iac-code 0.13.0__tar.gz → 0.14.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 (663) hide show
  1. {iac_code-0.13.0 → iac_code-0.14.0}/PKG-INFO +7 -9
  2. {iac_code-0.13.0 → iac_code-0.14.0}/pyproject.toml +10 -2
  3. {iac_code-0.13.0 → iac_code-0.14.0}/setup.py +14 -1
  4. iac_code-0.14.0/src/iac_code/__init__.py +2 -0
  5. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/app.py +147 -5
  6. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/backup.py +2 -1
  7. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/client.py +136 -4
  8. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/events.py +137 -53
  9. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/executor.py +803 -87
  10. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/input_required.py +396 -29
  11. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/parts.py +15 -0
  12. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/persistence.py +3 -0
  13. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/pipeline_events.py +19 -0
  14. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/pipeline_executor.py +299 -40
  15. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/pipeline_stream.py +210 -35
  16. iac_code-0.14.0/src/iac_code/a2a/request_mode.py +28 -0
  17. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/runtime_overrides.py +4 -1
  18. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/task_store.py +119 -10
  19. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/transports/dispatcher.py +164 -5
  20. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/types.py +1 -0
  21. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/agent/agent_loop.py +597 -7
  22. iac_code-0.14.0/src/iac_code/agui/__init__.py +1 -0
  23. iac_code-0.14.0/src/iac_code/agui/adapter.py +1439 -0
  24. iac_code-0.14.0/src/iac_code/agui/app.py +341 -0
  25. iac_code-0.14.0/src/iac_code/agui/errors.py +111 -0
  26. iac_code-0.14.0/src/iac_code/agui/events.py +933 -0
  27. iac_code-0.14.0/src/iac_code/agui/inputs.py +190 -0
  28. iac_code-0.14.0/src/iac_code/agui/process.py +94 -0
  29. iac_code-0.14.0/src/iac_code/agui/server.py +84 -0
  30. iac_code-0.14.0/src/iac_code/agui/state.py +131 -0
  31. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/cli/main.py +121 -0
  32. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/config.py +3 -3
  33. iac_code-0.14.0/src/iac_code/i18n/locales/de/LC_MESSAGES/messages.mo +0 -0
  34. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/i18n/locales/de/LC_MESSAGES/messages.po +347 -3
  35. iac_code-0.14.0/src/iac_code/i18n/locales/es/LC_MESSAGES/messages.mo +0 -0
  36. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/i18n/locales/es/LC_MESSAGES/messages.po +349 -3
  37. iac_code-0.14.0/src/iac_code/i18n/locales/fr/LC_MESSAGES/messages.mo +0 -0
  38. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/i18n/locales/fr/LC_MESSAGES/messages.po +347 -3
  39. iac_code-0.14.0/src/iac_code/i18n/locales/ja/LC_MESSAGES/messages.mo +0 -0
  40. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/i18n/locales/ja/LC_MESSAGES/messages.po +341 -3
  41. iac_code-0.14.0/src/iac_code/i18n/locales/pt/LC_MESSAGES/messages.mo +0 -0
  42. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/i18n/locales/pt/LC_MESSAGES/messages.po +347 -3
  43. iac_code-0.14.0/src/iac_code/i18n/locales/zh/LC_MESSAGES/messages.mo +0 -0
  44. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/i18n/locales/zh/LC_MESSAGES/messages.po +341 -3
  45. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/mcp/manager.py +18 -4
  46. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/mcp/oauth.py +6 -5
  47. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/mcp/storage.py +3 -7
  48. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/mcp/types.py +17 -4
  49. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/pipeline_runner.py +117 -2
  50. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/step_executor.py +4 -1
  51. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/tools/ros_deploy_tool.py +4 -0
  52. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/providers/dashscope_provider.py +13 -0
  53. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/providers/manager.py +99 -5
  54. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/providers/registry.py +19 -2
  55. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/providers/thinking.py +44 -0
  56. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/providers/zhipu_provider.py +1 -1
  57. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/agent_factory.py +1 -1
  58. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/context_manager.py +13 -0
  59. iac_code-0.14.0/src/iac_code/services/permission_wait.py +1280 -0
  60. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/permissions/pipeline.py +30 -8
  61. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/providers/aliyun.py +150 -48
  62. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/session_layout.py +8 -0
  63. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/session_storage.py +1 -0
  64. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/telemetry/__init__.py +2 -0
  65. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/telemetry/attributes.py +29 -2
  66. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/telemetry/constants.py +10 -0
  67. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/aliyun_api.py +11 -2
  68. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/types/stream_events.py +27 -1
  69. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/utils/state_io.py +37 -0
  70. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/app.py +161 -10
  71. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/permissions.py +2 -0
  72. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/pipeline_actions.py +92 -15
  73. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/runtime.py +217 -35
  74. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/session_manager.py +397 -5
  75. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/session_titler.py +18 -3
  76. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/static/index.html +1 -1
  77. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/static/js/app.js +341 -54
  78. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code.egg-info/PKG-INFO +7 -9
  79. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code.egg-info/SOURCES.txt +11 -0
  80. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code.egg-info/requires.txt +6 -0
  81. iac_code-0.13.0/src/iac_code/__init__.py +0 -2
  82. iac_code-0.13.0/src/iac_code/i18n/locales/de/LC_MESSAGES/messages.mo +0 -0
  83. iac_code-0.13.0/src/iac_code/i18n/locales/es/LC_MESSAGES/messages.mo +0 -0
  84. iac_code-0.13.0/src/iac_code/i18n/locales/fr/LC_MESSAGES/messages.mo +0 -0
  85. iac_code-0.13.0/src/iac_code/i18n/locales/ja/LC_MESSAGES/messages.mo +0 -0
  86. iac_code-0.13.0/src/iac_code/i18n/locales/pt/LC_MESSAGES/messages.mo +0 -0
  87. iac_code-0.13.0/src/iac_code/i18n/locales/zh/LC_MESSAGES/messages.mo +0 -0
  88. {iac_code-0.13.0 → iac_code-0.14.0}/LICENSE +0 -0
  89. {iac_code-0.13.0 → iac_code-0.14.0}/MANIFEST.in +0 -0
  90. {iac_code-0.13.0 → iac_code-0.14.0}/README.md +0 -0
  91. {iac_code-0.13.0 → iac_code-0.14.0}/setup.cfg +0 -0
  92. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/__init__.py +0 -0
  93. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/agent_card.py +0 -0
  94. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/artifacts.py +0 -0
  95. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/exposure.py +0 -0
  96. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/jsonrpc_passthrough.py +0 -0
  97. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/metadata_redaction.py +0 -0
  98. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/metrics.py +0 -0
  99. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/pipeline_delta_coalescing.py +0 -0
  100. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/pipeline_flow_monitor.py +0 -0
  101. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/pipeline_journal.py +0 -0
  102. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/pipeline_outbound.py +0 -0
  103. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/pipeline_paths.py +0 -0
  104. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/pipeline_performance.py +0 -0
  105. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/pipeline_recovery.py +0 -0
  106. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/pipeline_snapshot.py +0 -0
  107. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/pipeline_transport_delivery.py +0 -0
  108. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/projection.py +0 -0
  109. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/push.py +0 -0
  110. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/push_queue.py +0 -0
  111. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/push_secrets.py +0 -0
  112. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/push_worker.py +0 -0
  113. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/router.py +0 -0
  114. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/runtime_registry.py +0 -0
  115. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/signing.py +0 -0
  116. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/thinking_metadata.py +0 -0
  117. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/transport.py +0 -0
  118. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/transports/__init__.py +0 -0
  119. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/transports/base.py +0 -0
  120. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/transports/grpc.py +0 -0
  121. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/transports/grpc_jsonrpc.py +0 -0
  122. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/transports/http.py +0 -0
  123. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/transports/redis_streams.py +0 -0
  124. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/transports/stdio.py +0 -0
  125. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/transports/unix.py +0 -0
  126. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/a2a/transports/websocket.py +0 -0
  127. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/acp/__init__.py +0 -0
  128. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/acp/convert.py +0 -0
  129. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/acp/http_sse.py +0 -0
  130. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/acp/mcp.py +0 -0
  131. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/acp/metrics.py +0 -0
  132. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/acp/runner.py +0 -0
  133. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/acp/server.py +0 -0
  134. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/acp/session.py +0 -0
  135. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/acp/slash_registry.py +0 -0
  136. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/acp/state.py +0 -0
  137. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/acp/tools.py +0 -0
  138. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/acp/types.py +0 -0
  139. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/acp/version.py +0 -0
  140. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/agent/__init__.py +0 -0
  141. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/agent/agent_tool.py +0 -0
  142. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/agent/agent_types.py +0 -0
  143. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/agent/message.py +0 -0
  144. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/agent/system_prompt.py +0 -0
  145. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/cli/__init__.py +0 -0
  146. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/cli/headless.py +0 -0
  147. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/cli/install_git_bash.py +0 -0
  148. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/cli/output_formats.py +0 -0
  149. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/cli/process_events.py +0 -0
  150. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/cli/process_mode.py +0 -0
  151. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/cli/process_protocol.py +0 -0
  152. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/cli/update.py +0 -0
  153. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/commands/__init__.py +0 -0
  154. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/commands/auth.py +0 -0
  155. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/commands/clear.py +0 -0
  156. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/commands/compact.py +0 -0
  157. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/commands/debug.py +0 -0
  158. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/commands/effort.py +0 -0
  159. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/commands/exit.py +0 -0
  160. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/commands/help.py +0 -0
  161. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/commands/mcp.py +0 -0
  162. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/commands/memory.py +0 -0
  163. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/commands/model.py +0 -0
  164. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/commands/prompt.py +0 -0
  165. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/commands/registry.py +0 -0
  166. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/commands/rename.py +0 -0
  167. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/commands/resume.py +0 -0
  168. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/commands/skills.py +0 -0
  169. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/commands/status.py +0 -0
  170. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/commands/tasks.py +0 -0
  171. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/commands/thinking_enabled.py +0 -0
  172. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/desktop/__init__.py +0 -0
  173. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/desktop/__main__.py +0 -0
  174. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/desktop/control.py +0 -0
  175. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/desktop/controller.py +0 -0
  176. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/desktop/diagnostics.py +0 -0
  177. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/desktop/download_journal.py +0 -0
  178. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/desktop/external_env.py +0 -0
  179. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/desktop/git_bash.py +0 -0
  180. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/desktop/install_lock.py +0 -0
  181. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/desktop/loop_runner.py +0 -0
  182. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/desktop/native_preload_manifest.json +0 -0
  183. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/desktop/ports.py +0 -0
  184. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/desktop/probe_worker.py +0 -0
  185. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/desktop/runtime.py +0 -0
  186. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/desktop/tool_paths.py +0 -0
  187. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/i18n/__init__.py +0 -0
  188. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/i18n/html_extractor.py +0 -0
  189. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/i18n/locales/de/LC_MESSAGES/webui.mo +0 -0
  190. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/i18n/locales/de/LC_MESSAGES/webui.po +0 -0
  191. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/i18n/locales/es/LC_MESSAGES/webui.mo +0 -0
  192. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/i18n/locales/es/LC_MESSAGES/webui.po +0 -0
  193. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/i18n/locales/fr/LC_MESSAGES/webui.mo +0 -0
  194. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/i18n/locales/fr/LC_MESSAGES/webui.po +0 -0
  195. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/i18n/locales/ja/LC_MESSAGES/webui.mo +0 -0
  196. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/i18n/locales/ja/LC_MESSAGES/webui.po +0 -0
  197. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/i18n/locales/pt/LC_MESSAGES/webui.mo +0 -0
  198. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/i18n/locales/pt/LC_MESSAGES/webui.po +0 -0
  199. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/i18n/locales/zh/LC_MESSAGES/webui.mo +0 -0
  200. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/i18n/locales/zh/LC_MESSAGES/webui.po +0 -0
  201. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/mcp/__init__.py +0 -0
  202. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/mcp/cli.py +0 -0
  203. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/mcp/client.py +0 -0
  204. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/mcp/config.py +0 -0
  205. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/mcp/env_expansion.py +0 -0
  206. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/mcp/errors.py +0 -0
  207. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/mcp/output.py +0 -0
  208. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/mcp/progress.py +0 -0
  209. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/mcp/prompt_dispatch.py +0 -0
  210. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/mcp/prompts.py +0 -0
  211. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/mcp/redaction.py +0 -0
  212. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/mcp/skills.py +0 -0
  213. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/mcp/tools.py +0 -0
  214. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/memory/__init__.py +0 -0
  215. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/memory/memory_manager.py +0 -0
  216. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/memory/memory_tools.py +0 -0
  217. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/memory/project_memory.py +0 -0
  218. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/memory/recall.py +0 -0
  219. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/__init__.py +0 -0
  220. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/config.py +0 -0
  221. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/constants.py +0 -0
  222. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/display_names.py +0 -0
  223. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/__init__.py +0 -0
  224. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/architecture_graph.py +0 -0
  225. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/architecture_meta.py +0 -0
  226. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/architecture_metas/Categories.json +0 -0
  227. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/architecture_metas/config.json +0 -0
  228. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/architecture_metas/products.json +0 -0
  229. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/architecture_resource_inventory.py +0 -0
  230. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/architecture_rule_candidates.py +0 -0
  231. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/architecture_rule_drafts.py +0 -0
  232. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/architecture_rule_facts.py +0 -0
  233. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/architecture_rules.json +0 -0
  234. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/architecture_rules.py +0 -0
  235. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/architecture_semantic_planning.py +0 -0
  236. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/ask_user_question_tool.py +0 -0
  237. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/cleanup.py +0 -0
  238. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/complete_step_tool.py +0 -0
  239. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/completion_guard_state.py +0 -0
  240. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/context.py +0 -0
  241. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/display_replay.py +0 -0
  242. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/events.py +0 -0
  243. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/handoff.py +0 -0
  244. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/hard_constraints.py +0 -0
  245. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/interrupt.py +0 -0
  246. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/loader.py +0 -0
  247. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/observability.py +0 -0
  248. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/prerequisites.py +0 -0
  249. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/prompts/interrupt_judge.md +0 -0
  250. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/public_errors.py +0 -0
  251. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/recovery.py +0 -0
  252. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/resume_recovery.py +0 -0
  253. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/session.py +0 -0
  254. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/show_diagram_tool.py +0 -0
  255. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/state_machine.py +0 -0
  256. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/step_spec.py +0 -0
  257. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/sub_pipeline_executor.py +0 -0
  258. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/transcript_storage.py +0 -0
  259. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/types.py +0 -0
  260. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/ui_contract.py +0 -0
  261. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/engine/user_input.py +0 -0
  262. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/hooks/deploying.py +0 -0
  263. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/pipeline.yaml +0 -0
  264. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/prompts/architecture_planning.md +0 -0
  265. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/prompts/confirm_and_select.a2a.md +0 -0
  266. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/prompts/confirm_and_select.a2a.rich.md +0 -0
  267. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/prompts/confirm_and_select.md +0 -0
  268. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/prompts/cost_estimating.md +0 -0
  269. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/prompts/deploying.md +0 -0
  270. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/prompts/evaluate_candidates.md +0 -0
  271. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/prompts/intent_parsing.md +0 -0
  272. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/prompts/reviewing.md +0 -0
  273. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/prompts/template_generating.md +0 -0
  274. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/references/cloud-products/ecs.md +0 -0
  275. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/references/cloud-products/ga.md +0 -0
  276. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/references/cloud-products/oss.md +0 -0
  277. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/references/cloud-products/rds.md +0 -0
  278. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/references/cloud-products/redis.md +0 -0
  279. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/references/cloud-products/slb.md +0 -0
  280. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/references/cloud-products/vpc.md +0 -0
  281. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/references/ros-template.md +0 -0
  282. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/references/solutions/iac-code-web.md +0 -0
  283. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/references/solutions/iac-code-web.ros.yml +0 -0
  284. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/references/template-parameter-recommendation.md +0 -0
  285. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/references/template-parameters.md +0 -0
  286. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/references/terraform-template.md +0 -0
  287. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-architecture/SKILL.md +0 -0
  288. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-architecture/evals.json +0 -0
  289. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/SKILL.md +0 -0
  290. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/evals.json +0 -0
  291. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/ecs.md +0 -0
  292. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/ga.md +0 -0
  293. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/oss.md +0 -0
  294. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/rds.md +0 -0
  295. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/redis.md +0 -0
  296. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/slb.md +0 -0
  297. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/vpc.md +0 -0
  298. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/ros-template.md +0 -0
  299. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/solutions/iac-code-web.md +0 -0
  300. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/solutions/iac-code-web.ros.yml +0 -0
  301. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/template-parameter-recommendation.md +0 -0
  302. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/template-parameters.md +0 -0
  303. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/terraform-template.md +0 -0
  304. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/SKILL.md +0 -0
  305. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/evals.json +0 -0
  306. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/ecs.md +0 -0
  307. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/ga.md +0 -0
  308. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/oss.md +0 -0
  309. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/rds.md +0 -0
  310. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/redis.md +0 -0
  311. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/slb.md +0 -0
  312. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/vpc.md +0 -0
  313. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/ros-template.md +0 -0
  314. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/solutions/iac-code-web.md +0 -0
  315. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/solutions/iac-code-web.ros.yml +0 -0
  316. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/template-parameter-recommendation.md +0 -0
  317. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/template-parameters.md +0 -0
  318. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/terraform-template.md +0 -0
  319. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-intent/SKILL.md +0 -0
  320. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-intent/evals.json +0 -0
  321. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-review/SKILL.md +0 -0
  322. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-review/evals.json +0 -0
  323. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/SKILL.md +0 -0
  324. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/evals.json +0 -0
  325. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/ecs.md +0 -0
  326. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/ga.md +0 -0
  327. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/oss.md +0 -0
  328. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/rds.md +0 -0
  329. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/redis.md +0 -0
  330. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/slb.md +0 -0
  331. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/vpc.md +0 -0
  332. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/ros-template.md +0 -0
  333. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/solutions/iac-code-web.md +0 -0
  334. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/solutions/iac-code-web.ros.yml +0 -0
  335. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/template-parameter-recommendation.md +0 -0
  336. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/template-parameters.md +0 -0
  337. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/terraform-template.md +0 -0
  338. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/tools/__init__.py +0 -0
  339. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/tools/infraguard_scan_tool.py +0 -0
  340. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/tools/ros_template_tools.py +0 -0
  341. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/pipeline/selling/tools/show_candidate_detail_tool.py +0 -0
  342. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/providers/__init__.py +0 -0
  343. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/providers/anthropic_provider.py +0 -0
  344. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/providers/azure_openai_provider.py +0 -0
  345. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/providers/base.py +0 -0
  346. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/providers/deepseek_provider.py +0 -0
  347. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/providers/gemini_provider.py +0 -0
  348. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/providers/kimi_provider.py +0 -0
  349. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/providers/lmstudio_provider.py +0 -0
  350. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/providers/minimax_provider.py +0 -0
  351. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/providers/modelscope_provider.py +0 -0
  352. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/providers/ollama_provider.py +0 -0
  353. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/providers/openai_provider.py +0 -0
  354. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/providers/openrouter_provider.py +0 -0
  355. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/providers/request_logging.py +0 -0
  356. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/providers/request_policy.py +0 -0
  357. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/providers/retry.py +0 -0
  358. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/providers/siliconflow_provider.py +0 -0
  359. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/providers/stream_watchdog.py +0 -0
  360. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/providers/volcengine_provider.py +0 -0
  361. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/__init__.py +0 -0
  362. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/capabilities/__init__.py +0 -0
  363. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/capabilities/auto_detect.py +0 -0
  364. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/capabilities/multimodal.py +0 -0
  365. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/cloud_credentials.py +0 -0
  366. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/configuration_readiness.py +0 -0
  367. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/git_bash.py +0 -0
  368. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/permissions/__init__.py +0 -0
  369. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/permissions/audit.py +0 -0
  370. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/permissions/loader.py +0 -0
  371. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/permissions/rule_scope.py +0 -0
  372. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/permissions/storage.py +0 -0
  373. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/permissions/trusted_roots.py +0 -0
  374. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/providers/__init__.py +0 -0
  375. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/providers/aliyun_credentials_runtime.py +0 -0
  376. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/providers/aliyun_oauth.py +0 -0
  377. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/qwenpaw_source.py +0 -0
  378. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/session_backup.py +0 -0
  379. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/session_backup_staging.py +0 -0
  380. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/session_backup_state.py +0 -0
  381. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/session_index.py +0 -0
  382. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/session_logging.py +0 -0
  383. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/session_metadata.py +0 -0
  384. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/session_resolver.py +0 -0
  385. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/session_usage.py +0 -0
  386. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/telemetry/client.py +0 -0
  387. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/telemetry/config.py +0 -0
  388. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/telemetry/content_serializer.py +0 -0
  389. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/telemetry/events.py +0 -0
  390. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/telemetry/fallback.py +0 -0
  391. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/telemetry/identity.py +0 -0
  392. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/telemetry/metrics.py +0 -0
  393. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/telemetry/names.py +0 -0
  394. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/telemetry/sanitize.py +0 -0
  395. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/telemetry/scope.py +0 -0
  396. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/telemetry/sink.py +0 -0
  397. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/telemetry/tracing.py +0 -0
  398. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/telemetry/types.py +0 -0
  399. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/token_budget.py +0 -0
  400. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/token_counter.py +0 -0
  401. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/services/update_checker.py +0 -0
  402. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/skills/__init__.py +0 -0
  403. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/skills/auto_trigger.py +0 -0
  404. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/skills/bundled/__init__.py +0 -0
  405. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/skills/bundled/iac_aliyun/SKILL.md +0 -0
  406. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/skills/bundled/iac_aliyun/__init__.py +0 -0
  407. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/skills/bundled/iac_aliyun/auto_trigger.py +0 -0
  408. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/ecs.md +0 -0
  409. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/ga.md +0 -0
  410. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/oss.md +0 -0
  411. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/rds.md +0 -0
  412. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/redis.md +0 -0
  413. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/slb.md +0 -0
  414. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/vpc.md +0 -0
  415. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/skills/bundled/iac_aliyun/references/ros-template.md +0 -0
  416. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/skills/bundled/iac_aliyun/references/solutions/iac-code-web.md +0 -0
  417. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/skills/bundled/iac_aliyun/references/solutions/iac-code-web.ros.yml +0 -0
  418. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/skills/bundled/iac_aliyun/references/template-parameter-recommendation.md +0 -0
  419. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/skills/bundled/iac_aliyun/references/template-parameters.md +0 -0
  420. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/skills/bundled/iac_aliyun/references/terraform-template.md +0 -0
  421. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/skills/bundled/iac_aliyun/scripts/tf2ros.py +0 -0
  422. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/skills/bundled/pac_aliyun/SKILL.md +0 -0
  423. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/skills/bundled/pac_aliyun/__init__.py +0 -0
  424. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/skills/bundled/pac_aliyun/auto_trigger.py +0 -0
  425. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/skills/bundled/pac_aliyun/references/infraguard-policy-generation.md +0 -0
  426. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/skills/bundled/simplify.py +0 -0
  427. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/skills/discovery.py +0 -0
  428. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/skills/frontmatter.py +0 -0
  429. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/skills/listing.py +0 -0
  430. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/skills/loader.py +0 -0
  431. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/skills/management.py +0 -0
  432. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/skills/processor.py +0 -0
  433. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/skills/renderer.py +0 -0
  434. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/skills/settings.py +0 -0
  435. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/skills/skill_definition.py +0 -0
  436. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/skills/skill_tool.py +0 -0
  437. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/state/__init__.py +0 -0
  438. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/state/app_state.py +0 -0
  439. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tasks/__init__.py +0 -0
  440. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tasks/notification_queue.py +0 -0
  441. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tasks/task_state.py +0 -0
  442. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tasks/task_tools.py +0 -0
  443. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/__init__.py +0 -0
  444. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/base.py +0 -0
  445. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/bash/__init__.py +0 -0
  446. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/bash/argv_safety.py +0 -0
  447. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/bash/bash_tool.py +0 -0
  448. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/bash/command_parser.py +0 -0
  449. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/bash/mode_validation.py +0 -0
  450. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/bash/path_validation.py +0 -0
  451. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/bash/permissions.py +0 -0
  452. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/bash/readonly_commands.py +0 -0
  453. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/bash/rule_matching.py +0 -0
  454. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/bash/safety_checks.py +0 -0
  455. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/__init__.py +0 -0
  456. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/__init__.py +0 -0
  457. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/acs3_transport.py +0 -0
  458. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/aliyun_api_doc.py +0 -0
  459. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/aliyun_doc_search.py +0 -0
  460. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/api_contract.py +0 -0
  461. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/api_hooks.py +0 -0
  462. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/api_identifiers.py +0 -0
  463. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/contract_store.py +0 -0
  464. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/data/README.md +0 -0
  465. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/data/endpoints/catalog.json +0 -0
  466. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/data/endpoints/generation_report.json +0 -0
  467. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/data/endpoints/legacy.yml +0 -0
  468. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/data/endpoints/overrides.yml +0 -0
  469. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/data/endpoints/unavailable.json +0 -0
  470. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/data/openmeta/api_overrides.yml +0 -0
  471. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/data/openmeta/exclusions.yml +0 -0
  472. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/data/openmeta/product_aliases.yml +0 -0
  473. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/data/openmeta/product_catalog.json +0 -0
  474. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/data/oss/operation_catalog.json +0 -0
  475. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/data/validation/judgments.yml +0 -0
  476. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/data/validation/overrides.yml +0 -0
  477. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/ecs_credential_errors.py +0 -0
  478. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/endpoint_resolver.py +0 -0
  479. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/hooks/__init__.py +0 -0
  480. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/hooks/ros_parameters.py +0 -0
  481. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py +0 -0
  482. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/openmeta.py +0 -0
  483. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/oss_v4_adapter.py +0 -0
  484. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/product_resolver.py +0 -0
  485. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/public_errors.py +0 -0
  486. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/result_contract.py +0 -0
  487. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/retry_policy.py +0 -0
  488. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/ros_client.py +0 -0
  489. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/ros_lifecycle.py +0 -0
  490. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/ros_stack.py +0 -0
  491. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/ros_stack_instances.py +0 -0
  492. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/ros_template_tools.py +0 -0
  493. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/ros_validation/__init__.py +0 -0
  494. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/ros_validation/action_policy.py +0 -0
  495. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/ros_validation/analyzer.py +0 -0
  496. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/ros_validation/association_property_specs.py +0 -0
  497. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/ros_validation/count.py +0 -0
  498. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_association_property_specs.json +0 -0
  499. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_official_resource_index.json +0 -0
  500. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_resource_value_specs.json +0 -0
  501. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_template_body_action_policies.json +0 -0
  502. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/ros_validation/facts.py +0 -0
  503. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/ros_validation/function_specs.py +0 -0
  504. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/ros_validation/model.py +0 -0
  505. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/ros_validation/outcome.py +0 -0
  506. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/ros_validation/parser.py +0 -0
  507. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/ros_validation/renderer.py +0 -0
  508. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/ros_validation/resource_value_specs.py +0 -0
  509. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/__init__.py +0 -0
  510. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/association_property.py +0 -0
  511. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/base.py +0 -0
  512. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/registry.py +0 -0
  513. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/ros_validation/symbols.py +0 -0
  514. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/ros_validation/template_kind.py +0 -0
  515. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/ros_validation/types.py +0 -0
  516. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/ros_validation/validator.py +0 -0
  517. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/ros_yaml.py +0 -0
  518. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/runtime.py +0 -0
  519. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/template_source.py +0 -0
  520. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/user_agent.py +0 -0
  521. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/aliyun/validation_policy.py +0 -0
  522. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/base_api.py +0 -0
  523. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/base_stack.py +0 -0
  524. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/registry.py +0 -0
  525. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/cloud/types.py +0 -0
  526. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/edit_file.py +0 -0
  527. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/glob.py +0 -0
  528. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/grep.py +0 -0
  529. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/list_files.py +0 -0
  530. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/path_safety.py +0 -0
  531. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/read_file.py +0 -0
  532. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/result_storage.py +0 -0
  533. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/tool_executor.py +0 -0
  534. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/web_fetch.py +0 -0
  535. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/tools/write_file.py +0 -0
  536. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/types/__init__.py +0 -0
  537. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/types/permissions.py +0 -0
  538. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/types/skill_source.py +0 -0
  539. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/__init__.py +0 -0
  540. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/assets/iac-code-terminal-logo.png +0 -0
  541. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/banner.py +0 -0
  542. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/components/__init__.py +0 -0
  543. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/components/candidate_selection.py +0 -0
  544. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/components/dialog.py +0 -0
  545. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/components/divider.py +0 -0
  546. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/components/fuzzy_picker.py +0 -0
  547. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/components/parallel_tabs.py +0 -0
  548. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/components/progress_bar.py +0 -0
  549. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/components/search_box.py +0 -0
  550. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/components/select.py +0 -0
  551. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/components/status_icon.py +0 -0
  552. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/components/tabs.py +0 -0
  553. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/core/__init__.py +0 -0
  554. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/core/in_place_render.py +0 -0
  555. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/core/input_history.py +0 -0
  556. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/core/key_event.py +0 -0
  557. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/core/prompt_input.py +0 -0
  558. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/core/raw_input.py +0 -0
  559. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/core/raw_input_win.py +0 -0
  560. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/core/screen.py +0 -0
  561. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/diagram_rendering.py +0 -0
  562. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/dialogs/__init__.py +0 -0
  563. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/dialogs/global_search.py +0 -0
  564. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/dialogs/history_search.py +0 -0
  565. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/dialogs/mcp_manager.py +0 -0
  566. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/dialogs/memory.py +0 -0
  567. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/dialogs/memory_editor.py +0 -0
  568. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/dialogs/model_picker.py +0 -0
  569. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/dialogs/quick_open.py +0 -0
  570. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/dialogs/resume_picker.py +0 -0
  571. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/dialogs/skills_picker.py +0 -0
  572. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/keybindings/__init__.py +0 -0
  573. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/keybindings/manager.py +0 -0
  574. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/pipeline_display_replay.py +0 -0
  575. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/pipeline_styles.py +0 -0
  576. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/renderer.py +0 -0
  577. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/repl.py +0 -0
  578. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/spinner.py +0 -0
  579. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/stream_accumulator.py +0 -0
  580. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/suggestions/__init__.py +0 -0
  581. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/suggestions/aggregator.py +0 -0
  582. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/suggestions/command_provider.py +0 -0
  583. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/suggestions/directory_provider.py +0 -0
  584. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/suggestions/file_provider.py +0 -0
  585. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/suggestions/shell_history_provider.py +0 -0
  586. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/suggestions/skill_provider.py +0 -0
  587. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/suggestions/token_extractor.py +0 -0
  588. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/suggestions/types.py +0 -0
  589. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/terminal_image.py +0 -0
  590. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/ui/transcript_view.py +0 -0
  591. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/utils/__init__.py +0 -0
  592. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/utils/async_lifecycle.py +0 -0
  593. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/utils/background_housekeeping.py +0 -0
  594. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/utils/cleanup.py +0 -0
  595. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/utils/console.py +0 -0
  596. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/utils/file_security.py +0 -0
  597. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/utils/image/__init__.py +0 -0
  598. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/utils/image/clipboard.py +0 -0
  599. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/utils/image/format_detect.py +0 -0
  600. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/utils/image/pasted_content.py +0 -0
  601. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/utils/image/processor.py +0 -0
  602. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/utils/image/resizer.py +0 -0
  603. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/utils/image/store.py +0 -0
  604. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/utils/json_utils.py +0 -0
  605. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/utils/log.py +0 -0
  606. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/utils/path_components.py +0 -0
  607. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/utils/path_locks.py +0 -0
  608. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/utils/platform.py +0 -0
  609. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/utils/project_paths.py +0 -0
  610. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/utils/public_errors.py +0 -0
  611. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/utils/public_paths.py +0 -0
  612. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/utils/signals.py +0 -0
  613. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/utils/tool_input_parser.py +0 -0
  614. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/utils/tool_result_redaction.py +0 -0
  615. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/utils/windows_paths.py +0 -0
  616. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/__init__.py +0 -0
  617. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/cleanup.py +0 -0
  618. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/commands.py +0 -0
  619. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/diagram_cache.py +0 -0
  620. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/diagram_optimizer.py +0 -0
  621. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/diagrams.py +0 -0
  622. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/events.py +0 -0
  623. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/files.py +0 -0
  624. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/images.py +0 -0
  625. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/mcp_settings.py +0 -0
  626. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/memory.py +0 -0
  627. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/outputs.py +0 -0
  628. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/pipeline.py +0 -0
  629. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/pipeline_prerequisites.py +0 -0
  630. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/pipeline_transcript.py +0 -0
  631. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/security.py +0 -0
  632. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/server.py +0 -0
  633. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/settings.py +0 -0
  634. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/shell.py +0 -0
  635. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/skills.py +0 -0
  636. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/static/icons/iac-code-logo.svg +0 -0
  637. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/static/icons/sidebar-new-thread.svg +0 -0
  638. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/static/icons/sidebar-project-open.svg +0 -0
  639. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/static/icons/sidebar-search.svg +0 -0
  640. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/static/icons/sidebar-settings.svg +0 -0
  641. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/static/icons/sidebar-skills.svg +0 -0
  642. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/static/js/api.js +0 -0
  643. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/static/js/components/blocking.js +0 -0
  644. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/static/js/components/composer.js +0 -0
  645. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/static/js/components/image_lightbox.js +0 -0
  646. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/static/js/components/output_panel.js +0 -0
  647. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/static/js/components/pipeline.js +0 -0
  648. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/static/js/components/tool_cards.js +0 -0
  649. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/static/js/components/workspace.js +0 -0
  650. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/static/js/events.js +0 -0
  651. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/static/js/i18n.js +0 -0
  652. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/static/js/mermaid_render.js +0 -0
  653. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/static/js/token_transport.js +0 -0
  654. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/static/js/vendor/markdown-it.LICENSE +0 -0
  655. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/static/js/vendor/markdown-it.min.js +0 -0
  656. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/static/js/vendor/mermaid.LICENSE +0 -0
  657. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/static/js/vendor/mermaid.min.js +0 -0
  658. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/static/js/vendor/token-crypto.js +0 -0
  659. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/static/styles.css +0 -0
  660. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code/web/token_transport.py +0 -0
  661. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code.egg-info/dependency_links.txt +0 -0
  662. {iac_code-0.13.0 → iac_code-0.14.0}/src/iac_code.egg-info/entry_points.txt +0 -0
  663. {iac_code-0.13.0 → iac_code-0.14.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.13.0
3
+ Version: 0.14.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
@@ -14,12 +14,13 @@ Provides-Extra: a2a
14
14
  Provides-Extra: a2a-grpc
15
15
  Provides-Extra: a2a-redis
16
16
  Provides-Extra: a2a-signing
17
+ Provides-Extra: agui
17
18
  Provides-Extra: diagram
18
19
  Provides-Extra: http
19
20
  License-File: LICENSE
20
21
 
21
22
  <p align="center">
22
- <img src="website/static/img/logo-with-front.png" alt="iac-code" width="200">
23
+ <img src="https://raw.githubusercontent.com/aliyun/iac-code/main/website/static/img/logo-with-front.png" alt="iac-code" width="200">
23
24
  </p>
24
25
  <p align="center">
25
26
  <em>AI-powered Infrastructure as Code assistant for cloud infrastructure through natural language interaction. Currently supports Alibaba Cloud ROS and Terraform workflows.</em>
@@ -29,9 +30,6 @@ License-File: LICENSE
29
30
  <a href="https://pypi.org/project/iac-code"><img src="https://img.shields.io/pypi/v/iac-code?color=%2334D058&label=pypi%20package" alt="PyPI Package"></a>
30
31
  <a href="https://pypi.org/project/iac-code"><img src="https://img.shields.io/pypi/pyversions/iac-code?color=%2334D058&label=python" alt="Python"></a>
31
32
  </p>
32
- <p align="center">
33
- <strong>Language</strong>: English | <a href="readme/README.zh.md">中文</a> | <a href="readme/README.es.md">Español</a> | <a href="readme/README.fr.md">Français</a> | <a href="readme/README.de.md">Deutsch</a> | <a href="readme/README.ja.md">日本語</a> | <a href="readme/README.pt.md">Português</a>
34
- </p>
35
33
 
36
34
  > **Documentation**: [https://aliyun.github.io/iac-code/](https://aliyun.github.io/iac-code/)
37
35
 
@@ -56,7 +54,7 @@ No Python, pip, or terminal setup required — download the native app and start
56
54
  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.
57
55
 
58
56
  <p align="center">
59
- <img src="website/static/img/screenshots/iac-code-desktop-en.jpg" alt="IaC Code Desktop app" width="100%">
57
+ <img src="https://raw.githubusercontent.com/aliyun/iac-code/main/website/static/img/screenshots/iac-code-desktop-en.jpg" alt="IaC Code Desktop app" width="100%">
60
58
  </p>
61
59
 
62
60
  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. Stable macOS packages are signed with Apple Developer ID and notarized by Apple; stable Windows packages carry an Authenticode publisher signature. Always download from the official release page and verify the accompanying `SHA256SUMS`. See the [Desktop App guide](https://aliyun.github.io/iac-code/docs/desktop-app) for installation and troubleshooting details.
@@ -84,7 +82,7 @@ iac-code
84
82
  ```
85
83
 
86
84
  <p align="center">
87
- <img src="website/static/img/demo_en.gif" alt="iac-code demo" width="100%">
85
+ <img src="https://raw.githubusercontent.com/aliyun/iac-code/main/website/static/img/demo_en.gif" alt="iac-code demo" width="100%">
88
86
  </p>
89
87
 
90
88
  ### Non-Interactive Mode
@@ -113,7 +111,7 @@ iac-code web
113
111
  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.
114
112
 
115
113
  <p align="center">
116
- <img src="website/static/img/screenshots/iac-code-web-en.jpg" alt="IaC Code Web app" width="100%">
114
+ <img src="https://raw.githubusercontent.com/aliyun/iac-code/main/website/static/img/screenshots/iac-code-web-en.jpg" alt="IaC Code Web app" width="100%">
117
115
  </p>
118
116
 
119
117
  ## Contributing
@@ -134,4 +132,4 @@ See the [Contributing Guide](https://aliyun.github.io/iac-code/getting-started/c
134
132
 
135
133
  | [DingTalk](https://qr.dingtalk.com/action/joingroup?code=v1,k1,ubm/77U7qRh/STFZUNBP26X4PNg2z6+uhiPcLGtDNfU=&_dt_no_comment=1&origin=11) | [Discord](https://discord.gg/qECFuFBwF) |
136
134
  | :----------------------------------------------------------: | :----------------------------------------------------------: |
137
- | [<img src="website/static/img/qrcode-dingtalk.jpg" width="120" height="120" alt="DingTalk">](https://qr.dingtalk.com/action/joingroup?code=v1,k1,ubm/77U7qRh/STFZUNBP26X4PNg2z6+uhiPcLGtDNfU=&_dt_no_comment=1&origin=11) | [<img src="website/static/img/qrcode-discord.jpg" width="120" height="120" alt="Discord">](https://discord.gg/qECFuFBwF) |
135
+ | [<img src="https://raw.githubusercontent.com/aliyun/iac-code/main/website/static/img/qrcode-dingtalk.jpg" width="120" height="120" alt="DingTalk">](https://qr.dingtalk.com/action/joingroup?code=v1,k1,ubm/77U7qRh/STFZUNBP26X4PNg2z6+uhiPcLGtDNfU=&_dt_no_comment=1&origin=11) | [<img src="https://raw.githubusercontent.com/aliyun/iac-code/main/website/static/img/qrcode-discord.jpg" width="120" height="120" alt="Discord">](https://discord.gg/qECFuFBwF) |
@@ -1,8 +1,7 @@
1
1
  [project]
2
2
  name = "iac_code"
3
- dynamic = ["version"]
3
+ dynamic = ["version", "readme"]
4
4
  description = "Your AI-powered Infrastructure as Code assistant"
5
- readme = "README.md"
6
5
  requires-python = ">=3.10"
7
6
  classifiers = [
8
7
  "Programming Language :: Python :: 3",
@@ -75,6 +74,12 @@ a2a-grpc = [
75
74
  a2a-redis = [
76
75
  "redis>=5.0.0",
77
76
  ]
77
+ agui = [
78
+ "ag-ui-protocol==0.1.20",
79
+ "a2a-sdk[http-server,signing]>=1.0.2,<2",
80
+ "starlette>=0.39.0",
81
+ "uvicorn[standard]>=0.30.0",
82
+ ]
78
83
  diagram = ["termaid>=0.1; python_version >= '3.11'"]
79
84
 
80
85
  [dependency-groups]
@@ -147,6 +152,9 @@ default = true
147
152
 
148
153
  [tool.pytest.ini_options]
149
154
  timeout = 30
155
+ markers = [
156
+ "integration: process-level integration tests that use local services only",
157
+ ]
150
158
 
151
159
  [tool.coverage.run]
152
160
  source_pkgs = ["iac_code"]
@@ -1,5 +1,6 @@
1
1
  """Custom build hook to inject __release_date__ at build time."""
2
2
 
3
+ import os
3
4
  import platform
4
5
  import re
5
6
  import shutil
@@ -99,7 +100,19 @@ def _read_version():
99
100
 
100
101
  def _read_long_description():
101
102
  readme = Path("README.md")
102
- return readme.read_text(encoding="utf-8") if readme.is_file() else ""
103
+ if not readme.is_file():
104
+ return ""
105
+ text = readme.read_text(encoding="utf-8")
106
+ # PyPI renders the package description standalone, where the README's
107
+ # relative image paths have no repository base and show up broken.
108
+ # Rewrite them to absolute raw URLs at build time so the checked-in
109
+ # README keeps GitHub-friendly relative paths.
110
+ # The language switcher links point at in-repo translated READMEs, which
111
+ # cannot resolve on PyPI's standalone rendering; drop the line there.
112
+ text = re.sub(r'<p align="center">\s*<strong>Language</strong>.*?</p>\n?', "", text, flags=re.S)
113
+ ref = os.environ.get("IAC_CODE_README_IMG_REF", "main")
114
+ base = "https://raw.githubusercontent.com/aliyun/iac-code/{}/website/static/img/".format(ref)
115
+ return text.replace('src="website/static/img/', 'src="{}'.format(base))
103
116
 
104
117
 
105
118
  def _try_import_babel():
@@ -0,0 +1,2 @@
1
+ __version__ = "0.14.0"
2
+ __release_date__ = "2026-08-28"
@@ -7,7 +7,9 @@ import hashlib
7
7
  import hmac
8
8
  import json
9
9
  import logging
10
+ import math
10
11
  import os
12
+ import signal
11
13
  from contextlib import asynccontextmanager, suppress
12
14
  from email.utils import formatdate
13
15
  from pathlib import Path
@@ -37,9 +39,12 @@ from iac_code.a2a.projection import (
37
39
  resolve_a2a_public_path_roots,
38
40
  resolve_a2a_public_path_roots_for_data,
39
41
  )
42
+ from iac_code.a2a.types import validate_protocol_id
40
43
  from iac_code.i18n import _
41
44
  from iac_code.pipeline.config import get_run_mode
42
45
  from iac_code.services.configuration_readiness import configuration_readiness
46
+ from iac_code.services.session_backup import SessionBackupError
47
+ from iac_code.services.session_storage import SessionStorage
43
48
 
44
49
  logger = logging.getLogger(__name__)
45
50
  _V03_JSONRPC_METHODS = frozenset(
@@ -72,6 +77,58 @@ class _PrincipalUser(User):
72
77
  return self._principal
73
78
 
74
79
 
80
+ class _A2AIdleShutdownController:
81
+ def __init__(self, timeout_seconds: float, callback: Callable[[], None]) -> None:
82
+ self._timeout_seconds = timeout_seconds
83
+ self._callback = callback
84
+ self._inflight_requests = 0
85
+ self._last_activity = 0.0
86
+
87
+ def touch(self) -> None:
88
+ self._last_activity = asyncio.get_running_loop().time()
89
+
90
+ def request_started(self) -> None:
91
+ self._inflight_requests += 1
92
+ self.touch()
93
+
94
+ def request_finished(self) -> None:
95
+ self._inflight_requests = max(0, self._inflight_requests - 1)
96
+ self.touch()
97
+
98
+ async def monitor(self, task_store: Any) -> None:
99
+ interval = min(1.0, max(0.05, self._timeout_seconds / 10))
100
+ while True:
101
+ await asyncio.sleep(interval)
102
+ if self._inflight_requests:
103
+ continue
104
+ now = asyncio.get_running_loop().time()
105
+ if now - self._last_activity < self._timeout_seconds:
106
+ continue
107
+ if await task_store.has_active_work():
108
+ self._last_activity = asyncio.get_running_loop().time()
109
+ continue
110
+ if self._inflight_requests:
111
+ continue
112
+ self._callback()
113
+ return
114
+
115
+
116
+ class _A2AIdleActivityMiddleware:
117
+ def __init__(self, app: Any, *, controller: _A2AIdleShutdownController) -> None:
118
+ self._app = app
119
+ self._controller = controller
120
+
121
+ async def __call__(self, scope: dict[str, Any], receive: Any, send: Any) -> None:
122
+ if scope["type"] != "http":
123
+ await self._app(scope, receive, send)
124
+ return
125
+ self._controller.request_started()
126
+ try:
127
+ await self._app(scope, receive, send)
128
+ finally:
129
+ self._controller.request_finished()
130
+
131
+
75
132
  def resolve_token(cli_token: str | None) -> str | None:
76
133
  return cli_token or os.environ.get("IACCODE_A2A_HTTP_TOKEN")
77
134
 
@@ -338,7 +395,10 @@ def create_app(
338
395
  supported_interfaces: list[dict[str, str]] | None = None,
339
396
  agent_extensions: object | None = None,
340
397
  auto_approve_permissions: bool = False,
398
+ permission_wait: object | None = None,
341
399
  thinking_exposure: object | None = None,
400
+ idle_shutdown_seconds: float = 0,
401
+ idle_shutdown_callback: Callable[[], None] | None = None,
342
402
  ) -> Starlette:
343
403
  from iac_code.a2a.transports.dispatcher import create_runtime_components
344
404
 
@@ -367,20 +427,36 @@ def create_app(
367
427
  supported_interfaces=supported_interfaces,
368
428
  agent_extensions=agent_extensions,
369
429
  auto_approve_permissions=auto_approve_permissions,
430
+ permission_wait=permission_wait,
370
431
  thinking_exposure=thinking_exposure,
371
432
  )
372
433
  from iac_code.a2a.pipeline_recovery import A2APipelineRecoveryService
373
434
 
435
+ idle_controller: _A2AIdleShutdownController | None = None
436
+ if idle_shutdown_seconds > 0:
437
+ idle_controller = _A2AIdleShutdownController(
438
+ idle_shutdown_seconds,
439
+ idle_shutdown_callback or (lambda: os.kill(os.getpid(), signal.SIGTERM)),
440
+ )
441
+
374
442
  @asynccontextmanager
375
443
  async def lifespan(app: Starlette):
376
444
  push_worker_task: asyncio.Task[None] | None = None
445
+ idle_shutdown_task: asyncio.Task[None] | None = None
377
446
  components.start_background_services()
378
447
  try:
379
448
  await components.task_store.start_cleanup_loop()
380
449
  if components.push_worker is not None:
381
450
  push_worker_task = asyncio.create_task(components.push_worker.serve_forever())
451
+ if idle_controller is not None:
452
+ idle_controller.touch()
453
+ idle_shutdown_task = asyncio.create_task(idle_controller.monitor(components.task_store))
382
454
  yield
383
455
  finally:
456
+ if idle_shutdown_task is not None:
457
+ idle_shutdown_task.cancel()
458
+ with suppress(asyncio.CancelledError):
459
+ await idle_shutdown_task
384
460
  if push_worker_task is not None:
385
461
  push_worker_task.cancel()
386
462
  with suppress(asyncio.CancelledError):
@@ -404,6 +480,42 @@ def create_app(
404
480
  async def get_readiness(request: Request) -> JSONResponse:
405
481
  return JSONResponse(configuration_readiness(model=model))
406
482
 
483
+ async def ensure_session_restored(request: Request) -> JSONResponse:
484
+ try:
485
+ payload = await request.json()
486
+ except Exception:
487
+ return JSONResponse({"error": "Invalid session restore request."}, status_code=400)
488
+ if not isinstance(payload, dict):
489
+ return JSONResponse({"error": "Invalid session restore request."}, status_code=400)
490
+ raw_cwd = payload.get("cwd")
491
+ raw_session_id = payload.get("sessionId")
492
+ if not isinstance(raw_cwd, str) or not raw_cwd or not isinstance(raw_session_id, str):
493
+ return JSONResponse({"error": "Invalid session restore request."}, status_code=400)
494
+
495
+ executor = getattr(components.handler, "agent_executor", None)
496
+ resolve_cwd = getattr(executor, "_resolve_cwd", None)
497
+ backup_service = components.backup_service
498
+ if not callable(resolve_cwd) or backup_service is None:
499
+ return JSONResponse({"error": "Session restore is unavailable."}, status_code=503)
500
+ try:
501
+ session_id = validate_protocol_id(raw_session_id)
502
+ cwd = resolve_cwd({"iac_code": {"cwd": raw_cwd}})
503
+ result = await asyncio.to_thread(backup_service.reconcile_session, cwd, session_id)
504
+ exists = SessionStorage().exists(cwd, session_id)
505
+ except ValueError:
506
+ return JSONResponse({"error": "Invalid session restore request."}, status_code=400)
507
+ except SessionBackupError as exc:
508
+ logger.warning("A2A session restore failed error_type=%s", type(exc).__name__)
509
+ return JSONResponse({"error": "Unable to restore the A2A session."}, status_code=503)
510
+ except Exception as exc:
511
+ logger.warning("A2A session restore failed error_type=%s", type(exc).__name__)
512
+ return JSONResponse({"error": "Unable to restore the A2A session."}, status_code=503)
513
+
514
+ if not exists:
515
+ return JSONResponse({"status": "not_found"}, status_code=404)
516
+ status = "restored" if getattr(result, "action", None) == "restored" else "current"
517
+ return JSONResponse({"status": status})
518
+
407
519
  recovery_service = A2APipelineRecoveryService(task_store=components.task_store)
408
520
 
409
521
  async def recovery_path_roots(*, context_id: str | None, task_id: str | None) -> list[dict[str, str]]:
@@ -450,6 +562,7 @@ def create_app(
450
562
  Route("/health", health, methods=["GET"]),
451
563
  Route(AGENT_CARD_WELL_KNOWN_PATH, get_agent_card, methods=["GET"]),
452
564
  Route("/iac-code/readiness", get_readiness, methods=["GET"]),
565
+ Route("/iac-code/session/ensure-restored", ensure_session_restored, methods=["POST"]),
453
566
  Route("/iac-code/pipeline/state", get_pipeline_state, methods=["GET"]),
454
567
  ]
455
568
  install_jsonrpc_error_data_passthrough()
@@ -472,6 +585,8 @@ def create_app(
472
585
  api_key=api_key,
473
586
  api_key_header=api_key_header,
474
587
  )
588
+ if idle_controller is not None:
589
+ app.add_middleware(_A2AIdleActivityMiddleware, controller=idle_controller)
475
590
  return app
476
591
 
477
592
 
@@ -534,11 +649,22 @@ def run_server(
534
649
  push_consumer_name: str | None = None,
535
650
  push_lease_timeout_ms: int = 300_000,
536
651
  auto_approve_permissions: bool = False,
652
+ permission_wait: object | None = None,
537
653
  thinking_exposure: object | None = None,
654
+ idle_shutdown_seconds: float = 0,
538
655
  ) -> None:
539
656
  from iac_code.a2a.transports.base import normalize_transport_name, validate_transport_for_platform
540
657
 
541
658
  normalized_transport = normalize_transport_name(transport)
659
+ if isinstance(idle_shutdown_seconds, bool) or not isinstance(idle_shutdown_seconds, (int, float)):
660
+ raise ValueError("idle_shutdown_seconds must be a non-negative number.")
661
+ idle_shutdown_seconds = float(idle_shutdown_seconds)
662
+ if not math.isfinite(idle_shutdown_seconds):
663
+ raise ValueError("idle_shutdown_seconds must be a non-negative number.")
664
+ if idle_shutdown_seconds < 0:
665
+ raise ValueError("idle_shutdown_seconds must be a non-negative number.")
666
+ if idle_shutdown_seconds > 0 and normalized_transport != "http":
667
+ raise RuntimeError("idle_shutdown_seconds is only supported with the HTTP transport.")
542
668
  if persistence_dir is None:
543
669
  from iac_code.config import get_config_dir
544
670
 
@@ -595,6 +721,7 @@ def run_server(
595
721
  "push_lease_timeout_ms": push_lease_timeout_ms,
596
722
  "supported_interfaces": supported_interfaces,
597
723
  "auto_approve_permissions": auto_approve_permissions,
724
+ "permission_wait": permission_wait,
598
725
  "thinking_exposure": thinking_exposure,
599
726
  }
600
727
 
@@ -663,6 +790,13 @@ def run_server(
663
790
  )
664
791
  return
665
792
 
793
+ idle_server_holder: dict[str, Any] = {}
794
+
795
+ def request_idle_shutdown() -> None:
796
+ server = idle_server_holder.get("server")
797
+ if server is not None:
798
+ server.should_exit = True
799
+
666
800
  if normalized_transport == "websocket":
667
801
  from iac_code.a2a.transports.websocket import WebSocketA2AServerApp
668
802
 
@@ -693,7 +827,10 @@ def run_server(
693
827
  push_lease_timeout_ms=push_lease_timeout_ms,
694
828
  supported_interfaces=supported_interfaces,
695
829
  auto_approve_permissions=auto_approve_permissions,
830
+ permission_wait=permission_wait,
696
831
  thinking_exposure=thinking_exposure,
832
+ idle_shutdown_seconds=idle_shutdown_seconds,
833
+ idle_shutdown_callback=request_idle_shutdown,
697
834
  )
698
835
 
699
836
  try:
@@ -701,11 +838,16 @@ def run_server(
701
838
  except ImportError as exc:
702
839
  raise RuntimeError("A2A server dependencies are missing. Install with: pip install 'iac-code[a2a]'") from exc
703
840
 
704
- uvicorn.run(
705
- app,
706
- host=host,
707
- port=port,
708
- )
841
+ if idle_shutdown_seconds > 0:
842
+ server = uvicorn.Server(uvicorn.Config(app, host=host, port=port))
843
+ idle_server_holder["server"] = server
844
+ server.run()
845
+ else:
846
+ uvicorn.run(
847
+ app,
848
+ host=host,
849
+ port=port,
850
+ )
709
851
 
710
852
 
711
853
  async def _serve_async_transport(server, *, components) -> None:
@@ -41,13 +41,14 @@ async def backup_session_async(
41
41
  critical: bool,
42
42
  metrics: Any | None = None,
43
43
  publication_proofs: dict[str, BackupPublicationProof] | None = None,
44
+ backup_call: Callable[..., Any] | None = None,
44
45
  ) -> Any | None:
45
46
  failed_recorded = False
46
47
  try:
47
48
  kwargs: dict[str, Any] = {"reason": reason, "critical": critical}
48
49
  if publication_proofs is not None:
49
50
  kwargs["publication_proofs"] = publication_proofs
50
- result = await run_sync_fenced(backup_service.backup_session, cwd, session_id, **kwargs)
51
+ result = await run_sync_fenced(backup_call or backup_service.backup_session, cwd, session_id, **kwargs)
51
52
  retry_count = _retry_count(result)
52
53
  if getattr(result, "enabled", False) and not getattr(result, "succeeded", True):
53
54
  message = str(
@@ -154,22 +154,29 @@ class A2AClient:
154
154
  *,
155
155
  cwd: str,
156
156
  context_id: str | None = None,
157
+ task_id: str | None = None,
158
+ message_id: str | None = None,
157
159
  model: str | None = None,
158
160
  iac_code_api_key: str | None = None,
159
161
  thinking_enabled: bool | None = None,
160
162
  thinking_effort: str | None = None,
161
163
  thinking_budget: int | None = None,
164
+ iac_code_metadata: Mapping[str, Any] | None = None,
162
165
  ) -> A2AClientResponse:
163
166
  payload = self._message_payload(
164
167
  method="SendMessage",
165
168
  prompt=prompt,
169
+ parts=None,
166
170
  cwd=cwd,
167
171
  context_id=context_id,
172
+ task_id=task_id,
173
+ message_id=message_id,
168
174
  model=model,
169
175
  iac_code_api_key=iac_code_api_key,
170
176
  thinking_enabled=thinking_enabled,
171
177
  thinking_effort=thinking_effort,
172
178
  thinking_budget=thinking_budget,
179
+ additional_iac_code_metadata=iac_code_metadata,
173
180
  )
174
181
  transport = self._make_transport_client(url)
175
182
  response = await transport.send(payload)
@@ -182,22 +189,101 @@ class A2AClient:
182
189
  *,
183
190
  cwd: str,
184
191
  context_id: str | None = None,
192
+ task_id: str | None = None,
193
+ message_id: str | None = None,
185
194
  model: str | None = None,
186
195
  iac_code_api_key: str | None = None,
187
196
  thinking_enabled: bool | None = None,
188
197
  thinking_effort: str | None = None,
189
198
  thinking_budget: int | None = None,
199
+ iac_code_metadata: Mapping[str, Any] | None = None,
190
200
  ) -> AsyncIterator[dict[str, Any]]:
191
201
  payload = self._message_payload(
192
202
  method="SendStreamingMessage",
193
203
  prompt=prompt,
204
+ parts=None,
194
205
  cwd=cwd,
195
206
  context_id=context_id,
207
+ task_id=task_id,
208
+ message_id=message_id,
196
209
  model=model,
197
210
  iac_code_api_key=iac_code_api_key,
198
211
  thinking_enabled=thinking_enabled,
199
212
  thinking_effort=thinking_effort,
200
213
  thinking_budget=thinking_budget,
214
+ additional_iac_code_metadata=iac_code_metadata,
215
+ )
216
+ transport = self._make_transport_client(url)
217
+ async for event in transport.stream(payload):
218
+ yield event
219
+
220
+ async def send_message_parts(
221
+ self,
222
+ url: str,
223
+ parts: Sequence[Mapping[str, Any]],
224
+ *,
225
+ cwd: str,
226
+ context_id: str,
227
+ task_id: str | None = None,
228
+ message_id: str | None = None,
229
+ model: str | None = None,
230
+ iac_code_api_key: str | None = None,
231
+ thinking_enabled: bool | None = None,
232
+ thinking_effort: str | None = None,
233
+ thinking_budget: int | None = None,
234
+ iac_code_metadata: Mapping[str, Any] | None = None,
235
+ ) -> A2AClientResponse:
236
+ """Send pre-validated A2A parts while preserving iac-code request metadata."""
237
+ payload = self._message_payload(
238
+ method="SendMessage",
239
+ prompt=None,
240
+ parts=parts,
241
+ cwd=cwd,
242
+ context_id=context_id,
243
+ task_id=task_id,
244
+ message_id=message_id,
245
+ model=model,
246
+ iac_code_api_key=iac_code_api_key,
247
+ thinking_enabled=thinking_enabled,
248
+ thinking_effort=thinking_effort,
249
+ thinking_budget=thinking_budget,
250
+ additional_iac_code_metadata=iac_code_metadata,
251
+ )
252
+ transport = self._make_transport_client(url)
253
+ response = await transport.send(payload)
254
+ return A2AClientResponse(payload=response)
255
+
256
+ async def stream_message_parts(
257
+ self,
258
+ url: str,
259
+ parts: Sequence[Mapping[str, Any]],
260
+ *,
261
+ cwd: str,
262
+ context_id: str,
263
+ task_id: str | None = None,
264
+ message_id: str | None = None,
265
+ model: str | None = None,
266
+ iac_code_api_key: str | None = None,
267
+ thinking_enabled: bool | None = None,
268
+ thinking_effort: str | None = None,
269
+ thinking_budget: int | None = None,
270
+ iac_code_metadata: Mapping[str, Any] | None = None,
271
+ ) -> AsyncIterator[dict[str, Any]]:
272
+ """Stream a message whose parts were validated by an embedding protocol adapter."""
273
+ payload = self._message_payload(
274
+ method="SendStreamingMessage",
275
+ prompt=None,
276
+ parts=parts,
277
+ cwd=cwd,
278
+ context_id=context_id,
279
+ task_id=task_id,
280
+ message_id=message_id,
281
+ model=model,
282
+ iac_code_api_key=iac_code_api_key,
283
+ thinking_enabled=thinking_enabled,
284
+ thinking_effort=thinking_effort,
285
+ thinking_budget=thinking_budget,
286
+ additional_iac_code_metadata=iac_code_metadata,
201
287
  )
202
288
  transport = self._make_transport_client(url)
203
289
  async for event in transport.stream(payload):
@@ -209,6 +295,43 @@ class A2AClient:
209
295
  params["historyLength"] = history_length
210
296
  return await self._send_jsonrpc(url, method="GetTask", params=params)
211
297
 
298
+ async def get_pipeline_state(
299
+ self,
300
+ url: str,
301
+ *,
302
+ task_id: str,
303
+ after_sequence: int | None = None,
304
+ ) -> dict[str, Any] | None:
305
+ """Read iac-code's existing A2A pipeline recovery extension over HTTP."""
306
+
307
+ endpoint = url.rstrip("/") + "/iac-code/pipeline/state"
308
+ params = _without_none({"taskId": task_id, "afterSequence": after_sequence})
309
+ response = await self._http_client.get(endpoint, params=params, headers=self._jsonrpc_headers())
310
+ if response.status_code == 404:
311
+ return None
312
+ response.raise_for_status()
313
+ data = response.json()
314
+ if not isinstance(data, dict):
315
+ raise ValueError("A2A pipeline state response must be a JSON object")
316
+ return data
317
+
318
+ async def ensure_session_restored(self, url: str, *, cwd: str, session_id: str) -> bool:
319
+ """Ensure the A2A session payload is locally available before a cold resume."""
320
+
321
+ endpoint = url.rstrip("/") + "/iac-code/session/ensure-restored"
322
+ response = await self._http_client.post(
323
+ endpoint,
324
+ json={"cwd": cwd, "sessionId": session_id},
325
+ headers=self._jsonrpc_headers(),
326
+ )
327
+ if response.status_code == 404:
328
+ return False
329
+ response.raise_for_status()
330
+ data = response.json()
331
+ if not isinstance(data, dict) or data.get("status") not in {"current", "restored"}:
332
+ raise ValueError("A2A session restore response must report a ready session")
333
+ return True
334
+
212
335
  async def list_tasks(
213
336
  self,
214
337
  url: str,
@@ -397,16 +520,23 @@ class A2AClient:
397
520
  self,
398
521
  *,
399
522
  method: str,
400
- prompt: str,
523
+ prompt: str | None,
524
+ parts: Sequence[Mapping[str, Any]] | None,
401
525
  cwd: str,
402
526
  context_id: str | None,
527
+ task_id: str | None,
528
+ message_id: str | None,
403
529
  model: str | None,
404
530
  iac_code_api_key: str | None,
405
531
  thinking_enabled: bool | None,
406
532
  thinking_effort: str | None,
407
533
  thinking_budget: int | None,
534
+ additional_iac_code_metadata: Mapping[str, Any] | None,
408
535
  ) -> dict[str, Any]:
409
- iac_code_metadata: dict[str, Any] = {"cwd": cwd}
536
+ if (prompt is None) == (parts is None):
537
+ raise ValueError("Exactly one of prompt or parts is required")
538
+ iac_code_metadata: dict[str, Any] = dict(additional_iac_code_metadata or {})
539
+ iac_code_metadata["cwd"] = cwd
410
540
  if model:
411
541
  stripped_model = model.strip()
412
542
  if stripped_model:
@@ -427,13 +557,15 @@ class A2AClient:
427
557
  if thinking:
428
558
  iac_code_metadata["thinking"] = thinking
429
559
  message: dict[str, Any] = {
430
- "messageId": str(uuid.uuid4()),
560
+ "messageId": message_id or str(uuid.uuid4()),
431
561
  "role": "ROLE_USER",
432
- "parts": [{"text": prompt}],
562
+ "parts": [{"text": prompt}] if prompt is not None else [dict(part) for part in parts or ()],
433
563
  "metadata": {"iac_code": iac_code_metadata},
434
564
  }
435
565
  if context_id:
436
566
  message["contextId"] = context_id
567
+ if task_id:
568
+ message["taskId"] = task_id
437
569
  return self._jsonrpc_payload(
438
570
  method=method,
439
571
  params={