iac-code 0.11.3__tar.gz → 0.12.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 (645) hide show
  1. {iac_code-0.11.3 → iac_code-0.12.0}/PKG-INFO +13 -1
  2. {iac_code-0.11.3 → iac_code-0.12.0}/README.md +12 -0
  3. {iac_code-0.11.3 → iac_code-0.12.0}/pyproject.toml +12 -1
  4. iac_code-0.12.0/src/iac_code/__init__.py +2 -0
  5. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/executor.py +1 -0
  6. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/pipeline_events.py +6 -2
  7. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/pipeline_executor.py +125 -19
  8. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/pipeline_stream.py +13 -0
  9. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/task_store.py +20 -5
  10. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/transports/dispatcher.py +5 -1
  11. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/acp/server.py +1 -1
  12. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/agent/agent_loop.py +7 -1
  13. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/cli/headless.py +1 -0
  14. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/cli/install_git_bash.py +28 -41
  15. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/cli/main.py +22 -11
  16. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/cli/process_mode.py +4 -2
  17. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/commands/auth.py +45 -9
  18. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/commands/clear.py +7 -8
  19. iac_code-0.12.0/src/iac_code/desktop/__init__.py +7 -0
  20. iac_code-0.12.0/src/iac_code/desktop/__main__.py +358 -0
  21. iac_code-0.12.0/src/iac_code/desktop/control.py +374 -0
  22. iac_code-0.12.0/src/iac_code/desktop/controller.py +107 -0
  23. iac_code-0.12.0/src/iac_code/desktop/diagnostics.py +133 -0
  24. iac_code-0.12.0/src/iac_code/desktop/download_journal.py +807 -0
  25. iac_code-0.12.0/src/iac_code/desktop/external_env.py +1156 -0
  26. iac_code-0.12.0/src/iac_code/desktop/git_bash.py +46 -0
  27. iac_code-0.12.0/src/iac_code/desktop/install_lock.py +121 -0
  28. iac_code-0.12.0/src/iac_code/desktop/loop_runner.py +36 -0
  29. iac_code-0.12.0/src/iac_code/desktop/native_preload_manifest.json +31 -0
  30. iac_code-0.12.0/src/iac_code/desktop/ports.py +81 -0
  31. iac_code-0.12.0/src/iac_code/desktop/probe_worker.py +511 -0
  32. iac_code-0.12.0/src/iac_code/desktop/runtime.py +87 -0
  33. iac_code-0.12.0/src/iac_code/desktop/tool_paths.py +80 -0
  34. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/i18n/locales/de/LC_MESSAGES/messages.mo +0 -0
  35. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/i18n/locales/de/LC_MESSAGES/messages.po +122 -3
  36. iac_code-0.12.0/src/iac_code/i18n/locales/de/LC_MESSAGES/webui.mo +0 -0
  37. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/i18n/locales/de/LC_MESSAGES/webui.po +191 -25
  38. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/i18n/locales/es/LC_MESSAGES/messages.mo +0 -0
  39. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/i18n/locales/es/LC_MESSAGES/messages.po +123 -3
  40. iac_code-0.12.0/src/iac_code/i18n/locales/es/LC_MESSAGES/webui.mo +0 -0
  41. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/i18n/locales/es/LC_MESSAGES/webui.po +196 -26
  42. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/i18n/locales/fr/LC_MESSAGES/messages.mo +0 -0
  43. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/i18n/locales/fr/LC_MESSAGES/messages.po +120 -3
  44. iac_code-0.12.0/src/iac_code/i18n/locales/fr/LC_MESSAGES/webui.mo +0 -0
  45. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/i18n/locales/fr/LC_MESSAGES/webui.po +191 -26
  46. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/i18n/locales/ja/LC_MESSAGES/messages.mo +0 -0
  47. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/i18n/locales/ja/LC_MESSAGES/messages.po +111 -3
  48. iac_code-0.12.0/src/iac_code/i18n/locales/ja/LC_MESSAGES/webui.mo +0 -0
  49. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/i18n/locales/ja/LC_MESSAGES/webui.po +163 -25
  50. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/i18n/locales/pt/LC_MESSAGES/messages.mo +0 -0
  51. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/i18n/locales/pt/LC_MESSAGES/messages.po +120 -3
  52. iac_code-0.12.0/src/iac_code/i18n/locales/pt/LC_MESSAGES/webui.mo +0 -0
  53. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/i18n/locales/pt/LC_MESSAGES/webui.po +189 -26
  54. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/i18n/locales/zh/LC_MESSAGES/messages.mo +0 -0
  55. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/i18n/locales/zh/LC_MESSAGES/messages.po +103 -7
  56. iac_code-0.12.0/src/iac_code/i18n/locales/zh/LC_MESSAGES/webui.mo +0 -0
  57. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/i18n/locales/zh/LC_MESSAGES/webui.po +161 -25
  58. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/mcp/client.py +37 -11
  59. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/mcp/oauth.py +12 -1
  60. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/complete_step_tool.py +77 -5
  61. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/completion_guard_state.py +27 -1
  62. iac_code-0.12.0/src/iac_code/pipeline/engine/hard_constraints.py +326 -0
  63. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/loader.py +38 -1
  64. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/pipeline_runner.py +17 -46
  65. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/prerequisites.py +165 -27
  66. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/recovery.py +1 -0
  67. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/step_executor.py +15 -0
  68. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/step_spec.py +1 -0
  69. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/types.py +1 -0
  70. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/pipeline.yaml +12 -2
  71. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/prompts/cost_estimating.md +13 -1
  72. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/prompts/deploying.md +3 -8
  73. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/prompts/intent_parsing.md +0 -1
  74. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/prompts/template_generating.md +1 -3
  75. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/references/cloud-products/ecs.md +23 -8
  76. {iac_code-0.11.3/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating → iac_code-0.12.0/src/iac_code/pipeline/selling}/references/solutions/iac-code-web.md +13 -10
  77. {iac_code-0.11.3/src/iac_code/pipeline/selling/skills/iac-aliyun-cost → iac_code-0.12.0/src/iac_code/pipeline/selling}/references/solutions/iac-code-web.ros.yml +80 -32
  78. {iac_code-0.11.3/src/iac_code/pipeline/selling/skills/iac-aliyun-cost → iac_code-0.12.0/src/iac_code/pipeline/selling}/references/template-parameter-recommendation.md +8 -4
  79. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-architecture/SKILL.md +44 -3
  80. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/SKILL.md +112 -6
  81. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/evals.json +41 -3
  82. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/ecs.md +23 -8
  83. {iac_code-0.11.3/src/iac_code/pipeline/selling → iac_code-0.12.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost}/references/solutions/iac-code-web.md +13 -10
  84. {iac_code-0.11.3/src/iac_code/pipeline/selling → iac_code-0.12.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost}/references/solutions/iac-code-web.ros.yml +80 -32
  85. {iac_code-0.11.3/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating → iac_code-0.12.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost}/references/template-parameter-recommendation.md +8 -4
  86. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/SKILL.md +6 -4
  87. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/ecs.md +23 -8
  88. {iac_code-0.11.3/src/iac_code/pipeline/selling/skills/iac-aliyun-cost → iac_code-0.12.0/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying}/references/solutions/iac-code-web.md +13 -10
  89. {iac_code-0.11.3/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating → iac_code-0.12.0/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying}/references/solutions/iac-code-web.ros.yml +80 -32
  90. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/template-parameter-recommendation.md +8 -4
  91. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-intent/SKILL.md +58 -3
  92. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/SKILL.md +9 -2
  93. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/ecs.md +23 -8
  94. {iac_code-0.11.3/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying → iac_code-0.12.0/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating}/references/solutions/iac-code-web.md +13 -10
  95. {iac_code-0.11.3/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying → iac_code-0.12.0/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating}/references/solutions/iac-code-web.ros.yml +80 -32
  96. {iac_code-0.11.3/src/iac_code/pipeline/selling → iac_code-0.12.0/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating}/references/template-parameter-recommendation.md +8 -4
  97. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/tools/infraguard_scan_tool.py +112 -11
  98. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/tools/ros_deploy_tool.py +3 -4
  99. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/providers/manager.py +74 -1
  100. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/agent_factory.py +51 -0
  101. iac_code-0.12.0/src/iac_code/services/git_bash.py +62 -0
  102. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/providers/aliyun.py +64 -1
  103. iac_code-0.12.0/src/iac_code/services/providers/aliyun_credentials_runtime.py +427 -0
  104. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/session_backup.py +135 -29
  105. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/session_index.py +21 -12
  106. iac_code-0.12.0/src/iac_code/services/session_logging.py +279 -0
  107. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/telemetry/config.py +53 -9
  108. iac_code-0.12.0/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/ecs.md +182 -0
  109. iac_code-0.12.0/src/iac_code/skills/bundled/iac_aliyun/references/solutions/iac-code-web.md +35 -0
  110. iac_code-0.12.0/src/iac_code/skills/bundled/iac_aliyun/references/solutions/iac-code-web.ros.yml +366 -0
  111. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/skills/renderer.py +30 -9
  112. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/bash/bash_tool.py +28 -9
  113. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/acs3_transport.py +25 -33
  114. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/aliyun_api.py +30 -13
  115. iac_code-0.12.0/src/iac_code/tools/cloud/aliyun/ecs_credential_errors.py +39 -0
  116. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/endpoint_resolver.py +25 -51
  117. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/public_errors.py +54 -0
  118. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_client.py +23 -12
  119. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_stack.py +39 -17
  120. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_stack_instances.py +28 -15
  121. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/base_stack.py +64 -5
  122. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/grep.py +4 -2
  123. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/types/stream_events.py +26 -0
  124. iac_code-0.12.0/src/iac_code/ui/assets/iac-code-terminal-logo.png +0 -0
  125. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/banner.py +123 -13
  126. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/renderer.py +15 -5
  127. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/repl.py +106 -18
  128. iac_code-0.12.0/src/iac_code/ui/terminal_image.py +257 -0
  129. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/utils/file_security.py +7 -2
  130. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/utils/log.py +19 -1
  131. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/utils/platform.py +86 -11
  132. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/utils/project_paths.py +43 -6
  133. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/app.py +457 -44
  134. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/events.py +20 -1
  135. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/memory.py +7 -2
  136. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/outputs.py +31 -8
  137. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/pipeline_prerequisites.py +111 -18
  138. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/runtime.py +58 -10
  139. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/server.py +28 -1
  140. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/session_manager.py +68 -0
  141. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/settings.py +84 -7
  142. iac_code-0.12.0/src/iac_code/web/static/icons/iac-code-logo.svg +28 -0
  143. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/static/index.html +7 -2
  144. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/static/js/api.js +35 -5
  145. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/static/js/app.js +364 -37
  146. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/static/js/components/output_panel.js +123 -7
  147. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/static/js/components/workspace.js +191 -23
  148. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/static/js/events.js +14 -0
  149. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/static/styles.css +136 -3
  150. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code.egg-info/PKG-INFO +13 -1
  151. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code.egg-info/SOURCES.txt +23 -0
  152. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code.egg-info/requires.txt +2 -1
  153. iac_code-0.11.3/src/iac_code/__init__.py +0 -2
  154. iac_code-0.11.3/src/iac_code/i18n/locales/de/LC_MESSAGES/webui.mo +0 -0
  155. iac_code-0.11.3/src/iac_code/i18n/locales/es/LC_MESSAGES/webui.mo +0 -0
  156. iac_code-0.11.3/src/iac_code/i18n/locales/fr/LC_MESSAGES/webui.mo +0 -0
  157. iac_code-0.11.3/src/iac_code/i18n/locales/ja/LC_MESSAGES/webui.mo +0 -0
  158. iac_code-0.11.3/src/iac_code/i18n/locales/pt/LC_MESSAGES/webui.mo +0 -0
  159. iac_code-0.11.3/src/iac_code/i18n/locales/zh/LC_MESSAGES/webui.mo +0 -0
  160. iac_code-0.11.3/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/ecs.md +0 -167
  161. iac_code-0.11.3/src/iac_code/skills/bundled/iac_aliyun/references/solutions/iac-code-web.md +0 -32
  162. iac_code-0.11.3/src/iac_code/skills/bundled/iac_aliyun/references/solutions/iac-code-web.ros.yml +0 -318
  163. {iac_code-0.11.3 → iac_code-0.12.0}/LICENSE +0 -0
  164. {iac_code-0.11.3 → iac_code-0.12.0}/MANIFEST.in +0 -0
  165. {iac_code-0.11.3 → iac_code-0.12.0}/setup.cfg +0 -0
  166. {iac_code-0.11.3 → iac_code-0.12.0}/setup.py +0 -0
  167. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/__init__.py +0 -0
  168. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/agent_card.py +0 -0
  169. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/app.py +0 -0
  170. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/artifacts.py +0 -0
  171. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/backup.py +0 -0
  172. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/client.py +0 -0
  173. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/events.py +0 -0
  174. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/exposure.py +0 -0
  175. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/jsonrpc_passthrough.py +0 -0
  176. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/metadata_redaction.py +0 -0
  177. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/metrics.py +0 -0
  178. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/parts.py +0 -0
  179. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/persistence.py +0 -0
  180. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/pipeline_delta_coalescing.py +0 -0
  181. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/pipeline_flow_monitor.py +0 -0
  182. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/pipeline_journal.py +0 -0
  183. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/pipeline_outbound.py +0 -0
  184. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/pipeline_paths.py +0 -0
  185. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/pipeline_performance.py +0 -0
  186. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/pipeline_recovery.py +0 -0
  187. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/pipeline_snapshot.py +0 -0
  188. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/pipeline_transport_delivery.py +0 -0
  189. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/projection.py +0 -0
  190. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/push.py +0 -0
  191. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/push_queue.py +0 -0
  192. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/push_secrets.py +0 -0
  193. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/push_worker.py +0 -0
  194. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/router.py +0 -0
  195. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/runtime_overrides.py +0 -0
  196. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/runtime_registry.py +0 -0
  197. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/signing.py +0 -0
  198. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/thinking_metadata.py +0 -0
  199. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/transport.py +0 -0
  200. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/transports/__init__.py +0 -0
  201. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/transports/base.py +0 -0
  202. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/transports/grpc.py +0 -0
  203. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/transports/grpc_jsonrpc.py +0 -0
  204. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/transports/http.py +0 -0
  205. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/transports/redis_streams.py +0 -0
  206. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/transports/stdio.py +0 -0
  207. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/transports/unix.py +0 -0
  208. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/transports/websocket.py +0 -0
  209. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/a2a/types.py +0 -0
  210. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/acp/__init__.py +0 -0
  211. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/acp/convert.py +0 -0
  212. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/acp/http_sse.py +0 -0
  213. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/acp/mcp.py +0 -0
  214. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/acp/metrics.py +0 -0
  215. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/acp/runner.py +0 -0
  216. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/acp/session.py +0 -0
  217. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/acp/slash_registry.py +0 -0
  218. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/acp/state.py +0 -0
  219. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/acp/tools.py +0 -0
  220. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/acp/types.py +0 -0
  221. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/acp/version.py +0 -0
  222. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/agent/__init__.py +0 -0
  223. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/agent/agent_tool.py +0 -0
  224. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/agent/agent_types.py +0 -0
  225. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/agent/message.py +0 -0
  226. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/agent/system_prompt.py +0 -0
  227. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/cli/__init__.py +0 -0
  228. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/cli/output_formats.py +0 -0
  229. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/cli/process_events.py +0 -0
  230. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/cli/process_protocol.py +0 -0
  231. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/cli/update.py +0 -0
  232. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/commands/__init__.py +0 -0
  233. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/commands/compact.py +0 -0
  234. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/commands/debug.py +0 -0
  235. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/commands/effort.py +0 -0
  236. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/commands/exit.py +0 -0
  237. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/commands/help.py +0 -0
  238. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/commands/mcp.py +0 -0
  239. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/commands/memory.py +0 -0
  240. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/commands/model.py +0 -0
  241. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/commands/prompt.py +0 -0
  242. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/commands/registry.py +0 -0
  243. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/commands/rename.py +0 -0
  244. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/commands/resume.py +0 -0
  245. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/commands/skills.py +0 -0
  246. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/commands/status.py +0 -0
  247. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/commands/tasks.py +0 -0
  248. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/commands/thinking_enabled.py +0 -0
  249. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/config.py +0 -0
  250. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/i18n/__init__.py +0 -0
  251. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/i18n/html_extractor.py +0 -0
  252. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/mcp/__init__.py +0 -0
  253. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/mcp/cli.py +0 -0
  254. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/mcp/config.py +0 -0
  255. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/mcp/env_expansion.py +0 -0
  256. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/mcp/errors.py +0 -0
  257. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/mcp/manager.py +0 -0
  258. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/mcp/output.py +0 -0
  259. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/mcp/progress.py +0 -0
  260. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/mcp/prompt_dispatch.py +0 -0
  261. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/mcp/prompts.py +0 -0
  262. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/mcp/redaction.py +0 -0
  263. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/mcp/skills.py +0 -0
  264. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/mcp/storage.py +0 -0
  265. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/mcp/tools.py +0 -0
  266. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/mcp/types.py +0 -0
  267. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/memory/__init__.py +0 -0
  268. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/memory/memory_manager.py +0 -0
  269. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/memory/memory_tools.py +0 -0
  270. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/memory/project_memory.py +0 -0
  271. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/memory/recall.py +0 -0
  272. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/__init__.py +0 -0
  273. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/config.py +0 -0
  274. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/constants.py +0 -0
  275. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/display_names.py +0 -0
  276. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/__init__.py +0 -0
  277. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/architecture_graph.py +0 -0
  278. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/architecture_meta.py +0 -0
  279. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/architecture_metas/Categories.json +0 -0
  280. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/architecture_metas/config.json +0 -0
  281. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/architecture_metas/products.json +0 -0
  282. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/architecture_resource_inventory.py +0 -0
  283. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/architecture_rule_candidates.py +0 -0
  284. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/architecture_rule_drafts.py +0 -0
  285. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/architecture_rule_facts.py +0 -0
  286. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/architecture_rules.json +0 -0
  287. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/architecture_rules.py +0 -0
  288. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/architecture_semantic_planning.py +0 -0
  289. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/ask_user_question_tool.py +0 -0
  290. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/cleanup.py +0 -0
  291. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/context.py +0 -0
  292. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/display_replay.py +0 -0
  293. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/events.py +0 -0
  294. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/handoff.py +0 -0
  295. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/interrupt.py +0 -0
  296. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/observability.py +0 -0
  297. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/prompts/interrupt_judge.md +0 -0
  298. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/public_errors.py +0 -0
  299. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/resume_recovery.py +0 -0
  300. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/session.py +0 -0
  301. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/show_diagram_tool.py +0 -0
  302. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/state_machine.py +0 -0
  303. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/sub_pipeline_executor.py +0 -0
  304. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/transcript_storage.py +0 -0
  305. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/ui_contract.py +0 -0
  306. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/engine/user_input.py +0 -0
  307. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/hooks/deploying.py +0 -0
  308. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/prompts/architecture_planning.md +0 -0
  309. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/prompts/confirm_and_select.a2a.md +0 -0
  310. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/prompts/confirm_and_select.md +0 -0
  311. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/prompts/evaluate_candidates.md +0 -0
  312. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/prompts/reviewing.md +0 -0
  313. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/references/cloud-products/oss.md +0 -0
  314. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/references/cloud-products/rds.md +0 -0
  315. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/references/cloud-products/redis.md +0 -0
  316. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/references/cloud-products/slb.md +0 -0
  317. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/references/cloud-products/vpc.md +0 -0
  318. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/references/ros-template.md +0 -0
  319. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/references/template-parameters.md +0 -0
  320. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/references/terraform-template.md +0 -0
  321. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-architecture/evals.json +0 -0
  322. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/oss.md +0 -0
  323. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/rds.md +0 -0
  324. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/redis.md +0 -0
  325. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/slb.md +0 -0
  326. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/vpc.md +0 -0
  327. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/ros-template.md +0 -0
  328. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/template-parameters.md +0 -0
  329. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/terraform-template.md +0 -0
  330. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/evals.json +0 -0
  331. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/oss.md +0 -0
  332. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/rds.md +0 -0
  333. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/redis.md +0 -0
  334. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/slb.md +0 -0
  335. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/vpc.md +0 -0
  336. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/ros-template.md +0 -0
  337. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/template-parameters.md +0 -0
  338. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/terraform-template.md +0 -0
  339. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-intent/evals.json +0 -0
  340. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-review/SKILL.md +0 -0
  341. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-review/evals.json +0 -0
  342. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/evals.json +0 -0
  343. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/oss.md +0 -0
  344. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/rds.md +0 -0
  345. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/redis.md +0 -0
  346. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/slb.md +0 -0
  347. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/vpc.md +0 -0
  348. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/ros-template.md +0 -0
  349. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/template-parameters.md +0 -0
  350. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/terraform-template.md +0 -0
  351. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/tools/__init__.py +0 -0
  352. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/tools/ros_template_tools.py +0 -0
  353. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/pipeline/selling/tools/show_candidate_detail_tool.py +0 -0
  354. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/providers/__init__.py +0 -0
  355. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/providers/anthropic_provider.py +0 -0
  356. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/providers/azure_openai_provider.py +0 -0
  357. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/providers/base.py +0 -0
  358. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/providers/dashscope_provider.py +0 -0
  359. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/providers/deepseek_provider.py +0 -0
  360. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/providers/gemini_provider.py +0 -0
  361. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/providers/kimi_provider.py +0 -0
  362. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/providers/lmstudio_provider.py +0 -0
  363. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/providers/minimax_provider.py +0 -0
  364. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/providers/modelscope_provider.py +0 -0
  365. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/providers/ollama_provider.py +0 -0
  366. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/providers/openai_provider.py +0 -0
  367. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/providers/openrouter_provider.py +0 -0
  368. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/providers/registry.py +0 -0
  369. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/providers/request_logging.py +0 -0
  370. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/providers/request_policy.py +0 -0
  371. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/providers/retry.py +0 -0
  372. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/providers/siliconflow_provider.py +0 -0
  373. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/providers/stream_watchdog.py +0 -0
  374. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/providers/thinking.py +0 -0
  375. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/providers/volcengine_provider.py +0 -0
  376. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/providers/zhipu_provider.py +0 -0
  377. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/__init__.py +0 -0
  378. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/capabilities/__init__.py +0 -0
  379. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/capabilities/auto_detect.py +0 -0
  380. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/capabilities/multimodal.py +0 -0
  381. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/cloud_credentials.py +0 -0
  382. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/context_manager.py +0 -0
  383. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/permissions/__init__.py +0 -0
  384. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/permissions/audit.py +0 -0
  385. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/permissions/loader.py +0 -0
  386. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/permissions/pipeline.py +0 -0
  387. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/permissions/rule_scope.py +0 -0
  388. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/permissions/storage.py +0 -0
  389. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/permissions/trusted_roots.py +0 -0
  390. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/providers/__init__.py +0 -0
  391. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/providers/aliyun_oauth.py +0 -0
  392. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/qwenpaw_source.py +0 -0
  393. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/session_backup_state.py +0 -0
  394. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/session_layout.py +0 -0
  395. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/session_metadata.py +0 -0
  396. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/session_resolver.py +0 -0
  397. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/session_storage.py +0 -0
  398. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/session_usage.py +0 -0
  399. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/telemetry/__init__.py +0 -0
  400. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/telemetry/attributes.py +0 -0
  401. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/telemetry/client.py +0 -0
  402. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/telemetry/constants.py +0 -0
  403. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/telemetry/content_serializer.py +0 -0
  404. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/telemetry/events.py +0 -0
  405. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/telemetry/fallback.py +0 -0
  406. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/telemetry/identity.py +0 -0
  407. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/telemetry/metrics.py +0 -0
  408. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/telemetry/names.py +0 -0
  409. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/telemetry/sanitize.py +0 -0
  410. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/telemetry/scope.py +0 -0
  411. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/telemetry/sink.py +0 -0
  412. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/telemetry/tracing.py +0 -0
  413. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/telemetry/types.py +0 -0
  414. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/token_budget.py +0 -0
  415. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/token_counter.py +0 -0
  416. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/services/update_checker.py +0 -0
  417. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/skills/__init__.py +0 -0
  418. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/skills/auto_trigger.py +0 -0
  419. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/skills/bundled/__init__.py +0 -0
  420. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/skills/bundled/iac_aliyun/SKILL.md +0 -0
  421. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/skills/bundled/iac_aliyun/__init__.py +0 -0
  422. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/skills/bundled/iac_aliyun/auto_trigger.py +0 -0
  423. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/oss.md +0 -0
  424. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/rds.md +0 -0
  425. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/redis.md +0 -0
  426. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/slb.md +0 -0
  427. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/vpc.md +0 -0
  428. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/skills/bundled/iac_aliyun/references/ros-template.md +0 -0
  429. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/skills/bundled/iac_aliyun/references/template-parameter-recommendation.md +0 -0
  430. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/skills/bundled/iac_aliyun/references/template-parameters.md +0 -0
  431. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/skills/bundled/iac_aliyun/references/terraform-template.md +0 -0
  432. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/skills/bundled/iac_aliyun/scripts/tf2ros.py +0 -0
  433. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/skills/bundled/pac_aliyun/SKILL.md +0 -0
  434. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/skills/bundled/pac_aliyun/__init__.py +0 -0
  435. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/skills/bundled/pac_aliyun/auto_trigger.py +0 -0
  436. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/skills/bundled/pac_aliyun/references/infraguard-policy-generation.md +0 -0
  437. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/skills/bundled/simplify.py +0 -0
  438. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/skills/discovery.py +0 -0
  439. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/skills/frontmatter.py +0 -0
  440. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/skills/listing.py +0 -0
  441. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/skills/loader.py +0 -0
  442. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/skills/management.py +0 -0
  443. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/skills/processor.py +0 -0
  444. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/skills/settings.py +0 -0
  445. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/skills/skill_definition.py +0 -0
  446. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/skills/skill_tool.py +0 -0
  447. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/state/__init__.py +0 -0
  448. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/state/app_state.py +0 -0
  449. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tasks/__init__.py +0 -0
  450. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tasks/notification_queue.py +0 -0
  451. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tasks/task_state.py +0 -0
  452. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tasks/task_tools.py +0 -0
  453. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/__init__.py +0 -0
  454. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/base.py +0 -0
  455. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/bash/__init__.py +0 -0
  456. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/bash/argv_safety.py +0 -0
  457. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/bash/command_parser.py +0 -0
  458. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/bash/mode_validation.py +0 -0
  459. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/bash/path_validation.py +0 -0
  460. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/bash/permissions.py +0 -0
  461. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/bash/readonly_commands.py +0 -0
  462. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/bash/rule_matching.py +0 -0
  463. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/bash/safety_checks.py +0 -0
  464. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/__init__.py +0 -0
  465. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/__init__.py +0 -0
  466. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/aliyun_api_doc.py +0 -0
  467. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/aliyun_doc_search.py +0 -0
  468. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/api_contract.py +0 -0
  469. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/api_hooks.py +0 -0
  470. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/api_identifiers.py +0 -0
  471. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/contract_store.py +0 -0
  472. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/data/README.md +0 -0
  473. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/data/endpoints/catalog.json +0 -0
  474. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/data/endpoints/generation_report.json +0 -0
  475. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/data/endpoints/legacy.yml +0 -0
  476. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/data/endpoints/overrides.yml +0 -0
  477. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/data/endpoints/unavailable.json +0 -0
  478. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/data/openmeta/api_overrides.yml +0 -0
  479. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/data/openmeta/exclusions.yml +0 -0
  480. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/data/openmeta/product_aliases.yml +0 -0
  481. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/data/openmeta/product_catalog.json +0 -0
  482. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/data/oss/operation_catalog.json +0 -0
  483. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/data/validation/judgments.yml +0 -0
  484. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/data/validation/overrides.yml +0 -0
  485. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/hooks/__init__.py +0 -0
  486. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/hooks/ros_parameters.py +0 -0
  487. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py +0 -0
  488. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/openmeta.py +0 -0
  489. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/oss_v4_adapter.py +0 -0
  490. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/product_resolver.py +0 -0
  491. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/result_contract.py +0 -0
  492. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/retry_policy.py +0 -0
  493. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_template_tools.py +0 -0
  494. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/__init__.py +0 -0
  495. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/action_policy.py +0 -0
  496. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/analyzer.py +0 -0
  497. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/association_property_specs.py +0 -0
  498. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/count.py +0 -0
  499. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_association_property_specs.json +0 -0
  500. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_official_resource_index.json +0 -0
  501. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_resource_value_specs.json +0 -0
  502. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_template_body_action_policies.json +0 -0
  503. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/facts.py +0 -0
  504. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/function_specs.py +0 -0
  505. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/model.py +0 -0
  506. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/outcome.py +0 -0
  507. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/parser.py +0 -0
  508. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/renderer.py +0 -0
  509. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/resource_value_specs.py +0 -0
  510. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/__init__.py +0 -0
  511. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/association_property.py +0 -0
  512. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/base.py +0 -0
  513. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/registry.py +0 -0
  514. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/symbols.py +0 -0
  515. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/template_kind.py +0 -0
  516. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/types.py +0 -0
  517. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/validator.py +0 -0
  518. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_yaml.py +0 -0
  519. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/runtime.py +0 -0
  520. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/template_source.py +0 -0
  521. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/user_agent.py +0 -0
  522. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/validation_policy.py +0 -0
  523. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/base_api.py +0 -0
  524. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/registry.py +0 -0
  525. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/cloud/types.py +0 -0
  526. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/edit_file.py +0 -0
  527. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/glob.py +0 -0
  528. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/list_files.py +0 -0
  529. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/path_safety.py +0 -0
  530. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/read_file.py +0 -0
  531. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/result_storage.py +0 -0
  532. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/tool_executor.py +0 -0
  533. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/web_fetch.py +0 -0
  534. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/tools/write_file.py +0 -0
  535. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/types/__init__.py +0 -0
  536. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/types/permissions.py +0 -0
  537. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/types/skill_source.py +0 -0
  538. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/__init__.py +0 -0
  539. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/components/__init__.py +0 -0
  540. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/components/candidate_selection.py +0 -0
  541. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/components/dialog.py +0 -0
  542. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/components/divider.py +0 -0
  543. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/components/fuzzy_picker.py +0 -0
  544. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/components/parallel_tabs.py +0 -0
  545. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/components/progress_bar.py +0 -0
  546. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/components/search_box.py +0 -0
  547. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/components/select.py +0 -0
  548. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/components/status_icon.py +0 -0
  549. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/components/tabs.py +0 -0
  550. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/core/__init__.py +0 -0
  551. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/core/in_place_render.py +0 -0
  552. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/core/input_history.py +0 -0
  553. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/core/key_event.py +0 -0
  554. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/core/prompt_input.py +0 -0
  555. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/core/raw_input.py +0 -0
  556. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/core/raw_input_win.py +0 -0
  557. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/core/screen.py +0 -0
  558. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/diagram_rendering.py +0 -0
  559. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/dialogs/__init__.py +0 -0
  560. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/dialogs/global_search.py +0 -0
  561. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/dialogs/history_search.py +0 -0
  562. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/dialogs/mcp_manager.py +0 -0
  563. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/dialogs/memory.py +0 -0
  564. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/dialogs/memory_editor.py +0 -0
  565. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/dialogs/model_picker.py +0 -0
  566. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/dialogs/quick_open.py +0 -0
  567. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/dialogs/resume_picker.py +0 -0
  568. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/dialogs/skills_picker.py +0 -0
  569. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/keybindings/__init__.py +0 -0
  570. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/keybindings/manager.py +0 -0
  571. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/pipeline_display_replay.py +0 -0
  572. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/pipeline_styles.py +0 -0
  573. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/spinner.py +0 -0
  574. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/stream_accumulator.py +0 -0
  575. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/suggestions/__init__.py +0 -0
  576. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/suggestions/aggregator.py +0 -0
  577. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/suggestions/command_provider.py +0 -0
  578. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/suggestions/directory_provider.py +0 -0
  579. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/suggestions/file_provider.py +0 -0
  580. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/suggestions/shell_history_provider.py +0 -0
  581. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/suggestions/skill_provider.py +0 -0
  582. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/suggestions/token_extractor.py +0 -0
  583. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/suggestions/types.py +0 -0
  584. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/ui/transcript_view.py +0 -0
  585. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/utils/__init__.py +0 -0
  586. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/utils/async_lifecycle.py +0 -0
  587. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/utils/background_housekeeping.py +0 -0
  588. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/utils/cleanup.py +0 -0
  589. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/utils/console.py +0 -0
  590. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/utils/image/__init__.py +0 -0
  591. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/utils/image/clipboard.py +0 -0
  592. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/utils/image/format_detect.py +0 -0
  593. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/utils/image/pasted_content.py +0 -0
  594. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/utils/image/processor.py +0 -0
  595. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/utils/image/resizer.py +0 -0
  596. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/utils/image/store.py +0 -0
  597. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/utils/json_utils.py +0 -0
  598. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/utils/path_components.py +0 -0
  599. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/utils/path_locks.py +0 -0
  600. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/utils/public_errors.py +0 -0
  601. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/utils/public_paths.py +0 -0
  602. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/utils/signals.py +0 -0
  603. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/utils/state_io.py +0 -0
  604. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/utils/tool_input_parser.py +0 -0
  605. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/utils/tool_result_redaction.py +0 -0
  606. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/utils/windows_paths.py +0 -0
  607. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/__init__.py +0 -0
  608. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/cleanup.py +0 -0
  609. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/commands.py +0 -0
  610. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/diagram_cache.py +0 -0
  611. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/diagram_optimizer.py +0 -0
  612. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/diagrams.py +0 -0
  613. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/files.py +0 -0
  614. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/images.py +0 -0
  615. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/mcp_settings.py +0 -0
  616. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/permissions.py +0 -0
  617. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/pipeline.py +0 -0
  618. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/pipeline_actions.py +0 -0
  619. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/pipeline_transcript.py +0 -0
  620. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/security.py +0 -0
  621. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/session_titler.py +0 -0
  622. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/shell.py +0 -0
  623. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/skills.py +0 -0
  624. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/static/icons/sidebar-new-thread.svg +0 -0
  625. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/static/icons/sidebar-project-open.svg +0 -0
  626. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/static/icons/sidebar-search.svg +0 -0
  627. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/static/icons/sidebar-settings.svg +0 -0
  628. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/static/icons/sidebar-skills.svg +0 -0
  629. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/static/js/components/blocking.js +0 -0
  630. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/static/js/components/composer.js +0 -0
  631. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/static/js/components/image_lightbox.js +0 -0
  632. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/static/js/components/pipeline.js +0 -0
  633. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/static/js/components/tool_cards.js +0 -0
  634. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/static/js/i18n.js +0 -0
  635. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/static/js/mermaid_render.js +0 -0
  636. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/static/js/token_transport.js +0 -0
  637. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/static/js/vendor/markdown-it.LICENSE +0 -0
  638. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/static/js/vendor/markdown-it.min.js +0 -0
  639. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/static/js/vendor/mermaid.LICENSE +0 -0
  640. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/static/js/vendor/mermaid.min.js +0 -0
  641. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/static/js/vendor/token-crypto.js +0 -0
  642. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code/web/token_transport.py +0 -0
  643. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code.egg-info/dependency_links.txt +0 -0
  644. {iac_code-0.11.3 → iac_code-0.12.0}/src/iac_code.egg-info/entry_points.txt +0 -0
  645. {iac_code-0.11.3 → iac_code-0.12.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.11.3
3
+ Version: 0.12.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
@@ -86,6 +86,18 @@ iac-code web
86
86
 
87
87
  By default it opens `http://127.0.0.1:8766` in your browser (loopback only). See the [Web App guide](https://aliyun.github.io/iac-code/web-app) for details.
88
88
 
89
+ ### Desktop App
90
+
91
+ For an installed native experience, download the package for your platform from [GitHub Releases](https://github.com/aliyun/iac-code/releases):
92
+
93
+ - macOS Apple Silicon: `.dmg`
94
+ - Windows x64: setup `.exe`
95
+ - Linux x64: `.AppImage` or `.deb`
96
+
97
+ The Desktop app runs the same IaC Code engine and uses the same providers, cloud credentials, settings, projects, and sessions as the CLI and Web app. On first launch, select the project directory you want IaC Code to work in. Windows also checks for Git Bash and guides you through installation if it is missing.
98
+
99
+ macOS, Windows, and AppImage builds can check for and apply cryptographically signed updates in the app. The deb package is updated by installing a newer package. Release installers do not yet carry commercial publisher signatures, so macOS or Windows may display an unknown-developer warning; verify the accompanying `SHA256SUMS` before installation. See the [Desktop App guide](https://aliyun.github.io/iac-code/docs/desktop-app) for installation and troubleshooting details.
100
+
89
101
  ## Contributing
90
102
 
91
103
  Install [uv](https://docs.astral.sh/uv/getting-started/installation/), then:
@@ -66,6 +66,18 @@ iac-code web
66
66
 
67
67
  By default it opens `http://127.0.0.1:8766` in your browser (loopback only). See the [Web App guide](https://aliyun.github.io/iac-code/web-app) for details.
68
68
 
69
+ ### Desktop App
70
+
71
+ For an installed native experience, download the package for your platform from [GitHub Releases](https://github.com/aliyun/iac-code/releases):
72
+
73
+ - macOS Apple Silicon: `.dmg`
74
+ - Windows x64: setup `.exe`
75
+ - Linux x64: `.AppImage` or `.deb`
76
+
77
+ The Desktop app runs the same IaC Code engine and uses the same providers, cloud credentials, settings, projects, and sessions as the CLI and Web app. On first launch, select the project directory you want IaC Code to work in. Windows also checks for Git Bash and guides you through installation if it is missing.
78
+
79
+ macOS, Windows, and AppImage builds can check for and apply cryptographically signed updates in the app. The deb package is updated by installing a newer package. Release installers do not yet carry commercial publisher signatures, so macOS or Windows may display an unknown-developer warning; verify the accompanying `SHA256SUMS` before installation. See the [Desktop App guide](https://aliyun.github.io/iac-code/docs/desktop-app) for installation and troubleshooting details.
80
+
69
81
  ## Contributing
70
82
 
71
83
  Install [uv](https://docs.astral.sh/uv/getting-started/installation/), then:
@@ -30,7 +30,11 @@ dependencies = [
30
30
  "alibabacloud-oss-v2>=1.2,<2",
31
31
  "aiohttp>=3.10,<4",
32
32
  "defusedxml>=0.7,<1",
33
- "alibabacloud-credentials>=0.3.0",
33
+ # >=1.0.8 for EcsRamRoleCredentialsProvider(async_update_enabled=...) and
34
+ # refreshable Credentials.get_expiration(), both required by the ECS RAM Role runtime.
35
+ "alibabacloud-credentials>=1.0.8",
36
+ # ICredentialsProvider is implemented directly by EcsRamRoleProviderAdapter.
37
+ "alibabacloud-credentials-api>=1.0.0",
34
38
  "loguru>=0.7.0",
35
39
  "opentelemetry-distro>=0.48b0",
36
40
  "opentelemetry-exporter-otlp>=1.27.0",
@@ -89,6 +93,12 @@ dev = [
89
93
  "tomli>=2.0; python_version<\"3.11\"",
90
94
  "pexpect>=4.9.0",
91
95
  ]
96
+ desktop = [
97
+ "a2a-sdk[http-server,signing]>=1.0.2,<2",
98
+ "pyinstaller==6.21.0",
99
+ "termaid>=0.1; python_version >= '3.11'",
100
+ "uvicorn[standard]>=0.30.0",
101
+ ]
92
102
 
93
103
  [build-system]
94
104
  requires = ["setuptools>=68.0"]
@@ -109,6 +119,7 @@ version = {attr = "iac_code.__version__"}
109
119
  "**/*.html",
110
120
  "**/*.css",
111
121
  "**/*.js",
122
+ "**/*.png",
112
123
  "**/*.svg",
113
124
  "**/*.LICENSE",
114
125
  "**/*.rego",
@@ -0,0 +1,2 @@
1
+ __version__ = "0.12.0"
2
+ __release_date__ = "2026-08-09"
@@ -1179,6 +1179,7 @@ class IacCodeA2AExecutor(AgentExecutor):
1179
1179
  cwd=cwd,
1180
1180
  resume_messages=resume_messages,
1181
1181
  a2a_safe_mode=_a2a_safe_mode_enabled(),
1182
+ source="a2a",
1182
1183
  )
1183
1184
  )
1184
1185
 
@@ -14,6 +14,7 @@ from iac_code.a2a.pipeline_journal import to_json_safe
14
14
  from iac_code.mcp.progress import mcp_progress_metadata
15
15
  from iac_code.pipeline.engine.events import PipelineEvent, PipelineEventType
16
16
  from iac_code.services.permissions.audit import build_input_summary, build_redacted_tool_input, fingerprint_text
17
+ from iac_code.tools.cloud.base_stack import stack_result_from_metadata
17
18
  from iac_code.types.stream_events import (
18
19
  AskUserQuestionEvent,
19
20
  CandidateDetailEvent,
@@ -900,7 +901,7 @@ class PipelineEventTranslator:
900
901
  action = operation["action"]
901
902
  params = operation["params"]
902
903
 
903
- result = _json_object_from_string(event.result)
904
+ result = stack_result_from_metadata(event.metadata) or _json_object_from_string(event.result)
904
905
  if result is None:
905
906
  return None
906
907
  is_success = _bool_or_none(result.get("is_success"))
@@ -1480,12 +1481,15 @@ def _safe_permission_field_name(key: Any) -> str:
1480
1481
 
1481
1482
 
1482
1483
  def _tool_result_data(event: ToolResultEvent) -> dict[str, Any]:
1483
- return {
1484
+ data = {
1484
1485
  "toolName": event.tool_name,
1485
1486
  "toolUseId": event.tool_use_id,
1486
1487
  "isError": event.is_error,
1487
1488
  "result": to_json_safe(event.result),
1488
1489
  }
1490
+ if stack_result := stack_result_from_metadata(event.metadata):
1491
+ data["stackResult"] = to_json_safe(stack_result)
1492
+ return data
1489
1493
 
1490
1494
 
1491
1495
  def _sanitize_tool_input(tool_input: dict[str, Any]) -> dict[str, Any]:
@@ -87,6 +87,7 @@ _COMMITTED_BACKUP_VISIBILITY = "committed"
87
87
  _WAITING_INPUT_CANCEL_LOCKS = PathLockRegistry()
88
88
  _TERMINAL_PUBLICATION_UNAVAILABLE_KIND = "terminal_publication_unavailable"
89
89
  _HANDOFF_PUBLICATION_UNAVAILABLE_ACTION = "switch_to_normal_unavailable"
90
+ _PREREQUISITE_METADATA_UNSET = object()
90
91
  _TERMINAL_EVENT_BY_SIDECAR_STATUS = {
91
92
  "completed": ("pipeline_completed", "completed"),
92
93
  "failed": ("pipeline_failed", "failed"),
@@ -320,6 +321,7 @@ class IacCodeA2APipelineExecutor:
320
321
  provider_config_frozen=self._provider_config_frozen,
321
322
  provider_config_override=self._provider_config_override,
322
323
  effort_override=self._effort_override,
324
+ source="a2a-pipeline",
323
325
  )
324
326
  )
325
327
 
@@ -419,12 +421,29 @@ class IacCodeA2APipelineExecutor:
419
421
  iac_code_session_id=ctx.session_id,
420
422
  )
421
423
  self._configure_agent_runtime_for_request(agent_runtime)
422
- pipeline = self._create_pipeline(
423
- session_id=ctx.session_id,
424
- cwd=cwd,
425
- runtime=agent_runtime,
426
- session_storage=session_storage,
427
- )
424
+ if os.environ.get("IAC_CODE_DESKTOP_RUNTIME") == "1":
425
+ prerequisite_metadata = await asyncio.to_thread(
426
+ self._inspect_pipeline_prerequisite_metadata,
427
+ pipeline_name=get_pipeline_name(),
428
+ cwd=cwd,
429
+ session_id=ctx.session_id,
430
+ session_storage=session_storage,
431
+ resume_from_sidecar=True,
432
+ )
433
+ pipeline = self._create_pipeline(
434
+ session_id=ctx.session_id,
435
+ cwd=cwd,
436
+ runtime=agent_runtime,
437
+ session_storage=session_storage,
438
+ prerequisite_metadata=prerequisite_metadata,
439
+ )
440
+ else:
441
+ pipeline = self._create_pipeline(
442
+ session_id=ctx.session_id,
443
+ cwd=cwd,
444
+ runtime=agent_runtime,
445
+ session_storage=session_storage,
446
+ )
428
447
  self._set_pipeline_telemetry_correlation(pipeline, task_id=task_id, context_id=context_id)
429
448
  publisher = self._publisher(
430
449
  event_queue=event_queue,
@@ -450,13 +469,14 @@ class IacCodeA2APipelineExecutor:
450
469
  ctx.runtime = pipeline_runtime
451
470
  self._task_store.mirror_context(ctx)
452
471
 
453
- def fresh_pipeline_factory() -> Any:
472
+ def create_fresh_pipeline(prerequisite_metadata: object = _PREREQUISITE_METADATA_UNSET) -> Any:
454
473
  fresh_pipeline = self._create_pipeline(
455
474
  session_id=ctx.session_id,
456
475
  cwd=cwd,
457
476
  runtime=agent_runtime,
458
477
  session_storage=session_storage,
459
478
  resume_from_sidecar=False,
479
+ prerequisite_metadata=prerequisite_metadata,
460
480
  )
461
481
  self._set_pipeline_telemetry_correlation(
462
482
  fresh_pipeline,
@@ -465,6 +485,22 @@ class IacCodeA2APipelineExecutor:
465
485
  )
466
486
  return fresh_pipeline
467
487
 
488
+ if os.environ.get("IAC_CODE_DESKTOP_RUNTIME") == "1":
489
+
490
+ async def fresh_pipeline_factory() -> Any:
491
+ prerequisite_metadata = await asyncio.to_thread(
492
+ self._inspect_pipeline_prerequisite_metadata,
493
+ pipeline_name=get_pipeline_name(),
494
+ cwd=cwd,
495
+ session_id=ctx.session_id,
496
+ session_storage=session_storage,
497
+ resume_from_sidecar=False,
498
+ )
499
+ return create_fresh_pipeline(prerequisite_metadata)
500
+
501
+ else:
502
+ fresh_pipeline_factory = create_fresh_pipeline
503
+
468
504
  selected = await self._select_stream(
469
505
  pipeline,
470
506
  prompt,
@@ -722,6 +758,7 @@ class IacCodeA2APipelineExecutor:
722
758
  provider_config_frozen=self._provider_config_frozen,
723
759
  provider_config_override=self._provider_config_override,
724
760
  effort_override=self._effort_override,
761
+ source="a2a-pipeline",
725
762
  )
726
763
  ),
727
764
  )
@@ -1154,17 +1191,20 @@ class IacCodeA2APipelineExecutor:
1154
1191
  runtime: Any,
1155
1192
  session_storage: SessionStorage,
1156
1193
  resume_from_sidecar: bool = True,
1194
+ prerequisite_metadata: object = _PREREQUISITE_METADATA_UNSET,
1157
1195
  ) -> Any:
1158
1196
  pipeline_name = get_pipeline_name()
1159
- prerequisite_resolution = self._inspect_pipeline_prerequisite_metadata(
1160
- pipeline_name=pipeline_name,
1161
- cwd=cwd,
1162
- session_id=session_id,
1163
- session_storage=session_storage,
1164
- resume_from_sidecar=resume_from_sidecar,
1165
- )
1197
+ prerequisite_resolution = prerequisite_metadata
1198
+ if prerequisite_resolution is _PREREQUISITE_METADATA_UNSET:
1199
+ prerequisite_resolution = self._inspect_pipeline_prerequisite_metadata(
1200
+ pipeline_name=pipeline_name,
1201
+ cwd=cwd,
1202
+ session_id=session_id,
1203
+ session_storage=session_storage,
1204
+ resume_from_sidecar=resume_from_sidecar,
1205
+ )
1166
1206
  create_kwargs: dict[str, Any] = {}
1167
- if prerequisite_resolution is not None:
1207
+ if isinstance(prerequisite_resolution, dict):
1168
1208
  create_kwargs["prerequisite_resolution"] = prerequisite_resolution
1169
1209
  delegated_factory = self._aliyun_delegated_executor_factory
1170
1210
  if delegated_factory is None:
@@ -1753,10 +1793,22 @@ class IacCodeA2APipelineExecutor:
1753
1793
  ctx=ctx,
1754
1794
  )
1755
1795
 
1796
+ async def after_enqueue(envelope: dict[str, Any]) -> None:
1797
+ await self._backup_after_pipeline_publication(
1798
+ envelope,
1799
+ publisher=publisher,
1800
+ pipeline=pipeline,
1801
+ cwd=cwd,
1802
+ session_id=session_id,
1803
+ task=task,
1804
+ ctx=ctx,
1805
+ )
1806
+
1756
1807
  async def after_backup_commit(envelope: dict[str, Any]) -> None:
1757
1808
  self._mirror_a2a_snapshots_for_pipeline_publication(envelope, task=task, ctx=ctx)
1758
1809
 
1759
1810
  publisher.before_enqueue = before_enqueue
1811
+ publisher.after_enqueue = after_enqueue
1760
1812
  publisher.after_backup_commit = after_backup_commit
1761
1813
 
1762
1814
  async def _backup_before_pipeline_publication(
@@ -1773,11 +1825,63 @@ class IacCodeA2APipelineExecutor:
1773
1825
  reason = _backup_reason_for_pipeline_envelope(envelope)
1774
1826
  if reason is None:
1775
1827
  return True
1828
+ if reason in {BackupReason.INPUT_REQUIRED, BackupReason.WAITING_INPUT}:
1829
+ return True
1776
1830
  if reason in {BackupReason.TERMINAL, BackupReason.HANDOFF_READY}:
1777
1831
  if _is_pending_backup_publication_event(envelope):
1778
1832
  return True
1779
1833
  else:
1780
1834
  self._mirror_a2a_snapshots_for_pipeline_publication(envelope, task=task, ctx=ctx)
1835
+ await self._backup_pipeline_publication(
1836
+ envelope,
1837
+ publisher=publisher,
1838
+ pipeline=pipeline,
1839
+ cwd=cwd,
1840
+ session_id=session_id,
1841
+ task=task,
1842
+ ctx=ctx,
1843
+ reason=reason,
1844
+ )
1845
+ return True
1846
+
1847
+ async def _backup_after_pipeline_publication(
1848
+ self,
1849
+ envelope: dict[str, Any],
1850
+ *,
1851
+ publisher: PipelineA2AEventPublisher,
1852
+ pipeline: Any,
1853
+ cwd: str,
1854
+ session_id: str,
1855
+ task: Any,
1856
+ ctx: Any,
1857
+ ) -> None:
1858
+ reason = _backup_reason_for_pipeline_envelope(envelope)
1859
+ if reason not in {BackupReason.INPUT_REQUIRED, BackupReason.WAITING_INPUT}:
1860
+ return
1861
+ self._mirror_a2a_snapshots_for_pipeline_publication(envelope, task=task, ctx=ctx)
1862
+ await self._backup_pipeline_publication(
1863
+ envelope,
1864
+ publisher=publisher,
1865
+ pipeline=pipeline,
1866
+ cwd=cwd,
1867
+ session_id=session_id,
1868
+ task=task,
1869
+ ctx=ctx,
1870
+ reason=reason,
1871
+ )
1872
+
1873
+ async def _backup_pipeline_publication(
1874
+ self,
1875
+ envelope: dict[str, Any],
1876
+ *,
1877
+ publisher: PipelineA2AEventPublisher,
1878
+ pipeline: Any,
1879
+ cwd: str,
1880
+ session_id: str,
1881
+ task: Any,
1882
+ ctx: Any,
1883
+ reason: BackupReason,
1884
+ ) -> None:
1781
1885
  publication_proofs = None
1782
1886
  if reason == BackupReason.HANDOFF_READY and envelope.get("visibility") == "committed":
1783
1887
  publication_proofs = {
@@ -1831,7 +1935,6 @@ class IacCodeA2APipelineExecutor:
1831
1935
  self._task_store.mirror_task(task)
1832
1936
  self._task_store.mirror_context(ctx)
1833
1937
  raise _PipelineBackupBlockedTransitionError from exc
1834
- return True
1835
1938
 
1836
1939
  def _mirror_a2a_snapshots_for_pipeline_publication(
1837
1940
  self,
@@ -2035,7 +2138,7 @@ class IacCodeA2APipelineExecutor:
2035
2138
  if status in _TERMINAL_SIDECAR_STATUSES:
2036
2139
  if _terminal_sidecar_matches_task(publisher, status, task_id=task_id, context_id=context_id):
2037
2140
  return _SelectedPipelineStream(pipeline=pipeline, stream=_empty_stream())
2038
- pipeline = self._fresh_pipeline_after_sidecar_mismatch(pipeline, fresh_pipeline_factory)
2141
+ pipeline = await self._fresh_pipeline_after_sidecar_mismatch(pipeline, fresh_pipeline_factory)
2039
2142
  return _SelectedPipelineStream(
2040
2143
  pipeline=pipeline,
2041
2144
  stream=pipeline.run(_pipeline_runner_input(pipeline_input)),
@@ -2045,13 +2148,16 @@ class IacCodeA2APipelineExecutor:
2045
2148
  stream=pipeline.run(_pipeline_runner_input(pipeline_input)),
2046
2149
  )
2047
2150
 
2048
- def _fresh_pipeline_after_sidecar_mismatch(
2151
+ async def _fresh_pipeline_after_sidecar_mismatch(
2049
2152
  self,
2050
2153
  pipeline: Any,
2051
2154
  fresh_pipeline_factory: Callable[[], Any],
2052
2155
  ) -> Any:
2053
2156
  self._clear_terminal_sidecar(pipeline)
2054
- return fresh_pipeline_factory()
2157
+ fresh_pipeline = fresh_pipeline_factory()
2158
+ if inspect.isawaitable(fresh_pipeline):
2159
+ return await fresh_pipeline
2160
+ return fresh_pipeline
2055
2161
 
2056
2162
  def _clear_terminal_sidecar(self, pipeline: Any) -> None:
2057
2163
  clear_sidecar = getattr(pipeline, "clear_sidecar", None)
@@ -50,6 +50,7 @@ from iac_code.utils.public_errors import sanitize_strict_text
50
50
 
51
51
  PipelinePermissionResolver = Callable[[PermissionRequestEvent], bool | Awaitable[bool]]
52
52
  PipelineBeforeEnqueueHook = Callable[[dict[str, Any]], bool | Awaitable[bool]]
53
+ PipelineAfterEnqueueHook = Callable[[dict[str, Any]], None | Awaitable[None]]
53
54
  PipelineAfterBackupCommitHook = Callable[[dict[str, Any]], None | Awaitable[None]]
54
55
  PipelineBackupCommitGate = Callable[[dict[str, Any]], bool]
55
56
  logger = logging.getLogger(__name__)
@@ -147,6 +148,7 @@ class PipelineA2AEventPublisher:
147
148
  delivery_task_id: str | None = None,
148
149
  delivery_context_id: str | None = None,
149
150
  before_enqueue: PipelineBeforeEnqueueHook | None = None,
151
+ after_enqueue: PipelineAfterEnqueueHook | None = None,
150
152
  after_backup_commit: PipelineAfterBackupCommitHook | None = None,
151
153
  backup_commit_gate: PipelineBackupCommitGate | None = None,
152
154
  extreme_performance: bool | None = None,
@@ -161,6 +163,7 @@ class PipelineA2AEventPublisher:
161
163
  self.delivery_task_id = delivery_task_id
162
164
  self.delivery_context_id = delivery_context_id
163
165
  self.before_enqueue = before_enqueue
166
+ self.after_enqueue = after_enqueue
164
167
  self.after_backup_commit = after_backup_commit
165
168
  self.backup_commit_gate = backup_commit_gate
166
169
  self.flow_monitor = flow_monitor
@@ -715,6 +718,7 @@ class PipelineA2AEventPublisher:
715
718
  await self._forward_local_pipeline_envelope(local_envelope)
716
719
  await self._enqueue_status(envelope, wait_for_transport=wait_for_transport)
717
720
  self.last_envelope = envelope
721
+ await self._run_after_enqueue_hook(envelope)
718
722
  return True
719
723
 
720
724
  async def _forward_local_pipeline_envelope(self, local_envelope: dict[str, Any]) -> None:
@@ -761,6 +765,8 @@ class PipelineA2AEventPublisher:
761
765
  pending,
762
766
  wait_for_transport=wait_for_transport,
763
767
  )
768
+ for envelope in deliverable:
769
+ await self._run_after_enqueue_hook(envelope)
764
770
  return frame_count
765
771
 
766
772
  async def _enqueue_persisted_batches(
@@ -899,6 +905,13 @@ class PipelineA2AEventPublisher:
899
905
  should_enqueue = await should_enqueue
900
906
  return should_enqueue is not False
901
907
 
908
+ async def _run_after_enqueue_hook(self, envelope: dict[str, Any]) -> None:
909
+ if self.after_enqueue is None:
910
+ return
911
+ result = self.after_enqueue(envelope)
912
+ if inspect.isawaitable(result):
913
+ await result
914
+
902
915
  async def _run_after_backup_commit_hook(self, envelope: dict[str, Any]) -> None:
903
916
  if self.after_backup_commit is None:
904
917
  return
@@ -57,6 +57,7 @@ class A2ATaskStore(TaskStore):
57
57
  self._sdk_tasks: dict[str, dict[str, Task]] = {}
58
58
  self._sdk_tasks_by_context: dict[str, dict[str, set[str]]] = {}
59
59
  self._tasks: dict[str, A2ATaskRecord] = {}
60
+ self._task_persistence_dirty: set[str] = set()
60
61
  self._contexts: dict[str, A2AContextRecord] = {}
61
62
  self._expired_task_tombstones: dict[str, float] = {}
62
63
  self._metrics = metrics or NoOpA2AMetrics()
@@ -99,22 +100,32 @@ class A2ATaskStore(TaskStore):
99
100
  owner_tasks[task_id] = _copy_task(task)
100
101
  self._sdk_tasks_by_context.setdefault(owner, {}).setdefault(task.context_id, set()).add(task_id)
101
102
  record = self._tasks.get(task_id)
103
+ next_state = _task_state_from_sdk_task(task)
104
+ # The SDK saves the full Task before yielding every streaming frame. Executors already
105
+ # mirror task records explicitly at output/state durability boundaries, so repeated SDK
106
+ # saves with the same projected state only need the session-local mirror below.
107
+ persist_shared_snapshot = (
108
+ record is None
109
+ or task_id in self._task_persistence_dirty
110
+ or record.state != next_state
111
+ or record.owner != owner
112
+ )
102
113
  if record is None:
103
114
  record = A2ATaskRecord(
104
115
  task_id=task_id,
105
116
  context_id=task.context_id,
106
- state=_task_state_from_sdk_task(task),
117
+ state=next_state,
107
118
  owner=owner,
108
119
  updated_at=_task_updated_at_from_sdk_task(task),
109
120
  )
110
121
  self._tasks[task_id] = record
111
122
  self._metrics.record_task_created()
112
123
  else:
113
- record.state = _task_state_from_sdk_task(task)
124
+ record.state = next_state
114
125
  record.owner = owner
115
126
  record.updated_at = _task_updated_at_from_sdk_task(task)
116
127
  record.touch()
117
- self._mirror_task(record)
128
+ self._mirror_task(record, persist_shared_snapshot=persist_shared_snapshot)
118
129
 
119
130
  def _attach_context_metadata(self, task: Task) -> None:
120
131
  context = self._contexts.get(task.context_id)
@@ -135,6 +146,7 @@ class A2ATaskStore(TaskStore):
135
146
  self._remove_sdk_task_from_index(owner, task_id, existing.context_id)
136
147
  owner_tasks.pop(task_id, None)
137
148
  self._tasks.pop(task_id, None)
149
+ self._task_persistence_dirty.discard(task_id)
138
150
  self._expired_task_tombstones.pop(task_id, None)
139
151
 
140
152
  async def list(self, params: ListTasksRequest, context: ServerCallContext | None = None) -> ListTasksResponse:
@@ -798,6 +810,7 @@ class A2ATaskStore(TaskStore):
798
810
  if now - expired_at > self._cleanup_interval_seconds:
799
811
  self._expired_task_tombstones.pop(task_id, None)
800
812
  self._tasks.pop(task_id, None)
813
+ self._task_persistence_dirty.discard(task_id)
801
814
  for owner, owner_tasks in list(self._sdk_tasks.items()):
802
815
  existing = owner_tasks.pop(task_id, None)
803
816
  if existing is not None:
@@ -846,7 +859,7 @@ class A2ATaskStore(TaskStore):
846
859
  except Exception:
847
860
  logger.exception("A2A cleanup loop failed")
848
861
 
849
- def _mirror_task(self, record: A2ATaskRecord) -> None:
862
+ def _mirror_task(self, record: A2ATaskRecord, *, persist_shared_snapshot: bool = True) -> None:
850
863
  snapshot = A2ATaskSnapshot(
851
864
  task_id=record.task_id,
852
865
  context_id=record.context_id,
@@ -855,10 +868,12 @@ class A2ATaskStore(TaskStore):
855
868
  output_text=list(record.output_text),
856
869
  updated_at=record.updated_at,
857
870
  )
858
- if self._persistence is not None:
871
+ if self._persistence is not None and persist_shared_snapshot:
859
872
  try:
860
873
  self._persistence.save_task(snapshot)
874
+ self._task_persistence_dirty.discard(record.task_id)
861
875
  except Exception:
876
+ self._task_persistence_dirty.add(record.task_id)
862
877
  logger.exception("Failed to persist A2A task %s", record.task_id)
863
878
  self._mirror_session_task(snapshot)
864
879
 
@@ -472,7 +472,11 @@ class IacCodeRequestHandler(DefaultRequestHandler):
472
472
  if task_id and isinstance(self.task_store, A2ATaskStore) and await self.task_store.is_task_active(task_id):
473
473
  task = await self.task_store.get(task_id, context)
474
474
  active_task = await self._active_task_registry.get(task_id)
475
- if task is not None and active_task is not None and task.status.state not in TERMINAL_TASK_STATES:
475
+ if (
476
+ task is not None
477
+ and active_task is not None
478
+ and task.status.state not in TERMINAL_TASK_STATES | INTERRUPTED_TASK_STATES
479
+ ):
476
480
  active_stream = self._on_active_message_send_stream(
477
481
  params,
478
482
  context,
@@ -803,7 +803,7 @@ class ACPServer:
803
803
  """Create an agent runtime, converting auth errors to ACP RequestError."""
804
804
  try:
805
805
  return create_agent_runtime(
806
- AgentFactoryOptions(model=model, session_id=session_id, cwd=cwd, mcp_configs=mcp_configs)
806
+ AgentFactoryOptions(model=model, session_id=session_id, cwd=cwd, mcp_configs=mcp_configs, source="acp")
807
807
  )
808
808
  except Exception as exc:
809
809
  if _is_auth_error(exc):
@@ -1602,7 +1602,11 @@ class AgentLoop:
1602
1602
  for request, result in denied_results
1603
1603
  ]
1604
1604
  for req, result in zip(requests, results):
1605
- if result.metadata and result.metadata.get("step_result") is not None:
1605
+ if (
1606
+ result.metadata
1607
+ and result.metadata.get("step_result") is not None
1608
+ and result.metadata.get("complete_step_terminal", True)
1609
+ ):
1606
1610
  terminal_step_result = True
1607
1611
  processed = self._result_storage.process(req.id, result.content)
1608
1612
  self._mark_read_memory_tool_result(req, result)
@@ -1815,10 +1819,12 @@ class AgentLoop:
1815
1819
  ALIYUN_HTTP_METADATA_KEY,
1816
1820
  sanitize_aliyun_http_metadata,
1817
1821
  )
1822
+ from iac_code.tools.cloud.base_stack import persisted_stack_metadata
1818
1823
 
1819
1824
  aliyun_http = sanitize_aliyun_http_metadata(result_metadata.get(ALIYUN_HTTP_METADATA_KEY))
1820
1825
  if aliyun_http is not None:
1821
1826
  metadata[ALIYUN_HTTP_METADATA_KEY] = aliyun_http
1827
+ metadata.update(persisted_stack_metadata(result_metadata))
1822
1828
  render_metadata = result_metadata.get(TOOL_RENDER_METADATA_KEY)
1823
1829
  if isinstance(render_metadata, dict):
1824
1830
  safe_render_metadata: dict[str, Any] = {}
@@ -187,6 +187,7 @@ class HeadlessRunner:
187
187
  cli_permission_mode=self._cli_permission_mode,
188
188
  resume_messages=resume_messages,
189
189
  mcp_elicitation_handler=_headless_mcp_elicitation_handler,
190
+ source="headless",
190
191
  )
191
192
  )
192
193
  self._runtime = runtime
@@ -12,12 +12,9 @@ import subprocess
12
12
  import typer
13
13
 
14
14
  from iac_code.i18n import _
15
- from iac_code.utils.platform import (
16
- _NPMMIRROR_CMD,
17
- GitBashNotFoundError,
18
- _clear_cache,
19
- _find_git_bash_path,
20
- )
15
+ from iac_code.services.git_bash import GitBashInstallError
16
+ from iac_code.services.git_bash import install_git_bash as _install_git_bash
17
+ from iac_code.utils.platform import GitBashNotFoundError, _clear_cache, _find_git_bash_path
21
18
 
22
19
 
23
20
  def install_git_bash() -> None:
@@ -43,42 +40,32 @@ def install_git_bash() -> None:
43
40
  typer.echo(_("Installing Git for Windows via npmmirror..."))
44
41
 
45
42
  try:
46
- result = subprocess.run(
47
- [
48
- "powershell",
49
- "-NoProfile",
50
- "-ExecutionPolicy",
51
- "Bypass",
52
- "-Command",
53
- _NPMMIRROR_CMD,
54
- ],
55
- check=False,
56
- )
57
- except FileNotFoundError:
58
- typer.echo(
59
- _("powershell.exe was not found on PATH; cannot run installer."),
60
- err=True,
61
- )
62
- raise typer.Exit(1)
63
-
64
- if result.returncode != 0:
65
- typer.echo(
66
- _("Installation failed (PowerShell exited with code {})").format(result.returncode),
67
- err=True,
68
- )
69
- raise typer.Exit(1)
70
-
71
- _clear_cache()
72
- try:
73
- path = _find_git_bash_path()
74
- except GitBashNotFoundError:
75
- typer.echo(
76
- _(
77
- "Installer exited but bash.exe was not found in common locations; "
78
- "UAC may have been cancelled or the installer used a non-standard path."
79
- ),
80
- err=True,
43
+ path = _install_git_bash(
44
+ run=subprocess.run,
45
+ find=_find_git_bash_path,
46
+ clear_cache=_clear_cache,
47
+ check_existing=False,
81
48
  )
49
+ except GitBashInstallError as exc:
50
+ reason = str(exc)
51
+ if reason == "powershell-not-found":
52
+ typer.echo(
53
+ _("powershell.exe was not found on PATH; cannot run installer."),
54
+ err=True,
55
+ )
56
+ elif reason.startswith("installer-exit:"):
57
+ typer.echo(
58
+ _("Installation failed (PowerShell exited with code {})").format(reason.partition(":")[2]),
59
+ err=True,
60
+ )
61
+ else:
62
+ typer.echo(
63
+ _(
64
+ "Installer exited but bash.exe was not found in common locations; "
65
+ "UAC may have been cancelled or the installer used a non-standard path."
66
+ ),
67
+ err=True,
68
+ )
82
69
  raise typer.Exit(1)
83
70
 
84
71
  typer.echo("✓ " + _("Git for Windows installed at {}").format(path))