iac-code 0.11.0__tar.gz → 0.11.2__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 (615) hide show
  1. {iac_code-0.11.0 → iac_code-0.11.2}/PKG-INFO +3 -2
  2. {iac_code-0.11.0 → iac_code-0.11.2}/README.md +2 -1
  3. iac_code-0.11.2/src/iac_code/__init__.py +2 -0
  4. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/app.py +170 -4
  5. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/events.py +42 -23
  6. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/executor.py +16 -15
  7. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/jsonrpc_passthrough.py +6 -1
  8. iac_code-0.11.2/src/iac_code/a2a/metadata_redaction.py +32 -0
  9. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/pipeline_events.py +10 -16
  10. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/pipeline_executor.py +5 -23
  11. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/pipeline_flow_monitor.py +1 -1
  12. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/pipeline_recovery.py +2 -8
  13. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/pipeline_snapshot.py +38 -65
  14. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/pipeline_stream.py +16 -36
  15. iac_code-0.11.2/src/iac_code/a2a/projection.py +406 -0
  16. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/push.py +17 -6
  17. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/push_worker.py +24 -8
  18. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/task_store.py +48 -0
  19. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/transports/dispatcher.py +46 -13
  20. iac_code-0.11.2/src/iac_code/a2a/transports/grpc.py +113 -0
  21. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/transports/grpc_jsonrpc.py +15 -7
  22. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/transports/redis_streams.py +9 -2
  23. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/transports/stdio.py +12 -3
  24. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/transports/websocket.py +11 -3
  25. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/acp/convert.py +5 -7
  26. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/acp/server.py +9 -16
  27. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/acp/session.py +16 -44
  28. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/acp/slash_registry.py +6 -6
  29. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/cli/headless.py +6 -6
  30. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/cli/output_formats.py +5 -31
  31. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/cli/process_events.py +3 -4
  32. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/config.py +2 -1
  33. iac_code-0.11.2/src/iac_code/i18n/locales/de/LC_MESSAGES/messages.mo +0 -0
  34. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/i18n/locales/de/LC_MESSAGES/messages.po +1002 -23
  35. iac_code-0.11.2/src/iac_code/i18n/locales/de/LC_MESSAGES/webui.mo +0 -0
  36. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/i18n/locales/de/LC_MESSAGES/webui.po +78 -14
  37. iac_code-0.11.2/src/iac_code/i18n/locales/es/LC_MESSAGES/messages.mo +0 -0
  38. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/i18n/locales/es/LC_MESSAGES/messages.po +1004 -23
  39. iac_code-0.11.2/src/iac_code/i18n/locales/es/LC_MESSAGES/webui.mo +0 -0
  40. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/i18n/locales/es/LC_MESSAGES/webui.po +81 -14
  41. iac_code-0.11.2/src/iac_code/i18n/locales/fr/LC_MESSAGES/messages.mo +0 -0
  42. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/i18n/locales/fr/LC_MESSAGES/messages.po +1008 -23
  43. iac_code-0.11.2/src/iac_code/i18n/locales/fr/LC_MESSAGES/webui.mo +0 -0
  44. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/i18n/locales/fr/LC_MESSAGES/webui.po +81 -14
  45. iac_code-0.11.2/src/iac_code/i18n/locales/ja/LC_MESSAGES/messages.mo +0 -0
  46. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/i18n/locales/ja/LC_MESSAGES/messages.po +841 -23
  47. iac_code-0.11.2/src/iac_code/i18n/locales/ja/LC_MESSAGES/webui.mo +0 -0
  48. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/i18n/locales/ja/LC_MESSAGES/webui.po +72 -14
  49. iac_code-0.11.2/src/iac_code/i18n/locales/pt/LC_MESSAGES/messages.mo +0 -0
  50. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/i18n/locales/pt/LC_MESSAGES/messages.po +999 -23
  51. iac_code-0.11.2/src/iac_code/i18n/locales/pt/LC_MESSAGES/webui.mo +0 -0
  52. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/i18n/locales/pt/LC_MESSAGES/webui.po +80 -14
  53. iac_code-0.11.2/src/iac_code/i18n/locales/zh/LC_MESSAGES/messages.mo +0 -0
  54. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/i18n/locales/zh/LC_MESSAGES/messages.po +829 -19
  55. iac_code-0.11.2/src/iac_code/i18n/locales/zh/LC_MESSAGES/webui.mo +0 -0
  56. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/i18n/locales/zh/LC_MESSAGES/webui.po +72 -14
  57. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/mcp/cli.py +2 -2
  58. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/mcp/oauth.py +62 -40
  59. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/mcp/storage.py +6 -2
  60. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/cleanup.py +14 -15
  61. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/complete_step_tool.py +18 -25
  62. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/events.py +2 -4
  63. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/handoff.py +14 -1
  64. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/observability.py +2 -2
  65. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/pipeline_runner.py +31 -22
  66. iac_code-0.11.2/src/iac_code/pipeline/engine/public_errors.py +57 -0
  67. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/sub_pipeline_executor.py +35 -34
  68. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/hooks/deploying.py +18 -0
  69. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/prompts/cost_estimating.md +1 -1
  70. {iac_code-0.11.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost → iac_code-0.11.2/src/iac_code/pipeline/selling}/references/template-parameter-recommendation.md +7 -7
  71. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/SKILL.md +1 -1
  72. {iac_code-0.11.0/src/iac_code/pipeline/selling → iac_code-0.11.2/src/iac_code/pipeline/selling/skills/iac-aliyun-cost}/references/template-parameter-recommendation.md +7 -7
  73. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/SKILL.md +1 -1
  74. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/template-parameter-recommendation.md +7 -7
  75. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/template-parameter-recommendation.md +7 -7
  76. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/tools/ros_deploy_tool.py +7 -0
  77. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/anthropic_provider.py +6 -1
  78. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/dashscope_provider.py +2 -2
  79. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/deepseek_provider.py +5 -1
  80. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/manager.py +6 -1
  81. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/registry.py +8 -2
  82. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/thinking.py +79 -13
  83. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/agent_factory.py +4 -1
  84. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/context_manager.py +6 -2
  85. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/telemetry/constants.py +4 -0
  86. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/telemetry/content_serializer.py +59 -14
  87. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/telemetry/sanitize.py +4 -2
  88. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/analyzer.py +29 -11
  89. iac_code-0.11.2/src/iac_code/tools/cloud/aliyun/ros_validation/association_property_specs.py +693 -0
  90. iac_code-0.11.2/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_association_property_specs.json +12563 -0
  91. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/model.py +5 -0
  92. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/outcome.py +1 -0
  93. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/renderer.py +53 -5
  94. iac_code-0.11.2/src/iac_code/tools/cloud/aliyun/ros_validation/rules/association_property.py +3248 -0
  95. iac_code-0.11.2/src/iac_code/tools/cloud/aliyun/ros_validation/template_kind.py +16 -0
  96. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/validator.py +6 -1
  97. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/renderer.py +2 -9
  98. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/repl.py +4 -15
  99. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/public_errors.py +29 -1
  100. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/public_paths.py +125 -1
  101. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/app.py +33 -22
  102. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/events.py +12 -50
  103. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/pipeline_actions.py +2 -6
  104. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/runtime.py +25 -5
  105. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/server.py +2 -2
  106. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/session_manager.py +85 -0
  107. iac_code-0.11.2/src/iac_code/web/session_titler.py +82 -0
  108. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/settings.py +33 -0
  109. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/shell.py +3 -4
  110. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/index.html +2 -2
  111. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/js/api.js +15 -0
  112. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/js/app.js +136 -24
  113. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/js/components/composer.js +32 -16
  114. iac_code-0.11.2/src/iac_code/web/static/js/components/image_lightbox.js +77 -0
  115. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/js/components/output_panel.js +5 -2
  116. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/js/components/workspace.js +315 -88
  117. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/styles.css +131 -16
  118. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code.egg-info/PKG-INFO +3 -2
  119. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code.egg-info/SOURCES.txt +7 -0
  120. iac_code-0.11.0/src/iac_code/__init__.py +0 -2
  121. iac_code-0.11.0/src/iac_code/a2a/metadata_redaction.py +0 -89
  122. iac_code-0.11.0/src/iac_code/a2a/transports/grpc.py +0 -52
  123. iac_code-0.11.0/src/iac_code/i18n/locales/de/LC_MESSAGES/messages.mo +0 -0
  124. iac_code-0.11.0/src/iac_code/i18n/locales/de/LC_MESSAGES/webui.mo +0 -0
  125. iac_code-0.11.0/src/iac_code/i18n/locales/es/LC_MESSAGES/messages.mo +0 -0
  126. iac_code-0.11.0/src/iac_code/i18n/locales/es/LC_MESSAGES/webui.mo +0 -0
  127. iac_code-0.11.0/src/iac_code/i18n/locales/fr/LC_MESSAGES/messages.mo +0 -0
  128. iac_code-0.11.0/src/iac_code/i18n/locales/fr/LC_MESSAGES/webui.mo +0 -0
  129. iac_code-0.11.0/src/iac_code/i18n/locales/ja/LC_MESSAGES/messages.mo +0 -0
  130. iac_code-0.11.0/src/iac_code/i18n/locales/ja/LC_MESSAGES/webui.mo +0 -0
  131. iac_code-0.11.0/src/iac_code/i18n/locales/pt/LC_MESSAGES/messages.mo +0 -0
  132. iac_code-0.11.0/src/iac_code/i18n/locales/pt/LC_MESSAGES/webui.mo +0 -0
  133. iac_code-0.11.0/src/iac_code/i18n/locales/zh/LC_MESSAGES/messages.mo +0 -0
  134. iac_code-0.11.0/src/iac_code/i18n/locales/zh/LC_MESSAGES/webui.mo +0 -0
  135. iac_code-0.11.0/src/iac_code/pipeline/engine/public_errors.py +0 -17
  136. {iac_code-0.11.0 → iac_code-0.11.2}/LICENSE +0 -0
  137. {iac_code-0.11.0 → iac_code-0.11.2}/MANIFEST.in +0 -0
  138. {iac_code-0.11.0 → iac_code-0.11.2}/pyproject.toml +0 -0
  139. {iac_code-0.11.0 → iac_code-0.11.2}/setup.cfg +0 -0
  140. {iac_code-0.11.0 → iac_code-0.11.2}/setup.py +0 -0
  141. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/__init__.py +0 -0
  142. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/agent_card.py +0 -0
  143. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/artifacts.py +0 -0
  144. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/backup.py +0 -0
  145. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/client.py +0 -0
  146. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/exposure.py +0 -0
  147. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/metrics.py +0 -0
  148. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/parts.py +0 -0
  149. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/persistence.py +0 -0
  150. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/pipeline_delta_coalescing.py +0 -0
  151. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/pipeline_journal.py +0 -0
  152. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/pipeline_outbound.py +0 -0
  153. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/pipeline_paths.py +0 -0
  154. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/pipeline_performance.py +0 -0
  155. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/pipeline_transport_delivery.py +0 -0
  156. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/push_queue.py +0 -0
  157. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/push_secrets.py +0 -0
  158. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/router.py +0 -0
  159. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/runtime_overrides.py +0 -0
  160. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/runtime_registry.py +0 -0
  161. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/signing.py +0 -0
  162. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/thinking_metadata.py +0 -0
  163. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/transport.py +0 -0
  164. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/transports/__init__.py +0 -0
  165. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/transports/base.py +0 -0
  166. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/transports/http.py +0 -0
  167. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/transports/unix.py +0 -0
  168. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/types.py +0 -0
  169. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/acp/__init__.py +0 -0
  170. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/acp/http_sse.py +0 -0
  171. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/acp/mcp.py +0 -0
  172. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/acp/metrics.py +0 -0
  173. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/acp/runner.py +0 -0
  174. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/acp/state.py +0 -0
  175. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/acp/tools.py +0 -0
  176. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/acp/types.py +0 -0
  177. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/acp/version.py +0 -0
  178. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/agent/__init__.py +0 -0
  179. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/agent/agent_loop.py +0 -0
  180. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/agent/agent_tool.py +0 -0
  181. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/agent/agent_types.py +0 -0
  182. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/agent/message.py +0 -0
  183. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/agent/system_prompt.py +0 -0
  184. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/cli/__init__.py +0 -0
  185. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/cli/install_git_bash.py +0 -0
  186. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/cli/main.py +0 -0
  187. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/cli/process_mode.py +0 -0
  188. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/cli/process_protocol.py +0 -0
  189. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/cli/update.py +0 -0
  190. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/__init__.py +0 -0
  191. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/auth.py +0 -0
  192. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/clear.py +0 -0
  193. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/compact.py +0 -0
  194. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/debug.py +0 -0
  195. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/effort.py +0 -0
  196. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/exit.py +0 -0
  197. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/help.py +0 -0
  198. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/mcp.py +0 -0
  199. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/memory.py +0 -0
  200. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/model.py +0 -0
  201. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/prompt.py +0 -0
  202. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/registry.py +0 -0
  203. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/rename.py +0 -0
  204. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/resume.py +0 -0
  205. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/skills.py +0 -0
  206. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/status.py +0 -0
  207. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/tasks.py +0 -0
  208. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/thinking_enabled.py +0 -0
  209. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/i18n/__init__.py +0 -0
  210. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/i18n/html_extractor.py +0 -0
  211. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/mcp/__init__.py +0 -0
  212. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/mcp/client.py +0 -0
  213. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/mcp/config.py +0 -0
  214. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/mcp/env_expansion.py +0 -0
  215. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/mcp/errors.py +0 -0
  216. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/mcp/manager.py +0 -0
  217. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/mcp/output.py +0 -0
  218. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/mcp/progress.py +0 -0
  219. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/mcp/prompt_dispatch.py +0 -0
  220. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/mcp/prompts.py +0 -0
  221. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/mcp/redaction.py +0 -0
  222. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/mcp/skills.py +0 -0
  223. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/mcp/tools.py +0 -0
  224. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/mcp/types.py +0 -0
  225. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/memory/__init__.py +0 -0
  226. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/memory/memory_manager.py +0 -0
  227. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/memory/memory_tools.py +0 -0
  228. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/memory/project_memory.py +0 -0
  229. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/memory/recall.py +0 -0
  230. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/__init__.py +0 -0
  231. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/config.py +0 -0
  232. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/constants.py +0 -0
  233. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/display_names.py +0 -0
  234. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/__init__.py +0 -0
  235. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/architecture_graph.py +0 -0
  236. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/architecture_meta.py +0 -0
  237. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/architecture_metas/Categories.json +0 -0
  238. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/architecture_metas/config.json +0 -0
  239. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/architecture_metas/products.json +0 -0
  240. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/architecture_resource_inventory.py +0 -0
  241. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/architecture_rule_candidates.py +0 -0
  242. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/architecture_rule_drafts.py +0 -0
  243. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/architecture_rule_facts.py +0 -0
  244. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/architecture_rules.json +0 -0
  245. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/architecture_rules.py +0 -0
  246. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/architecture_semantic_planning.py +0 -0
  247. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/ask_user_question_tool.py +0 -0
  248. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/completion_guard_state.py +0 -0
  249. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/context.py +0 -0
  250. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/display_replay.py +0 -0
  251. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/interrupt.py +0 -0
  252. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/loader.py +0 -0
  253. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/prerequisites.py +0 -0
  254. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/prompts/interrupt_judge.md +0 -0
  255. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/recovery.py +0 -0
  256. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/resume_recovery.py +0 -0
  257. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/session.py +0 -0
  258. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/show_diagram_tool.py +0 -0
  259. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/state_machine.py +0 -0
  260. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/step_executor.py +0 -0
  261. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/step_spec.py +0 -0
  262. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/transcript_storage.py +0 -0
  263. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/types.py +0 -0
  264. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/ui_contract.py +0 -0
  265. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/user_input.py +0 -0
  266. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/pipeline.yaml +0 -0
  267. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/prompts/architecture_planning.md +0 -0
  268. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/prompts/confirm_and_select.a2a.md +0 -0
  269. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/prompts/confirm_and_select.md +0 -0
  270. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/prompts/deploying.md +0 -0
  271. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/prompts/evaluate_candidates.md +0 -0
  272. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/prompts/intent_parsing.md +0 -0
  273. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/prompts/reviewing.md +0 -0
  274. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/prompts/template_generating.md +0 -0
  275. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/references/cloud-products/ecs.md +0 -0
  276. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/references/cloud-products/oss.md +0 -0
  277. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/references/cloud-products/rds.md +0 -0
  278. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/references/cloud-products/redis.md +0 -0
  279. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/references/cloud-products/slb.md +0 -0
  280. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/references/cloud-products/vpc.md +0 -0
  281. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/references/ros-template.md +0 -0
  282. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/references/template-parameters.md +0 -0
  283. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/references/terraform-template.md +0 -0
  284. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-architecture/SKILL.md +0 -0
  285. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-architecture/evals.json +0 -0
  286. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/evals.json +0 -0
  287. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/ecs.md +0 -0
  288. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/oss.md +0 -0
  289. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/rds.md +0 -0
  290. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/redis.md +0 -0
  291. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/slb.md +0 -0
  292. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/vpc.md +0 -0
  293. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/ros-template.md +0 -0
  294. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/template-parameters.md +0 -0
  295. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/terraform-template.md +0 -0
  296. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/evals.json +0 -0
  297. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/ecs.md +0 -0
  298. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/oss.md +0 -0
  299. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/rds.md +0 -0
  300. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/redis.md +0 -0
  301. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/slb.md +0 -0
  302. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/vpc.md +0 -0
  303. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/ros-template.md +0 -0
  304. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/template-parameters.md +0 -0
  305. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/terraform-template.md +0 -0
  306. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-intent/SKILL.md +0 -0
  307. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-intent/evals.json +0 -0
  308. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-review/SKILL.md +0 -0
  309. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-review/evals.json +0 -0
  310. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/SKILL.md +0 -0
  311. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/evals.json +0 -0
  312. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/ecs.md +0 -0
  313. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/oss.md +0 -0
  314. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/rds.md +0 -0
  315. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/redis.md +0 -0
  316. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/slb.md +0 -0
  317. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/vpc.md +0 -0
  318. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/ros-template.md +0 -0
  319. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/template-parameters.md +0 -0
  320. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/terraform-template.md +0 -0
  321. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/tools/__init__.py +0 -0
  322. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/tools/infraguard_scan_tool.py +0 -0
  323. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/tools/ros_template_tools.py +0 -0
  324. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/tools/show_candidate_detail_tool.py +0 -0
  325. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/__init__.py +0 -0
  326. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/azure_openai_provider.py +0 -0
  327. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/base.py +0 -0
  328. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/gemini_provider.py +0 -0
  329. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/kimi_provider.py +0 -0
  330. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/lmstudio_provider.py +0 -0
  331. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/minimax_provider.py +0 -0
  332. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/modelscope_provider.py +0 -0
  333. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/ollama_provider.py +0 -0
  334. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/openai_provider.py +0 -0
  335. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/openrouter_provider.py +0 -0
  336. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/request_logging.py +0 -0
  337. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/request_policy.py +0 -0
  338. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/retry.py +0 -0
  339. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/siliconflow_provider.py +0 -0
  340. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/stream_watchdog.py +0 -0
  341. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/volcengine_provider.py +0 -0
  342. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/zhipu_provider.py +0 -0
  343. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/__init__.py +0 -0
  344. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/capabilities/__init__.py +0 -0
  345. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/capabilities/auto_detect.py +0 -0
  346. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/capabilities/multimodal.py +0 -0
  347. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/cloud_credentials.py +0 -0
  348. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/permissions/__init__.py +0 -0
  349. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/permissions/audit.py +0 -0
  350. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/permissions/loader.py +0 -0
  351. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/permissions/pipeline.py +0 -0
  352. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/permissions/rule_scope.py +0 -0
  353. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/permissions/storage.py +0 -0
  354. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/permissions/trusted_roots.py +0 -0
  355. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/providers/__init__.py +0 -0
  356. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/providers/aliyun.py +0 -0
  357. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/providers/aliyun_oauth.py +0 -0
  358. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/qwenpaw_source.py +0 -0
  359. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/session_backup.py +0 -0
  360. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/session_backup_state.py +0 -0
  361. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/session_index.py +0 -0
  362. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/session_layout.py +0 -0
  363. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/session_metadata.py +0 -0
  364. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/session_resolver.py +0 -0
  365. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/session_storage.py +0 -0
  366. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/session_usage.py +0 -0
  367. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/telemetry/__init__.py +0 -0
  368. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/telemetry/attributes.py +0 -0
  369. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/telemetry/client.py +0 -0
  370. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/telemetry/config.py +0 -0
  371. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/telemetry/events.py +0 -0
  372. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/telemetry/fallback.py +0 -0
  373. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/telemetry/identity.py +0 -0
  374. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/telemetry/metrics.py +0 -0
  375. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/telemetry/names.py +0 -0
  376. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/telemetry/scope.py +0 -0
  377. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/telemetry/sink.py +0 -0
  378. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/telemetry/tracing.py +0 -0
  379. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/telemetry/types.py +0 -0
  380. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/token_budget.py +0 -0
  381. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/token_counter.py +0 -0
  382. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/update_checker.py +0 -0
  383. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/__init__.py +0 -0
  384. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/auto_trigger.py +0 -0
  385. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/__init__.py +0 -0
  386. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/iac_aliyun/SKILL.md +0 -0
  387. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/iac_aliyun/__init__.py +0 -0
  388. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/iac_aliyun/auto_trigger.py +0 -0
  389. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/ecs.md +0 -0
  390. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/oss.md +0 -0
  391. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/rds.md +0 -0
  392. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/redis.md +0 -0
  393. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/slb.md +0 -0
  394. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/vpc.md +0 -0
  395. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/iac_aliyun/references/ros-template.md +0 -0
  396. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/iac_aliyun/references/template-parameter-recommendation.md +0 -0
  397. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/iac_aliyun/references/template-parameters.md +0 -0
  398. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/iac_aliyun/references/terraform-template.md +0 -0
  399. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/iac_aliyun/scripts/tf2ros.py +0 -0
  400. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/pac_aliyun/SKILL.md +0 -0
  401. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/pac_aliyun/__init__.py +0 -0
  402. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/pac_aliyun/auto_trigger.py +0 -0
  403. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/pac_aliyun/references/infraguard-policy-generation.md +0 -0
  404. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/simplify.py +0 -0
  405. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/discovery.py +0 -0
  406. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/frontmatter.py +0 -0
  407. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/listing.py +0 -0
  408. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/loader.py +0 -0
  409. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/management.py +0 -0
  410. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/processor.py +0 -0
  411. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/renderer.py +0 -0
  412. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/settings.py +0 -0
  413. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/skill_definition.py +0 -0
  414. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/skill_tool.py +0 -0
  415. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/state/__init__.py +0 -0
  416. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/state/app_state.py +0 -0
  417. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tasks/__init__.py +0 -0
  418. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tasks/notification_queue.py +0 -0
  419. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tasks/task_state.py +0 -0
  420. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tasks/task_tools.py +0 -0
  421. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/__init__.py +0 -0
  422. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/base.py +0 -0
  423. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/bash/__init__.py +0 -0
  424. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/bash/argv_safety.py +0 -0
  425. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/bash/bash_tool.py +0 -0
  426. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/bash/command_parser.py +0 -0
  427. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/bash/mode_validation.py +0 -0
  428. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/bash/path_validation.py +0 -0
  429. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/bash/permissions.py +0 -0
  430. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/bash/readonly_commands.py +0 -0
  431. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/bash/rule_matching.py +0 -0
  432. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/bash/safety_checks.py +0 -0
  433. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/__init__.py +0 -0
  434. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/__init__.py +0 -0
  435. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/acs3_transport.py +0 -0
  436. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/aliyun_api.py +0 -0
  437. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/aliyun_api_doc.py +0 -0
  438. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/aliyun_doc_search.py +0 -0
  439. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/api_contract.py +0 -0
  440. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/api_hooks.py +0 -0
  441. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/api_identifiers.py +0 -0
  442. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/contract_store.py +0 -0
  443. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/data/README.md +0 -0
  444. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/data/endpoints/catalog.json +0 -0
  445. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/data/endpoints/generation_report.json +0 -0
  446. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/data/endpoints/legacy.yml +0 -0
  447. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/data/endpoints/overrides.yml +0 -0
  448. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/data/endpoints/unavailable.json +0 -0
  449. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/data/openmeta/api_overrides.yml +0 -0
  450. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/data/openmeta/exclusions.yml +0 -0
  451. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/data/openmeta/product_aliases.yml +0 -0
  452. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/data/openmeta/product_catalog.json +0 -0
  453. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/data/oss/operation_catalog.json +0 -0
  454. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/data/validation/judgments.yml +0 -0
  455. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/data/validation/overrides.yml +0 -0
  456. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/endpoint_resolver.py +0 -0
  457. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/hooks/__init__.py +0 -0
  458. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/hooks/ros_parameters.py +0 -0
  459. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py +0 -0
  460. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/openmeta.py +0 -0
  461. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/oss_v4_adapter.py +0 -0
  462. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/product_resolver.py +0 -0
  463. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/public_errors.py +0 -0
  464. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/result_contract.py +0 -0
  465. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/retry_policy.py +0 -0
  466. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_client.py +0 -0
  467. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_stack.py +0 -0
  468. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_stack_instances.py +0 -0
  469. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_template_tools.py +0 -0
  470. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/__init__.py +0 -0
  471. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/action_policy.py +0 -0
  472. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/count.py +0 -0
  473. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_official_resource_index.json +0 -0
  474. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_resource_value_specs.json +0 -0
  475. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_template_body_action_policies.json +0 -0
  476. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/facts.py +0 -0
  477. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/function_specs.py +0 -0
  478. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/parser.py +0 -0
  479. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/resource_value_specs.py +0 -0
  480. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/__init__.py +0 -0
  481. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/base.py +0 -0
  482. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/registry.py +0 -0
  483. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/symbols.py +0 -0
  484. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/types.py +0 -0
  485. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_yaml.py +0 -0
  486. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/runtime.py +0 -0
  487. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/template_source.py +0 -0
  488. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/user_agent.py +0 -0
  489. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/validation_policy.py +0 -0
  490. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/base_api.py +0 -0
  491. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/base_stack.py +0 -0
  492. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/registry.py +0 -0
  493. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/types.py +0 -0
  494. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/edit_file.py +0 -0
  495. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/glob.py +0 -0
  496. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/grep.py +0 -0
  497. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/list_files.py +0 -0
  498. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/path_safety.py +0 -0
  499. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/read_file.py +0 -0
  500. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/result_storage.py +0 -0
  501. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/tool_executor.py +0 -0
  502. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/web_fetch.py +0 -0
  503. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/write_file.py +0 -0
  504. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/types/__init__.py +0 -0
  505. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/types/permissions.py +0 -0
  506. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/types/skill_source.py +0 -0
  507. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/types/stream_events.py +0 -0
  508. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/__init__.py +0 -0
  509. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/banner.py +0 -0
  510. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/components/__init__.py +0 -0
  511. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/components/candidate_selection.py +0 -0
  512. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/components/dialog.py +0 -0
  513. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/components/divider.py +0 -0
  514. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/components/fuzzy_picker.py +0 -0
  515. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/components/parallel_tabs.py +0 -0
  516. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/components/progress_bar.py +0 -0
  517. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/components/search_box.py +0 -0
  518. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/components/select.py +0 -0
  519. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/components/status_icon.py +0 -0
  520. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/components/tabs.py +0 -0
  521. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/core/__init__.py +0 -0
  522. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/core/in_place_render.py +0 -0
  523. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/core/input_history.py +0 -0
  524. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/core/key_event.py +0 -0
  525. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/core/prompt_input.py +0 -0
  526. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/core/raw_input.py +0 -0
  527. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/core/raw_input_win.py +0 -0
  528. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/core/screen.py +0 -0
  529. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/diagram_rendering.py +0 -0
  530. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/dialogs/__init__.py +0 -0
  531. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/dialogs/global_search.py +0 -0
  532. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/dialogs/history_search.py +0 -0
  533. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/dialogs/mcp_manager.py +0 -0
  534. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/dialogs/memory.py +0 -0
  535. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/dialogs/memory_editor.py +0 -0
  536. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/dialogs/model_picker.py +0 -0
  537. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/dialogs/quick_open.py +0 -0
  538. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/dialogs/resume_picker.py +0 -0
  539. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/dialogs/skills_picker.py +0 -0
  540. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/keybindings/__init__.py +0 -0
  541. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/keybindings/manager.py +0 -0
  542. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/pipeline_display_replay.py +0 -0
  543. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/pipeline_styles.py +0 -0
  544. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/spinner.py +0 -0
  545. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/stream_accumulator.py +0 -0
  546. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/suggestions/__init__.py +0 -0
  547. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/suggestions/aggregator.py +0 -0
  548. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/suggestions/command_provider.py +0 -0
  549. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/suggestions/directory_provider.py +0 -0
  550. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/suggestions/file_provider.py +0 -0
  551. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/suggestions/shell_history_provider.py +0 -0
  552. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/suggestions/skill_provider.py +0 -0
  553. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/suggestions/token_extractor.py +0 -0
  554. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/suggestions/types.py +0 -0
  555. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/transcript_view.py +0 -0
  556. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/__init__.py +0 -0
  557. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/async_lifecycle.py +0 -0
  558. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/background_housekeeping.py +0 -0
  559. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/cleanup.py +0 -0
  560. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/console.py +0 -0
  561. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/file_security.py +0 -0
  562. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/image/__init__.py +0 -0
  563. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/image/clipboard.py +0 -0
  564. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/image/format_detect.py +0 -0
  565. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/image/pasted_content.py +0 -0
  566. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/image/processor.py +0 -0
  567. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/image/resizer.py +0 -0
  568. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/image/store.py +0 -0
  569. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/json_utils.py +0 -0
  570. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/log.py +0 -0
  571. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/path_components.py +0 -0
  572. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/path_locks.py +0 -0
  573. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/platform.py +0 -0
  574. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/project_paths.py +0 -0
  575. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/signals.py +0 -0
  576. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/state_io.py +0 -0
  577. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/tool_input_parser.py +0 -0
  578. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/tool_result_redaction.py +0 -0
  579. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/windows_paths.py +0 -0
  580. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/__init__.py +0 -0
  581. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/cleanup.py +0 -0
  582. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/commands.py +0 -0
  583. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/diagram_cache.py +0 -0
  584. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/diagram_optimizer.py +0 -0
  585. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/diagrams.py +0 -0
  586. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/files.py +0 -0
  587. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/images.py +0 -0
  588. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/mcp_settings.py +0 -0
  589. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/memory.py +0 -0
  590. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/outputs.py +0 -0
  591. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/permissions.py +0 -0
  592. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/pipeline.py +0 -0
  593. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/pipeline_prerequisites.py +0 -0
  594. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/pipeline_transcript.py +0 -0
  595. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/security.py +0 -0
  596. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/skills.py +0 -0
  597. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/icons/sidebar-new-thread.svg +0 -0
  598. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/icons/sidebar-project-open.svg +0 -0
  599. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/icons/sidebar-search.svg +0 -0
  600. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/icons/sidebar-settings.svg +0 -0
  601. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/icons/sidebar-skills.svg +0 -0
  602. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/js/components/blocking.js +0 -0
  603. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/js/components/pipeline.js +0 -0
  604. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/js/components/tool_cards.js +0 -0
  605. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/js/events.js +0 -0
  606. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/js/i18n.js +0 -0
  607. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/js/mermaid_render.js +0 -0
  608. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/js/vendor/markdown-it.LICENSE +0 -0
  609. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/js/vendor/markdown-it.min.js +0 -0
  610. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/js/vendor/mermaid.LICENSE +0 -0
  611. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/js/vendor/mermaid.min.js +0 -0
  612. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code.egg-info/dependency_links.txt +0 -0
  613. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code.egg-info/entry_points.txt +0 -0
  614. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code.egg-info/requires.txt +0 -0
  615. {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: iac_code
3
- Version: 0.11.0
3
+ Version: 0.11.2
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
@@ -77,9 +77,10 @@ echo "Create an OSS Bucket" | iac-code --prompt -
77
77
 
78
78
  ### Web App
79
79
 
80
- Prefer a graphical interface? Launch the local web app, which runs the same engine as the CLI and shares the same sessions:
80
+ Prefer a graphical interface? Launch the local web app, which runs the same engine as the CLI and shares the same sessions. The web app needs the `http` extra, so install it first:
81
81
 
82
82
  ```bash
83
+ pip install 'iac-code[http]'
83
84
  iac-code web
84
85
  ```
85
86
 
@@ -57,9 +57,10 @@ echo "Create an OSS Bucket" | iac-code --prompt -
57
57
 
58
58
  ### Web App
59
59
 
60
- Prefer a graphical interface? Launch the local web app, which runs the same engine as the CLI and shares the same sessions:
60
+ Prefer a graphical interface? Launch the local web app, which runs the same engine as the CLI and shares the same sessions. The web app needs the `http` extra, so install it first:
61
61
 
62
62
  ```bash
63
+ pip install 'iac-code[http]'
63
64
  iac-code web
64
65
  ```
65
66
 
@@ -0,0 +1,2 @@
1
+ __version__ = "0.11.2"
2
+ __release_date__ = "2026-08-03"
@@ -12,7 +12,7 @@ from contextlib import asynccontextmanager, suppress
12
12
  from email.utils import formatdate
13
13
  from pathlib import Path
14
14
  from time import time
15
- from typing import Awaitable, Callable
15
+ from typing import Any, AsyncIterator, Awaitable, Callable, cast
16
16
 
17
17
  from a2a.auth.user import User
18
18
  from a2a.server.context import ServerCallContext
@@ -30,6 +30,12 @@ from iac_code.a2a.jsonrpc_passthrough import (
30
30
  install_jsonrpc_error_data_passthrough,
31
31
  install_v03_jsonrpc_error_data_passthrough,
32
32
  )
33
+ from iac_code.a2a.projection import (
34
+ project_a2a_data,
35
+ project_a2a_text,
36
+ resolve_a2a_public_path_roots,
37
+ resolve_a2a_public_path_roots_for_data,
38
+ )
33
39
  from iac_code.i18n import _
34
40
 
35
41
  logger = logging.getLogger(__name__)
@@ -144,6 +150,146 @@ class A2AAuthMiddleware(BaseHTTPMiddleware):
144
150
  )
