iac-code 0.13.0__tar.gz → 0.13.1__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 (646) hide show
  1. {iac_code-0.13.0 → iac_code-0.13.1}/PKG-INFO +6 -9
  2. {iac_code-0.13.0 → iac_code-0.13.1}/pyproject.toml +1 -2
  3. {iac_code-0.13.0 → iac_code-0.13.1}/setup.py +14 -1
  4. iac_code-0.13.1/src/iac_code/__init__.py +2 -0
  5. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/app.py +102 -5
  6. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/executor.py +30 -2
  7. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/parts.py +15 -0
  8. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/persistence.py +3 -0
  9. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/runtime_overrides.py +4 -1
  10. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/task_store.py +85 -7
  11. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/types.py +1 -0
  12. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/cli/main.py +2 -0
  13. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/de/LC_MESSAGES/messages.mo +0 -0
  14. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/de/LC_MESSAGES/messages.po +1 -1
  15. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/es/LC_MESSAGES/messages.mo +0 -0
  16. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/es/LC_MESSAGES/messages.po +1 -1
  17. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/fr/LC_MESSAGES/messages.mo +0 -0
  18. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/fr/LC_MESSAGES/messages.po +1 -1
  19. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/ja/LC_MESSAGES/messages.mo +0 -0
  20. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/ja/LC_MESSAGES/messages.po +1 -1
  21. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/pt/LC_MESSAGES/messages.mo +0 -0
  22. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/pt/LC_MESSAGES/messages.po +1 -1
  23. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/zh/LC_MESSAGES/messages.mo +0 -0
  24. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/zh/LC_MESSAGES/messages.po +1 -1
  25. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/manager.py +78 -2
  26. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/providers/aliyun.py +150 -48
  27. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/telemetry/__init__.py +2 -0
  28. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/telemetry/attributes.py +29 -2
  29. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/session_manager.py +3 -1
  30. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/session_titler.py +18 -3
  31. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/index.html +1 -1
  32. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/app.js +341 -54
  33. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code.egg-info/PKG-INFO +6 -9
  34. iac_code-0.13.0/src/iac_code/__init__.py +0 -2
  35. {iac_code-0.13.0 → iac_code-0.13.1}/LICENSE +0 -0
  36. {iac_code-0.13.0 → iac_code-0.13.1}/MANIFEST.in +0 -0
  37. {iac_code-0.13.0 → iac_code-0.13.1}/README.md +0 -0
  38. {iac_code-0.13.0 → iac_code-0.13.1}/setup.cfg +0 -0
  39. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/__init__.py +0 -0
  40. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/agent_card.py +0 -0
  41. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/artifacts.py +0 -0
  42. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/backup.py +0 -0
  43. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/client.py +0 -0
  44. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/events.py +0 -0
  45. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/exposure.py +0 -0
  46. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/input_required.py +0 -0
  47. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/jsonrpc_passthrough.py +0 -0
  48. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/metadata_redaction.py +0 -0
  49. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/metrics.py +0 -0
  50. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/pipeline_delta_coalescing.py +0 -0
  51. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/pipeline_events.py +0 -0
  52. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/pipeline_executor.py +0 -0
  53. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/pipeline_flow_monitor.py +0 -0
  54. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/pipeline_journal.py +0 -0
  55. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/pipeline_outbound.py +0 -0
  56. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/pipeline_paths.py +0 -0
  57. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/pipeline_performance.py +0 -0
  58. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/pipeline_recovery.py +0 -0
  59. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/pipeline_snapshot.py +0 -0
  60. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/pipeline_stream.py +0 -0
  61. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/pipeline_transport_delivery.py +0 -0
  62. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/projection.py +0 -0
  63. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/push.py +0 -0
  64. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/push_queue.py +0 -0
  65. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/push_secrets.py +0 -0
  66. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/push_worker.py +0 -0
  67. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/router.py +0 -0
  68. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/runtime_registry.py +0 -0
  69. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/signing.py +0 -0
  70. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/thinking_metadata.py +0 -0
  71. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/transport.py +0 -0
  72. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/transports/__init__.py +0 -0
  73. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/transports/base.py +0 -0
  74. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/transports/dispatcher.py +0 -0
  75. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/transports/grpc.py +0 -0
  76. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/transports/grpc_jsonrpc.py +0 -0
  77. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/transports/http.py +0 -0
  78. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/transports/redis_streams.py +0 -0
  79. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/transports/stdio.py +0 -0
  80. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/transports/unix.py +0 -0
  81. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/transports/websocket.py +0 -0
  82. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/acp/__init__.py +0 -0
  83. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/acp/convert.py +0 -0
  84. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/acp/http_sse.py +0 -0
  85. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/acp/mcp.py +0 -0
  86. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/acp/metrics.py +0 -0
  87. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/acp/runner.py +0 -0
  88. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/acp/server.py +0 -0
  89. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/acp/session.py +0 -0
  90. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/acp/slash_registry.py +0 -0
  91. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/acp/state.py +0 -0
  92. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/acp/tools.py +0 -0
  93. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/acp/types.py +0 -0
  94. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/acp/version.py +0 -0
  95. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/agent/__init__.py +0 -0
  96. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/agent/agent_loop.py +0 -0
  97. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/agent/agent_tool.py +0 -0
  98. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/agent/agent_types.py +0 -0
  99. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/agent/message.py +0 -0
  100. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/agent/system_prompt.py +0 -0
  101. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/cli/__init__.py +0 -0
  102. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/cli/headless.py +0 -0
  103. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/cli/install_git_bash.py +0 -0
  104. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/cli/output_formats.py +0 -0
  105. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/cli/process_events.py +0 -0
  106. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/cli/process_mode.py +0 -0
  107. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/cli/process_protocol.py +0 -0
  108. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/cli/update.py +0 -0
  109. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/__init__.py +0 -0
  110. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/auth.py +0 -0
  111. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/clear.py +0 -0
  112. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/compact.py +0 -0
  113. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/debug.py +0 -0
  114. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/effort.py +0 -0
  115. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/exit.py +0 -0
  116. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/help.py +0 -0
  117. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/mcp.py +0 -0
  118. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/memory.py +0 -0
  119. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/model.py +0 -0
  120. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/prompt.py +0 -0
  121. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/registry.py +0 -0
  122. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/rename.py +0 -0
  123. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/resume.py +0 -0
  124. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/skills.py +0 -0
  125. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/status.py +0 -0
  126. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/tasks.py +0 -0
  127. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/thinking_enabled.py +0 -0
  128. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/config.py +0 -0
  129. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/desktop/__init__.py +0 -0
  130. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/desktop/__main__.py +0 -0
  131. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/desktop/control.py +0 -0
  132. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/desktop/controller.py +0 -0
  133. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/desktop/diagnostics.py +0 -0
  134. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/desktop/download_journal.py +0 -0
  135. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/desktop/external_env.py +0 -0
  136. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/desktop/git_bash.py +0 -0
  137. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/desktop/install_lock.py +0 -0
  138. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/desktop/loop_runner.py +0 -0
  139. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/desktop/native_preload_manifest.json +0 -0
  140. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/desktop/ports.py +0 -0
  141. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/desktop/probe_worker.py +0 -0
  142. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/desktop/runtime.py +0 -0
  143. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/desktop/tool_paths.py +0 -0
  144. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/__init__.py +0 -0
  145. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/html_extractor.py +0 -0
  146. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/de/LC_MESSAGES/webui.mo +0 -0
  147. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/de/LC_MESSAGES/webui.po +0 -0
  148. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/es/LC_MESSAGES/webui.mo +0 -0
  149. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/es/LC_MESSAGES/webui.po +0 -0
  150. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/fr/LC_MESSAGES/webui.mo +0 -0
  151. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/fr/LC_MESSAGES/webui.po +0 -0
  152. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/ja/LC_MESSAGES/webui.mo +0 -0
  153. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/ja/LC_MESSAGES/webui.po +0 -0
  154. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/pt/LC_MESSAGES/webui.mo +0 -0
  155. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/pt/LC_MESSAGES/webui.po +0 -0
  156. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/zh/LC_MESSAGES/webui.mo +0 -0
  157. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/zh/LC_MESSAGES/webui.po +0 -0
  158. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/mcp/__init__.py +0 -0
  159. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/mcp/cli.py +0 -0
  160. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/mcp/client.py +0 -0
  161. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/mcp/config.py +0 -0
  162. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/mcp/env_expansion.py +0 -0
  163. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/mcp/errors.py +0 -0
  164. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/mcp/manager.py +0 -0
  165. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/mcp/oauth.py +0 -0
  166. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/mcp/output.py +0 -0
  167. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/mcp/progress.py +0 -0
  168. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/mcp/prompt_dispatch.py +0 -0
  169. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/mcp/prompts.py +0 -0
  170. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/mcp/redaction.py +0 -0
  171. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/mcp/skills.py +0 -0
  172. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/mcp/storage.py +0 -0
  173. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/mcp/tools.py +0 -0
  174. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/mcp/types.py +0 -0
  175. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/memory/__init__.py +0 -0
  176. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/memory/memory_manager.py +0 -0
  177. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/memory/memory_tools.py +0 -0
  178. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/memory/project_memory.py +0 -0
  179. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/memory/recall.py +0 -0
  180. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/__init__.py +0 -0
  181. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/config.py +0 -0
  182. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/constants.py +0 -0
  183. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/display_names.py +0 -0
  184. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/__init__.py +0 -0
  185. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/architecture_graph.py +0 -0
  186. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/architecture_meta.py +0 -0
  187. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/architecture_metas/Categories.json +0 -0
  188. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/architecture_metas/config.json +0 -0
  189. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/architecture_metas/products.json +0 -0
  190. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/architecture_resource_inventory.py +0 -0
  191. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/architecture_rule_candidates.py +0 -0
  192. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/architecture_rule_drafts.py +0 -0
  193. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/architecture_rule_facts.py +0 -0
  194. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/architecture_rules.json +0 -0
  195. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/architecture_rules.py +0 -0
  196. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/architecture_semantic_planning.py +0 -0
  197. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/ask_user_question_tool.py +0 -0
  198. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/cleanup.py +0 -0
  199. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/complete_step_tool.py +0 -0
  200. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/completion_guard_state.py +0 -0
  201. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/context.py +0 -0
  202. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/display_replay.py +0 -0
  203. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/events.py +0 -0
  204. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/handoff.py +0 -0
  205. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/hard_constraints.py +0 -0
  206. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/interrupt.py +0 -0
  207. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/loader.py +0 -0
  208. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/observability.py +0 -0
  209. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/pipeline_runner.py +0 -0
  210. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/prerequisites.py +0 -0
  211. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/prompts/interrupt_judge.md +0 -0
  212. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/public_errors.py +0 -0
  213. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/recovery.py +0 -0
  214. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/resume_recovery.py +0 -0
  215. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/session.py +0 -0
  216. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/show_diagram_tool.py +0 -0
  217. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/state_machine.py +0 -0
  218. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/step_executor.py +0 -0
  219. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/step_spec.py +0 -0
  220. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/sub_pipeline_executor.py +0 -0
  221. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/transcript_storage.py +0 -0
  222. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/types.py +0 -0
  223. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/ui_contract.py +0 -0
  224. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/user_input.py +0 -0
  225. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/hooks/deploying.py +0 -0
  226. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/pipeline.yaml +0 -0
  227. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/prompts/architecture_planning.md +0 -0
  228. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/prompts/confirm_and_select.a2a.md +0 -0
  229. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/prompts/confirm_and_select.a2a.rich.md +0 -0
  230. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/prompts/confirm_and_select.md +0 -0
  231. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/prompts/cost_estimating.md +0 -0
  232. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/prompts/deploying.md +0 -0
  233. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/prompts/evaluate_candidates.md +0 -0
  234. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/prompts/intent_parsing.md +0 -0
  235. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/prompts/reviewing.md +0 -0
  236. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/prompts/template_generating.md +0 -0
  237. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/references/cloud-products/ecs.md +0 -0
  238. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/references/cloud-products/ga.md +0 -0
  239. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/references/cloud-products/oss.md +0 -0
  240. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/references/cloud-products/rds.md +0 -0
  241. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/references/cloud-products/redis.md +0 -0
  242. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/references/cloud-products/slb.md +0 -0
  243. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/references/cloud-products/vpc.md +0 -0
  244. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/references/ros-template.md +0 -0
  245. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/references/solutions/iac-code-web.md +0 -0
  246. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/references/solutions/iac-code-web.ros.yml +0 -0
  247. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/references/template-parameter-recommendation.md +0 -0
  248. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/references/template-parameters.md +0 -0
  249. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/references/terraform-template.md +0 -0
  250. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-architecture/SKILL.md +0 -0
  251. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-architecture/evals.json +0 -0
  252. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/SKILL.md +0 -0
  253. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/evals.json +0 -0
  254. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/ecs.md +0 -0
  255. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/ga.md +0 -0
  256. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/oss.md +0 -0
  257. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/rds.md +0 -0
  258. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/redis.md +0 -0
  259. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/slb.md +0 -0
  260. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/vpc.md +0 -0
  261. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/ros-template.md +0 -0
  262. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/solutions/iac-code-web.md +0 -0
  263. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/solutions/iac-code-web.ros.yml +0 -0
  264. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/template-parameter-recommendation.md +0 -0
  265. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/template-parameters.md +0 -0
  266. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/terraform-template.md +0 -0
  267. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/SKILL.md +0 -0
  268. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/evals.json +0 -0
  269. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/ecs.md +0 -0
  270. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/ga.md +0 -0
  271. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/oss.md +0 -0
  272. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/rds.md +0 -0
  273. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/redis.md +0 -0
  274. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/slb.md +0 -0
  275. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/vpc.md +0 -0
  276. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/ros-template.md +0 -0
  277. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/solutions/iac-code-web.md +0 -0
  278. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/solutions/iac-code-web.ros.yml +0 -0
  279. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/template-parameter-recommendation.md +0 -0
  280. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/template-parameters.md +0 -0
  281. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/terraform-template.md +0 -0
  282. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-intent/SKILL.md +0 -0
  283. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-intent/evals.json +0 -0
  284. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-review/SKILL.md +0 -0
  285. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-review/evals.json +0 -0
  286. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/SKILL.md +0 -0
  287. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/evals.json +0 -0
  288. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/ecs.md +0 -0
  289. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/ga.md +0 -0
  290. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/oss.md +0 -0
  291. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/rds.md +0 -0
  292. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/redis.md +0 -0
  293. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/slb.md +0 -0
  294. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/vpc.md +0 -0
  295. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/ros-template.md +0 -0
  296. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/solutions/iac-code-web.md +0 -0
  297. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/solutions/iac-code-web.ros.yml +0 -0
  298. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/template-parameter-recommendation.md +0 -0
  299. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/template-parameters.md +0 -0
  300. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/terraform-template.md +0 -0
  301. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/tools/__init__.py +0 -0
  302. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/tools/infraguard_scan_tool.py +0 -0
  303. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/tools/ros_deploy_tool.py +0 -0
  304. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/tools/ros_template_tools.py +0 -0
  305. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/tools/show_candidate_detail_tool.py +0 -0
  306. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/__init__.py +0 -0
  307. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/anthropic_provider.py +0 -0
  308. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/azure_openai_provider.py +0 -0
  309. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/base.py +0 -0
  310. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/dashscope_provider.py +0 -0
  311. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/deepseek_provider.py +0 -0
  312. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/gemini_provider.py +0 -0
  313. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/kimi_provider.py +0 -0
  314. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/lmstudio_provider.py +0 -0
  315. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/minimax_provider.py +0 -0
  316. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/modelscope_provider.py +0 -0
  317. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/ollama_provider.py +0 -0
  318. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/openai_provider.py +0 -0
  319. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/openrouter_provider.py +0 -0
  320. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/registry.py +0 -0
  321. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/request_logging.py +0 -0
  322. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/request_policy.py +0 -0
  323. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/retry.py +0 -0
  324. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/siliconflow_provider.py +0 -0
  325. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/stream_watchdog.py +0 -0
  326. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/thinking.py +0 -0
  327. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/volcengine_provider.py +0 -0
  328. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/zhipu_provider.py +0 -0
  329. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/__init__.py +0 -0
  330. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/agent_factory.py +0 -0
  331. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/capabilities/__init__.py +0 -0
  332. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/capabilities/auto_detect.py +0 -0
  333. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/capabilities/multimodal.py +0 -0
  334. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/cloud_credentials.py +0 -0
  335. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/configuration_readiness.py +0 -0
  336. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/context_manager.py +0 -0
  337. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/git_bash.py +0 -0
  338. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/permissions/__init__.py +0 -0
  339. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/permissions/audit.py +0 -0
  340. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/permissions/loader.py +0 -0
  341. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/permissions/pipeline.py +0 -0
  342. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/permissions/rule_scope.py +0 -0
  343. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/permissions/storage.py +0 -0
  344. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/permissions/trusted_roots.py +0 -0
  345. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/providers/__init__.py +0 -0
  346. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/providers/aliyun_credentials_runtime.py +0 -0
  347. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/providers/aliyun_oauth.py +0 -0
  348. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/qwenpaw_source.py +0 -0
  349. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/session_backup.py +0 -0
  350. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/session_backup_staging.py +0 -0
  351. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/session_backup_state.py +0 -0
  352. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/session_index.py +0 -0
  353. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/session_layout.py +0 -0
  354. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/session_logging.py +0 -0
  355. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/session_metadata.py +0 -0
  356. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/session_resolver.py +0 -0
  357. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/session_storage.py +0 -0
  358. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/session_usage.py +0 -0
  359. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/telemetry/client.py +0 -0
  360. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/telemetry/config.py +0 -0
  361. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/telemetry/constants.py +0 -0
  362. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/telemetry/content_serializer.py +0 -0
  363. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/telemetry/events.py +0 -0
  364. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/telemetry/fallback.py +0 -0
  365. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/telemetry/identity.py +0 -0
  366. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/telemetry/metrics.py +0 -0
  367. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/telemetry/names.py +0 -0
  368. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/telemetry/sanitize.py +0 -0
  369. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/telemetry/scope.py +0 -0
  370. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/telemetry/sink.py +0 -0
  371. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/telemetry/tracing.py +0 -0
  372. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/telemetry/types.py +0 -0
  373. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/token_budget.py +0 -0
  374. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/token_counter.py +0 -0
  375. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/update_checker.py +0 -0
  376. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/__init__.py +0 -0
  377. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/auto_trigger.py +0 -0
  378. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/__init__.py +0 -0
  379. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/iac_aliyun/SKILL.md +0 -0
  380. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/iac_aliyun/__init__.py +0 -0
  381. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/iac_aliyun/auto_trigger.py +0 -0
  382. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/ecs.md +0 -0
  383. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/ga.md +0 -0
  384. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/oss.md +0 -0
  385. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/rds.md +0 -0
  386. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/redis.md +0 -0
  387. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/slb.md +0 -0
  388. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/vpc.md +0 -0
  389. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/iac_aliyun/references/ros-template.md +0 -0
  390. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/iac_aliyun/references/solutions/iac-code-web.md +0 -0
  391. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/iac_aliyun/references/solutions/iac-code-web.ros.yml +0 -0
  392. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/iac_aliyun/references/template-parameter-recommendation.md +0 -0
  393. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/iac_aliyun/references/template-parameters.md +0 -0
  394. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/iac_aliyun/references/terraform-template.md +0 -0
  395. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/iac_aliyun/scripts/tf2ros.py +0 -0
  396. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/pac_aliyun/SKILL.md +0 -0
  397. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/pac_aliyun/__init__.py +0 -0
  398. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/pac_aliyun/auto_trigger.py +0 -0
  399. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/pac_aliyun/references/infraguard-policy-generation.md +0 -0
  400. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/simplify.py +0 -0
  401. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/discovery.py +0 -0
  402. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/frontmatter.py +0 -0
  403. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/listing.py +0 -0
  404. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/loader.py +0 -0
  405. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/management.py +0 -0
  406. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/processor.py +0 -0
  407. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/renderer.py +0 -0
  408. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/settings.py +0 -0
  409. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/skill_definition.py +0 -0
  410. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/skill_tool.py +0 -0
  411. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/state/__init__.py +0 -0
  412. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/state/app_state.py +0 -0
  413. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tasks/__init__.py +0 -0
  414. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tasks/notification_queue.py +0 -0
  415. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tasks/task_state.py +0 -0
  416. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tasks/task_tools.py +0 -0
  417. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/__init__.py +0 -0
  418. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/base.py +0 -0
  419. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/bash/__init__.py +0 -0
  420. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/bash/argv_safety.py +0 -0
  421. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/bash/bash_tool.py +0 -0
  422. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/bash/command_parser.py +0 -0
  423. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/bash/mode_validation.py +0 -0
  424. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/bash/path_validation.py +0 -0
  425. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/bash/permissions.py +0 -0
  426. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/bash/readonly_commands.py +0 -0
  427. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/bash/rule_matching.py +0 -0
  428. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/bash/safety_checks.py +0 -0
  429. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/__init__.py +0 -0
  430. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/__init__.py +0 -0
  431. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/acs3_transport.py +0 -0
  432. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/aliyun_api.py +0 -0
  433. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/aliyun_api_doc.py +0 -0
  434. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/aliyun_doc_search.py +0 -0
  435. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/api_contract.py +0 -0
  436. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/api_hooks.py +0 -0
  437. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/api_identifiers.py +0 -0
  438. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/contract_store.py +0 -0
  439. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/data/README.md +0 -0
  440. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/data/endpoints/catalog.json +0 -0
  441. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/data/endpoints/generation_report.json +0 -0
  442. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/data/endpoints/legacy.yml +0 -0
  443. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/data/endpoints/overrides.yml +0 -0
  444. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/data/endpoints/unavailable.json +0 -0
  445. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/data/openmeta/api_overrides.yml +0 -0
  446. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/data/openmeta/exclusions.yml +0 -0
  447. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/data/openmeta/product_aliases.yml +0 -0
  448. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/data/openmeta/product_catalog.json +0 -0
  449. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/data/oss/operation_catalog.json +0 -0
  450. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/data/validation/judgments.yml +0 -0
  451. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/data/validation/overrides.yml +0 -0
  452. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ecs_credential_errors.py +0 -0
  453. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/endpoint_resolver.py +0 -0
  454. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/hooks/__init__.py +0 -0
  455. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/hooks/ros_parameters.py +0 -0
  456. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py +0 -0
  457. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/openmeta.py +0 -0
  458. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/oss_v4_adapter.py +0 -0
  459. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/product_resolver.py +0 -0
  460. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/public_errors.py +0 -0
  461. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/result_contract.py +0 -0
  462. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/retry_policy.py +0 -0
  463. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_client.py +0 -0
  464. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_lifecycle.py +0 -0
  465. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_stack.py +0 -0
  466. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_stack_instances.py +0 -0
  467. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_template_tools.py +0 -0
  468. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/__init__.py +0 -0
  469. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/action_policy.py +0 -0
  470. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/analyzer.py +0 -0
  471. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/association_property_specs.py +0 -0
  472. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/count.py +0 -0
  473. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_association_property_specs.json +0 -0
  474. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_official_resource_index.json +0 -0
  475. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_resource_value_specs.json +0 -0
  476. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_template_body_action_policies.json +0 -0
  477. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/facts.py +0 -0
  478. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/function_specs.py +0 -0
  479. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/model.py +0 -0
  480. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/outcome.py +0 -0
  481. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/parser.py +0 -0
  482. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/renderer.py +0 -0
  483. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/resource_value_specs.py +0 -0
  484. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/__init__.py +0 -0
  485. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/association_property.py +0 -0
  486. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/base.py +0 -0
  487. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/registry.py +0 -0
  488. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/symbols.py +0 -0
  489. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/template_kind.py +0 -0
  490. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/types.py +0 -0
  491. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/validator.py +0 -0
  492. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_yaml.py +0 -0
  493. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/runtime.py +0 -0
  494. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/template_source.py +0 -0
  495. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/user_agent.py +0 -0
  496. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/validation_policy.py +0 -0
  497. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/base_api.py +0 -0
  498. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/base_stack.py +0 -0
  499. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/registry.py +0 -0
  500. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/types.py +0 -0
  501. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/edit_file.py +0 -0
  502. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/glob.py +0 -0
  503. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/grep.py +0 -0
  504. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/list_files.py +0 -0
  505. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/path_safety.py +0 -0
  506. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/read_file.py +0 -0
  507. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/result_storage.py +0 -0
  508. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/tool_executor.py +0 -0
  509. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/web_fetch.py +0 -0
  510. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/write_file.py +0 -0
  511. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/types/__init__.py +0 -0
  512. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/types/permissions.py +0 -0
  513. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/types/skill_source.py +0 -0
  514. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/types/stream_events.py +0 -0
  515. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/__init__.py +0 -0
  516. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/assets/iac-code-terminal-logo.png +0 -0
  517. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/banner.py +0 -0
  518. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/components/__init__.py +0 -0
  519. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/components/candidate_selection.py +0 -0
  520. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/components/dialog.py +0 -0
  521. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/components/divider.py +0 -0
  522. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/components/fuzzy_picker.py +0 -0
  523. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/components/parallel_tabs.py +0 -0
  524. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/components/progress_bar.py +0 -0
  525. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/components/search_box.py +0 -0
  526. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/components/select.py +0 -0
  527. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/components/status_icon.py +0 -0
  528. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/components/tabs.py +0 -0
  529. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/core/__init__.py +0 -0
  530. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/core/in_place_render.py +0 -0
  531. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/core/input_history.py +0 -0
  532. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/core/key_event.py +0 -0
  533. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/core/prompt_input.py +0 -0
  534. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/core/raw_input.py +0 -0
  535. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/core/raw_input_win.py +0 -0
  536. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/core/screen.py +0 -0
  537. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/diagram_rendering.py +0 -0
  538. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/dialogs/__init__.py +0 -0
  539. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/dialogs/global_search.py +0 -0
  540. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/dialogs/history_search.py +0 -0
  541. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/dialogs/mcp_manager.py +0 -0
  542. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/dialogs/memory.py +0 -0
  543. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/dialogs/memory_editor.py +0 -0
  544. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/dialogs/model_picker.py +0 -0
  545. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/dialogs/quick_open.py +0 -0
  546. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/dialogs/resume_picker.py +0 -0
  547. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/dialogs/skills_picker.py +0 -0
  548. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/keybindings/__init__.py +0 -0
  549. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/keybindings/manager.py +0 -0
  550. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/pipeline_display_replay.py +0 -0
  551. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/pipeline_styles.py +0 -0
  552. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/renderer.py +0 -0
  553. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/repl.py +0 -0
  554. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/spinner.py +0 -0
  555. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/stream_accumulator.py +0 -0
  556. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/suggestions/__init__.py +0 -0
  557. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/suggestions/aggregator.py +0 -0
  558. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/suggestions/command_provider.py +0 -0
  559. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/suggestions/directory_provider.py +0 -0
  560. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/suggestions/file_provider.py +0 -0
  561. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/suggestions/shell_history_provider.py +0 -0
  562. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/suggestions/skill_provider.py +0 -0
  563. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/suggestions/token_extractor.py +0 -0
  564. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/suggestions/types.py +0 -0
  565. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/terminal_image.py +0 -0
  566. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/transcript_view.py +0 -0
  567. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/__init__.py +0 -0
  568. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/async_lifecycle.py +0 -0
  569. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/background_housekeeping.py +0 -0
  570. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/cleanup.py +0 -0
  571. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/console.py +0 -0
  572. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/file_security.py +0 -0
  573. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/image/__init__.py +0 -0
  574. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/image/clipboard.py +0 -0
  575. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/image/format_detect.py +0 -0
  576. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/image/pasted_content.py +0 -0
  577. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/image/processor.py +0 -0
  578. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/image/resizer.py +0 -0
  579. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/image/store.py +0 -0
  580. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/json_utils.py +0 -0
  581. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/log.py +0 -0
  582. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/path_components.py +0 -0
  583. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/path_locks.py +0 -0
  584. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/platform.py +0 -0
  585. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/project_paths.py +0 -0
  586. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/public_errors.py +0 -0
  587. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/public_paths.py +0 -0
  588. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/signals.py +0 -0
  589. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/state_io.py +0 -0
  590. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/tool_input_parser.py +0 -0
  591. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/tool_result_redaction.py +0 -0
  592. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/windows_paths.py +0 -0
  593. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/__init__.py +0 -0
  594. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/app.py +0 -0
  595. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/cleanup.py +0 -0
  596. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/commands.py +0 -0
  597. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/diagram_cache.py +0 -0
  598. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/diagram_optimizer.py +0 -0
  599. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/diagrams.py +0 -0
  600. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/events.py +0 -0
  601. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/files.py +0 -0
  602. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/images.py +0 -0
  603. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/mcp_settings.py +0 -0
  604. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/memory.py +0 -0
  605. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/outputs.py +0 -0
  606. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/permissions.py +0 -0
  607. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/pipeline.py +0 -0
  608. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/pipeline_actions.py +0 -0
  609. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/pipeline_prerequisites.py +0 -0
  610. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/pipeline_transcript.py +0 -0
  611. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/runtime.py +0 -0
  612. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/security.py +0 -0
  613. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/server.py +0 -0
  614. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/settings.py +0 -0
  615. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/shell.py +0 -0
  616. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/skills.py +0 -0
  617. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/icons/iac-code-logo.svg +0 -0
  618. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/icons/sidebar-new-thread.svg +0 -0
  619. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/icons/sidebar-project-open.svg +0 -0
  620. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/icons/sidebar-search.svg +0 -0
  621. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/icons/sidebar-settings.svg +0 -0
  622. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/icons/sidebar-skills.svg +0 -0
  623. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/api.js +0 -0
  624. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/components/blocking.js +0 -0
  625. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/components/composer.js +0 -0
  626. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/components/image_lightbox.js +0 -0
  627. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/components/output_panel.js +0 -0
  628. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/components/pipeline.js +0 -0
  629. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/components/tool_cards.js +0 -0
  630. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/components/workspace.js +0 -0
  631. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/events.js +0 -0
  632. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/i18n.js +0 -0
  633. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/mermaid_render.js +0 -0
  634. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/token_transport.js +0 -0
  635. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/vendor/markdown-it.LICENSE +0 -0
  636. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/vendor/markdown-it.min.js +0 -0
  637. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/vendor/mermaid.LICENSE +0 -0
  638. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/vendor/mermaid.min.js +0 -0
  639. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/vendor/token-crypto.js +0 -0
  640. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/styles.css +0 -0
  641. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/token_transport.py +0 -0
  642. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code.egg-info/SOURCES.txt +0 -0
  643. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code.egg-info/dependency_links.txt +0 -0
  644. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code.egg-info/entry_points.txt +0 -0
  645. {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code.egg-info/requires.txt +0 -0
  646. {iac_code-0.13.0 → iac_code-0.13.1}/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.13.1
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
@@ -19,7 +19,7 @@ Provides-Extra: http
19
19
  License-File: LICENSE
20
20
 
21
21
  <p align="center">
22
- <img src="website/static/img/logo-with-front.png" alt="iac-code" width="200">
22
+ <img src="https://raw.githubusercontent.com/aliyun/iac-code/main/website/static/img/logo-with-front.png" alt="iac-code" width="200">
23
23
  </p>
24
24
  <p align="center">
25
25
  <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 +29,6 @@ License-File: LICENSE
29
29
  <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
30
  <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
31
  </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
32
 
36
33
  > **Documentation**: [https://aliyun.github.io/iac-code/](https://aliyun.github.io/iac-code/)
37
34
 
@@ -56,7 +53,7 @@ No Python, pip, or terminal setup required — download the native app and start
56
53
  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
54
 
58
55
  <p align="center">
59
- <img src="website/static/img/screenshots/iac-code-desktop-en.jpg" alt="IaC Code Desktop app" width="100%">
56
+ <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
57
  </p>
61
58
 
62
59
  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 +81,7 @@ iac-code
84
81
  ```
85
82
 
86
83
  <p align="center">
87
- <img src="website/static/img/demo_en.gif" alt="iac-code demo" width="100%">
84
+ <img src="https://raw.githubusercontent.com/aliyun/iac-code/main/website/static/img/demo_en.gif" alt="iac-code demo" width="100%">
88
85
  </p>
89
86
 
90
87
  ### Non-Interactive Mode
@@ -113,7 +110,7 @@ iac-code web
113
110
  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
111
 
115
112
  <p align="center">
116
- <img src="website/static/img/screenshots/iac-code-web-en.jpg" alt="IaC Code Web app" width="100%">
113
+ <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
114
  </p>
118
115
 
119
116
  ## Contributing
@@ -134,4 +131,4 @@ See the [Contributing Guide](https://aliyun.github.io/iac-code/getting-started/c
134
131
 
135
132
  | [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
133
  | :----------------------------------------------------------: | :----------------------------------------------------------: |
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) |
134
+ | [<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",
@@ -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.13.1"
2
+ __release_date__ = "2026-08-21"
@@ -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
@@ -72,6 +74,58 @@ class _PrincipalUser(User):
72
74
  return self._principal
73
75
 
74
76
 
77
+ class _A2AIdleShutdownController:
78
+ def __init__(self, timeout_seconds: float, callback: Callable[[], None]) -> None:
79
+ self._timeout_seconds = timeout_seconds
80
+ self._callback = callback
81
+ self._inflight_requests = 0
82
+ self._last_activity = 0.0
83
+
84
+ def touch(self) -> None:
85
+ self._last_activity = asyncio.get_running_loop().time()
86
+
87
+ def request_started(self) -> None:
88
+ self._inflight_requests += 1
89
+ self.touch()
90
+
91
+ def request_finished(self) -> None:
92
+ self._inflight_requests = max(0, self._inflight_requests - 1)
93
+ self.touch()
94
+
95
+ async def monitor(self, task_store: Any) -> None:
96
+ interval = min(1.0, max(0.05, self._timeout_seconds / 10))
97
+ while True:
98
+ await asyncio.sleep(interval)
99
+ if self._inflight_requests:
100
+ continue
101
+ now = asyncio.get_running_loop().time()
102
+ if now - self._last_activity < self._timeout_seconds:
103
+ continue
104
+ if await task_store.has_active_work():
105
+ self._last_activity = asyncio.get_running_loop().time()
106
+ continue
107
+ if self._inflight_requests:
108
+ continue
109
+ self._callback()
110
+ return
111
+
112
+
113
+ class _A2AIdleActivityMiddleware:
114
+ def __init__(self, app: Any, *, controller: _A2AIdleShutdownController) -> None:
115
+ self._app = app
116
+ self._controller = controller
117
+
118
+ async def __call__(self, scope: dict[str, Any], receive: Any, send: Any) -> None:
119
+ if scope["type"] != "http":
120
+ await self._app(scope, receive, send)
121
+ return
122
+ self._controller.request_started()
123
+ try:
124
+ await self._app(scope, receive, send)
125
+ finally:
126
+ self._controller.request_finished()
127
+
128
+
75
129
  def resolve_token(cli_token: str | None) -> str | None:
76
130
  return cli_token or os.environ.get("IACCODE_A2A_HTTP_TOKEN")
77
131
 
@@ -339,6 +393,8 @@ def create_app(
339
393
  agent_extensions: object | None = None,
340
394
  auto_approve_permissions: bool = False,
341
395
  thinking_exposure: object | None = None,
396
+ idle_shutdown_seconds: float = 0,
397
+ idle_shutdown_callback: Callable[[], None] | None = None,
342
398
  ) -> Starlette:
343
399
  from iac_code.a2a.transports.dispatcher import create_runtime_components
344
400
 
@@ -371,16 +427,31 @@ def create_app(
371
427
  )
372
428
  from iac_code.a2a.pipeline_recovery import A2APipelineRecoveryService
373
429
 
430
+ idle_controller: _A2AIdleShutdownController | None = None
431
+ if idle_shutdown_seconds > 0:
432
+ idle_controller = _A2AIdleShutdownController(
433
+ idle_shutdown_seconds,
434
+ idle_shutdown_callback or (lambda: os.kill(os.getpid(), signal.SIGTERM)),
435
+ )
436
+
374
437
  @asynccontextmanager
375
438
  async def lifespan(app: Starlette):
376
439
  push_worker_task: asyncio.Task[None] | None = None
440
+ idle_shutdown_task: asyncio.Task[None] | None = None
377
441
  components.start_background_services()
378
442
  try:
379
443
  await components.task_store.start_cleanup_loop()
380
444
  if components.push_worker is not None:
381
445
  push_worker_task = asyncio.create_task(components.push_worker.serve_forever())
446
+ if idle_controller is not None:
447
+ idle_controller.touch()
448
+ idle_shutdown_task = asyncio.create_task(idle_controller.monitor(components.task_store))
382
449
  yield
383
450
  finally:
451
+ if idle_shutdown_task is not None:
452
+ idle_shutdown_task.cancel()
453
+ with suppress(asyncio.CancelledError):
454
+ await idle_shutdown_task
384
455
  if push_worker_task is not None:
385
456
  push_worker_task.cancel()
386
457
  with suppress(asyncio.CancelledError):
@@ -472,6 +543,8 @@ def create_app(
472
543
  api_key=api_key,
473
544
  api_key_header=api_key_header,
474
545
  )
546
+ if idle_controller is not None:
547
+ app.add_middleware(_A2AIdleActivityMiddleware, controller=idle_controller)
475
548
  return app
476
549
 
477
550
 
@@ -535,10 +608,20 @@ def run_server(
535
608
  push_lease_timeout_ms: int = 300_000,
536
609
  auto_approve_permissions: bool = False,
537
610
  thinking_exposure: object | None = None,
611
+ idle_shutdown_seconds: float = 0,
538
612
  ) -> None:
539
613
  from iac_code.a2a.transports.base import normalize_transport_name, validate_transport_for_platform
540
614
 
541
615
  normalized_transport = normalize_transport_name(transport)
616
+ if isinstance(idle_shutdown_seconds, bool) or not isinstance(idle_shutdown_seconds, (int, float)):
617
+ raise ValueError("idle_shutdown_seconds must be a non-negative number.")
618
+ idle_shutdown_seconds = float(idle_shutdown_seconds)
619
+ if not math.isfinite(idle_shutdown_seconds):
620
+ raise ValueError("idle_shutdown_seconds must be a non-negative number.")
621
+ if idle_shutdown_seconds < 0:
622
+ raise ValueError("idle_shutdown_seconds must be a non-negative number.")
623
+ if idle_shutdown_seconds > 0 and normalized_transport != "http":
624
+ raise RuntimeError("idle_shutdown_seconds is only supported with the HTTP transport.")
542
625
  if persistence_dir is None:
543
626
  from iac_code.config import get_config_dir
544
627
 
@@ -663,6 +746,13 @@ def run_server(
663
746
  )
664
747
  return
665
748
 
749
+ idle_server_holder: dict[str, Any] = {}
750
+
751
+ def request_idle_shutdown() -> None:
752
+ server = idle_server_holder.get("server")
753
+ if server is not None:
754
+ server.should_exit = True
755
+
666
756
  if normalized_transport == "websocket":
667
757
  from iac_code.a2a.transports.websocket import WebSocketA2AServerApp
668
758
 
@@ -694,6 +784,8 @@ def run_server(
694
784
  supported_interfaces=supported_interfaces,
695
785
  auto_approve_permissions=auto_approve_permissions,
696
786
  thinking_exposure=thinking_exposure,
787
+ idle_shutdown_seconds=idle_shutdown_seconds,
788
+ idle_shutdown_callback=request_idle_shutdown,
697
789
  )
698
790
 
699
791
  try:
@@ -701,11 +793,16 @@ def run_server(
701
793
  except ImportError as exc:
702
794
  raise RuntimeError("A2A server dependencies are missing. Install with: pip install 'iac-code[a2a]'") from exc
703
795
 
704
- uvicorn.run(
705
- app,
706
- host=host,
707
- port=port,
708
- )
796
+ if idle_shutdown_seconds > 0:
797
+ server = uvicorn.Server(uvicorn.Config(app, host=host, port=port))
798
+ idle_server_holder["server"] = server
799
+ server.run()
800
+ else:
801
+ uvicorn.run(
802
+ app,
803
+ host=host,
804
+ port=port,
805
+ )
709
806
 
710
807
 
711
808
  async def _serve_async_transport(server, *, components) -> None:
@@ -40,6 +40,7 @@ from iac_code.a2a.parts import (
40
40
  parts_to_prompt,
41
41
  parts_to_user_input,
42
42
  resolve_workspace_path,
43
+ trust_request_cwd,
43
44
  )
44
45
  from iac_code.a2a.pipeline_events import PipelineA2AContext, PipelineEventTranslator
45
46
  from iac_code.a2a.pipeline_executor import (
@@ -110,6 +111,7 @@ from iac_code.services.session_backup_state import (
110
111
  SessionBackupState,
111
112
  )
112
113
  from iac_code.services.session_storage import SessionStorage
114
+ from iac_code.services.telemetry.attributes import normalize_telemetry_channel
113
115
  from iac_code.types.stream_events import MessageEndEvent, MessageStartEvent, TextDeltaEvent
114
116
  from iac_code.utils.file_security import atomic_write_text, ensure_private_dir, ensure_private_file
115
117
  from iac_code.utils.public_errors import sanitize_strict_text
@@ -1027,9 +1029,23 @@ class IacCodeA2AExecutor(AgentExecutor):
1027
1029
  return permission_ack_message(response, approved=approved)
1028
1030
 
1029
1031
  async def execute(self, context: RequestContext, event_queue: EventQueue) -> None:
1032
+ metadata = getattr(context, "metadata", None) or getattr(getattr(context, "message", None), "metadata", None)
1033
+ permission_response = parse_permission_response(getattr(context, "message", None))
1034
+ context_id = (
1035
+ context.context_id
1036
+ or (permission_response.context_id if permission_response is not None else None)
1037
+ or "ctx-" + uuid.uuid4().hex[:12]
1038
+ )
1039
+ telemetry_channel = await self._task_store.resolve_context_telemetry_channel(
1040
+ context_id,
1041
+ self._resolve_telemetry_channel(metadata),
1042
+ )
1043
+ with a2a_request_context(telemetry_channel=telemetry_channel):
1044
+ await self._execute(context, event_queue, context_id=context_id)
1045
+
1046
+ async def _execute(self, context: RequestContext, event_queue: EventQueue, *, context_id: str) -> None:
1030
1047
  requested_task_id = context.task_id or None
1031
1048
  task_id = requested_task_id or "task-" + uuid.uuid4().hex[:12]
1032
- context_id = context.context_id or "ctx-" + uuid.uuid4().hex[:12]
1033
1049
  permission_response = parse_permission_response(getattr(context, "message", None))
1034
1050
  if permission_response is not None:
1035
1051
  approved = await self._permission_input_registry.answer(permission_response)
@@ -1715,7 +1731,9 @@ class IacCodeA2AExecutor(AgentExecutor):
1715
1731
  raise ValueError("Invalid A2A workspace metadata.")
1716
1732
  logical_cwd = os.path.normpath(cwd)
1717
1733
  resolved_cwd = resolve_workspace_path(Path(logical_cwd))
1718
- if not any(_is_relative_to(resolved_cwd, root) for root in _allowed_cwd_roots()):
1734
+ if not trust_request_cwd() and not any(
1735
+ _is_relative_to(resolved_cwd, root) for root in _allowed_cwd_roots()
1736
+ ):
1719
1737
  raise ValueError("Invalid A2A workspace metadata.")
1720
1738
  if resolved_cwd.exists():
1721
1739
  if not resolved_cwd.is_dir():
@@ -1737,6 +1755,16 @@ class IacCodeA2AExecutor(AgentExecutor):
1737
1755
  return raw_user_id.strip()
1738
1756
  return None
1739
1757
 
1758
+ def _resolve_telemetry_channel(self, metadata: Any | None) -> str | None:
1759
+ if metadata is not None and hasattr(metadata, "DESCRIPTOR"):
1760
+ metadata = MessageToDict(metadata, preserving_proto_field_name=False)
1761
+ if not isinstance(metadata, Mapping):
1762
+ return None
1763
+ raw_iac_meta = metadata.get("iac_code")
1764
+ if not isinstance(raw_iac_meta, Mapping):
1765
+ return None
1766
+ return normalize_telemetry_channel(raw_iac_meta.get("channel"))
1767
+
1740
1768
  def _resolve_preferred_language(self, metadata: Any | None) -> str | None:
1741
1769
  if metadata is not None and hasattr(metadata, "DESCRIPTOR"):
1742
1770
  metadata = MessageToDict(metadata, preserving_proto_field_name=False)
@@ -78,6 +78,21 @@ def allowed_cwd_roots() -> list[Path]:
78
78
  return [resolve_workspace_path(path) for path in candidates if path.exists() and path.is_dir()]
79
79
 
80
80
 
81
+ def trust_request_cwd() -> bool:
82
+ """Return whether authenticated callers may select any local user workspace.
83
+
84
+ The external Skill Runtime is a localhost-only, single-user process with a
85
+ random bearer token. It opts into this mode so one A2A server can serve
86
+ multiple per-context workspaces without widening the default A2A policy.
87
+ """
88
+ return os.environ.get("IAC_CODE_A2A_TRUST_REQUEST_CWD", "").strip().lower() in {
89
+ "1",
90
+ "true",
91
+ "yes",
92
+ "on",
93
+ }
94
+
95
+
81
96
  def is_relative_to(path: Path, root: Path) -> bool:
82
97
  try:
83
98
  path.relative_to(root)
@@ -10,6 +10,7 @@ from pathlib import Path
10
10
  from typing import cast
11
11
 
12
12
  from iac_code.a2a.types import validate_protocol_id
13
+ from iac_code.services.telemetry.attributes import normalize_telemetry_channel
13
14
  from iac_code.utils.file_security import atomic_write_text
14
15
 
15
16
  _INTERRUPTED_RESTORE_STATES = {"submitted", "working", "auth-required"}
@@ -48,6 +49,7 @@ class A2AContextSnapshot:
48
49
  context_id: str
49
50
  session_id: str
50
51
  cwd: str
52
+ telemetry_channel: str | None = None
51
53
  active_task_id: str | None = None
52
54
  updated_at: float = field(default_factory=time.time)
53
55
 
@@ -185,6 +187,7 @@ class A2APersistenceStore:
185
187
  context_id=context_id,
186
188
  session_id=session_id,
187
189
  cwd=cwd,
190
+ telemetry_channel=normalize_telemetry_channel(data.get("telemetry_channel")),
188
191
  active_task_id=active_task_id if isinstance(active_task_id, str) else None,
189
192
  updated_at=float(updated_at) if isinstance(updated_at, (int, float)) else time.time(),
190
193
  )
@@ -7,7 +7,7 @@ from typing import Any
7
7
 
8
8
  from iac_code.providers.request_policy import ProviderRequestPolicy
9
9
  from iac_code.services.providers.aliyun import AliyunCredential, use_aliyun_credential
10
- from iac_code.services.telemetry import use_session_id, use_user_id
10
+ from iac_code.services.telemetry import use_session_id, use_telemetry_channel, use_user_id
11
11
 
12
12
  _RUNTIME_OVERRIDE_UNSET = object()
13
13
  _preferred_language: contextvars.ContextVar[str | None] = contextvars.ContextVar(
@@ -28,8 +28,11 @@ def a2a_request_context(
28
28
  user_id: str | None = None,
29
29
  aliyun_credential: AliyunCredential | None = None,
30
30
  preferred_language: str | None = None,
31
+ telemetry_channel: str | None = None,
31
32
  ) -> Iterator[None]:
32
33
  with contextlib.ExitStack() as stack:
34
+ if telemetry_channel:
35
+ stack.enter_context(use_telemetry_channel(telemetry_channel))
33
36
  if preferred_language:
34
37
  token = _preferred_language.set(preferred_language)
35
38
  stack.callback(_preferred_language.reset, token)
@@ -38,6 +38,7 @@ from iac_code.i18n import _
38
38
  from iac_code.services.session_backup import SessionBackupService
39
39
  from iac_code.services.session_layout import SessionPaths, ensure_session_owned_parent
40
40
  from iac_code.services.session_storage import SessionStorage
41
+ from iac_code.services.telemetry.attributes import normalize_telemetry_channel
41
42
  from iac_code.utils.file_security import atomic_write_text
42
43
 
43
44
  logger = logging.getLogger(__name__)
@@ -61,6 +62,7 @@ class A2ATaskStore(TaskStore):
61
62
  self._tasks: dict[str, A2ATaskRecord] = {}
62
63
  self._task_persistence_dirty: set[str] = set()
63
64
  self._contexts: dict[str, A2AContextRecord] = {}
65
+ self._pending_context_telemetry_channels: dict[str, str] = {}
64
66
  self._expired_task_tombstones: dict[str, float] = {}
65
67
  self._metrics = metrics or NoOpA2AMetrics()
66
68
  self._persistence = persistence
@@ -294,6 +296,9 @@ class A2ATaskStore(TaskStore):
294
296
  async with self._mutation_lock:
295
297
  if context_id in self._contexts:
296
298
  record = self._contexts[context_id]
299
+ pending_channel = self._pending_context_telemetry_channels.get(context_id)
300
+ if pending_channel is not None:
301
+ record.telemetry_channel = pending_channel
297
302
  if record.expired:
298
303
  raise ValueError(_("A2A context expired"))
299
304
  if record.cwd != cwd:
@@ -306,15 +311,18 @@ class A2ATaskStore(TaskStore):
306
311
  else:
307
312
  record.touch()
308
313
  self._mirror_context(record)
314
+ self._pending_context_telemetry_channels.pop(context_id, None)
309
315
  return record
310
316
  else:
311
317
  session_id: str | None = None
312
- if self._persistence is not None:
313
- snapshot = self._persistence.load_context(context_id)
314
- if snapshot is not None:
315
- if snapshot.cwd != cwd:
316
- raise ValueError(_("A2A context belongs to a different workspace"))
317
- session_id = snapshot.session_id
318
+ telemetry_channel = self._pending_context_telemetry_channels.get(context_id)
319
+ snapshot = self._load_context_snapshot(context_id)
320
+ if snapshot is not None:
321
+ if snapshot.cwd != cwd:
322
+ raise ValueError(_("A2A context belongs to a different workspace"))
323
+ session_id = snapshot.session_id
324
+ if telemetry_channel is None:
325
+ telemetry_channel = snapshot.telemetry_channel
318
326
 
319
327
  if session_id is None:
320
328
  session_id = str(uuid.uuid4())
@@ -323,6 +331,7 @@ class A2ATaskStore(TaskStore):
323
331
  context_id=context_id,
324
332
  session_id=session_id,
325
333
  cwd=cwd,
334
+ telemetry_channel=telemetry_channel,
326
335
  runtime=None,
327
336
  lock=asyncio.Lock(),
328
337
  )
@@ -397,8 +406,48 @@ class A2ATaskStore(TaskStore):
397
406
  await _close_runtime(runtime)
398
407
  record.touch()
399
408
  self._mirror_context(record)
409
+ self._pending_context_telemetry_channels.pop(context_id, None)
400
410
  return record
401
411
 
412
+ async def resolve_context_telemetry_channel(
413
+ self,
414
+ context_id: str,
415
+ requested_channel: str | None,
416
+ ) -> str | None:
417
+ """Resolve and, when explicitly supplied, bind telemetry channel to an A2A context."""
418
+
419
+ context_id = validate_protocol_id(context_id)
420
+ requested_channel = normalize_telemetry_channel(requested_channel)
421
+ async with self._mutation_lock:
422
+ record = self._contexts.get(context_id)
423
+ if record is not None:
424
+ if requested_channel is not None and requested_channel != record.telemetry_channel:
425
+ record.telemetry_channel = requested_channel
426
+ record.touch()
427
+ self._mirror_context(record)
428
+ return record.telemetry_channel
429
+
430
+ snapshot = self._load_context_snapshot(context_id)
431
+ stored_channel = self._pending_context_telemetry_channels.get(context_id)
432
+ if stored_channel is None and snapshot is not None:
433
+ stored_channel = snapshot.telemetry_channel
434
+ effective_channel = requested_channel or stored_channel
435
+ if effective_channel is None:
436
+ return None
437
+
438
+ self._pending_context_telemetry_channels[context_id] = effective_channel
439
+ if snapshot is not None and snapshot.telemetry_channel != effective_channel:
440
+ snapshot = A2AContextSnapshot(
441
+ context_id=snapshot.context_id,
442
+ session_id=snapshot.session_id,
443
+ cwd=snapshot.cwd,
444
+ telemetry_channel=effective_channel,
445
+ active_task_id=snapshot.active_task_id,
446
+ updated_at=time.time(),
447
+ )
448
+ self._persist_context_snapshot(snapshot)
449
+ return effective_channel
450
+
402
451
  async def get_context_record(self, context_id: str) -> A2AContextRecord:
403
452
  context_id = validate_protocol_id(context_id)
404
453
  async with self._mutation_lock:
@@ -408,6 +457,7 @@ class A2ATaskStore(TaskStore):
408
457
  context_id=record.context_id,
409
458
  session_id=record.session_id,
410
459
  cwd=record.cwd,
460
+ telemetry_channel=record.telemetry_channel,
411
461
  active_task_id=record.active_task_id,
412
462
  expired=record.expired,
413
463
  created_at=record.created_at,
@@ -421,6 +471,7 @@ class A2ATaskStore(TaskStore):
421
471
  context_id=snapshot.context_id,
422
472
  session_id=snapshot.session_id,
423
473
  cwd=snapshot.cwd,
474
+ telemetry_channel=snapshot.telemetry_channel,
424
475
  active_task_id=snapshot.active_task_id,
425
476
  )
426
477
 
@@ -690,11 +741,14 @@ class A2ATaskStore(TaskStore):
690
741
  context_id=context_id,
691
742
  session_id=session_id,
692
743
  cwd=cwd,
744
+ telemetry_channel=snapshot.telemetry_channel,
693
745
  lock=asyncio.Lock(),
694
746
  )
695
747
  self._contexts[context_id] = record
696
748
  elif record.session_id != session_id or record.cwd != cwd:
697
749
  raise ValueError(_("A2A context belongs to a different workspace"))
750
+ elif record.telemetry_channel is None:
751
+ record.telemetry_channel = snapshot.telemetry_channel
698
752
  runtime = record.runtime
699
753
  record.runtime = None
700
754
  record.active_task_id = None if clear_active_task_for_proven_handoff else snapshot.active_task_id
@@ -704,6 +758,7 @@ class A2ATaskStore(TaskStore):
704
758
  context_id=record.context_id,
705
759
  session_id=record.session_id,
706
760
  cwd=record.cwd,
761
+ telemetry_channel=record.telemetry_channel,
707
762
  active_task_id=record.active_task_id,
708
763
  expired=record.expired,
709
764
  created_at=record.created_at,
@@ -802,6 +857,23 @@ class A2ATaskStore(TaskStore):
802
857
  async with self._mutation_lock:
803
858
  return self._task_is_active_locked(task_id)
804
859
 
860
+ async def has_active_work(self) -> bool:
861
+ """Return whether shutting down would interrupt in-process A2A work."""
862
+ async with self._mutation_lock:
863
+ return (
864
+ any(record.active_task is not None and not record.active_task.done() for record in self._tasks.values())
865
+ or any(not task.done() for task in self._context_runtime_tasks.values())
866
+ or any(
867
+ not task.done()
868
+ for starts in self._context_execution_starts.values()
869
+ for task in starts.values()
870
+ )
871
+ or any(self._context_reconciliation_waiters.values())
872
+ or any(lock.locked() for lock in self._reconciliation_locks.values())
873
+ or any(count > 0 for count in self._context_runtime_waiters.values())
874
+ or any(not task.done() for task in self._discarded_context_runtime_tasks)
875
+ )
876
+
805
877
  def mirror_task(self, record: A2ATaskRecord) -> None:
806
878
  record.updated_at = time.time()
807
879
  self._mirror_task(record)
@@ -873,6 +945,7 @@ class A2ATaskStore(TaskStore):
873
945
  for context_id, task in self._context_runtime_tasks.items()
874
946
  ]
875
947
  self._contexts.clear()
948
+ self._pending_context_telemetry_channels.clear()
876
949
  self._context_runtime_tasks.clear()
877
950
  self._context_runtime_waiters.clear()
878
951
  for task, waiters in runtime_tasks:
@@ -917,13 +990,17 @@ class A2ATaskStore(TaskStore):
917
990
  context_id=record.context_id,
918
991
  session_id=record.session_id,
919
992
  cwd=record.cwd,
993
+ telemetry_channel=record.telemetry_channel,
920
994
  active_task_id=record.active_task_id,
921
995
  )
996
+ self._persist_context_snapshot(snapshot)
997
+
998
+ def _persist_context_snapshot(self, snapshot: A2AContextSnapshot) -> None:
922
999
  if self._persistence is not None:
923
1000
  try:
924
1001
  self._persistence.save_context(snapshot)
925
1002
  except Exception:
926
- logger.exception("Failed to persist A2A context %s", record.context_id)
1003
+ logger.exception("Failed to persist A2A context %s", snapshot.context_id)
927
1004
  self._mirror_session_context(snapshot)
928
1005
 
929
1006
  def _mirror_session_task(self, snapshot: A2ATaskSnapshot) -> None:
@@ -1099,6 +1176,7 @@ def _load_session_context_snapshot(*, cwd: str, session_id: str) -> A2AContextSn
1099
1176
  context_id=context_id,
1100
1177
  session_id=snapshot_session_id,
1101
1178
  cwd=snapshot_cwd,
1179
+ telemetry_channel=normalize_telemetry_channel(payload.get("telemetry_channel")),
1102
1180
  active_task_id=active_task_id,
1103
1181
  updated_at=float(updated_at) if isinstance(updated_at, (int, float)) else time.time(),
1104
1182
  )
@@ -46,6 +46,7 @@ class A2AContextRecord:
46
46
  context_id: str
47
47
  session_id: str
48
48
  cwd: str
49
+ telemetry_channel: str | None = None
49
50
  runtime: Any | None = None
50
51
  lock: asyncio.Lock | None = None
51
52
  active_task_id: str | None = None
@@ -795,6 +795,7 @@ def a2a(
795
795
  push_consumer_name = config.get("push_consumer_name", "")
796
796
  push_lease_timeout_ms = config.get("push_lease_timeout_ms", 300000)
797
797
  auto_approve_permissions = config.get("auto_approve_permissions", False)
798
+ idle_shutdown_seconds = config.get("idle_shutdown_seconds", 0)
798
799
  log_to_stdout = _a2a_config_value(ctx, config, "log_to_stdout", log_to_stdout)
799
800
  thinking_exposure = _a2a_config_value(ctx, config, "thinking_exposure", thinking_exposure)
800
801
  model = load_saved_model() or DEFAULT_MODEL
@@ -938,6 +939,7 @@ def a2a(
938
939
  consumer_group=consumer_group,
939
940
  auto_approve_permissions=auto_approve_permissions,
940
941
  thinking_exposure=thinking_exposure,
942
+ idle_shutdown_seconds=idle_shutdown_seconds,
941
943
  )
942
944
  except (RuntimeError, ValueError) as exc:
943
945
  exit_reason = "error"
@@ -4,7 +4,7 @@
4
4
  #
5
5
  msgid ""
6
6
  msgstr ""
7
- "Project-Id-Version: iac-code 0.13.0\n"
7
+ "Project-Id-Version: iac-code 0.13.1\n"
8
8
  "Report-Msgid-Bugs-To: \n"
9
9
  "POT-Creation-Date: 2026-06-04 15:58+0800\n"
10
10
  "PO-Revision-Date: 2026-05-13 00:00+0000\n"