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.
Files changed (762) hide show
  1. {iac_code-0.15.0 → iac_code-0.16.0}/PKG-INFO +8 -1
  2. {iac_code-0.15.0 → iac_code-0.16.0}/README.md +7 -0
  3. {iac_code-0.15.0 → iac_code-0.16.0}/pyproject.toml +3 -0
  4. {iac_code-0.15.0 → iac_code-0.16.0}/setup.py +2 -0
  5. iac_code-0.16.0/src/iac_code/__init__.py +2 -0
  6. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/agent_card.py +58 -0
  7. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/app.py +196 -1
  8. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/backup.py +65 -8
  9. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/client.py +135 -1
  10. iac_code-0.16.0/src/iac_code/a2a/execution_control.py +1533 -0
  11. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/executor.py +1068 -154
  12. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/input_required.py +42 -4
  13. iac_code-0.16.0/src/iac_code/a2a/metadata_redaction.py +63 -0
  14. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/pipeline_events.py +34 -0
  15. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/pipeline_executor.py +328 -17
  16. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/pipeline_outbound.py +32 -7
  17. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/pipeline_recovery.py +21 -1
  18. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/pipeline_snapshot.py +1 -0
  19. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/pipeline_stream.py +31 -3
  20. iac_code-0.16.0/src/iac_code/a2a/resource_selector.py +418 -0
  21. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/runtime_overrides.py +54 -0
  22. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/task_store.py +346 -15
  23. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/transports/dispatcher.py +50 -10
  24. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/agent/agent_loop.py +375 -136
  25. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/agent/agent_tool.py +3 -0
  26. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/agui/adapter.py +2 -0
  27. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/agui/inputs.py +1 -0
  28. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/effort.py +51 -31
  29. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/config.py +12 -3
  30. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/de/LC_MESSAGES/messages.mo +0 -0
  31. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/de/LC_MESSAGES/messages.po +64 -6
  32. iac_code-0.16.0/src/iac_code/i18n/locales/de/LC_MESSAGES/webui.mo +0 -0
  33. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/de/LC_MESSAGES/webui.po +208 -38
  34. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/es/LC_MESSAGES/messages.mo +0 -0
  35. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/es/LC_MESSAGES/messages.po +64 -6
  36. iac_code-0.16.0/src/iac_code/i18n/locales/es/LC_MESSAGES/webui.mo +0 -0
  37. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/es/LC_MESSAGES/webui.po +208 -38
  38. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/fr/LC_MESSAGES/messages.mo +0 -0
  39. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/fr/LC_MESSAGES/messages.po +63 -6
  40. iac_code-0.16.0/src/iac_code/i18n/locales/fr/LC_MESSAGES/webui.mo +0 -0
  41. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/fr/LC_MESSAGES/webui.po +208 -38
  42. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/ja/LC_MESSAGES/messages.mo +0 -0
  43. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/ja/LC_MESSAGES/messages.po +61 -6
  44. iac_code-0.16.0/src/iac_code/i18n/locales/ja/LC_MESSAGES/webui.mo +0 -0
  45. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/ja/LC_MESSAGES/webui.po +202 -38
  46. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/pt/LC_MESSAGES/messages.mo +0 -0
  47. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/pt/LC_MESSAGES/messages.po +64 -6
  48. iac_code-0.16.0/src/iac_code/i18n/locales/pt/LC_MESSAGES/webui.mo +0 -0
  49. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/pt/LC_MESSAGES/webui.po +208 -38
  50. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/zh/LC_MESSAGES/messages.mo +0 -0
  51. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/zh/LC_MESSAGES/messages.po +59 -6
  52. iac_code-0.16.0/src/iac_code/i18n/locales/zh/LC_MESSAGES/webui.mo +0 -0
  53. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/locales/zh/LC_MESSAGES/webui.po +202 -38
  54. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/architecture_graph.py +82 -1
  55. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/architecture_semantic_planning.py +2 -2
  56. iac_code-0.16.0/src/iac_code/pipeline/engine/diagram_graph.py +145 -0
  57. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/display_replay.py +13 -11
  58. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/pipeline_runner.py +62 -4
  59. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/session.py +28 -1
  60. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/show_diagram_tool.py +13 -7
  61. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/step_executor.py +31 -3
  62. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/sub_pipeline_executor.py +2 -0
  63. {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
  64. {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
  65. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/references/solutions/iac-code-web.md +6 -3
  66. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/references/solutions/iac-code-web.ros.yml +129 -12
  67. {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
  68. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-architecture/SKILL.md +4 -2
  69. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-architecture/evals.json +1 -1
  70. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/SKILL.md +3 -2
  71. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/evals.json +21 -3
  72. {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
  73. {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
  74. {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
  75. {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
  76. {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
  77. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/SKILL.md +4 -4
  78. {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
  79. {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
  80. {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
  81. {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
  82. {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
  83. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/SKILL.md +1 -0
  84. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/evals.json +21 -3
  85. {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
  86. {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
  87. {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
  88. {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
  89. {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
  90. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/tools/infraguard_scan_tool.py +4 -3
  91. {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
  92. iac_code-0.16.0/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-deploying/references/cloud-products/ecs.md +186 -0
  93. iac_code-0.16.0/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-deploying/references/cloud-products/vpc.md +60 -0
  94. iac_code-0.16.0/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-deploying/references/solutions/iac-code-web.md +41 -0
  95. 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
  96. iac_code-0.16.0/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-deploying/references/template-parameter-recommendation.md +167 -0
  97. {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
  98. {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
  99. 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
  100. 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
  101. 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
  102. 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
  103. 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
  104. {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
  105. {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
  106. {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
  107. {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
  108. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/anthropic_provider.py +5 -2
  109. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/dashscope_provider.py +14 -9
  110. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/kimi_provider.py +5 -2
  111. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/manager.py +22 -7
  112. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/openai_provider.py +9 -7
  113. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/registry.py +34 -17
  114. iac_code-0.16.0/src/iac_code/providers/request_headers.py +52 -0
  115. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/thinking.py +97 -2
  116. iac_code-0.16.0/src/iac_code/resource_selector/__init__.py +16 -0
  117. iac_code-0.16.0/src/iac_code/resource_selector/capability.py +85 -0
  118. iac_code-0.16.0/src/iac_code/resource_selector/ore-capabilities.json +4028 -0
  119. iac_code-0.16.0/src/iac_code/resource_selector/ore-operations.json +2272 -0
  120. iac_code-0.16.0/src/iac_code/resource_selector/ore-response-projections.json +5231 -0
  121. iac_code-0.16.0/src/iac_code/resource_selector/profiles.py +1291 -0
  122. iac_code-0.16.0/src/iac_code/resource_selector/query.py +1530 -0
  123. iac_code-0.16.0/src/iac_code/resource_selector/tools.py +586 -0
  124. iac_code-0.16.0/src/iac_code/resource_selector/validation.py +174 -0
  125. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/agent_factory.py +31 -0
  126. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/context_manager.py +18 -4
  127. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/permission_wait.py +73 -30
  128. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/session_backup.py +1 -0
  129. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/session_backup_staging.py +44 -0
  130. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/telemetry/constants.py +14 -0
  131. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/iac_aliyun/SKILL.md +3 -2
  132. iac_code-0.16.0/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/ecs.md +186 -0
  133. iac_code-0.16.0/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/vpc.md +60 -0
  134. iac_code-0.16.0/src/iac_code/skills/bundled/iac_aliyun/references/solutions/iac-code-web.md +41 -0
  135. iac_code-0.16.0/src/iac_code/skills/bundled/iac_aliyun/references/solutions/iac-code-web.ros.yml +516 -0
  136. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/iac_aliyun/references/template-parameter-recommendation.md +9 -4
  137. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/base.py +6 -0
  138. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/bash/bash_tool.py +2 -1
  139. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/aliyun_api.py +5 -4
  140. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/api_contract.py +2 -2
  141. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/openmeta.py +2 -1
  142. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_stack.py +128 -16
  143. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_stack_instances.py +37 -11
  144. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/eip_association.py +47 -2
  145. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/glob.py +3 -3
  146. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/grep.py +2 -1
  147. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/tool_executor.py +14 -8
  148. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/types/__init__.py +2 -0
  149. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/types/stream_events.py +20 -1
  150. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/dialogs/model_picker.py +4 -0
  151. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/app.py +217 -1
  152. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/diagram_cache.py +13 -5
  153. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/diagram_optimizer.py +13 -2
  154. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/diagrams.py +73 -29
  155. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/events.py +5 -1
  156. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/permissions.py +16 -0
  157. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/runtime.py +56 -0
  158. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/session_manager.py +121 -2
  159. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/session_titler.py +2 -2
  160. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/settings.py +32 -3
  161. iac_code-0.16.0/src/iac_code/web/static/diagram-preview-corpus.json +35 -0
  162. iac_code-0.16.0/src/iac_code/web/static/diagram-preview.css +332 -0
  163. iac_code-0.16.0/src/iac_code/web/static/diagram-preview.html +111 -0
  164. iac_code-0.16.0/src/iac_code/web/static/eraser-frame.html +51 -0
  165. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/index.html +2 -2
  166. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/api.js +34 -0
  167. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/app.js +509 -37
  168. iac_code-0.16.0/src/iac_code/web/static/js/architecture_diagram.js +377 -0
  169. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/components/blocking.js +262 -1
  170. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/components/composer.js +19 -2
  171. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/components/output_panel.js +61 -13
  172. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/components/pipeline.js +18 -9
  173. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/components/workspace.js +63 -2
  174. iac_code-0.16.0/src/iac_code/web/static/js/diagram_preview.js +213 -0
  175. iac_code-0.16.0/src/iac_code/web/static/js/diagram_preview_library.js +33 -0
  176. iac_code-0.16.0/src/iac_code/web/static/js/eraser_frame.js +195 -0
  177. iac_code-0.16.0/src/iac_code/web/static/js/eraser_layout_worker.js +711 -0
  178. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/events.js +25 -0
  179. iac_code-0.16.0/src/iac_code/web/static/js/vendor/eraser-diagrams.LICENSE +21 -0
  180. iac_code-0.16.0/src/iac_code/web/static/js/vendor/eraser-diagrams.NOTICE +544 -0
  181. iac_code-0.16.0/src/iac_code/web/static/js/vendor/eraser-diagrams.min.js +826 -0
  182. iac_code-0.16.0/src/iac_code/web/static/js/vendor/ore-resource-selector.THIRD_PARTY_NOTICES +3214 -0
  183. iac_code-0.16.0/src/iac_code/web/static/js/vendor/ore-resource-selector.manifest.json +4010 -0
  184. iac_code-0.16.0/src/iac_code/web/static/js/vendor/ore-resource-selector.min.js +490 -0
  185. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/styles.css +397 -3
  186. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code.egg-info/PKG-INFO +8 -1
  187. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code.egg-info/SOURCES.txt +28 -0
  188. iac_code-0.15.0/src/iac_code/__init__.py +0 -2
  189. iac_code-0.15.0/src/iac_code/a2a/metadata_redaction.py +0 -32
  190. iac_code-0.15.0/src/iac_code/i18n/locales/de/LC_MESSAGES/webui.mo +0 -0
  191. iac_code-0.15.0/src/iac_code/i18n/locales/es/LC_MESSAGES/webui.mo +0 -0
  192. iac_code-0.15.0/src/iac_code/i18n/locales/fr/LC_MESSAGES/webui.mo +0 -0
  193. iac_code-0.15.0/src/iac_code/i18n/locales/ja/LC_MESSAGES/webui.mo +0 -0
  194. iac_code-0.15.0/src/iac_code/i18n/locales/pt/LC_MESSAGES/webui.mo +0 -0
  195. iac_code-0.15.0/src/iac_code/i18n/locales/zh/LC_MESSAGES/webui.mo +0 -0
  196. iac_code-0.15.0/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-deploying/references/cloud-products/ecs.md +0 -185
  197. iac_code-0.15.0/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-deploying/references/cloud-products/vpc.md +0 -54
  198. iac_code-0.15.0/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-deploying/references/solutions/iac-code-web.md +0 -38
  199. 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
  200. iac_code-0.15.0/src/iac_code/pipeline/selling_solution_first/skills/iac-aliyun-deploying/references/template-parameter-recommendation.md +0 -162
  201. 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
  202. 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
  203. 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
  204. 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
  205. 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
  206. iac_code-0.15.0/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/ecs.md +0 -185
  207. iac_code-0.15.0/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/vpc.md +0 -54
  208. iac_code-0.15.0/src/iac_code/skills/bundled/iac_aliyun/references/solutions/iac-code-web.md +0 -38
  209. iac_code-0.15.0/src/iac_code/skills/bundled/iac_aliyun/references/solutions/iac-code-web.ros.yml +0 -399
  210. {iac_code-0.15.0 → iac_code-0.16.0}/LICENSE +0 -0
  211. {iac_code-0.15.0 → iac_code-0.16.0}/MANIFEST.in +0 -0
  212. {iac_code-0.15.0 → iac_code-0.16.0}/setup.cfg +0 -0
  213. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/__init__.py +0 -0
  214. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/artifacts.py +0 -0
  215. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/events.py +0 -0
  216. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/exposure.py +0 -0
  217. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/jsonrpc_passthrough.py +0 -0
  218. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/metrics.py +0 -0
  219. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/parts.py +0 -0
  220. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/persistence.py +0 -0
  221. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/pipeline_delta_coalescing.py +0 -0
  222. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/pipeline_flow_monitor.py +0 -0
  223. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/pipeline_journal.py +0 -0
  224. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/pipeline_paths.py +0 -0
  225. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/pipeline_performance.py +0 -0
  226. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/pipeline_transport_delivery.py +0 -0
  227. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/projection.py +0 -0
  228. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/push.py +0 -0
  229. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/push_queue.py +0 -0
  230. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/push_secrets.py +0 -0
  231. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/push_worker.py +0 -0
  232. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/request_mode.py +0 -0
  233. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/router.py +0 -0
  234. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/runtime_registry.py +0 -0
  235. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/signing.py +0 -0
  236. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/thinking_metadata.py +0 -0
  237. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/transport.py +0 -0
  238. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/transports/__init__.py +0 -0
  239. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/transports/base.py +0 -0
  240. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/transports/grpc.py +0 -0
  241. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/transports/grpc_jsonrpc.py +0 -0
  242. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/transports/http.py +0 -0
  243. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/transports/redis_streams.py +0 -0
  244. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/transports/stdio.py +0 -0
  245. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/transports/unix.py +0 -0
  246. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/transports/websocket.py +0 -0
  247. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/a2a/types.py +0 -0
  248. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/acp/__init__.py +0 -0
  249. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/acp/convert.py +0 -0
  250. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/acp/http_sse.py +0 -0
  251. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/acp/mcp.py +0 -0
  252. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/acp/metrics.py +0 -0
  253. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/acp/runner.py +0 -0
  254. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/acp/server.py +0 -0
  255. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/acp/session.py +0 -0
  256. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/acp/slash_registry.py +0 -0
  257. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/acp/state.py +0 -0
  258. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/acp/tools.py +0 -0
  259. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/acp/types.py +0 -0
  260. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/acp/version.py +0 -0
  261. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/agent/__init__.py +0 -0
  262. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/agent/agent_types.py +0 -0
  263. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/agent/message.py +0 -0
  264. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/agent/system_prompt.py +0 -0
  265. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/agui/__init__.py +0 -0
  266. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/agui/app.py +0 -0
  267. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/agui/errors.py +0 -0
  268. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/agui/events.py +0 -0
  269. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/agui/process.py +0 -0
  270. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/agui/server.py +0 -0
  271. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/agui/state.py +0 -0
  272. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/cli/__init__.py +0 -0
  273. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/cli/headless.py +0 -0
  274. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/cli/install_git_bash.py +0 -0
  275. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/cli/main.py +0 -0
  276. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/cli/output_formats.py +0 -0
  277. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/cli/process_events.py +0 -0
  278. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/cli/process_mode.py +0 -0
  279. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/cli/process_protocol.py +0 -0
  280. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/cli/update.py +0 -0
  281. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/__init__.py +0 -0
  282. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/auth.py +0 -0
  283. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/clear.py +0 -0
  284. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/compact.py +0 -0
  285. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/debug.py +0 -0
  286. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/exit.py +0 -0
  287. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/help.py +0 -0
  288. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/mcp.py +0 -0
  289. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/memory.py +0 -0
  290. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/model.py +0 -0
  291. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/prompt.py +0 -0
  292. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/registry.py +0 -0
  293. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/rename.py +0 -0
  294. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/resume.py +0 -0
  295. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/skills.py +0 -0
  296. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/status.py +0 -0
  297. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/tasks.py +0 -0
  298. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/commands/thinking_enabled.py +0 -0
  299. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/desktop/__init__.py +0 -0
  300. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/desktop/__main__.py +0 -0
  301. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/desktop/control.py +0 -0
  302. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/desktop/controller.py +0 -0
  303. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/desktop/diagnostics.py +0 -0
  304. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/desktop/download_journal.py +0 -0
  305. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/desktop/external_env.py +0 -0
  306. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/desktop/git_bash.py +0 -0
  307. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/desktop/install_lock.py +0 -0
  308. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/desktop/loop_runner.py +0 -0
  309. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/desktop/native_preload_manifest.json +0 -0
  310. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/desktop/ports.py +0 -0
  311. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/desktop/probe_worker.py +0 -0
  312. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/desktop/runtime.py +0 -0
  313. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/desktop/tool_paths.py +0 -0
  314. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/__init__.py +0 -0
  315. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/i18n/html_extractor.py +0 -0
  316. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/mcp/__init__.py +0 -0
  317. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/mcp/cli.py +0 -0
  318. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/mcp/client.py +0 -0
  319. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/mcp/config.py +0 -0
  320. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/mcp/env_expansion.py +0 -0
  321. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/mcp/errors.py +0 -0
  322. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/mcp/manager.py +0 -0
  323. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/mcp/oauth.py +0 -0
  324. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/mcp/output.py +0 -0
  325. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/mcp/progress.py +0 -0
  326. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/mcp/prompt_dispatch.py +0 -0
  327. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/mcp/prompts.py +0 -0
  328. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/mcp/redaction.py +0 -0
  329. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/mcp/skills.py +0 -0
  330. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/mcp/storage.py +0 -0
  331. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/mcp/tools.py +0 -0
  332. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/mcp/types.py +0 -0
  333. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/memory/__init__.py +0 -0
  334. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/memory/memory_manager.py +0 -0
  335. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/memory/memory_tools.py +0 -0
  336. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/memory/project_memory.py +0 -0
  337. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/memory/recall.py +0 -0
  338. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/__init__.py +0 -0
  339. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/config.py +0 -0
  340. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/constants.py +0 -0
  341. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/display_names.py +0 -0
  342. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/__init__.py +0 -0
  343. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/architecture_meta.py +0 -0
  344. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/architecture_metas/Categories.json +0 -0
  345. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/architecture_metas/config.json +0 -0
  346. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/architecture_metas/products.json +0 -0
  347. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/architecture_resource_inventory.py +0 -0
  348. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/architecture_rule_candidates.py +0 -0
  349. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/architecture_rule_drafts.py +0 -0
  350. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/architecture_rule_facts.py +0 -0
  351. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/architecture_rules.json +0 -0
  352. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/architecture_rules.py +0 -0
  353. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/ask_user_question_tool.py +0 -0
  354. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/cleanup.py +0 -0
  355. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/complete_step_tool.py +0 -0
  356. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/completion_guard_state.py +0 -0
  357. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/context.py +0 -0
  358. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/events.py +0 -0
  359. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/handoff.py +0 -0
  360. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/hard_constraints.py +0 -0
  361. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/interrupt.py +0 -0
  362. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/loader.py +0 -0
  363. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/observability.py +0 -0
  364. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/prerequisites.py +0 -0
  365. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/prompts/interrupt_judge.md +0 -0
  366. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/public_errors.py +0 -0
  367. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/recovery.py +0 -0
  368. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/resume_recovery.py +0 -0
  369. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/state_machine.py +0 -0
  370. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/step_spec.py +0 -0
  371. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/transcript_storage.py +0 -0
  372. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/types.py +0 -0
  373. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/ui_contract.py +0 -0
  374. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/engine/user_input.py +0 -0
  375. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/hooks/deploying.py +0 -0
  376. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/pipeline.yaml +0 -0
  377. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/prompts/architecture_planning.md +0 -0
  378. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/prompts/confirm_and_select.a2a.md +0 -0
  379. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/prompts/confirm_and_select.a2a.rich.md +0 -0
  380. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/prompts/confirm_and_select.md +0 -0
  381. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/prompts/cost_estimating.md +0 -0
  382. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/prompts/deploying.md +0 -0
  383. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/prompts/evaluate_candidates.md +0 -0
  384. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/prompts/intent_parsing.md +0 -0
  385. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/prompts/reviewing.md +0 -0
  386. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/prompts/template_generating.md +0 -0
  387. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/references/cloud-products/ga.md +0 -0
  388. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/references/cloud-products/oss.md +0 -0
  389. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/references/cloud-products/rds.md +0 -0
  390. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/references/cloud-products/redis.md +0 -0
  391. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/references/cloud-products/slb.md +0 -0
  392. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/references/ros-template.md +0 -0
  393. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/references/template-parameters.md +0 -0
  394. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/references/terraform-template.md +0 -0
  395. {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
  396. {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
  397. {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
  398. {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
  399. {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
  400. {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
  401. {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
  402. {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
  403. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/evals.json +0 -0
  404. {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
  405. {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
  406. {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
  407. {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
  408. {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
  409. {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
  410. {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
  411. {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
  412. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-intent/SKILL.md +0 -0
  413. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-intent/evals.json +0 -0
  414. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-review/SKILL.md +0 -0
  415. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-review/evals.json +0 -0
  416. {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
  417. {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
  418. {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
  419. {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
  420. {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
  421. {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
  422. {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
  423. {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
  424. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/tools/__init__.py +0 -0
  425. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/tools/ros_deploy_tool.py +0 -0
  426. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/tools/ros_template_tools.py +0 -0
  427. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling/tools/show_candidate_detail_tool.py +0 -0
  428. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/hooks/deploying.py +0 -0
  429. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/hooks/materialize_selected_candidate.py +0 -0
  430. {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
  431. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/pipeline.yaml +0 -0
  432. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/prompts/deploying.md +0 -0
  433. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/prompts/materialize_selected_candidate.md +0 -0
  434. {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
  435. {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
  436. {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
  437. {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
  438. {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
  439. {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
  440. {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
  441. {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
  442. {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
  443. {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
  444. {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
  445. {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
  446. {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
  447. {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
  448. {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
  449. {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
  450. {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
  451. {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
  452. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/tools/candidate_planning_records.py +0 -0
  453. {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
  454. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/pipeline/selling_solution_first/tools/reused_selling_tools.py +0 -0
  455. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/__init__.py +0 -0
  456. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/azure_openai_provider.py +0 -0
  457. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/base.py +0 -0
  458. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/dashscope_endpoints.py +0 -0
  459. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/deepseek_provider.py +0 -0
  460. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/gemini_provider.py +0 -0
  461. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/lmstudio_provider.py +0 -0
  462. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/minimax_provider.py +0 -0
  463. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/model_family.py +0 -0
  464. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/modelscope_provider.py +0 -0
  465. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/ollama_provider.py +0 -0
  466. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/openrouter_provider.py +0 -0
  467. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/qwen_prompts.py +0 -0
  468. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/qwen_provider.py +0 -0
  469. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/qwen_tool_call_parser.py +0 -0
  470. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/request_lease.py +0 -0
  471. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/request_logging.py +0 -0
  472. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/request_policy.py +0 -0
  473. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/retry.py +0 -0
  474. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/schema_compat.py +0 -0
  475. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/siliconflow_provider.py +0 -0
  476. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/stream_watchdog.py +0 -0
  477. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/streaming.py +0 -0
  478. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/thinking_intent.py +0 -0
  479. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/volcengine_provider.py +0 -0
  480. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/providers/zhipu_provider.py +0 -0
  481. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/__init__.py +0 -0
  482. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/capabilities/__init__.py +0 -0
  483. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/capabilities/auto_detect.py +0 -0
  484. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/capabilities/multimodal.py +0 -0
  485. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/cloud_credentials.py +0 -0
  486. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/configuration_readiness.py +0 -0
  487. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/git_bash.py +0 -0
  488. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/permissions/__init__.py +0 -0
  489. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/permissions/audit.py +0 -0
  490. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/permissions/loader.py +0 -0
  491. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/permissions/pipeline.py +0 -0
  492. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/permissions/rule_scope.py +0 -0
  493. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/permissions/storage.py +0 -0
  494. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/permissions/trusted_roots.py +0 -0
  495. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/providers/__init__.py +0 -0
  496. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/providers/aliyun.py +0 -0
  497. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/providers/aliyun_credentials_runtime.py +0 -0
  498. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/providers/aliyun_identity.py +0 -0
  499. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/providers/aliyun_oauth.py +0 -0
  500. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/qwenpaw_source.py +0 -0
  501. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/session_backup_state.py +0 -0
  502. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/session_index.py +0 -0
  503. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/session_layout.py +0 -0
  504. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/session_logging.py +0 -0
  505. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/session_metadata.py +0 -0
  506. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/session_resolver.py +0 -0
  507. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/session_storage.py +0 -0
  508. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/session_usage.py +0 -0
  509. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/telemetry/__init__.py +0 -0
  510. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/telemetry/attributes.py +0 -0
  511. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/telemetry/client.py +0 -0
  512. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/telemetry/config.py +0 -0
  513. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/telemetry/content_serializer.py +0 -0
  514. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/telemetry/events.py +0 -0
  515. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/telemetry/fallback.py +0 -0
  516. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/telemetry/identity.py +0 -0
  517. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/telemetry/metrics.py +0 -0
  518. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/telemetry/names.py +0 -0
  519. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/telemetry/sanitize.py +0 -0
  520. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/telemetry/scope.py +0 -0
  521. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/telemetry/sink.py +0 -0
  522. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/telemetry/tracing.py +0 -0
  523. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/telemetry/types.py +0 -0
  524. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/token_budget.py +0 -0
  525. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/token_counter.py +0 -0
  526. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/services/update_checker.py +0 -0
  527. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/__init__.py +0 -0
  528. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/auto_trigger.py +0 -0
  529. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/__init__.py +0 -0
  530. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/iac_aliyun/__init__.py +0 -0
  531. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/iac_aliyun/auto_trigger.py +0 -0
  532. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/ga.md +0 -0
  533. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/oss.md +0 -0
  534. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/rds.md +0 -0
  535. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/redis.md +0 -0
  536. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/slb.md +0 -0
  537. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/iac_aliyun/references/ros-template.md +0 -0
  538. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/iac_aliyun/references/template-parameters.md +0 -0
  539. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/iac_aliyun/references/terraform-template.md +0 -0
  540. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/iac_aliyun/scripts/tf2ros.py +0 -0
  541. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/pac_aliyun/SKILL.md +0 -0
  542. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/pac_aliyun/__init__.py +0 -0
  543. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/pac_aliyun/auto_trigger.py +0 -0
  544. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/pac_aliyun/references/infraguard-policy-generation.md +0 -0
  545. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/bundled/simplify.py +0 -0
  546. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/discovery.py +0 -0
  547. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/frontmatter.py +0 -0
  548. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/listing.py +0 -0
  549. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/loader.py +0 -0
  550. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/management.py +0 -0
  551. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/processor.py +0 -0
  552. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/renderer.py +0 -0
  553. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/settings.py +0 -0
  554. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/skill_definition.py +0 -0
  555. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/skills/skill_tool.py +0 -0
  556. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/state/__init__.py +0 -0
  557. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/state/app_state.py +0 -0
  558. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tasks/__init__.py +0 -0
  559. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tasks/notification_queue.py +0 -0
  560. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tasks/task_state.py +0 -0
  561. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tasks/task_tools.py +0 -0
  562. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/__init__.py +0 -0
  563. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/bash/__init__.py +0 -0
  564. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/bash/argv_safety.py +0 -0
  565. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/bash/command_parser.py +0 -0
  566. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/bash/mode_validation.py +0 -0
  567. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/bash/path_validation.py +0 -0
  568. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/bash/permissions.py +0 -0
  569. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/bash/readonly_commands.py +0 -0
  570. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/bash/rule_matching.py +0 -0
  571. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/bash/safety_checks.py +0 -0
  572. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/__init__.py +0 -0
  573. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/__init__.py +0 -0
  574. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/acs3_transport.py +0 -0
  575. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/aliyun_api_doc.py +0 -0
  576. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/aliyun_doc_search.py +0 -0
  577. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/api_hooks.py +0 -0
  578. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/api_identifiers.py +0 -0
  579. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/contract_store.py +0 -0
  580. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/data/README.md +0 -0
  581. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/data/endpoints/catalog.json +0 -0
  582. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/data/endpoints/generation_report.json +0 -0
  583. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/data/endpoints/legacy.yml +0 -0
  584. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/data/endpoints/overrides.yml +0 -0
  585. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/data/endpoints/unavailable.json +0 -0
  586. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/data/openmeta/api_overrides.yml +0 -0
  587. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/data/openmeta/exclusions.yml +0 -0
  588. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/data/openmeta/product_aliases.yml +0 -0
  589. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/data/openmeta/product_catalog.json +0 -0
  590. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/data/oss/operation_catalog.json +0 -0
  591. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/data/validation/judgments.yml +0 -0
  592. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/data/validation/overrides.yml +0 -0
  593. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ecs_credential_errors.py +0 -0
  594. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/endpoint_resolver.py +0 -0
  595. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/hooks/__init__.py +0 -0
  596. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/hooks/ros_parameters.py +0 -0
  597. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py +0 -0
  598. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/oss_v4_adapter.py +0 -0
  599. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/product_resolver.py +0 -0
  600. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/public_errors.py +0 -0
  601. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/result_contract.py +0 -0
  602. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/retry_policy.py +0 -0
  603. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_client.py +0 -0
  604. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_lifecycle.py +0 -0
  605. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_template_tools.py +0 -0
  606. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/__init__.py +0 -0
  607. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/action_policy.py +0 -0
  608. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/analyzer.py +0 -0
  609. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/association_property_specs.py +0 -0
  610. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/count.py +0 -0
  611. {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
  612. {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
  613. {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
  614. {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
  615. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/facts.py +0 -0
  616. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/function_specs.py +0 -0
  617. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/model.py +0 -0
  618. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/outcome.py +0 -0
  619. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/parser.py +0 -0
  620. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/renderer.py +0 -0
  621. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/resource_value_specs.py +0 -0
  622. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/__init__.py +0 -0
  623. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/association_property.py +0 -0
  624. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/base.py +0 -0
  625. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/registry.py +0 -0
  626. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/symbols.py +0 -0
  627. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/template_kind.py +0 -0
  628. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/types.py +0 -0
  629. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_validation/validator.py +0 -0
  630. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/ros_yaml.py +0 -0
  631. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/runtime.py +0 -0
  632. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/template_source.py +0 -0
  633. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/user_agent.py +0 -0
  634. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/aliyun/validation_policy.py +0 -0
  635. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/base_api.py +0 -0
  636. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/base_stack.py +0 -0
  637. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/registry.py +0 -0
  638. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/cloud/types.py +0 -0
  639. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/edit_file.py +0 -0
  640. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/list_files.py +0 -0
  641. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/path_safety.py +0 -0
  642. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/read_file.py +0 -0
  643. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/result_storage.py +0 -0
  644. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/web_fetch.py +0 -0
  645. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/tools/write_file.py +0 -0
  646. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/types/permissions.py +0 -0
  647. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/types/skill_source.py +0 -0
  648. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/types/usage_attribution.py +0 -0
  649. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/__init__.py +0 -0
  650. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/assets/iac-code-terminal-logo.png +0 -0
  651. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/banner.py +0 -0
  652. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/components/__init__.py +0 -0
  653. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/components/candidate_selection.py +0 -0
  654. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/components/dialog.py +0 -0
  655. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/components/divider.py +0 -0
  656. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/components/fuzzy_picker.py +0 -0
  657. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/components/parallel_tabs.py +0 -0
  658. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/components/progress_bar.py +0 -0
  659. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/components/search_box.py +0 -0
  660. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/components/select.py +0 -0
  661. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/components/status_icon.py +0 -0
  662. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/components/tabs.py +0 -0
  663. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/core/__init__.py +0 -0
  664. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/core/in_place_render.py +0 -0
  665. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/core/input_history.py +0 -0
  666. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/core/key_event.py +0 -0
  667. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/core/prompt_input.py +0 -0
  668. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/core/raw_input.py +0 -0
  669. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/core/raw_input_win.py +0 -0
  670. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/core/screen.py +0 -0
  671. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/diagram_rendering.py +0 -0
  672. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/dialogs/__init__.py +0 -0
  673. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/dialogs/global_search.py +0 -0
  674. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/dialogs/history_search.py +0 -0
  675. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/dialogs/mcp_manager.py +0 -0
  676. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/dialogs/memory.py +0 -0
  677. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/dialogs/memory_editor.py +0 -0
  678. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/dialogs/quick_open.py +0 -0
  679. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/dialogs/resume_picker.py +0 -0
  680. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/dialogs/skills_picker.py +0 -0
  681. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/keybindings/__init__.py +0 -0
  682. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/keybindings/manager.py +0 -0
  683. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/pipeline_display_replay.py +0 -0
  684. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/pipeline_styles.py +0 -0
  685. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/renderer.py +0 -0
  686. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/repl.py +0 -0
  687. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/spinner.py +0 -0
  688. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/stream_accumulator.py +0 -0
  689. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/suggestions/__init__.py +0 -0
  690. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/suggestions/aggregator.py +0 -0
  691. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/suggestions/command_provider.py +0 -0
  692. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/suggestions/directory_provider.py +0 -0
  693. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/suggestions/file_provider.py +0 -0
  694. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/suggestions/shell_history_provider.py +0 -0
  695. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/suggestions/skill_provider.py +0 -0
  696. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/suggestions/token_extractor.py +0 -0
  697. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/suggestions/types.py +0 -0
  698. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/terminal_image.py +0 -0
  699. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/ui/transcript_view.py +0 -0
  700. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/__init__.py +0 -0
  701. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/async_lifecycle.py +0 -0
  702. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/background_housekeeping.py +0 -0
  703. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/cleanup.py +0 -0
  704. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/console.py +0 -0
  705. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/file_security.py +0 -0
  706. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/image/__init__.py +0 -0
  707. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/image/clipboard.py +0 -0
  708. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/image/format_detect.py +0 -0
  709. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/image/pasted_content.py +0 -0
  710. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/image/processor.py +0 -0
  711. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/image/resizer.py +0 -0
  712. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/image/store.py +0 -0
  713. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/json_utils.py +0 -0
  714. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/log.py +0 -0
  715. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/path_components.py +0 -0
  716. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/path_locks.py +0 -0
  717. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/platform.py +0 -0
  718. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/project_paths.py +0 -0
  719. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/public_errors.py +0 -0
  720. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/public_paths.py +0 -0
  721. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/signals.py +0 -0
  722. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/state_io.py +0 -0
  723. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/tool_input_parser.py +0 -0
  724. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/tool_result_redaction.py +0 -0
  725. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/utils/windows_paths.py +0 -0
  726. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/__init__.py +0 -0
  727. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/cleanup.py +0 -0
  728. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/commands.py +0 -0
  729. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/files.py +0 -0
  730. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/images.py +0 -0
  731. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/mcp_settings.py +0 -0
  732. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/memory.py +0 -0
  733. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/outputs.py +0 -0
  734. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/pipeline.py +0 -0
  735. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/pipeline_actions.py +0 -0
  736. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/pipeline_prerequisites.py +0 -0
  737. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/pipeline_transcript.py +0 -0
  738. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/security.py +0 -0
  739. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/server.py +0 -0
  740. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/shell.py +0 -0
  741. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/skills.py +0 -0
  742. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/icons/iac-code-logo.svg +0 -0
  743. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/icons/sidebar-new-thread.svg +0 -0
  744. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/icons/sidebar-project-open.svg +0 -0
  745. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/icons/sidebar-search.svg +0 -0
  746. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/icons/sidebar-settings.svg +0 -0
  747. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/icons/sidebar-skills.svg +0 -0
  748. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/components/image_lightbox.js +0 -0
  749. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/components/tool_cards.js +0 -0
  750. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/i18n.js +0 -0
  751. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/mermaid_render.js +0 -0
  752. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/token_transport.js +0 -0
  753. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/vendor/markdown-it.LICENSE +0 -0
  754. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/vendor/markdown-it.min.js +0 -0
  755. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/vendor/mermaid.LICENSE +0 -0
  756. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/vendor/mermaid.min.js +0 -0
  757. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/static/js/vendor/token-crypto.js +0 -0
  758. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code/web/token_transport.py +0 -0
  759. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code.egg-info/dependency_links.txt +0 -0
  760. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code.egg-info/entry_points.txt +0 -0
  761. {iac_code-0.15.0 → iac_code-0.16.0}/src/iac_code.egg-info/requires.txt +0 -0
  762. {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.15.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]
@@ -88,6 +88,8 @@ PACKAGE_DATA = {
88
88
  "**/*.js",
89
89
  "**/*.svg",
90
90
  "**/*.LICENSE",
91
+ "**/*.NOTICE",
92
+ "**/*THIRD_PARTY_NOTICES",
91
93
  "**/*.mo",
92
94
  "**/*.po",
93
95
  ],
@@ -0,0 +1,2 @@
1
+ __version__ = "0.16.0"
2
+ __release_date__ = "2026-09-17"
@@ -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(project_a2a_data(client_pipeline_state(state, lean=lean), public_path_roots=roots))
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 contextlib
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 run_sync_fenced(function: Callable[..., Any], /, *args: Any, **kwargs: Any) -> Any:
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
- with contextlib.suppress(Exception):
31
- thread_task.result()
32
- raise
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 iac-code's existing A2A pipeline recovery extension over HTTP."""
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,