145
151
 
146
152
 
153
+ class A2AProjectionMiddleware(BaseHTTPMiddleware):
154
+ """Apply the current A2A delivery policy at the HTTP wire boundary."""
155
+
156
+ def __init__(self, app: Any, *, task_store: Any) -> None:
157
+ super().__init__(app)
158
+ self._task_store = task_store
159
+
160
+ async def dispatch(self, request: Request, call_next: Callable[[Request], Awaitable[Response]]) -> Response:
161
+ request_data = await _a2a_request_data(request)
162
+ response = await call_next(request)
163
+ request_data = _with_a2a_path_parameters(request, request_data)
164
+ if request.url.path in {"/health", AGENT_CARD_WELL_KNOWN_PATH}:
165
+ return response
166
+
167
+ content_type = response.headers.get("content-type", "").lower()
168
+ streaming_response = cast(Any, response)
169
+ if content_type.startswith("text/event-stream"):
170
+ streaming_response.body_iterator = self._project_sse(
171
+ streaming_response.body_iterator,
172
+ request_data=request_data,
173
+ )
174
+ return response
175
+ if "json" not in content_type:
176
+ return response
177
+
178
+ body = b"".join([_response_chunk_bytes(chunk) async for chunk in streaming_response.body_iterator])
179
+ try:
180
+ data = json.loads(body)
181
+ except (UnicodeDecodeError, json.JSONDecodeError):
182
+ return Response(
183
+ body,
184
+ status_code=response.status_code,
185
+ headers=_response_headers_without_length(response),
186
+ background=response.background,
187
+ )
188
+ roots = await self._resolve_roots(data, request_data)
189
+ projected = project_a2a_data(data, public_path_roots=roots)
190
+ return Response(
191
+ json.dumps(projected, ensure_ascii=False, separators=(",", ":")).encode("utf-8"),
192
+ status_code=response.status_code,
193
+ headers=_response_headers_without_length(response),
194
+ background=response.background,
195
+ )
196
+
197
+ async def _project_sse(self, body_iterator: Any, *, request_data: Any) -> AsyncIterator[bytes]:
198
+ pending = b""
199
+ async for chunk in body_iterator:
200
+ pending += _response_chunk_bytes(chunk)
201
+ while True:
202
+ frame, separator, pending = _take_sse_frame(pending)
203
+ if separator is None:
204
+ pending = frame
205
+ break
206
+ yield await self._project_sse_frame(frame, request_data=request_data) + separator
207
+ if pending:
208
+ yield await self._project_sse_frame(pending, request_data=request_data)
209
+
210
+ async def _project_sse_frame(self, frame: bytes, *, request_data: Any) -> bytes:
211
+ output: list[bytes] = []
212
+ for line in frame.splitlines(keepends=True):
213
+ stripped = line.lstrip()
214
+ if not stripped.startswith(b"data:"):
215
+ output.append(line)
216
+ continue
217
+ prefix_length = len(line) - len(stripped)
218
+ payload_with_ending = stripped.removeprefix(b"data:")
219
+ ending = b""
220
+ if payload_with_ending.endswith(b"\r\n"):
221
+ payload_with_ending, ending = payload_with_ending[:-2], b"\r\n"
222
+ elif payload_with_ending.endswith(b"\n"):
223
+ payload_with_ending, ending = payload_with_ending[:-1], b"\n"
224
+ try:
225
+ data = json.loads(payload_with_ending.strip())
226
+ except (UnicodeDecodeError, json.JSONDecodeError):
227
+ output.append(line)
228
+ continue
229
+ roots = await self._resolve_roots(data, request_data)
230
+ projected = project_a2a_data(data, public_path_roots=roots)
231
+ encoded = json.dumps(projected, ensure_ascii=False, separators=(",", ":")).encode("utf-8")
232
+ output.append(line[:prefix_length] + b"data: " + encoded + ending)
233
+ return b"".join(output)
234
+
235
+ async def _resolve_roots(self, response_data: Any, request_data: Any) -> list[dict[str, str]]:
236
+ return await resolve_a2a_public_path_roots_for_data(
237
+ self._task_store,
238
+ response_data=response_data,
239
+ request_data=request_data,
240
+ )
241
+
242
+
243
+ async def _a2a_request_data(request: Request) -> Any:
244
+ data: dict[str, Any] = dict(request.query_params)
245
+ if request.method in {"POST", "PUT", "PATCH"}:
246
+ try:
247
+ body = await request.json()
248
+ except Exception:
249
+ body = None
250
+ if isinstance(body, dict):
251
+ data.update(body)
252
+ elif body is not None:
253
+ data["body"] = body
254
+ return data
255
+
256
+
257
+ def _with_a2a_path_parameters(request: Request, request_data: Any) -> dict[str, Any]:
258
+ """Add REST route identity after routing has populated ``path_params``."""
259
+
260
+ data = dict(request_data) if isinstance(request_data, dict) else {"body": request_data}
261
+ path_params = request.scope.get("path_params")
262
+ if not isinstance(path_params, dict):
263
+ return data
264
+ task_id = path_params.get("id")
265
+ if isinstance(task_id, str) and task_id and "/tasks/" in request.url.path:
266
+ data.setdefault("taskId", task_id)
267
+ context_id = path_params.get("context_id") or path_params.get("contextId")
268
+ if isinstance(context_id, str) and context_id:
269
+ data.setdefault("contextId", context_id)
270
+ return data
271
+
272
+
273
+ def _response_chunk_bytes(chunk: Any) -> bytes:
274
+ if isinstance(chunk, bytes):
275
+ return chunk
276
+ if isinstance(chunk, memoryview):
277
+ return chunk.tobytes()
278
+ return str(chunk).encode("utf-8")
279
+
280
+
281
+ def _response_headers_without_length(response: Response) -> dict[str, str]:
282
+ return {key: value for key, value in response.headers.items() if key.lower() != "content-length"}
283
+
284
+
285
+ def _take_sse_frame(data: bytes) -> tuple[bytes, bytes | None, bytes]:
286
+ candidates = [(index, separator) for separator in (b"\r\n\r\n", b"\n\n") if (index := data.find(separator)) >= 0]
287
+ if not candidates:
288
+ return data, None, b""
289
+ index, separator = min(candidates, key=lambda item: item[0])
290
+ return data[:index], separator, data[index + len(separator) :]
291
+
292
+
147
293
  async def health(request: Request) -> JSONResponse:
