iac-code 0.11.4__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.4 → iac_code-0.12.0}/PKG-INFO +13 -1
  2. {iac_code-0.11.4 → iac_code-0.12.0}/README.md +12 -0
  3. {iac_code-0.11.4 → 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.4 → iac_code-0.12.0}/src/iac_code/a2a/pipeline_executor.py +59 -18
  6. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/agent/agent_loop.py +5 -1
  7. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/cli/install_git_bash.py +28 -41
  8. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/cli/main.py +17 -10
  9. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/cli/process_mode.py +2 -2
  10. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/commands/auth.py +45 -9
  11. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/commands/clear.py +7 -8
  12. iac_code-0.12.0/src/iac_code/desktop/__init__.py +7 -0
  13. iac_code-0.12.0/src/iac_code/desktop/__main__.py +358 -0
  14. iac_code-0.12.0/src/iac_code/desktop/control.py +374 -0
  15. iac_code-0.12.0/src/iac_code/desktop/controller.py +107 -0
  16. iac_code-0.12.0/src/iac_code/desktop/diagnostics.py +133 -0
  17. iac_code-0.12.0/src/iac_code/desktop/download_journal.py +807 -0
  18. iac_code-0.12.0/src/iac_code/desktop/external_env.py +1156 -0
  19. iac_code-0.12.0/src/iac_code/desktop/git_bash.py +46 -0
  20. iac_code-0.12.0/src/iac_code/desktop/install_lock.py +121 -0
  21. iac_code-0.12.0/src/iac_code/desktop/loop_runner.py +36 -0
  22. iac_code-0.12.0/src/iac_code/desktop/native_preload_manifest.json +31 -0
  23. iac_code-0.12.0/src/iac_code/desktop/ports.py +81 -0
  24. iac_code-0.12.0/src/iac_code/desktop/probe_worker.py +511 -0
  25. iac_code-0.12.0/src/iac_code/desktop/runtime.py +87 -0
  26. iac_code-0.12.0/src/iac_code/desktop/tool_paths.py +80 -0
  27. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/i18n/locales/de/LC_MESSAGES/messages.mo +0 -0
  28. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/i18n/locales/de/LC_MESSAGES/messages.po +120 -2
  29. iac_code-0.12.0/src/iac_code/i18n/locales/de/LC_MESSAGES/webui.mo +0 -0
  30. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/i18n/locales/de/LC_MESSAGES/webui.po +136 -21
  31. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/i18n/locales/es/LC_MESSAGES/messages.mo +0 -0
  32. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/i18n/locales/es/LC_MESSAGES/messages.po +121 -2
  33. iac_code-0.12.0/src/iac_code/i18n/locales/es/LC_MESSAGES/webui.mo +0 -0
  34. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/i18n/locales/es/LC_MESSAGES/webui.po +139 -21
  35. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/i18n/locales/fr/LC_MESSAGES/messages.mo +0 -0
  36. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/i18n/locales/fr/LC_MESSAGES/messages.po +118 -2
  37. iac_code-0.12.0/src/iac_code/i18n/locales/fr/LC_MESSAGES/webui.mo +0 -0
  38. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/i18n/locales/fr/LC_MESSAGES/webui.po +135 -21
  39. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/i18n/locales/ja/LC_MESSAGES/messages.mo +0 -0
  40. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/i18n/locales/ja/LC_MESSAGES/messages.po +109 -2
  41. iac_code-0.12.0/src/iac_code/i18n/locales/ja/LC_MESSAGES/webui.mo +0 -0
  42. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/i18n/locales/ja/LC_MESSAGES/webui.po +119 -21
  43. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/i18n/locales/pt/LC_MESSAGES/messages.mo +0 -0
  44. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/i18n/locales/pt/LC_MESSAGES/messages.po +118 -2
  45. iac_code-0.12.0/src/iac_code/i18n/locales/pt/LC_MESSAGES/webui.mo +0 -0
  46. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/i18n/locales/pt/LC_MESSAGES/webui.po +133 -21
  47. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/i18n/locales/zh/LC_MESSAGES/messages.mo +0 -0
  48. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/i18n/locales/zh/LC_MESSAGES/messages.po +101 -6
  49. iac_code-0.12.0/src/iac_code/i18n/locales/zh/LC_MESSAGES/webui.mo +0 -0
  50. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/i18n/locales/zh/LC_MESSAGES/webui.po +117 -21
  51. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/mcp/client.py +37 -11
  52. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/mcp/oauth.py +12 -1
  53. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/complete_step_tool.py +77 -5
  54. iac_code-0.12.0/src/iac_code/pipeline/engine/hard_constraints.py +326 -0
  55. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/loader.py +38 -1
  56. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/prerequisites.py +165 -27
  57. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/step_executor.py +2 -0
  58. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/step_spec.py +1 -0
  59. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/types.py +1 -0
  60. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/pipeline.yaml +11 -1
  61. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/prompts/cost_estimating.md +13 -1
  62. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/prompts/deploying.md +3 -8
  63. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/prompts/intent_parsing.md +0 -1
  64. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/prompts/template_generating.md +1 -3
  65. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/references/cloud-products/ecs.md +23 -8
  66. {iac_code-0.11.4/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 +9 -5
  67. {iac_code-0.11.4/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 +68 -16
  68. {iac_code-0.11.4/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
  69. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-architecture/SKILL.md +43 -2
  70. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/SKILL.md +112 -6
  71. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/evals.json +41 -3
  72. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/ecs.md +23 -8
  73. {iac_code-0.11.4/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 +9 -5
  74. {iac_code-0.11.4/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 +68 -16
  75. {iac_code-0.11.4/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
  76. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/SKILL.md +6 -4
  77. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/ecs.md +23 -8
  78. {iac_code-0.11.4/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 +9 -5
  79. {iac_code-0.11.4/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 +68 -16
  80. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/template-parameter-recommendation.md +8 -4
  81. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-intent/SKILL.md +58 -3
  82. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/SKILL.md +9 -2
  83. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/ecs.md +23 -8
  84. {iac_code-0.11.4/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 +9 -5
  85. {iac_code-0.11.4/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 +68 -16
  86. {iac_code-0.11.4/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
  87. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/tools/infraguard_scan_tool.py +112 -11
  88. iac_code-0.12.0/src/iac_code/services/git_bash.py +62 -0
  89. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/providers/aliyun.py +64 -1
  90. iac_code-0.12.0/src/iac_code/services/providers/aliyun_credentials_runtime.py +427 -0
  91. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/session_index.py +21 -12
  92. iac_code-0.12.0/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/ecs.md +182 -0
  93. iac_code-0.12.0/src/iac_code/skills/bundled/iac_aliyun/references/solutions/iac-code-web.md +35 -0
  94. iac_code-0.12.0/src/iac_code/skills/bundled/iac_aliyun/references/solutions/iac-code-web.ros.yml +366 -0
  95. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/skills/renderer.py +30 -9
  96. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/bash/bash_tool.py +28 -9
  97. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/acs3_transport.py +25 -33
  98. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/aliyun_api.py +30 -13
  99. iac_code-0.12.0/src/iac_code/tools/cloud/aliyun/ecs_credential_errors.py +39 -0
  100. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/endpoint_resolver.py +25 -51
  101. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/public_errors.py +54 -0
  102. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_client.py +23 -12
  103. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_stack.py +39 -17
  104. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_stack_instances.py +28 -15
  105. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/grep.py +4 -2
  106. iac_code-0.12.0/src/iac_code/ui/assets/iac-code-terminal-logo.png +0 -0
  107. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/banner.py +123 -13
  108. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/repl.py +19 -12
  109. iac_code-0.12.0/src/iac_code/ui/terminal_image.py +257 -0
  110. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/utils/file_security.py +7 -2
  111. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/utils/platform.py +86 -11
  112. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/utils/project_paths.py +43 -6
  113. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/app.py +426 -45
  114. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/memory.py +7 -2
  115. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/pipeline_prerequisites.py +111 -18
  116. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/runtime.py +57 -10
  117. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/server.py +7 -2
  118. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/settings.py +42 -3
  119. iac_code-0.12.0/src/iac_code/web/static/icons/iac-code-logo.svg +28 -0
  120. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/static/index.html +7 -2
  121. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/static/js/api.js +19 -3
  122. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/static/js/app.js +263 -29
  123. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/static/js/components/output_panel.js +9 -0
  124. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/static/js/components/workspace.js +89 -11
  125. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/static/styles.css +129 -0
  126. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code.egg-info/PKG-INFO +13 -1
  127. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code.egg-info/SOURCES.txt +22 -0
  128. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code.egg-info/requires.txt +2 -1
  129. iac_code-0.11.4/src/iac_code/__init__.py +0 -2
  130. iac_code-0.11.4/src/iac_code/i18n/locales/de/LC_MESSAGES/webui.mo +0 -0
  131. iac_code-0.11.4/src/iac_code/i18n/locales/es/LC_MESSAGES/webui.mo +0 -0
  132. iac_code-0.11.4/src/iac_code/i18n/locales/fr/LC_MESSAGES/webui.mo +0 -0
  133. iac_code-0.11.4/src/iac_code/i18n/locales/ja/LC_MESSAGES/webui.mo +0 -0
  134. iac_code-0.11.4/src/iac_code/i18n/locales/pt/LC_MESSAGES/webui.mo +0 -0
  135. iac_code-0.11.4/src/iac_code/i18n/locales/zh/LC_MESSAGES/webui.mo +0 -0
  136. iac_code-0.11.4/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/ecs.md +0 -167
  137. iac_code-0.11.4/src/iac_code/skills/bundled/iac_aliyun/references/solutions/iac-code-web.md +0 -31
  138. iac_code-0.11.4/src/iac_code/skills/bundled/iac_aliyun/references/solutions/iac-code-web.ros.yml +0 -314
  139. {iac_code-0.11.4 → iac_code-0.12.0}/LICENSE +0 -0
  140. {iac_code-0.11.4 → iac_code-0.12.0}/MANIFEST.in +0 -0
  141. {iac_code-0.11.4 → iac_code-0.12.0}/setup.cfg +0 -0
  142. {iac_code-0.11.4 → iac_code-0.12.0}/setup.py +0 -0
  143. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/__init__.py +0 -0
  144. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/agent_card.py +0 -0
  145. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/app.py +0 -0
  146. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/artifacts.py +0 -0
  147. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/backup.py +0 -0
  148. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/client.py +0 -0
  149. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/events.py +0 -0
  150. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/executor.py +0 -0
  151. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/exposure.py +0 -0
  152. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/jsonrpc_passthrough.py +0 -0
  153. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/metadata_redaction.py +0 -0
  154. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/metrics.py +0 -0
  155. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/parts.py +0 -0
  156. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/persistence.py +0 -0
  157. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/pipeline_delta_coalescing.py +0 -0
  158. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/pipeline_events.py +0 -0
  159. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/pipeline_flow_monitor.py +0 -0
  160. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/pipeline_journal.py +0 -0
  161. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/pipeline_outbound.py +0 -0
  162. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/pipeline_paths.py +0 -0
  163. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/pipeline_performance.py +0 -0
  164. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/pipeline_recovery.py +0 -0
  165. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/pipeline_snapshot.py +0 -0
  166. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/pipeline_stream.py +0 -0
  167. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/pipeline_transport_delivery.py +0 -0
  168. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/projection.py +0 -0
  169. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/push.py +0 -0
  170. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/push_queue.py +0 -0
  171. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/push_secrets.py +0 -0
  172. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/push_worker.py +0 -0
  173. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/router.py +0 -0
  174. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/runtime_overrides.py +0 -0
  175. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/runtime_registry.py +0 -0
  176. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/signing.py +0 -0
  177. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/task_store.py +0 -0
  178. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/thinking_metadata.py +0 -0
  179. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/transport.py +0 -0
  180. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/transports/__init__.py +0 -0
  181. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/transports/base.py +0 -0
  182. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/transports/dispatcher.py +0 -0
  183. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/transports/grpc.py +0 -0
  184. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/transports/grpc_jsonrpc.py +0 -0
  185. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/transports/http.py +0 -0
  186. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/transports/redis_streams.py +0 -0
  187. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/transports/stdio.py +0 -0
  188. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/transports/unix.py +0 -0
  189. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/transports/websocket.py +0 -0
  190. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/a2a/types.py +0 -0
  191. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/acp/__init__.py +0 -0
  192. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/acp/convert.py +0 -0
  193. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/acp/http_sse.py +0 -0
  194. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/acp/mcp.py +0 -0
  195. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/acp/metrics.py +0 -0
  196. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/acp/runner.py +0 -0
  197. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/acp/server.py +0 -0
  198. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/acp/session.py +0 -0
  199. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/acp/slash_registry.py +0 -0
  200. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/acp/state.py +0 -0
  201. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/acp/tools.py +0 -0
  202. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/acp/types.py +0 -0
  203. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/acp/version.py +0 -0
  204. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/agent/__init__.py +0 -0
  205. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/agent/agent_tool.py +0 -0
  206. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/agent/agent_types.py +0 -0
  207. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/agent/message.py +0 -0
  208. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/agent/system_prompt.py +0 -0
  209. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/cli/__init__.py +0 -0
  210. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/cli/headless.py +0 -0
  211. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/cli/output_formats.py +0 -0
  212. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/cli/process_events.py +0 -0
  213. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/cli/process_protocol.py +0 -0
  214. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/cli/update.py +0 -0
  215. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/commands/__init__.py +0 -0
  216. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/commands/compact.py +0 -0
  217. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/commands/debug.py +0 -0
  218. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/commands/effort.py +0 -0
  219. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/commands/exit.py +0 -0
  220. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/commands/help.py +0 -0
  221. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/commands/mcp.py +0 -0
  222. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/commands/memory.py +0 -0
  223. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/commands/model.py +0 -0
  224. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/commands/prompt.py +0 -0
  225. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/commands/registry.py +0 -0
  226. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/commands/rename.py +0 -0
  227. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/commands/resume.py +0 -0
  228. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/commands/skills.py +0 -0
  229. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/commands/status.py +0 -0
  230. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/commands/tasks.py +0 -0
  231. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/commands/thinking_enabled.py +0 -0
  232. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/config.py +0 -0
  233. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/i18n/__init__.py +0 -0
  234. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/i18n/html_extractor.py +0 -0
  235. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/mcp/__init__.py +0 -0
  236. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/mcp/cli.py +0 -0
  237. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/mcp/config.py +0 -0
  238. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/mcp/env_expansion.py +0 -0
  239. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/mcp/errors.py +0 -0
  240. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/mcp/manager.py +0 -0
  241. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/mcp/output.py +0 -0
  242. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/mcp/progress.py +0 -0
  243. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/mcp/prompt_dispatch.py +0 -0
  244. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/mcp/prompts.py +0 -0
  245. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/mcp/redaction.py +0 -0
  246. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/mcp/skills.py +0 -0
  247. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/mcp/storage.py +0 -0
  248. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/mcp/tools.py +0 -0
  249. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/mcp/types.py +0 -0
  250. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/memory/__init__.py +0 -0
  251. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/memory/memory_manager.py +0 -0
  252. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/memory/memory_tools.py +0 -0
  253. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/memory/project_memory.py +0 -0
  254. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/memory/recall.py +0 -0
  255. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/__init__.py +0 -0
  256. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/config.py +0 -0
  257. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/constants.py +0 -0
  258. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/display_names.py +0 -0
  259. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/__init__.py +0 -0
  260. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/architecture_graph.py +0 -0
  261. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/architecture_meta.py +0 -0
  262. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/architecture_metas/Categories.json +0 -0
  263. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/architecture_metas/config.json +0 -0
  264. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/architecture_metas/products.json +0 -0
  265. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/architecture_resource_inventory.py +0 -0
  266. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/architecture_rule_candidates.py +0 -0
  267. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/architecture_rule_drafts.py +0 -0
  268. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/architecture_rule_facts.py +0 -0
  269. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/architecture_rules.json +0 -0
  270. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/architecture_rules.py +0 -0
  271. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/architecture_semantic_planning.py +0 -0
  272. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/ask_user_question_tool.py +0 -0
  273. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/cleanup.py +0 -0
  274. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/completion_guard_state.py +0 -0
  275. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/context.py +0 -0
  276. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/display_replay.py +0 -0
  277. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/events.py +0 -0
  278. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/handoff.py +0 -0
  279. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/interrupt.py +0 -0
  280. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/observability.py +0 -0
  281. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/pipeline_runner.py +0 -0
  282. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/prompts/interrupt_judge.md +0 -0
  283. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/public_errors.py +0 -0
  284. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/recovery.py +0 -0
  285. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/resume_recovery.py +0 -0
  286. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/session.py +0 -0
  287. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/show_diagram_tool.py +0 -0
  288. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/state_machine.py +0 -0
  289. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/sub_pipeline_executor.py +0 -0
  290. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/transcript_storage.py +0 -0
  291. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/ui_contract.py +0 -0
  292. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/engine/user_input.py +0 -0
  293. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/hooks/deploying.py +0 -0
  294. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/prompts/architecture_planning.md +0 -0
  295. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/prompts/confirm_and_select.a2a.md +0 -0
  296. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/prompts/confirm_and_select.md +0 -0
  297. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/prompts/evaluate_candidates.md +0 -0
  298. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/prompts/reviewing.md +0 -0
  299. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/references/cloud-products/oss.md +0 -0
  300. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/references/cloud-products/rds.md +0 -0
  301. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/references/cloud-products/redis.md +0 -0
  302. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/references/cloud-products/slb.md +0 -0
  303. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/references/cloud-products/vpc.md +0 -0
  304. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/references/ros-template.md +0 -0
  305. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/references/template-parameters.md +0 -0
  306. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/references/terraform-template.md +0 -0
  307. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-architecture/evals.json +0 -0
  308. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/oss.md +0 -0
  309. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/rds.md +0 -0
  310. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/redis.md +0 -0
  311. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/slb.md +0 -0
  312. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/vpc.md +0 -0
  313. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/ros-template.md +0 -0
  314. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/template-parameters.md +0 -0
  315. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/terraform-template.md +0 -0
  316. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/evals.json +0 -0
  317. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/oss.md +0 -0
  318. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/rds.md +0 -0
  319. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/redis.md +0 -0
  320. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/slb.md +0 -0
  321. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/vpc.md +0 -0
  322. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/ros-template.md +0 -0
  323. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/template-parameters.md +0 -0
  324. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/terraform-template.md +0 -0
  325. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-intent/evals.json +0 -0
  326. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-review/SKILL.md +0 -0
  327. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-review/evals.json +0 -0
  328. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/evals.json +0 -0
  329. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/oss.md +0 -0
  330. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/rds.md +0 -0
  331. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/redis.md +0 -0
  332. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/slb.md +0 -0
  333. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/vpc.md +0 -0
  334. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/ros-template.md +0 -0
  335. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/template-parameters.md +0 -0
  336. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/terraform-template.md +0 -0
  337. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/tools/__init__.py +0 -0
  338. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/tools/ros_deploy_tool.py +0 -0
  339. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/tools/ros_template_tools.py +0 -0
  340. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/pipeline/selling/tools/show_candidate_detail_tool.py +0 -0
  341. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/providers/__init__.py +0 -0
  342. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/providers/anthropic_provider.py +0 -0
  343. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/providers/azure_openai_provider.py +0 -0
  344. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/providers/base.py +0 -0
  345. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/providers/dashscope_provider.py +0 -0
  346. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/providers/deepseek_provider.py +0 -0
  347. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/providers/gemini_provider.py +0 -0
  348. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/providers/kimi_provider.py +0 -0
  349. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/providers/lmstudio_provider.py +0 -0
  350. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/providers/manager.py +0 -0
  351. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/providers/minimax_provider.py +0 -0
  352. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/providers/modelscope_provider.py +0 -0
  353. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/providers/ollama_provider.py +0 -0
  354. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/providers/openai_provider.py +0 -0
  355. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/providers/openrouter_provider.py +0 -0
  356. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/providers/registry.py +0 -0
  357. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/providers/request_logging.py +0 -0
  358. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/providers/request_policy.py +0 -0
  359. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/providers/retry.py +0 -0
  360. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/providers/siliconflow_provider.py +0 -0
  361. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/providers/stream_watchdog.py +0 -0
  362. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/providers/thinking.py +0 -0
  363. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/providers/volcengine_provider.py +0 -0
  364. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/providers/zhipu_provider.py +0 -0
  365. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/__init__.py +0 -0
  366. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/agent_factory.py +0 -0
  367. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/capabilities/__init__.py +0 -0
  368. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/capabilities/auto_detect.py +0 -0
  369. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/capabilities/multimodal.py +0 -0
  370. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/cloud_credentials.py +0 -0
  371. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/context_manager.py +0 -0
  372. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/permissions/__init__.py +0 -0
  373. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/permissions/audit.py +0 -0
  374. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/permissions/loader.py +0 -0
  375. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/permissions/pipeline.py +0 -0
  376. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/permissions/rule_scope.py +0 -0
  377. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/permissions/storage.py +0 -0
  378. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/permissions/trusted_roots.py +0 -0
  379. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/providers/__init__.py +0 -0
  380. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/providers/aliyun_oauth.py +0 -0
  381. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/qwenpaw_source.py +0 -0
  382. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/session_backup.py +0 -0
  383. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/session_backup_state.py +0 -0
  384. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/session_layout.py +0 -0
  385. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/session_logging.py +0 -0
  386. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/session_metadata.py +0 -0
  387. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/session_resolver.py +0 -0
  388. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/session_storage.py +0 -0
  389. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/session_usage.py +0 -0
  390. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/telemetry/__init__.py +0 -0
  391. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/telemetry/attributes.py +0 -0
  392. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/telemetry/client.py +0 -0
  393. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/telemetry/config.py +0 -0
  394. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/telemetry/constants.py +0 -0
  395. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/telemetry/content_serializer.py +0 -0
  396. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/telemetry/events.py +0 -0
  397. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/telemetry/fallback.py +0 -0
  398. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/telemetry/identity.py +0 -0
  399. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/telemetry/metrics.py +0 -0
  400. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/telemetry/names.py +0 -0
  401. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/telemetry/sanitize.py +0 -0
  402. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/telemetry/scope.py +0 -0
  403. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/telemetry/sink.py +0 -0
  404. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/telemetry/tracing.py +0 -0
  405. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/telemetry/types.py +0 -0
  406. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/token_budget.py +0 -0
  407. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/token_counter.py +0 -0
  408. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/services/update_checker.py +0 -0
  409. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/skills/__init__.py +0 -0
  410. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/skills/auto_trigger.py +0 -0
  411. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/skills/bundled/__init__.py +0 -0
  412. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/skills/bundled/iac_aliyun/SKILL.md +0 -0
  413. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/skills/bundled/iac_aliyun/__init__.py +0 -0
  414. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/skills/bundled/iac_aliyun/auto_trigger.py +0 -0
  415. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/oss.md +0 -0
  416. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/rds.md +0 -0
  417. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/redis.md +0 -0
  418. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/slb.md +0 -0
  419. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/vpc.md +0 -0
  420. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/skills/bundled/iac_aliyun/references/ros-template.md +0 -0
  421. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/skills/bundled/iac_aliyun/references/template-parameter-recommendation.md +0 -0
  422. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/skills/bundled/iac_aliyun/references/template-parameters.md +0 -0
  423. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/skills/bundled/iac_aliyun/references/terraform-template.md +0 -0
  424. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/skills/bundled/iac_aliyun/scripts/tf2ros.py +0 -0
  425. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/skills/bundled/pac_aliyun/SKILL.md +0 -0
  426. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/skills/bundled/pac_aliyun/__init__.py +0 -0
  427. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/skills/bundled/pac_aliyun/auto_trigger.py +0 -0
  428. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/skills/bundled/pac_aliyun/references/infraguard-policy-generation.md +0 -0
  429. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/skills/bundled/simplify.py +0 -0
  430. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/skills/discovery.py +0 -0
  431. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/skills/frontmatter.py +0 -0
  432. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/skills/listing.py +0 -0
  433. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/skills/loader.py +0 -0
  434. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/skills/management.py +0 -0
  435. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/skills/processor.py +0 -0
  436. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/skills/settings.py +0 -0
  437. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/skills/skill_definition.py +0 -0
  438. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/skills/skill_tool.py +0 -0
  439. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/state/__init__.py +0 -0
  440. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/state/app_state.py +0 -0
  441. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tasks/__init__.py +0 -0
  442. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tasks/notification_queue.py +0 -0
  443. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tasks/task_state.py +0 -0
  444. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tasks/task_tools.py +0 -0
  445. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/__init__.py +0 -0
  446. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/base.py +0 -0
  447. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/bash/__init__.py +0 -0
  448. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/bash/argv_safety.py +0 -0
  449. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/bash/command_parser.py +0 -0
  450. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/bash/mode_validation.py +0 -0
  451. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/bash/path_validation.py +0 -0
  452. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/bash/permissions.py +0 -0
  453. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/bash/readonly_commands.py +0 -0
  454. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/bash/rule_matching.py +0 -0
  455. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/bash/safety_checks.py +0 -0
  456. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/__init__.py +0 -0
  457. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/__init__.py +0 -0
  458. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/aliyun_api_doc.py +0 -0
  459. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/aliyun_doc_search.py +0 -0
  460. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/api_contract.py +0 -0
  461. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/api_hooks.py +0 -0
  462. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/api_identifiers.py +0 -0
  463. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/contract_store.py +0 -0
  464. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/data/README.md +0 -0
  465. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/data/endpoints/catalog.json +0 -0
  466. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/data/endpoints/generation_report.json +0 -0
  467. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/data/endpoints/legacy.yml +0 -0
  468. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/data/endpoints/overrides.yml +0 -0
  469. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/data/endpoints/unavailable.json +0 -0
  470. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/data/openmeta/api_overrides.yml +0 -0
  471. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/data/openmeta/exclusions.yml +0 -0
  472. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/data/openmeta/product_aliases.yml +0 -0
  473. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/data/openmeta/product_catalog.json +0 -0
  474. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/data/oss/operation_catalog.json +0 -0
  475. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/data/validation/judgments.yml +0 -0
  476. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/data/validation/overrides.yml +0 -0
  477. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/hooks/__init__.py +0 -0
  478. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/hooks/ros_parameters.py +0 -0
  479. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py +0 -0
  480. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/openmeta.py +0 -0
  481. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/oss_v4_adapter.py +0 -0
  482. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/product_resolver.py +0 -0
  483. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/result_contract.py +0 -0
  484. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/retry_policy.py +0 -0
  485. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_template_tools.py +0 -0
  486. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/__init__.py +0 -0
  487. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/action_policy.py +0 -0
  488. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/analyzer.py +0 -0
  489. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/association_property_specs.py +0 -0
  490. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/count.py +0 -0
  491. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_association_property_specs.json +0 -0
  492. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_official_resource_index.json +0 -0
  493. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_resource_value_specs.json +0 -0
  494. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_template_body_action_policies.json +0 -0
  495. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/facts.py +0 -0
  496. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/function_specs.py +0 -0
  497. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/model.py +0 -0
  498. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/outcome.py +0 -0
  499. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/parser.py +0 -0
  500. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/renderer.py +0 -0
  501. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/resource_value_specs.py +0 -0
  502. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/__init__.py +0 -0
  503. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/association_property.py +0 -0
  504. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/base.py +0 -0
  505. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/registry.py +0 -0
  506. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/symbols.py +0 -0
  507. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/template_kind.py +0 -0
  508. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/types.py +0 -0
  509. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_validation/validator.py +0 -0
  510. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/ros_yaml.py +0 -0
  511. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/runtime.py +0 -0
  512. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/template_source.py +0 -0
  513. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/user_agent.py +0 -0
  514. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/aliyun/validation_policy.py +0 -0
  515. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/base_api.py +0 -0
  516. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/base_stack.py +0 -0
  517. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/registry.py +0 -0
  518. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/cloud/types.py +0 -0
  519. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/edit_file.py +0 -0
  520. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/glob.py +0 -0
  521. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/list_files.py +0 -0
  522. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/path_safety.py +0 -0
  523. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/read_file.py +0 -0
  524. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/result_storage.py +0 -0
  525. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/tool_executor.py +0 -0
  526. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/web_fetch.py +0 -0
  527. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/tools/write_file.py +0 -0
  528. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/types/__init__.py +0 -0
  529. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/types/permissions.py +0 -0
  530. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/types/skill_source.py +0 -0
  531. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/types/stream_events.py +0 -0
  532. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/__init__.py +0 -0
  533. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/components/__init__.py +0 -0
  534. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/components/candidate_selection.py +0 -0
  535. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/components/dialog.py +0 -0
  536. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/components/divider.py +0 -0
  537. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/components/fuzzy_picker.py +0 -0
  538. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/components/parallel_tabs.py +0 -0
  539. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/components/progress_bar.py +0 -0
  540. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/components/search_box.py +0 -0
  541. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/components/select.py +0 -0
  542. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/components/status_icon.py +0 -0
  543. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/components/tabs.py +0 -0
  544. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/core/__init__.py +0 -0
  545. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/core/in_place_render.py +0 -0
  546. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/core/input_history.py +0 -0
  547. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/core/key_event.py +0 -0
  548. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/core/prompt_input.py +0 -0
  549. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/core/raw_input.py +0 -0
  550. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/core/raw_input_win.py +0 -0
  551. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/core/screen.py +0 -0
  552. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/diagram_rendering.py +0 -0
  553. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/dialogs/__init__.py +0 -0
  554. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/dialogs/global_search.py +0 -0
  555. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/dialogs/history_search.py +0 -0
  556. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/dialogs/mcp_manager.py +0 -0
  557. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/dialogs/memory.py +0 -0
  558. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/dialogs/memory_editor.py +0 -0
  559. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/dialogs/model_picker.py +0 -0
  560. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/dialogs/quick_open.py +0 -0
  561. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/dialogs/resume_picker.py +0 -0
  562. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/dialogs/skills_picker.py +0 -0
  563. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/keybindings/__init__.py +0 -0
  564. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/keybindings/manager.py +0 -0
  565. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/pipeline_display_replay.py +0 -0
  566. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/pipeline_styles.py +0 -0
  567. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/renderer.py +0 -0
  568. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/spinner.py +0 -0
  569. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/stream_accumulator.py +0 -0
  570. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/suggestions/__init__.py +0 -0
  571. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/suggestions/aggregator.py +0 -0
  572. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/suggestions/command_provider.py +0 -0
  573. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/suggestions/directory_provider.py +0 -0
  574. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/suggestions/file_provider.py +0 -0
  575. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/suggestions/shell_history_provider.py +0 -0
  576. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/suggestions/skill_provider.py +0 -0
  577. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/suggestions/token_extractor.py +0 -0
  578. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/suggestions/types.py +0 -0
  579. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/ui/transcript_view.py +0 -0
  580. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/utils/__init__.py +0 -0
  581. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/utils/async_lifecycle.py +0 -0
  582. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/utils/background_housekeeping.py +0 -0
  583. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/utils/cleanup.py +0 -0
  584. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/utils/console.py +0 -0
  585. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/utils/image/__init__.py +0 -0
  586. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/utils/image/clipboard.py +0 -0
  587. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/utils/image/format_detect.py +0 -0
  588. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/utils/image/pasted_content.py +0 -0
  589. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/utils/image/processor.py +0 -0
  590. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/utils/image/resizer.py +0 -0
  591. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/utils/image/store.py +0 -0
  592. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/utils/json_utils.py +0 -0
  593. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/utils/log.py +0 -0
  594. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/utils/path_components.py +0 -0
  595. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/utils/path_locks.py +0 -0
  596. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/utils/public_errors.py +0 -0
  597. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/utils/public_paths.py +0 -0
  598. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/utils/signals.py +0 -0
  599. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/utils/state_io.py +0 -0
  600. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/utils/tool_input_parser.py +0 -0
  601. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/utils/tool_result_redaction.py +0 -0
  602. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/utils/windows_paths.py +0 -0
  603. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/__init__.py +0 -0
  604. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/cleanup.py +0 -0
  605. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/commands.py +0 -0
  606. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/diagram_cache.py +0 -0
  607. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/diagram_optimizer.py +0 -0
  608. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/diagrams.py +0 -0
  609. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/events.py +0 -0
  610. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/files.py +0 -0
  611. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/images.py +0 -0
  612. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/mcp_settings.py +0 -0
  613. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/outputs.py +0 -0
  614. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/permissions.py +0 -0
  615. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/pipeline.py +0 -0
  616. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/pipeline_actions.py +0 -0
  617. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/pipeline_transcript.py +0 -0
  618. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/security.py +0 -0
  619. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/session_manager.py +0 -0
  620. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/session_titler.py +0 -0
  621. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/shell.py +0 -0
  622. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/skills.py +0 -0
  623. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/static/icons/sidebar-new-thread.svg +0 -0
  624. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/static/icons/sidebar-project-open.svg +0 -0
  625. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/static/icons/sidebar-search.svg +0 -0
  626. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/static/icons/sidebar-settings.svg +0 -0
  627. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/static/icons/sidebar-skills.svg +0 -0
  628. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/static/js/components/blocking.js +0 -0
  629. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/static/js/components/composer.js +0 -0
  630. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/static/js/components/image_lightbox.js +0 -0
  631. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/static/js/components/pipeline.js +0 -0
  632. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/static/js/components/tool_cards.js +0 -0
  633. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/static/js/events.js +0 -0
  634. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/static/js/i18n.js +0 -0
  635. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/static/js/mermaid_render.js +0 -0
  636. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/static/js/token_transport.js +0 -0
  637. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/static/js/vendor/markdown-it.LICENSE +0 -0
  638. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/static/js/vendor/markdown-it.min.js +0 -0
  639. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/static/js/vendor/mermaid.LICENSE +0 -0
  640. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/static/js/vendor/mermaid.min.js +0 -0
  641. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/static/js/vendor/token-crypto.js +0 -0
  642. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code/web/token_transport.py +0 -0
  643. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code.egg-info/dependency_links.txt +0 -0
  644. {iac_code-0.11.4 → iac_code-0.12.0}/src/iac_code.egg-info/entry_points.txt +0 -0
  645. {iac_code-0.11.4 → 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.4
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"
@@ -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"),
@@ -420,12 +421,29 @@ class IacCodeA2APipelineExecutor:
420
421
  iac_code_session_id=ctx.session_id,
421
422
  )
422
423
  self._configure_agent_runtime_for_request(agent_runtime)
423
- pipeline = self._create_pipeline(
424
- session_id=ctx.session_id,
425
- cwd=cwd,
426
- runtime=agent_runtime,
427
- session_storage=session_storage,
428
- )
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
+ )
429
447
  self._set_pipeline_telemetry_correlation(pipeline, task_id=task_id, context_id=context_id)
430
448
  publisher = self._publisher(
431
449
  event_queue=event_queue,
@@ -451,13 +469,14 @@ class IacCodeA2APipelineExecutor:
451
469
  ctx.runtime = pipeline_runtime
452
470
  self._task_store.mirror_context(ctx)
453
471
 
454
- def fresh_pipeline_factory() -> Any:
472
+ def create_fresh_pipeline(prerequisite_metadata: object = _PREREQUISITE_METADATA_UNSET) -> Any:
455
473
  fresh_pipeline = self._create_pipeline(
456
474
  session_id=ctx.session_id,
457
475
  cwd=cwd,
458
476
  runtime=agent_runtime,
459
477
  session_storage=session_storage,
460
478
  resume_from_sidecar=False,
479
+ prerequisite_metadata=prerequisite_metadata,
461
480
  )
462
481
  self._set_pipeline_telemetry_correlation(
463
482
  fresh_pipeline,
@@ -466,6 +485,22 @@ class IacCodeA2APipelineExecutor:
466
485
  )
467
486
  return fresh_pipeline
468
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
+
469
504
  selected = await self._select_stream(
470
505
  pipeline,
471
506
  prompt,
@@ -1156,17 +1191,20 @@ class IacCodeA2APipelineExecutor:
1156
1191
  runtime: Any,
1157
1192
  session_storage: SessionStorage,
1158
1193
  resume_from_sidecar: bool = True,
1194
+ prerequisite_metadata: object = _PREREQUISITE_METADATA_UNSET,
1159
1195
  ) -> Any:
1160
1196
  pipeline_name = get_pipeline_name()
1161
- prerequisite_resolution = self._inspect_pipeline_prerequisite_metadata(
1162
- pipeline_name=pipeline_name,
1163
- cwd=cwd,
1164
- session_id=session_id,
1165
- session_storage=session_storage,
1166
- resume_from_sidecar=resume_from_sidecar,
1167
- )
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
+ )
1168
1206
  create_kwargs: dict[str, Any] = {}
1169
- if prerequisite_resolution is not None:
1207
+ if isinstance(prerequisite_resolution, dict):
1170
1208
  create_kwargs["prerequisite_resolution"] = prerequisite_resolution
1171
1209
  delegated_factory = self._aliyun_delegated_executor_factory
1172
1210
  if delegated_factory is None:
@@ -2100,7 +2138,7 @@ class IacCodeA2APipelineExecutor:
2100
2138
  if status in _TERMINAL_SIDECAR_STATUSES:
2101
2139
  if _terminal_sidecar_matches_task(publisher, status, task_id=task_id, context_id=context_id):
2102
2140
  return _SelectedPipelineStream(pipeline=pipeline, stream=_empty_stream())
2103
- pipeline = self._fresh_pipeline_after_sidecar_mismatch(pipeline, fresh_pipeline_factory)
2141
+ pipeline = await self._fresh_pipeline_after_sidecar_mismatch(pipeline, fresh_pipeline_factory)
2104
2142
  return _SelectedPipelineStream(
2105
2143
  pipeline=pipeline,
2106
2144
  stream=pipeline.run(_pipeline_runner_input(pipeline_input)),
@@ -2110,13 +2148,16 @@ class IacCodeA2APipelineExecutor:
2110
2148
  stream=pipeline.run(_pipeline_runner_input(pipeline_input)),
2111
2149
  )
2112
2150
 
2113
- def _fresh_pipeline_after_sidecar_mismatch(
2151
+ async def _fresh_pipeline_after_sidecar_mismatch(
2114
2152
  self,
2115
2153
  pipeline: Any,
2116
2154
  fresh_pipeline_factory: Callable[[], Any],
2117
2155
  ) -> Any:
2118
2156
  self._clear_terminal_sidecar(pipeline)
2119
- 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
2120
2161
 
2121
2162
  def _clear_terminal_sidecar(self, pipeline: Any) -> None:
2122
2163
  clear_sidecar = getattr(pipeline, "clear_sidecar", None)
@@ -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)
@@ -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))
@@ -67,6 +67,21 @@ def _piped_repl_requires_tty_message(piped_input: str) -> str:
67
67
  return _("Interactive REPL input requires a terminal. Use `iac-code --prompt -` for non-interactive stdin input.")
68
68
 
69
69
 
70
+ def _require_windows_git_bash() -> None:
71
+ """Apply the same startup prerequisite check to interactive and Web modes."""
72
+ if sys.platform != "win32":
73
+ return
74
+ from iac_code.utils.platform import GitBashNotFoundError, PlatformInfo
75
+
76
+ try:
77
+ PlatformInfo.detect()
78
+ except GitBashNotFoundError as exc:
79
+ from rich.console import Console
80
+
81
+ Console(stderr=True).print("[red]✗[/red] {}".format(exc), soft_wrap=True)
82
+ raise SystemExit(1)
83
+
84
+
70
85
  # `install-git-bash` is a Windows-only helper that installs Git for Windows
71
86
  # via the npmmirror mirror. We register it conditionally so it does not
72
87
  # show up in --help on non-Windows platforms (where it could not work).
@@ -101,6 +116,7 @@ def web(
101
116
  ),
102
117
  ) -> None:
103
118
  """Run iac-code as a local Web app."""
119
+ _require_windows_git_bash()
104
120
  from iac_code.services.telemetry import bootstrap_telemetry, graceful_shutdown
105
121
  from iac_code.web.server import run_web_server
106
122
  from iac_code.web.settings import developer_settings
@@ -206,16 +222,7 @@ def main(
206
222
  enable_virtual_terminal()
207
223
 
208
224
  # On Windows, verify Git Bash is available before proceeding.
209
- if sys.platform == "win32":
210
- from iac_code.utils.platform import GitBashNotFoundError, PlatformInfo
211
-
212
- try:
213
- PlatformInfo.detect()
214
- except GitBashNotFoundError as e:
215
- from rich.console import Console
216
-
217
- Console(stderr=True).print(f"[red]✗[/red] {e}", soft_wrap=True)
218
- raise SystemExit(1)
225
+ _require_windows_git_bash()
219
226
 
220
227
  if resume and continue_session:
221
228
  typer.echo(_("Error: --resume and --continue cannot be used together."), err=True)
@@ -35,7 +35,7 @@ from iac_code.types.stream_events import (
35
35
  TextDeltaEvent,
36
36
  Usage,
37
37
  )
38
- from iac_code.utils.project_paths import get_session_path
38
+ from iac_code.utils.project_paths import project_dir_candidates
39
39
 
40
40
  EXIT_OK = 0
41
41
  EXIT_ERROR = 1
@@ -75,7 +75,7 @@ class ProcessSessionLock:
75
75
  """Cross-process advisory lock for a single cwd/session_id pair."""
76
76
 
77
77
  def __init__(self, *, cwd: str, session_id: str) -> None:
78
- session_path = get_session_path(cwd, session_id)
78
+ session_path = project_dir_candidates(cwd)[0] / f"{session_id}.jsonl"
79
79
  self._lock_path = session_path.with_name(f".{session_path.name}.process.lock")
80
80
  self._lock_file: IO[bytes] | None = None
81
81
 
@@ -640,8 +640,12 @@ def _input_masked(title: str, prompt: str, existing: str | None = None) -> str |
640
640
  return "".join(chars) if chars else None
641
641
 
642
642
 
643
- def _input_text(title: str, prompt: str) -> str | None | _BackSentinel:
644
- """Full-screen text input. Returns str, None (Ctrl+C), or _BACK (Esc)."""
643
+ def _input_text(title: str, prompt: str, *, allow_empty: bool = False) -> str | None | _BackSentinel:
644
+ """Full-screen text input. Returns str, None (Ctrl+C), or _BACK (Esc).
645
+
646
+ With `allow_empty=True`, confirming an empty buffer returns `""` instead of `None`,
647
+ which lets an optional field be left blank on purpose.
648
+ """
645
649
  chars: list[str] = []
646
650
  hints = "Enter {} Esc {}".format(_("Confirm"), _("Back"))
647
651
 
@@ -725,6 +729,8 @@ def _input_text(title: str, prompt: str) -> str | None | _BackSentinel:
725
729
  finally:
726
730
  termios.tcsetattr(fd, termios.TCSADRAIN, old)
727
731
 
732
+ if not chars and allow_empty:
733
+ return ""
728
734
  return "".join(chars) if chars else None
729
735
 
730
736
 
@@ -1197,6 +1203,8 @@ def _aliyun_credential_mode_label(mode: str) -> str:
1197
1203
  return _("STS Token")
1198
1204
  if mode == "RamRoleArn":
1199
1205
  return _("RAM Role")
1206
+ if mode == "EcsRamRole":
1207
+ return _("ECS RAM Role")
1200
1208
  if mode == "OAuth":
1201
1209
  return _("OAuth Login (Browser)")
1202
1210
  return mode
@@ -1209,6 +1217,7 @@ def _aliyun_credential_field_label(label: str) -> str:
1209
1217
  "STS Token": _("STS Token"),
1210
1218
  "RAM Role ARN": _("RAM Role ARN"),
1211
1219
  "Session Name": _("Session Name"),
1220
+ "ECS RAM Role Name": _("ECS RAM Role Name"),
1212
1221
  "OAuth Site Type": _("OAuth Site Type"),
1213
1222
  "OAuth Access Token": _("OAuth Access Token"),
1214
1223
  "OAuth Refresh Token": _("OAuth Refresh Token"),
@@ -1228,6 +1237,11 @@ def _format_aliyun_credential_field_value(
1228
1237
  if field_name in _ALIYUN_EPOCH_FIELDS:
1229
1238
  return _format_local_epoch(raw_value)
1230
1239
 
1240
+ if field_name == "ram_role_name" and raw_value in ("", None):
1241
+ # An empty role name is a valid configuration, not a missing value: the runtime
1242
+ # discovers the bound role from ECS metadata.
1243
+ return _("Auto-detect from ECS metadata")
1244
+
1231
1245
  value = str(raw_value) if raw_value not in ("", None) else ""
1232
1246
  if value and sensitive:
1233
1247
  value = mask_sensitive(value)
@@ -1415,6 +1429,7 @@ def _aliyun_credential_flow() -> str | None | _BackSentinel:
1415
1429
  from iac_code.services.providers.aliyun import (
1416
1430
  CREDENTIAL_MODES,
1417
1431
  MODE_FIELDS,
1432
+ MODE_REQUIRED_FIELDS,
1418
1433
  AliyunCredential,
1419
1434
  AliyunCredentials,
1420
1435
  )
@@ -1468,13 +1483,23 @@ def _aliyun_credential_flow() -> str | None | _BackSentinel:
1468
1483
  if existing_cred and existing_cred.mode == selected_mode:
1469
1484
  existing_value = getattr(existing_cred, field_name, "") or None
1470
1485
 
1486
+ # The ECS role name is optional: blank means auto-detect from instance metadata,
1487
+ # so an empty buffer must be accepted both when configuring and when clearing.
1488
+ optional_field = field_name == "ram_role_name"
1489
+ field_label = label
1490
+ if optional_field:
1491
+ field_label = "{} ({})".format(
1492
+ _aliyun_credential_field_label(label),
1493
+ _("Leave blank to auto-detect from ECS metadata"),
1494
+ )
1495
+
1471
1496
  if sensitive:
1472
- value = _input_masked(title, f"{label}: ", existing=existing_value)
1497
+ value = _input_masked(title, f"{field_label}: ", existing=existing_value)
1473
1498
  else:
1474
1499
  if existing_value:
1475
- value = _input_text_with_default(title, label, existing_value)
1500
+ value = _input_text_with_default(title, field_label, existing_value, allow_empty=optional_field)
1476
1501
  else:
1477
- value = _input_text(title, f"{label}: ")
1502
+ value = _input_text(title, f"{field_label}: ", allow_empty=optional_field)
1478
1503
 
1479
1504
  if value is _BACK:
1480
1505
  break # Go back to mode selection
@@ -1486,8 +1511,10 @@ def _aliyun_credential_flow() -> str | None | _BackSentinel:
1486
1511
  if len(field_values) != len(mode_fields):
1487
1512
  continue # User pressed back during field input
1488
1513
 
1489
- # Validate that required fields are not empty
1490
- if not all(field_values.values()):
1514
+ # Validate that required fields are not empty; optional fields such as the ECS
1515
+ # role name may legitimately stay blank.
1516
+ required_fields = MODE_REQUIRED_FIELDS.get(selected_mode, set())
1517
+ if not all(field_values.get(field_name) for field_name in required_fields):
1491
1518
  continue
1492
1519
 
1493
1520
  # Build credential and save
@@ -1499,6 +1526,7 @@ def _aliyun_credential_flow() -> str | None | _BackSentinel:
1499
1526
  sts_token=field_values.get("sts_token", ""),
1500
1527
  ram_role_arn=field_values.get("ram_role_arn", ""),
1501
1528
  ram_session_name=field_values.get("ram_session_name", ""),
1529
+ ram_role_name=field_values.get("ram_role_name", ""),
1502
1530
  )
1503
1531
  AliyunCredentials.save(cred)
1504
1532
  return _("Configured: Alibaba Cloud credentials saved to ~/.iac-code")
@@ -1537,8 +1565,14 @@ def _aliyun_region_flow() -> str | None | _BackSentinel:
1537
1565
  return _("Configured: Alibaba Cloud region saved to ~/.iac-code")
1538
1566
 
1539
1567
 
1540
- def _input_text_with_default(title: str, label: str, default: str) -> str | None | _BackSentinel:
1541
- """Full-screen text input with a default value shown. Returns str, None (Ctrl+C), or _BACK (Esc)."""
1568
+ def _input_text_with_default(
1569
+ title: str, label: str, default: str, *, allow_empty: bool = False
1570
+ ) -> str | None | _BackSentinel:
1571
+ """Full-screen text input with a default value shown. Returns str, None (Ctrl+C), or _BACK (Esc).
1572
+
1573
+ With `allow_empty=True`, confirming an emptied buffer returns `""` instead of `None`,
1574
+ which lets a previously configured optional value be cleared.
1575
+ """
1542
1576
  chars: list[str] = list(default)
1543
1577
  hints = "Enter {} Esc {}".format(_("Confirm"), _("Back"))
1544
1578
 
@@ -1622,4 +1656,6 @@ def _input_text_with_default(title: str, label: str, default: str) -> str | None
1622
1656
  finally:
1623
1657
  termios.tcsetattr(fd, termios.TCSADRAIN, old)
1624
1658
 
1659
+ if not chars and allow_empty:
1660
+ return ""
1625
1661
  return "".join(chars) if chars else None
@@ -27,20 +27,19 @@ async def clear_command(context=None, **kwargs) -> str:
27
27
  console.file.flush()
28
28
 
29
29
  # Re-render the welcome banner
30
- from iac_code.ui.banner import render_welcome_banner
30
+ from iac_code.ui.banner import print_welcome_banner
31
31
 
32
32
  state = store.get_state() if store else None
33
33
  if state:
34
34
  repl = getattr(context, "repl", None)
35
35
  session_id = getattr(repl, "_session_id", None)
36
36
  session_name = getattr(repl, "_session_name", None)
37
- console.print(
38
- render_welcome_banner(
39
- state.model,
40
- state.cwd,
41
- session_id=session_id if isinstance(session_id, str) else None,
42
- session_name=session_name if isinstance(session_name, str) else None,
43
- )
37
+ print_welcome_banner(
38
+ console,
39
+ state.model,
40
+ state.cwd,
41
+ session_id=session_id if isinstance(session_id, str) else None,
42
+ session_name=session_name if isinstance(session_name, str) else None,
44
43
  )
45
44
 
46
45
  return ""
@@ -0,0 +1,7 @@
1
+ """Desktop-only runtime support for the Tauri sidecar distribution."""
2
+
3
+ from iac_code.desktop.runtime import DesktopInstallContext, DesktopRuntimeConfig
4
+
5
+ DESKTOP_PROTOCOL_VERSION = 1
6
+
7
+ __all__ = ["DESKTOP_PROTOCOL_VERSION", "DesktopInstallContext", "DesktopRuntimeConfig"]