148
294
  return JSONResponse({"status": "healthy"})
149
295
 
@@ -253,6 +399,13 @@ def create_app(
253
399
 
254
400
  recovery_service = A2APipelineRecoveryService(task_store=components.task_store)
255
401
 
402
+ async def recovery_path_roots(*, context_id: str | None, task_id: str | None) -> list[dict[str, str]]:
403
+ return await resolve_a2a_public_path_roots(
404
+ components.task_store,
405
+ task_id=task_id,
406
+ context_id=context_id,
407
+ )
408
+
256
409
  async def get_pipeline_state(request: Request) -> JSONResponse:
257
410
  context_id = request.query_params.get("contextId") or None
258
411
  task_id = request.query_params.get("taskId") or None
@@ -263,16 +416,28 @@ def create_app(
263
416
  if parse_error is not None:
264
417
  return JSONResponse({"error": parse_error}, status_code=400)
265
418
 
419
+ call_context = _call_context_from_request(request)
266
420
  try:
267
421
  state = await recovery_service.get_state(
268
422
  context_id=context_id,
269
423
  task_id=task_id,
270
424
  after_sequence=after_sequence,
271
- call_context=_call_context_from_request(request),
425
+ call_context=call_context,
272
426
  )
273
427
  except ValueError as exc:
274
- return JSONResponse({"error": str(exc)}, status_code=404)
275
- return JSONResponse(state)
428
+ roots = await recovery_path_roots(
429
+ context_id=context_id,
430
+ task_id=task_id,
431
+ )
432
+ return JSONResponse(
433
+ {"error": project_a2a_text(str(exc), public_path_roots=roots)},
434
+ status_code=404,
435
+ )
436
+ roots = await recovery_path_roots(
437
+ context_id=context_id,
438
+ task_id=task_id,
439
+ )
440
+ return JSONResponse(project_a2a_data(state, public_path_roots=roots))
276
441
 
277
442
  routes: list[BaseRoute] = [
278
443
  Route("/health", health, methods=["GET"]),
@@ -290,6 +455,7 @@ def create_app(
290
455
  routes.append(Route("/", handle_jsonrpc, methods=["POST"]))
291
456
  routes.extend(create_rest_routes(components.handler, enable_v0_3_compat=True))
292
457
  app = Starlette(routes=routes, lifespan=lifespan)
458
+ app.add_middleware(A2AProjectionMiddleware, task_store=components.task_store)
293
459
  app.add_middleware(
294
460
  A2AAuthMiddleware,
295
461
  token=token,
@@ -1,5 +1,6 @@
1
1
  from __future__ import annotations
2
2
 
3
+ import copy
3
4
  import inspect
4
5
  import logging
5
6
  from collections.abc import Awaitable, Callable
@@ -18,15 +19,10 @@ from a2a.types import (
18
19
  )
19
20
  from google.protobuf.json_format import ParseDict
20
21
 
21
- from iac_code.a2a.artifacts import (
22
- sanitize_public_artifact_text,
23
- sanitize_public_tool_output_data,
24
- )
22
+ from iac_code.a2a.artifacts import sanitize_public_artifact_text
25
23
  from iac_code.a2a.exposure import A2AExposureType, normalize_a2a_exposure_types
26
- from iac_code.a2a.metadata_redaction import A2AMetadataEchoRedactor
27
24
  from iac_code.i18n import _
28
25
  from iac_code.mcp.progress import mcp_progress_metadata, mcp_progress_public_name
29
- from iac_code.mcp.redaction import sanitize_mcp_public_data
30
26
  from iac_code.services.permissions.audit import (
31
27
  build_input_summary,
32
28
  build_redacted_tool_input,
@@ -51,10 +47,11 @@ from iac_code.types.stream_events import (
51
47
  _METADATA_MAX_CHARS = 4000
52
48
  _ERROR_TEXT_MAX_CHARS = 1000
53
49
  _METADATA_MAX_DEPTH = 32
50
+ _ARTIFACT_CONTAINER_KEYS = {"artifact", "artifacts"}
51
+ _ARTIFACT_PAYLOAD_KEYS = {"content", "bytes", "base64", "raw", "path"}
54
52
  logger = logging.getLogger(__name__)
55
53
  A2APermissionResolver: TypeAlias = Callable[[PermissionRequestEvent], "bool | Awaitable[bool]"]
56
54
  IAC_CODE_SESSION_ID_METADATA_KEY = "iacCodeSessionId"
57
- _METADATA_REDACTOR = A2AMetadataEchoRedactor()
58
55
 
59
56
 
60
57
  def iac_code_session_metadata(session_id: str) -> dict[str, Any]:
@@ -75,7 +72,7 @@ def _truncate(value: Any, *, _depth: int = 0) -> Any:
75
72
  if _depth >= _METADATA_MAX_DEPTH:
76
73
  return "[truncated-depth]"
77
74
  if isinstance(value, str):
78
- return sanitize_public_artifact_text(value)[:_METADATA_MAX_CHARS]
75
+ return value[:_METADATA_MAX_CHARS]
79
76
  if isinstance(value, dict):
80
77
  return {str(k): _truncate(v, _depth=_depth + 1) for k, v in value.items()}
81
78
  if isinstance(value, list):
@@ -83,10 +80,6 @@ def _truncate(value: Any, *, _depth: int = 0) -> Any:
83
80
  return value
84
81
 
85
82
 
86
- def _sanitize_trace_input(value: Any) -> Any:
87
- return _METADATA_REDACTOR.redact(_truncate(value))
88
-
89
-
90
83
  def _public_tool_input_metadata(tool_name: str, tool_input: dict[str, Any]) -> dict[str, Any]:
91
84
  return {"inputSummary": build_input_summary(tool_name, tool_input)}
92
85
 
@@ -183,10 +176,40 @@ def _tool_result_metadata(
183
176
  is_error: bool = False,
184
177
  public_path_roots: list[dict[str, str]] | None = None,
185
178
  ) -> Any:
186
- sanitized = sanitize_public_tool_output_data(result, public_path_roots=public_path_roots)
187
- if is_error and isinstance(sanitized, str):
188
- return sanitize_public_artifact_text(sanitized, public_path_roots=public_path_roots)
189
- return _truncate(sanitized)
179
+ del is_error, public_path_roots
180
+ return _tool_result_metadata_value(copy.deepcopy(result))
181
+
182
+
183
+ def _tool_result_metadata_value(value: Any, *, _depth: int = 0, _artifact_scope: bool = False) -> Any:
184
+ """Build protobuf-safe trace metadata without applying redaction.
185
+
186
+ Artifact payload bodies remain outside the trace metadata, matching the
187
+ existing artifact externalization contract. All other already-exposed
188
+ values are preserved, subject only to the existing depth/string bounds.
189
+ """
190
+
191
+ if _depth >= _METADATA_MAX_DEPTH:
192
+ return "[truncated-depth]"
193
+ if isinstance(value, str):
194
+ return value[:_METADATA_MAX_CHARS]
195
+ if isinstance(value, dict):
196
+ output: dict[str, Any] = {}
197
+ for key, item in value.items():
198
+ key_text = str(key)
199
+ key_lower = key_text.lower()
200
+ if _artifact_scope and key_lower in _ARTIFACT_PAYLOAD_KEYS:
201
+ continue
202
+ output[key_text] = _tool_result_metadata_value(
203
+ item,
204
+ _depth=_depth + 1,
205
+ _artifact_scope=_artifact_scope or key_lower in _ARTIFACT_CONTAINER_KEYS,
206
+ )
207
+ return output
208
+ if isinstance(value, list | tuple):
209
+ return [_tool_result_metadata_value(item, _depth=_depth + 1, _artifact_scope=_artifact_scope) for item in value]
210
+ if value is None or isinstance(value, bool | int | float):
211
+ return value
212
+ return str(value)[:_METADATA_MAX_CHARS]
190
213
 
191
214
 
192
215
  def _artifact_update_event(*, task_id: str, context_id: str, metadata: dict[str, Any]) -> TaskArtifactUpdateEvent:
@@ -355,13 +378,7 @@ async def publish_stream_event(
355
378
  _artifact_update_event(task_id=task_id, context_id=context_id, metadata=artifact_metadata)
356
379
  )
357
380
  return None
358
- result_metadata = _tool_result_metadata(
359
- event.result,
360
- is_error=event.is_error,
361
- public_path_roots=event.public_path_roots,
362
- )
363
- if event.tool_name.startswith("mcp__"):
364
- result_metadata = sanitize_mcp_public_data(result_metadata, fallback_summary="")
381
+ result_metadata = _tool_result_metadata(event.result, is_error=event.is_error)
365
382
  tool_metadata = {
366
383
  "status": "failed" if event.is_error else "completed",
367
384
  "toolUseId": event.tool_use_id,
@@ -476,6 +493,8 @@ async def publish_stream_event(
476
493
  state = TaskState.TASK_STATE_INPUT_REQUIRED
477
494
  else:
478
495
  raw = event.error or "Unknown error"
496
+ # Provider ErrorEvent is an explicitly retained compatibility
497
+ # exception; ordinary A2A payloads are projected at the wire edge.
479
498
  text = sanitize_public_artifact_text(raw)[:_ERROR_TEXT_MAX_CHARS]
480
499
  state = TaskState.TASK_STATE_FAILED
481
500
  await _enqueue_status(
@@ -45,6 +45,7 @@ from iac_code.a2a.pipeline_snapshot import (
45
45
  snapshot_needs_backup_commit_repair,
46
46
  )
47
47
  from iac_code.a2a.pipeline_stream import BACKUP_COMMITTED_EVENT_TYPE, PipelineA2AEventPublisher
48
+ from iac_code.a2a.projection import a2a_safe_mode_enabled
48
49
  from iac_code.a2a.runtime_overrides import (
49
50
  a2a_request_context,
50
51
  configure_runtime_model,
@@ -101,7 +102,7 @@ from iac_code.services.session_backup_state import (
101
102
  from iac_code.services.session_storage import SessionStorage
102
103
  from iac_code.types.stream_events import TextDeltaEvent
103
104
  from iac_code.utils.file_security import atomic_write_text, ensure_private_dir, ensure_private_file
104
- from iac_code.utils.public_errors import public_exception_summary, sanitize_public_text
105
+ from iac_code.utils.public_errors import sanitize_strict_text
105
106
  from iac_code.utils.public_paths import build_public_path_roots
106
107
 
107
108
  logger = logging.getLogger(__name__)
@@ -109,16 +110,16 @@ _CONTEXT_LOCK_ACQUIRE_TIMEOUT_SECONDS = 1
109
110
  _CANCEL_ACTIVE_TASK_DRAIN_TIMEOUT_SECONDS = 30
110
111
  _ERROR_TEXT_MAX_CHARS = 1000
111
112
  _DEFERRED_CLEANUP_PROMPTS_FILENAME = "cleanup-deferred-prompts.json"
112
- _A2A_SAFE_MODE_ENV = "IAC_CODE_A2A_SAFE_MODE"
113
- _TRUTHY_ENV_VALUES = {"1", "true", "yes", "on"}
114
113
 
115
114
 
116
115
  def _format_exception(exc: BaseException) -> str:
117
- return public_exception_summary(exc, max_chars=_ERROR_TEXT_MAX_CHARS)
116
+ message = str(exc)
117
+ raw = type(exc).__name__ if not message else f"{type(exc).__name__}: {message}"
118
+ return raw[:_ERROR_TEXT_MAX_CHARS]
118
119
 
119
120
 
120
121
  def _a2a_safe_mode_enabled() -> bool:
121
- return os.environ.get(_A2A_SAFE_MODE_ENV, "").strip().lower() in _TRUTHY_ENV_VALUES
122
+ return a2a_safe_mode_enabled()
122
123
 
123
124
 
124
125
  A2APermissionResolver: TypeAlias = Callable[[Any], "bool | Awaitable[bool]"]
@@ -741,7 +742,7 @@ def _cleanup_resource_event_data(resource: Any, *, resource_count: int) -> dict[
741
742
  def _public_cleanup_error(value: Any) -> str | None:
742
743
  if not value:
743
744
  return None
744
- text = sanitize_public_text(str(value))
745
+ text = str(value)
745
746
  return text[:_ERROR_TEXT_MAX_CHARS] + "..." if len(text) > _ERROR_TEXT_MAX_CHARS else text
746
747
 
747
748
 
@@ -1020,13 +1021,13 @@ class IacCodeA2AExecutor(AgentExecutor):
1020
1021
  try:
1021
1022
  pipeline_input = self._pipeline_input_from_context(context, cwd=cwd)
1022
1023
  except ValueError as exc:
1023
- raise InvalidParamsError(sanitize_public_text(str(exc))) from exc
1024
+ raise InvalidParamsError(str(exc)) from exc
1024
1025
  self._validate_pipeline_request_input(pipeline_input, model=model)
1025
1026
  else:
1026
1027
  try:
1027
1028
  normal_input = self._normal_input_from_context(context, cwd=cwd)
1028
1029
  except ValueError as exc:
1029
- raise InvalidParamsError(sanitize_public_text(str(exc))) from exc
1030
+ raise InvalidParamsError(str(exc)) from exc
1030
1031
  if normal_input.has_images:
1031
1032
  self._validate_pipeline_request_input(normal_input, model=model)
1032
1033
  if pipeline_mode and requested_task_id is None:
@@ -1068,7 +1069,7 @@ class IacCodeA2AExecutor(AgentExecutor):
1068
1069
  task_id=task_id,
1069
1070
  context_id=context_id,
1070
1071
  state=TaskState.TASK_STATE_FAILED,
1071
- text=sanitize_public_text(str(exc)),
1072
+ text=str(exc),
1072
1073
  )
1073
1074
  if task is not None:
1074
1075
  task.state = TASK_STATE_FAILED
@@ -1672,7 +1673,7 @@ class IacCodeA2AExecutor(AgentExecutor):
1672
1673
  cwd = self._resolve_cwd(metadata)
1673
1674
  pipeline_input = parts_to_user_input(message.parts, cwd=cwd)
1674
1675
  except ValueError as exc:
1675
- raise InvalidParamsError(sanitize_public_text(str(exc))) from exc
1676
+ raise InvalidParamsError(str(exc)) from exc
1676
1677
  model = self._resolve_model(metadata) or self._model
1677
1678
  self._validate_pipeline_request_input(pipeline_input, model=model)
1678
1679
 
@@ -1736,7 +1737,7 @@ class IacCodeA2AExecutor(AgentExecutor):
1736
1737
  "A2A terminal session backup blocked task publication reason=%s retry_count=%s error=%s",
1737
1738
  reason.value,
1738
1739
  getattr(exc, "retry_count", 0),
1739
- public_exception_summary(exc, max_chars=_ERROR_TEXT_MAX_CHARS),
1740
+ sanitize_strict_text(str(exc))[:_ERROR_TEXT_MAX_CHARS],
1740
1741
  )
1741
1742
  record_backup_blocked = getattr(self._metrics, "record_backup_blocked", None)
1742
1743
  if callable(record_backup_blocked):
@@ -1761,7 +1762,7 @@ class IacCodeA2AExecutor(AgentExecutor):
1761
1762
  "backupBlocked": {
1762
1763
  "reason": reason.value,
1763
1764
  "blockedTerminalState": blocked_terminal_state,
1764
- "error": public_exception_summary(exc, max_chars=_ERROR_TEXT_MAX_CHARS),
1765
+ "error": _format_exception(exc),
1765
1766
  "recoverable": True,
1766
1767
  }
1767
1768
  }
@@ -1993,7 +1994,7 @@ class IacCodeA2AExecutor(AgentExecutor):
1993
1994
  return None
1994
1995
 
1995
1996
  def _log_executor_exception(self, stage: str, *, task_id: str, context_id: str) -> None:
1996
- logger.exception("A2A executor %s failed (task_id=%s, context_id=%s)", stage, task_id, context_id)
1997
+ logger.error("A2A executor %s failed (task_id=%s, context_id=%s)", stage, task_id, context_id)
1997
1998
 
1998
1999
  async def _publish_mcp_status(
1999
2000
  self,
@@ -2121,8 +2122,8 @@ class IacCodeA2AExecutor(AgentExecutor):
2121
2122
  return
2122
2123
  try:
2123
2124
  await self._push_notifier.notify_task_state(task_id=task_id, context_id=context_id, state=state)
2124
- except Exception:
2125
- logger.warning("A2A push notification failed", exc_info=True)
2125
+ except Exception as exc:
2126
+ logger.warning("A2A push notification failed: %s", sanitize_strict_text(str(exc)))
2126
2127
 
2127
2128
 
2128
2129
  def _normal_handoff_has_backup_ack(handoff: dict[str, Any], journal_events: list[dict[str, Any]]) -> bool:
@@ -10,6 +10,8 @@ from jsonrpc.jsonrpc2 import JSONRPC20Response
10
10
  from sse_starlette.sse import EventSourceResponse
11
11
  from starlette.responses import Response
12
12
 
13
+ from iac_code.utils.public_errors import sanitize_strict_text
14
+
13
15
  logger = logging.getLogger(__name__)
14
16
 
15
17
 
@@ -72,7 +74,10 @@ def install_v03_jsonrpc_error_data_passthrough(jsonrpc_endpoint: Callable[..., A
72
74
  async for item in stream:
73
75
  yield {"data": item.model_dump_json(by_alias=True, exclude_none=True)}
74
76
  except Exception as exc:
75
- logger.exception("Error during stream generation in v0.3 JSONRPCAdapter")
77
+ logger.error(
78
+ "Error during stream generation in v0.3 JSONRPCAdapter: %s",
79
+ sanitize_strict_text(str(exc)),
80
+ )
76
81
  if getattr(exc, "jsonrpc_error_data_passthrough", False):
77
82
  error = types_v03.InvalidParamsError(message=str(exc), data=getattr(exc, "data", None))
78
83
  else:
@@ -0,0 +1,32 @@
1
+ from __future__ import annotations
2
+
3
+ import copy
4
+ from collections.abc import Iterable, Mapping
5
+ from typing import Any
6
+
7
+ from a2a.types import Message
8
+ from google.protobuf.json_format import MessageToDict, ParseDict
9
+
10
+
11
+ class A2AMetadataEchoRedactor:
12
+ """Compatibility wrapper that now preserves canonical A2A message data."""
13
+
14
+ def redact_message_echo(
15
+ self,
16
+ message: Message,
17
+ *,
18
+ public_path_roots: Iterable[Mapping[str, str]] | None = None,
19
+ ) -> Message:
20
+ del public_path_roots
21
+ result = Message()
22
+ ParseDict(MessageToDict(message, preserving_proto_field_name=False), result)
23
+ return result
24
+
25
+ def redact(
26
+ self,
27
+ value: Any,
28
+ *,
29
+ public_path_roots: Iterable[Mapping[str, str]] | None = None,
30
+ ) -> Any:
31
+ del public_path_roots
32
+ return copy.deepcopy(value)
@@ -8,8 +8,9 @@ from datetime import datetime, timezone
8
8
  from pathlib import Path
9
9
  from typing import Any
10
10
 
11
- from iac_code.a2a.artifacts import UnsafeArtifactNameError, artifact_filename_from_path, sanitize_public_artifact_text
12
- from iac_code.a2a.events import _tool_result_metadata, _truncate
11
+ from iac_code.a2a.artifacts import UnsafeArtifactNameError, artifact_filename_from_path
12
+ from iac_code.a2a.events import _truncate
13
+ from iac_code.a2a.pipeline_journal import to_json_safe
13
14
  from iac_code.mcp.progress import mcp_progress_metadata
14
15
  from iac_code.pipeline.engine.events import PipelineEvent, PipelineEventType
15
16
  from iac_code.services.permissions.audit import build_input_summary, build_redacted_tool_input, fingerprint_text
@@ -369,7 +370,7 @@ class PipelineEventTranslator:
369
370
  data={
370
371
  "candidateScope": candidate_scope,
371
372
  "targetCandidateStepId": target_candidate_step_id,
372
- "reason": sanitize_public_artifact_text(str(reason)),
373
+ "reason": str(reason),
373
374
  },
374
375
  )
375
376
  ]
@@ -381,7 +382,7 @@ class PipelineEventTranslator:
381
382
  "candidateScope": candidate_scope,
382
383
  "targetCandidateStepId": target_candidate_step_id,
383
384
  "nextCandidateAttempt": state.attempt + 1,
384
- "reason": sanitize_public_artifact_text(str(reason)),
385
+ "reason": str(reason),
385
386
  }
386
387
  envelope = self._envelope("candidate_restart_requested", "candidate", "working", data)
387
388
  self._add_candidate_coordinates(envelope, state)
@@ -1208,8 +1209,7 @@ def _event_data(data: dict[str, Any]) -> dict[str, Any]:
1208
1209
 
1209
1210
 
1210
1211
  def _warning_event_data(data: dict[str, Any]) -> dict[str, Any]:
1211
- private_keys = {"ledger_path", "ledgerPath", "load_error", "loadError"}
1212
- return _event_data({key: value for key, value in data.items() if str(key) not in private_keys})
1212
+ return _event_data(data)
1213
1213
 
1214
1214
 
1215
1215
  def _sanitize_event_value(key: str, value: Any) -> Any:
@@ -1219,8 +1219,6 @@ def _sanitize_event_value(key: str, value: Any) -> Any:
1219
1219
 
1220
1220
  return sanitize_mcp_status_metadata(value)
1221
1221
  if isinstance(value, str):
1222
- if any(marker in key_lower for marker in ("reason", "error", "message", "traceback")):
1223
- return sanitize_public_artifact_text(value)
1224
1222
  return value
1225
1223
  if isinstance(value, list):
1226
1224
  return [_sanitize_event_value(key, item) for item in value]
@@ -1486,17 +1484,13 @@ def _tool_result_data(event: ToolResultEvent) -> dict[str, Any]:
1486
1484
  "toolName": event.tool_name,
1487
1485
  "toolUseId": event.tool_use_id,
1488
1486
  "isError": event.is_error,
1489
- "result": _tool_result_metadata(
1490
- event.result,
1491
- is_error=event.is_error,
1492
- public_path_roots=event.public_path_roots,
1493
- ),
1487
+ "result": to_json_safe(event.result),
1494
1488
  }
1495
1489
 
1496
1490
 
1497
1491
  def _sanitize_tool_input(tool_input: dict[str, Any]) -> dict[str, Any]:
1498
- # journal 是本地用户数据;真正远程出口由 pipeline_stream._sanitize_remote_envelope 兜底脱敏,
1499
- # 故写入时不再脱敏,避免把 [REDACTED]/*** 注入模板 YAML 与 complete_step conclusion。
1492
+ # Journal canonical 功能数据;远程出口只在实际 A2A wire boundary
1493
+ # 按当前 safe mode 投影副本,不能反向污染这里的真实工具输入。
1500
1494
  return dict(tool_input) if isinstance(tool_input, dict) else {}
1501
1495
 
1502
1496
 
@@ -1627,7 +1621,7 @@ def _artifact_from_spec(spec: Any, root: dict[str, Any]) -> dict[str, Any] | Non
1627
1621
  "mediaType": media_type,
1628
1622
  "content": content,
1629
1623
  "role": role,
1630
- "supersedesPath": sanitize_public_artifact_text(supersedes_path),
1624
+ "supersedesPath": supersedes_path,
1631
1625
  "supersedesKey": fingerprint_text(supersedes_path),
1632
1626
  }
1633
1627