iac-code 0.10.0__tar.gz → 0.11.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 (613) hide show
  1. {iac_code-0.10.0 → iac_code-0.11.1}/PKG-INFO +12 -1
  2. {iac_code-0.10.0 → iac_code-0.11.1}/README.md +11 -0
  3. {iac_code-0.10.0 → iac_code-0.11.1}/pyproject.toml +7 -0
  4. {iac_code-0.10.0 → iac_code-0.11.1}/setup.py +8 -2
  5. iac_code-0.11.1/src/iac_code/__init__.py +2 -0
  6. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/app.py +170 -4
  7. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/artifacts.py +19 -2
  8. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/events.py +42 -23
  9. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/executor.py +16 -15
  10. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/jsonrpc_passthrough.py +6 -1
  11. iac_code-0.11.1/src/iac_code/a2a/metadata_redaction.py +32 -0
  12. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/pipeline_events.py +185 -18
  13. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/pipeline_executor.py +160 -52
  14. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/pipeline_flow_monitor.py +1 -1
  15. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/pipeline_outbound.py +1 -0
  16. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/pipeline_recovery.py +2 -8
  17. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/pipeline_snapshot.py +88 -65
  18. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/pipeline_stream.py +45 -16
  19. iac_code-0.11.1/src/iac_code/a2a/projection.py +406 -0
  20. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/push.py +17 -6
  21. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/push_worker.py +24 -8
  22. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/runtime_overrides.py +43 -14
  23. iac_code-0.11.1/src/iac_code/a2a/runtime_registry.py +57 -0
  24. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/task_store.py +48 -0
  25. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/transports/dispatcher.py +57 -13
  26. iac_code-0.11.1/src/iac_code/a2a/transports/grpc.py +113 -0
  27. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/transports/grpc_jsonrpc.py +15 -7
  28. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/transports/redis_streams.py +9 -2
  29. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/transports/stdio.py +12 -3
  30. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/transports/websocket.py +11 -3
  31. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/acp/convert.py +6 -8
  32. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/acp/server.py +9 -16
  33. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/acp/session.py +16 -44
  34. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/acp/slash_registry.py +6 -6
  35. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/acp/tools.py +3 -0
  36. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/agent/agent_loop.py +238 -50
  37. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/agent/agent_tool.py +15 -2
  38. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/agent/message.py +57 -1
  39. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/cli/headless.py +6 -6
  40. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/cli/main.py +21 -0
  41. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/cli/output_formats.py +12 -32
  42. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/cli/process_events.py +3 -4
  43. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/cli/process_mode.py +5 -2
  44. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/commands/auth.py +3 -19
  45. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/commands/prompt.py +14 -2
  46. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/config.py +1 -0
  47. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/i18n/__init__.py +46 -5
  48. iac_code-0.11.1/src/iac_code/i18n/html_extractor.py +27 -0
  49. iac_code-0.11.1/src/iac_code/i18n/locales/de/LC_MESSAGES/messages.mo +0 -0
  50. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/i18n/locales/de/LC_MESSAGES/messages.po +4015 -226
  51. iac_code-0.11.1/src/iac_code/i18n/locales/de/LC_MESSAGES/webui.mo +0 -0
  52. iac_code-0.11.1/src/iac_code/i18n/locales/de/LC_MESSAGES/webui.po +3841 -0
  53. iac_code-0.11.1/src/iac_code/i18n/locales/es/LC_MESSAGES/messages.mo +0 -0
  54. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/i18n/locales/es/LC_MESSAGES/messages.po +3974 -227
  55. iac_code-0.11.1/src/iac_code/i18n/locales/es/LC_MESSAGES/webui.mo +0 -0
  56. iac_code-0.11.1/src/iac_code/i18n/locales/es/LC_MESSAGES/webui.po +3829 -0
  57. iac_code-0.11.1/src/iac_code/i18n/locales/fr/LC_MESSAGES/messages.mo +0 -0
  58. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/i18n/locales/fr/LC_MESSAGES/messages.po +4014 -230
  59. iac_code-0.11.1/src/iac_code/i18n/locales/fr/LC_MESSAGES/webui.mo +0 -0
  60. iac_code-0.11.1/src/iac_code/i18n/locales/fr/LC_MESSAGES/webui.po +3847 -0
  61. iac_code-0.11.1/src/iac_code/i18n/locales/ja/LC_MESSAGES/messages.mo +0 -0
  62. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/i18n/locales/ja/LC_MESSAGES/messages.po +3549 -231
  63. iac_code-0.11.1/src/iac_code/i18n/locales/ja/LC_MESSAGES/webui.mo +0 -0
  64. iac_code-0.11.1/src/iac_code/i18n/locales/ja/LC_MESSAGES/webui.po +3725 -0
  65. iac_code-0.11.1/src/iac_code/i18n/locales/pt/LC_MESSAGES/messages.mo +0 -0
  66. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/i18n/locales/pt/LC_MESSAGES/messages.po +3935 -232
  67. iac_code-0.11.1/src/iac_code/i18n/locales/pt/LC_MESSAGES/webui.mo +0 -0
  68. iac_code-0.11.1/src/iac_code/i18n/locales/pt/LC_MESSAGES/webui.po +3820 -0
  69. iac_code-0.11.1/src/iac_code/i18n/locales/zh/LC_MESSAGES/messages.mo +0 -0
  70. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/i18n/locales/zh/LC_MESSAGES/messages.po +3522 -226
  71. iac_code-0.11.1/src/iac_code/i18n/locales/zh/LC_MESSAGES/webui.mo +0 -0
  72. iac_code-0.11.1/src/iac_code/i18n/locales/zh/LC_MESSAGES/webui.po +3719 -0
  73. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/mcp/cli.py +6 -2
  74. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/mcp/oauth.py +62 -40
  75. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/mcp/storage.py +6 -2
  76. iac_code-0.11.1/src/iac_code/pipeline/config.py +64 -0
  77. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/architecture_semantic_planning.py +40 -3
  78. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/ask_user_question_tool.py +26 -1
  79. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/cleanup.py +30 -19
  80. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/complete_step_tool.py +18 -25
  81. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/events.py +2 -4
  82. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/observability.py +72 -2
  83. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/pipeline_runner.py +253 -24
  84. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/prerequisites.py +34 -3
  85. iac_code-0.11.1/src/iac_code/pipeline/engine/public_errors.py +57 -0
  86. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/show_diagram_tool.py +11 -4
  87. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/step_executor.py +83 -4
  88. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/sub_pipeline_executor.py +48 -34
  89. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/transcript_storage.py +4 -1
  90. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/hooks/deploying.py +18 -0
  91. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/pipeline.yaml +1 -0
  92. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/prompts/cost_estimating.md +1 -1
  93. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/prompts/intent_parsing.md +1 -0
  94. {iac_code-0.10.0/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying → iac_code-0.11.1/src/iac_code/pipeline/selling}/references/template-parameter-recommendation.md +7 -7
  95. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/SKILL.md +3 -3
  96. {iac_code-0.10.0/src/iac_code/pipeline/selling → iac_code-0.11.1/src/iac_code/pipeline/selling/skills/iac-aliyun-cost}/references/template-parameter-recommendation.md +7 -7
  97. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/SKILL.md +2 -2
  98. {iac_code-0.10.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost → iac_code-0.11.1/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying}/references/template-parameter-recommendation.md +7 -7
  99. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-intent/SKILL.md +2 -0
  100. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/SKILL.md +2 -1
  101. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/template-parameter-recommendation.md +7 -7
  102. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/tools/ros_deploy_tool.py +7 -0
  103. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/providers/anthropic_provider.py +23 -14
  104. iac_code-0.11.1/src/iac_code/providers/manager.py +1542 -0
  105. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/providers/minimax_provider.py +2 -0
  106. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/providers/openai_provider.py +12 -5
  107. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/providers/registry.py +26 -0
  108. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/providers/thinking.py +44 -0
  109. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/agent_factory.py +42 -12
  110. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/context_manager.py +191 -21
  111. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/providers/aliyun.py +1 -0
  112. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/session_index.py +192 -24
  113. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/session_storage.py +83 -14
  114. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/telemetry/__init__.py +29 -0
  115. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/telemetry/attributes.py +11 -0
  116. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/telemetry/client.py +35 -2
  117. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/telemetry/constants.py +1 -0
  118. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/telemetry/content_serializer.py +144 -37
  119. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/telemetry/events.py +1 -0
  120. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/telemetry/metrics.py +2 -0
  121. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/telemetry/names.py +47 -1
  122. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/telemetry/sanitize.py +4 -2
  123. iac_code-0.11.1/src/iac_code/services/telemetry/scope.py +67 -0
  124. iac_code-0.11.1/src/iac_code/services/telemetry/tracing.py +82 -0
  125. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/update_checker.py +19 -9
  126. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/skills/bundled/iac_aliyun/SKILL.md +3 -2
  127. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/skills/processor.py +2 -1
  128. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/skills/settings.py +4 -2
  129. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/base.py +15 -0
  130. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/bash/bash_tool.py +29 -7
  131. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/acs3_transport.py +14 -0
  132. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/aliyun_api.py +526 -105
  133. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/api_hooks.py +30 -5
  134. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/contract_store.py +16 -0
  135. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/hooks/ros_parameters.py +23 -16
  136. iac_code-0.11.1/src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py +174 -0
  137. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/public_errors.py +10 -0
  138. iac_code-0.11.1/src/iac_code/tools/cloud/aliyun/result_contract.py +218 -0
  139. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/ros_stack.py +83 -15
  140. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/ros_stack_instances.py +1 -0
  141. iac_code-0.11.1/src/iac_code/tools/cloud/aliyun/ros_validation/__init__.py +53 -0
  142. iac_code-0.11.1/src/iac_code/tools/cloud/aliyun/ros_validation/action_policy.py +527 -0
  143. iac_code-0.11.1/src/iac_code/tools/cloud/aliyun/ros_validation/analyzer.py +5403 -0
  144. iac_code-0.11.1/src/iac_code/tools/cloud/aliyun/ros_validation/association_property_specs.py +693 -0
  145. iac_code-0.11.1/src/iac_code/tools/cloud/aliyun/ros_validation/count.py +158 -0
  146. iac_code-0.11.1/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_association_property_specs.json +12563 -0
  147. iac_code-0.11.1/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_official_resource_index.json +12961 -0
  148. iac_code-0.11.1/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_resource_value_specs.json +56214 -0
  149. iac_code-0.11.1/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_template_body_action_policies.json +260 -0
  150. iac_code-0.11.1/src/iac_code/tools/cloud/aliyun/ros_validation/facts.py +242 -0
  151. iac_code-0.11.1/src/iac_code/tools/cloud/aliyun/ros_validation/function_specs.py +240 -0
  152. iac_code-0.11.1/src/iac_code/tools/cloud/aliyun/ros_validation/model.py +547 -0
  153. iac_code-0.11.1/src/iac_code/tools/cloud/aliyun/ros_validation/outcome.py +109 -0
  154. iac_code-0.11.1/src/iac_code/tools/cloud/aliyun/ros_validation/parser.py +856 -0
  155. iac_code-0.11.1/src/iac_code/tools/cloud/aliyun/ros_validation/renderer.py +122 -0
  156. iac_code-0.11.1/src/iac_code/tools/cloud/aliyun/ros_validation/resource_value_specs.py +245 -0
  157. iac_code-0.11.1/src/iac_code/tools/cloud/aliyun/ros_validation/rules/__init__.py +1 -0
  158. iac_code-0.11.1/src/iac_code/tools/cloud/aliyun/ros_validation/rules/association_property.py +3248 -0
  159. iac_code-0.11.1/src/iac_code/tools/cloud/aliyun/ros_validation/rules/base.py +24 -0
  160. iac_code-0.11.1/src/iac_code/tools/cloud/aliyun/ros_validation/rules/registry.py +22 -0
  161. iac_code-0.11.1/src/iac_code/tools/cloud/aliyun/ros_validation/symbols.py +213 -0
  162. iac_code-0.11.1/src/iac_code/tools/cloud/aliyun/ros_validation/template_kind.py +16 -0
  163. iac_code-0.11.1/src/iac_code/tools/cloud/aliyun/ros_validation/types.py +352 -0
  164. iac_code-0.11.1/src/iac_code/tools/cloud/aliyun/ros_validation/validator.py +272 -0
  165. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/ros_yaml.py +13 -36
  166. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/runtime.py +11 -5
  167. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/base_stack.py +1 -0
  168. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/glob.py +54 -23
  169. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/grep.py +13 -8
  170. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/path_safety.py +43 -10
  171. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/tool_executor.py +25 -5
  172. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/types/stream_events.py +66 -2
  173. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/renderer.py +17 -11
  174. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/repl.py +121 -20
  175. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/suggestions/command_provider.py +3 -1
  176. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/suggestions/skill_provider.py +1 -0
  177. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/suggestions/types.py +1 -0
  178. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/utils/public_errors.py +62 -3
  179. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/utils/public_paths.py +125 -1
  180. iac_code-0.11.1/src/iac_code/web/__init__.py +1 -0
  181. iac_code-0.11.1/src/iac_code/web/app.py +4819 -0
  182. iac_code-0.11.1/src/iac_code/web/cleanup.py +121 -0
  183. iac_code-0.11.1/src/iac_code/web/commands.py +202 -0
  184. iac_code-0.11.1/src/iac_code/web/diagram_cache.py +90 -0
  185. iac_code-0.11.1/src/iac_code/web/diagram_optimizer.py +143 -0
  186. iac_code-0.11.1/src/iac_code/web/diagrams.py +149 -0
  187. iac_code-0.11.1/src/iac_code/web/events.py +751 -0
  188. iac_code-0.11.1/src/iac_code/web/files.py +370 -0
  189. iac_code-0.11.1/src/iac_code/web/images.py +277 -0
  190. iac_code-0.11.1/src/iac_code/web/mcp_settings.py +813 -0
  191. iac_code-0.11.1/src/iac_code/web/memory.py +193 -0
  192. iac_code-0.11.1/src/iac_code/web/outputs.py +380 -0
  193. iac_code-0.11.1/src/iac_code/web/permissions.py +327 -0
  194. iac_code-0.11.1/src/iac_code/web/pipeline.py +185 -0
  195. iac_code-0.11.1/src/iac_code/web/pipeline_actions.py +637 -0
  196. iac_code-0.11.1/src/iac_code/web/pipeline_prerequisites.py +169 -0
  197. iac_code-0.11.1/src/iac_code/web/pipeline_transcript.py +1419 -0
  198. iac_code-0.11.1/src/iac_code/web/runtime.py +849 -0
  199. iac_code-0.11.1/src/iac_code/web/security.py +69 -0
  200. iac_code-0.11.1/src/iac_code/web/server.py +266 -0
  201. iac_code-0.11.1/src/iac_code/web/session_manager.py +3474 -0
  202. iac_code-0.11.1/src/iac_code/web/session_titler.py +82 -0
  203. iac_code-0.11.1/src/iac_code/web/settings.py +1075 -0
  204. iac_code-0.11.1/src/iac_code/web/shell.py +296 -0
  205. iac_code-0.11.1/src/iac_code/web/skills.py +51 -0
  206. iac_code-0.11.1/src/iac_code/web/static/icons/sidebar-new-thread.svg +5 -0
  207. iac_code-0.11.1/src/iac_code/web/static/icons/sidebar-project-open.svg +16 -0
  208. iac_code-0.11.1/src/iac_code/web/static/icons/sidebar-search.svg +4 -0
  209. iac_code-0.11.1/src/iac_code/web/static/icons/sidebar-settings.svg +4 -0
  210. iac_code-0.11.1/src/iac_code/web/static/icons/sidebar-skills.svg +6 -0
  211. iac_code-0.11.1/src/iac_code/web/static/index.html +479 -0
  212. iac_code-0.11.1/src/iac_code/web/static/js/api.js +930 -0
  213. iac_code-0.11.1/src/iac_code/web/static/js/app.js +5934 -0
  214. iac_code-0.11.1/src/iac_code/web/static/js/components/blocking.js +474 -0
  215. iac_code-0.11.1/src/iac_code/web/static/js/components/composer.js +2228 -0
  216. iac_code-0.11.1/src/iac_code/web/static/js/components/image_lightbox.js +77 -0
  217. iac_code-0.11.1/src/iac_code/web/static/js/components/output_panel.js +342 -0
  218. iac_code-0.11.1/src/iac_code/web/static/js/components/pipeline.js +1145 -0
  219. iac_code-0.11.1/src/iac_code/web/static/js/components/tool_cards.js +1343 -0
  220. iac_code-0.11.1/src/iac_code/web/static/js/components/workspace.js +4891 -0
  221. iac_code-0.11.1/src/iac_code/web/static/js/events.js +803 -0
  222. iac_code-0.11.1/src/iac_code/web/static/js/i18n.js +37 -0
  223. iac_code-0.11.1/src/iac_code/web/static/js/mermaid_render.js +130 -0
  224. iac_code-0.11.1/src/iac_code/web/static/js/vendor/markdown-it.LICENSE +22 -0
  225. iac_code-0.11.1/src/iac_code/web/static/js/vendor/markdown-it.min.js +2 -0
  226. iac_code-0.11.1/src/iac_code/web/static/js/vendor/mermaid.LICENSE +21 -0
  227. iac_code-0.11.1/src/iac_code/web/static/js/vendor/mermaid.min.js +2029 -0
  228. iac_code-0.11.1/src/iac_code/web/static/styles.css +11953 -0
  229. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code.egg-info/PKG-INFO +12 -1
  230. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code.egg-info/SOURCES.txt +91 -1
  231. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code.egg-info/requires.txt +2 -0
  232. iac_code-0.10.0/src/iac_code/__init__.py +0 -2
  233. iac_code-0.10.0/src/iac_code/a2a/metadata_redaction.py +0 -85
  234. iac_code-0.10.0/src/iac_code/a2a/transports/grpc.py +0 -52
  235. iac_code-0.10.0/src/iac_code/i18n/locales/de/LC_MESSAGES/messages.mo +0 -0
  236. iac_code-0.10.0/src/iac_code/i18n/locales/es/LC_MESSAGES/messages.mo +0 -0
  237. iac_code-0.10.0/src/iac_code/i18n/locales/fr/LC_MESSAGES/messages.mo +0 -0
  238. iac_code-0.10.0/src/iac_code/i18n/locales/ja/LC_MESSAGES/messages.mo +0 -0
  239. iac_code-0.10.0/src/iac_code/i18n/locales/pt/LC_MESSAGES/messages.mo +0 -0
  240. iac_code-0.10.0/src/iac_code/i18n/locales/zh/LC_MESSAGES/messages.mo +0 -0
  241. iac_code-0.10.0/src/iac_code/pipeline/config.py +0 -30
  242. iac_code-0.10.0/src/iac_code/pipeline/engine/public_errors.py +0 -17
  243. iac_code-0.10.0/src/iac_code/providers/manager.py +0 -925
  244. iac_code-0.10.0/src/iac_code/services/telemetry/tracing.py +0 -38
  245. iac_code-0.10.0/src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py +0 -218
  246. {iac_code-0.10.0 → iac_code-0.11.1}/LICENSE +0 -0
  247. {iac_code-0.10.0 → iac_code-0.11.1}/MANIFEST.in +0 -0
  248. {iac_code-0.10.0 → iac_code-0.11.1}/setup.cfg +0 -0
  249. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/__init__.py +0 -0
  250. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/agent_card.py +0 -0
  251. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/backup.py +0 -0
  252. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/client.py +0 -0
  253. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/exposure.py +0 -0
  254. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/metrics.py +0 -0
  255. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/parts.py +0 -0
  256. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/persistence.py +0 -0
  257. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/pipeline_delta_coalescing.py +0 -0
  258. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/pipeline_journal.py +0 -0
  259. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/pipeline_paths.py +0 -0
  260. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/pipeline_performance.py +0 -0
  261. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/pipeline_transport_delivery.py +0 -0
  262. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/push_queue.py +0 -0
  263. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/push_secrets.py +0 -0
  264. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/router.py +0 -0
  265. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/signing.py +0 -0
  266. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/thinking_metadata.py +0 -0
  267. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/transport.py +0 -0
  268. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/transports/__init__.py +0 -0
  269. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/transports/base.py +0 -0
  270. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/transports/http.py +0 -0
  271. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/transports/unix.py +0 -0
  272. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/a2a/types.py +0 -0
  273. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/acp/__init__.py +0 -0
  274. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/acp/http_sse.py +0 -0
  275. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/acp/mcp.py +0 -0
  276. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/acp/metrics.py +0 -0
  277. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/acp/runner.py +0 -0
  278. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/acp/state.py +0 -0
  279. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/acp/types.py +0 -0
  280. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/acp/version.py +0 -0
  281. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/agent/__init__.py +0 -0
  282. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/agent/agent_types.py +0 -0
  283. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/agent/system_prompt.py +0 -0
  284. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/cli/__init__.py +0 -0
  285. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/cli/install_git_bash.py +0 -0
  286. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/cli/process_protocol.py +0 -0
  287. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/cli/update.py +0 -0
  288. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/commands/__init__.py +0 -0
  289. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/commands/clear.py +0 -0
  290. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/commands/compact.py +0 -0
  291. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/commands/debug.py +0 -0
  292. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/commands/effort.py +0 -0
  293. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/commands/exit.py +0 -0
  294. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/commands/help.py +0 -0
  295. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/commands/mcp.py +0 -0
  296. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/commands/memory.py +0 -0
  297. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/commands/model.py +0 -0
  298. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/commands/registry.py +0 -0
  299. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/commands/rename.py +0 -0
  300. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/commands/resume.py +0 -0
  301. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/commands/skills.py +0 -0
  302. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/commands/status.py +0 -0
  303. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/commands/tasks.py +0 -0
  304. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/commands/thinking_enabled.py +0 -0
  305. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/mcp/__init__.py +0 -0
  306. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/mcp/client.py +0 -0
  307. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/mcp/config.py +0 -0
  308. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/mcp/env_expansion.py +0 -0
  309. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/mcp/errors.py +0 -0
  310. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/mcp/manager.py +0 -0
  311. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/mcp/output.py +0 -0
  312. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/mcp/progress.py +0 -0
  313. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/mcp/prompt_dispatch.py +0 -0
  314. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/mcp/prompts.py +0 -0
  315. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/mcp/redaction.py +0 -0
  316. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/mcp/skills.py +0 -0
  317. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/mcp/tools.py +0 -0
  318. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/mcp/types.py +0 -0
  319. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/memory/__init__.py +0 -0
  320. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/memory/memory_manager.py +0 -0
  321. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/memory/memory_tools.py +0 -0
  322. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/memory/project_memory.py +0 -0
  323. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/memory/recall.py +0 -0
  324. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/__init__.py +0 -0
  325. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/constants.py +0 -0
  326. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/display_names.py +0 -0
  327. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/__init__.py +0 -0
  328. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/architecture_graph.py +0 -0
  329. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/architecture_meta.py +0 -0
  330. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/architecture_metas/Categories.json +0 -0
  331. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/architecture_metas/config.json +0 -0
  332. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/architecture_metas/products.json +0 -0
  333. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/architecture_resource_inventory.py +0 -0
  334. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/architecture_rule_candidates.py +0 -0
  335. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/architecture_rule_drafts.py +0 -0
  336. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/architecture_rule_facts.py +0 -0
  337. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/architecture_rules.json +0 -0
  338. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/architecture_rules.py +0 -0
  339. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/completion_guard_state.py +0 -0
  340. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/context.py +0 -0
  341. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/display_replay.py +0 -0
  342. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/handoff.py +0 -0
  343. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/interrupt.py +0 -0
  344. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/loader.py +0 -0
  345. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/prompts/interrupt_judge.md +0 -0
  346. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/recovery.py +0 -0
  347. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/resume_recovery.py +0 -0
  348. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/session.py +0 -0
  349. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/state_machine.py +0 -0
  350. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/step_spec.py +0 -0
  351. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/types.py +0 -0
  352. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/ui_contract.py +0 -0
  353. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/engine/user_input.py +0 -0
  354. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/prompts/architecture_planning.md +0 -0
  355. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/prompts/confirm_and_select.a2a.md +0 -0
  356. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/prompts/confirm_and_select.md +0 -0
  357. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/prompts/deploying.md +0 -0
  358. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/prompts/evaluate_candidates.md +0 -0
  359. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/prompts/reviewing.md +0 -0
  360. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/prompts/template_generating.md +0 -0
  361. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/references/cloud-products/ecs.md +0 -0
  362. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/references/cloud-products/oss.md +0 -0
  363. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/references/cloud-products/rds.md +0 -0
  364. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/references/cloud-products/redis.md +0 -0
  365. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/references/cloud-products/slb.md +0 -0
  366. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/references/cloud-products/vpc.md +0 -0
  367. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/references/ros-template.md +0 -0
  368. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/references/template-parameters.md +0 -0
  369. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/references/terraform-template.md +0 -0
  370. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-architecture/SKILL.md +0 -0
  371. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-architecture/evals.json +0 -0
  372. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/evals.json +0 -0
  373. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/ecs.md +0 -0
  374. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/oss.md +0 -0
  375. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/rds.md +0 -0
  376. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/redis.md +0 -0
  377. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/slb.md +0 -0
  378. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/vpc.md +0 -0
  379. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/ros-template.md +0 -0
  380. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/template-parameters.md +0 -0
  381. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/terraform-template.md +0 -0
  382. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/evals.json +0 -0
  383. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/ecs.md +0 -0
  384. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/oss.md +0 -0
  385. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/rds.md +0 -0
  386. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/redis.md +0 -0
  387. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/slb.md +0 -0
  388. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/vpc.md +0 -0
  389. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/ros-template.md +0 -0
  390. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/template-parameters.md +0 -0
  391. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/terraform-template.md +0 -0
  392. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-intent/evals.json +0 -0
  393. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-review/SKILL.md +0 -0
  394. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-review/evals.json +0 -0
  395. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/evals.json +0 -0
  396. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/ecs.md +0 -0
  397. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/oss.md +0 -0
  398. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/rds.md +0 -0
  399. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/redis.md +0 -0
  400. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/slb.md +0 -0
  401. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/vpc.md +0 -0
  402. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/ros-template.md +0 -0
  403. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/template-parameters.md +0 -0
  404. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/terraform-template.md +0 -0
  405. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/tools/__init__.py +0 -0
  406. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/tools/infraguard_scan_tool.py +0 -0
  407. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/tools/ros_template_tools.py +0 -0
  408. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/pipeline/selling/tools/show_candidate_detail_tool.py +0 -0
  409. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/providers/__init__.py +0 -0
  410. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/providers/azure_openai_provider.py +0 -0
  411. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/providers/base.py +0 -0
  412. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/providers/dashscope_provider.py +0 -0
  413. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/providers/deepseek_provider.py +0 -0
  414. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/providers/gemini_provider.py +0 -0
  415. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/providers/kimi_provider.py +0 -0
  416. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/providers/lmstudio_provider.py +0 -0
  417. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/providers/modelscope_provider.py +0 -0
  418. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/providers/ollama_provider.py +0 -0
  419. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/providers/openrouter_provider.py +0 -0
  420. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/providers/request_logging.py +0 -0
  421. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/providers/request_policy.py +0 -0
  422. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/providers/retry.py +0 -0
  423. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/providers/siliconflow_provider.py +0 -0
  424. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/providers/stream_watchdog.py +0 -0
  425. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/providers/volcengine_provider.py +0 -0
  426. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/providers/zhipu_provider.py +0 -0
  427. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/__init__.py +0 -0
  428. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/capabilities/__init__.py +0 -0
  429. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/capabilities/auto_detect.py +0 -0
  430. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/capabilities/multimodal.py +0 -0
  431. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/cloud_credentials.py +0 -0
  432. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/permissions/__init__.py +0 -0
  433. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/permissions/audit.py +0 -0
  434. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/permissions/loader.py +0 -0
  435. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/permissions/pipeline.py +0 -0
  436. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/permissions/rule_scope.py +0 -0
  437. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/permissions/storage.py +0 -0
  438. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/permissions/trusted_roots.py +0 -0
  439. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/providers/__init__.py +0 -0
  440. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/providers/aliyun_oauth.py +0 -0
  441. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/qwenpaw_source.py +0 -0
  442. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/session_backup.py +0 -0
  443. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/session_backup_state.py +0 -0
  444. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/session_layout.py +0 -0
  445. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/session_metadata.py +0 -0
  446. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/session_resolver.py +0 -0
  447. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/session_usage.py +0 -0
  448. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/telemetry/config.py +0 -0
  449. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/telemetry/fallback.py +0 -0
  450. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/telemetry/identity.py +0 -0
  451. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/telemetry/sink.py +0 -0
  452. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/telemetry/types.py +0 -0
  453. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/token_budget.py +0 -0
  454. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/services/token_counter.py +0 -0
  455. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/skills/__init__.py +0 -0
  456. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/skills/auto_trigger.py +0 -0
  457. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/skills/bundled/__init__.py +0 -0
  458. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/skills/bundled/iac_aliyun/__init__.py +0 -0
  459. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/skills/bundled/iac_aliyun/auto_trigger.py +0 -0
  460. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/ecs.md +0 -0
  461. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/oss.md +0 -0
  462. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/rds.md +0 -0
  463. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/redis.md +0 -0
  464. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/slb.md +0 -0
  465. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/vpc.md +0 -0
  466. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/skills/bundled/iac_aliyun/references/ros-template.md +0 -0
  467. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/skills/bundled/iac_aliyun/references/template-parameter-recommendation.md +0 -0
  468. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/skills/bundled/iac_aliyun/references/template-parameters.md +0 -0
  469. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/skills/bundled/iac_aliyun/references/terraform-template.md +0 -0
  470. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/skills/bundled/iac_aliyun/scripts/tf2ros.py +0 -0
  471. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/skills/bundled/pac_aliyun/SKILL.md +0 -0
  472. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/skills/bundled/pac_aliyun/__init__.py +0 -0
  473. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/skills/bundled/pac_aliyun/auto_trigger.py +0 -0
  474. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/skills/bundled/pac_aliyun/references/infraguard-policy-generation.md +0 -0
  475. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/skills/bundled/simplify.py +0 -0
  476. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/skills/discovery.py +0 -0
  477. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/skills/frontmatter.py +0 -0
  478. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/skills/listing.py +0 -0
  479. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/skills/loader.py +0 -0
  480. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/skills/management.py +0 -0
  481. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/skills/renderer.py +0 -0
  482. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/skills/skill_definition.py +0 -0
  483. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/skills/skill_tool.py +0 -0
  484. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/state/__init__.py +0 -0
  485. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/state/app_state.py +0 -0
  486. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tasks/__init__.py +0 -0
  487. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tasks/notification_queue.py +0 -0
  488. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tasks/task_state.py +0 -0
  489. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tasks/task_tools.py +0 -0
  490. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/__init__.py +0 -0
  491. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/bash/__init__.py +0 -0
  492. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/bash/argv_safety.py +0 -0
  493. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/bash/command_parser.py +0 -0
  494. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/bash/mode_validation.py +0 -0
  495. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/bash/path_validation.py +0 -0
  496. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/bash/permissions.py +0 -0
  497. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/bash/readonly_commands.py +0 -0
  498. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/bash/rule_matching.py +0 -0
  499. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/bash/safety_checks.py +0 -0
  500. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/__init__.py +0 -0
  501. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/__init__.py +0 -0
  502. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/aliyun_api_doc.py +0 -0
  503. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/aliyun_doc_search.py +0 -0
  504. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/api_contract.py +0 -0
  505. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/api_identifiers.py +0 -0
  506. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/data/README.md +0 -0
  507. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/data/endpoints/catalog.json +0 -0
  508. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/data/endpoints/generation_report.json +0 -0
  509. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/data/endpoints/legacy.yml +0 -0
  510. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/data/endpoints/overrides.yml +0 -0
  511. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/data/endpoints/unavailable.json +0 -0
  512. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/data/openmeta/api_overrides.yml +0 -0
  513. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/data/openmeta/exclusions.yml +0 -0
  514. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/data/openmeta/product_aliases.yml +0 -0
  515. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/data/openmeta/product_catalog.json +0 -0
  516. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/data/oss/operation_catalog.json +0 -0
  517. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/data/validation/judgments.yml +0 -0
  518. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/data/validation/overrides.yml +0 -0
  519. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/endpoint_resolver.py +0 -0
  520. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/hooks/__init__.py +0 -0
  521. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/openmeta.py +0 -0
  522. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/oss_v4_adapter.py +0 -0
  523. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/product_resolver.py +0 -0
  524. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/retry_policy.py +0 -0
  525. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/ros_client.py +0 -0
  526. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/ros_template_tools.py +0 -0
  527. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/template_source.py +0 -0
  528. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/user_agent.py +0 -0
  529. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/aliyun/validation_policy.py +0 -0
  530. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/base_api.py +0 -0
  531. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/registry.py +0 -0
  532. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/cloud/types.py +0 -0
  533. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/edit_file.py +0 -0
  534. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/list_files.py +0 -0
  535. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/read_file.py +0 -0
  536. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/result_storage.py +0 -0
  537. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/web_fetch.py +0 -0
  538. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/tools/write_file.py +0 -0
  539. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/types/__init__.py +0 -0
  540. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/types/permissions.py +0 -0
  541. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/types/skill_source.py +0 -0
  542. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/__init__.py +0 -0
  543. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/banner.py +0 -0
  544. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/components/__init__.py +0 -0
  545. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/components/candidate_selection.py +0 -0
  546. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/components/dialog.py +0 -0
  547. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/components/divider.py +0 -0
  548. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/components/fuzzy_picker.py +0 -0
  549. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/components/parallel_tabs.py +0 -0
  550. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/components/progress_bar.py +0 -0
  551. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/components/search_box.py +0 -0
  552. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/components/select.py +0 -0
  553. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/components/status_icon.py +0 -0
  554. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/components/tabs.py +0 -0
  555. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/core/__init__.py +0 -0
  556. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/core/in_place_render.py +0 -0
  557. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/core/input_history.py +0 -0
  558. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/core/key_event.py +0 -0
  559. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/core/prompt_input.py +0 -0
  560. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/core/raw_input.py +0 -0
  561. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/core/raw_input_win.py +0 -0
  562. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/core/screen.py +0 -0
  563. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/diagram_rendering.py +0 -0
  564. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/dialogs/__init__.py +0 -0
  565. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/dialogs/global_search.py +0 -0
  566. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/dialogs/history_search.py +0 -0
  567. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/dialogs/mcp_manager.py +0 -0
  568. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/dialogs/memory.py +0 -0
  569. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/dialogs/memory_editor.py +0 -0
  570. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/dialogs/model_picker.py +0 -0
  571. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/dialogs/quick_open.py +0 -0
  572. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/dialogs/resume_picker.py +0 -0
  573. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/dialogs/skills_picker.py +0 -0
  574. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/keybindings/__init__.py +0 -0
  575. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/keybindings/manager.py +0 -0
  576. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/pipeline_display_replay.py +0 -0
  577. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/pipeline_styles.py +0 -0
  578. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/spinner.py +0 -0
  579. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/stream_accumulator.py +0 -0
  580. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/suggestions/__init__.py +0 -0
  581. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/suggestions/aggregator.py +0 -0
  582. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/suggestions/directory_provider.py +0 -0
  583. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/suggestions/file_provider.py +0 -0
  584. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/suggestions/shell_history_provider.py +0 -0
  585. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/suggestions/token_extractor.py +0 -0
  586. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/ui/transcript_view.py +0 -0
  587. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/utils/__init__.py +0 -0
  588. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/utils/async_lifecycle.py +0 -0
  589. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/utils/background_housekeeping.py +0 -0
  590. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/utils/cleanup.py +0 -0
  591. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/utils/console.py +0 -0
  592. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/utils/file_security.py +0 -0
  593. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/utils/image/__init__.py +0 -0
  594. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/utils/image/clipboard.py +0 -0
  595. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/utils/image/format_detect.py +0 -0
  596. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/utils/image/pasted_content.py +0 -0
  597. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/utils/image/processor.py +0 -0
  598. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/utils/image/resizer.py +0 -0
  599. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/utils/image/store.py +0 -0
  600. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/utils/json_utils.py +0 -0
  601. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/utils/log.py +0 -0
  602. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/utils/path_components.py +0 -0
  603. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/utils/path_locks.py +0 -0
  604. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/utils/platform.py +0 -0
  605. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/utils/project_paths.py +0 -0
  606. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/utils/signals.py +0 -0
  607. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/utils/state_io.py +0 -0
  608. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/utils/tool_input_parser.py +0 -0
  609. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/utils/tool_result_redaction.py +0 -0
  610. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code/utils/windows_paths.py +0 -0
  611. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code.egg-info/dependency_links.txt +0 -0
  612. {iac_code-0.10.0 → iac_code-0.11.1}/src/iac_code.egg-info/entry_points.txt +0 -0
  613. {iac_code-0.10.0 → iac_code-0.11.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.10.0
3
+ Version: 0.11.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
@@ -75,6 +75,17 @@ Reading from stdin is also supported:
75
75
  echo "Create an OSS Bucket" | iac-code --prompt -
76
76
  ```
77
77
 
78
+ ### Web App
79
+
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
+
82
+ ```bash
83
+ pip install 'iac-code[http]'
84
+ iac-code web
85
+ ```
86
+
87
+ By default it opens `http://127.0.0.1:8766` in your browser (loopback only). See the [Web App guide](https://aliyun.github.io/iac-code/web-app) for details.
88
+
78
89
  ## Contributing
79
90
 
80
91
  Install [uv](https://docs.astral.sh/uv/getting-started/installation/), then:
@@ -55,6 +55,17 @@ Reading from stdin is also supported:
55
55
  echo "Create an OSS Bucket" | iac-code --prompt -
56
56
  ```
57
57
 
58
+ ### Web App
59
+
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
+
62
+ ```bash
63
+ pip install 'iac-code[http]'
64
+ iac-code web
65
+ ```
66
+
67
+ By default it opens `http://127.0.0.1:8766` in your browser (loopback only). See the [Web App guide](https://aliyun.github.io/iac-code/web-app) for details.
68
+
58
69
  ## Contributing
59
70
 
60
71
  Install [uv](https://docs.astral.sh/uv/getting-started/installation/), then:
@@ -46,10 +46,12 @@ dependencies = [
46
46
  "alibabacloud-gateway-oss>=0.0.25,<1",
47
47
  "alibabacloud-gateway-pop>=0.1.3,<1",
48
48
  "aliyun-python-sdk-core>=2.16,<3",
49
+ "python-dateutil==2.8.2",
49
50
  ]
50
51
 
51
52
  [project.optional-dependencies]
52
53
  http = [
54
+ "a2a-sdk[http-server,signing]>=1.0.2,<2",
53
55
  "starlette>=0.39.0",
54
56
  "uvicorn[standard]>=0.30.0",
55
57
  ]
@@ -104,6 +106,11 @@ version = {attr = "iac_code.__version__"}
104
106
  "**/*.yaml",
105
107
  "**/*.json",
106
108
  "**/*.md",
109
+ "**/*.html",
110
+ "**/*.css",
111
+ "**/*.js",
112
+ "**/*.svg",
113
+ "**/*.LICENSE",
107
114
  "**/*.rego",
108
115
  "**/*.mo",
109
116
  "**/*.po",
@@ -47,6 +47,7 @@ INSTALL_REQUIRES = [
47
47
  ]
48
48
  EXTRAS_REQUIRE = {
49
49
  "http": [
50
+ "a2a-sdk[http-server,signing]>=1.0.2,<2",
50
51
  "starlette>=0.39.0",
51
52
  "uvicorn[standard]>=0.30.0",
52
53
  ],
@@ -77,6 +78,11 @@ PACKAGE_DATA = {
77
78
  "**/*.json",
78
79
  "**/*.md",
79
80
  "**/*.rego",
81
+ "**/*.html",
82
+ "**/*.css",
83
+ "**/*.js",
84
+ "**/*.svg",
85
+ "**/*.LICENSE",
80
86
  "**/*.mo",
81
87
  "**/*.po",
82
88
  ],
@@ -194,7 +200,7 @@ def _compile_translations():
194
200
 
195
201
 
196
202
  def _replace_release_date():
197
- if platform.system() == 'Darwin':
203
+ if platform.system() == "Darwin":
198
204
  return
199
205
  content = INIT_PATH.read_text(encoding="utf-8")
200
206
  today = date.today().isoformat()
@@ -325,5 +331,5 @@ setup(
325
331
  cmdclass={
326
332
  "build_py": InjectReleaseDateBuildPy,
327
333
  "sdist": CompileTranslationsSdist,
328
- }
334
+ },
329
335
  )
@@ -0,0 +1,2 @@
1
+ __version__ = "0.11.1"
2
+ __release_date__ = "2026-07-31"
@@ -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,
@@ -20,7 +20,7 @@ from iac_code.services.session_layout import (
20
20
  ensure_session_owned_dir,
21
21
  require_supported_session_layout,
22
22
  )
23
- from iac_code.utils.public_errors import sanitize_public_text
23
+ from iac_code.utils.public_errors import all_redaction_suppressed, sanitize_public_text
24
24
  from iac_code.utils.public_paths import relativize_public_file_uri
25
25
  from iac_code.utils.state_io import atomic_write_bytes
26
26
  from iac_code.utils.tool_result_redaction import (
@@ -124,6 +124,10 @@ def sanitize_public_artifact_data(
124
124
  *,
125
125
  public_path_roots: Iterable[Mapping[str, str]] | None = None,
126
126
  ) -> Any:
127
+ if all_redaction_suppressed():
128
+ # 环回 web 上下文:结构化数据整体原样(含敏感键 → 不再打 [REDACTED]、不再删文件内容),
129
+ # 使 journal 与快照保留完整模板/结论,重载可正常出图。
130
+ return value
127
131
  if isinstance(value, list):
128
132
  return [sanitize_public_artifact_data(item, public_path_roots=public_path_roots) for item in value]
129
133
  if isinstance(value, tuple):
@@ -166,6 +170,10 @@ def sanitize_public_tool_output_data(
166
170
  *,
167
171
  public_path_roots: Iterable[Mapping[str, str]] | None = None,
168
172
  ) -> Any:
173
+ if all_redaction_suppressed():
174
+ # 环回 web 上下文:工具输出整体原样(敏感键也不打 [REDACTED]、不再删文件内容),
175
+ # 与 sanitize_public_artifact_data 一致,使 journal/快照保留完整结果供重载。
176
+ return value
169
177
  if isinstance(value, str):
170
178
  value = redact_file_content_from_json_string(value)
171
179
  return sanitize_public_artifact_text(value, fallback_summary="", public_path_roots=public_path_roots)
@@ -229,6 +237,8 @@ def _sanitize_artifact_string(
229
237
  except UnsafeArtifactNameError:
230
238
  pass
231
239
  if value.lower().startswith("file://"):
240
+ if all_redaction_suppressed():
241
+ return value
232
242
  return relativize_public_file_uri(value, public_path_roots) or "[PATH]"
233
243
  return _sanitize_artifact_scalar_string(value, public_path_roots=public_path_roots)
234
244
 
@@ -239,10 +249,14 @@ def _sanitize_artifact_scalar_string(
239
249
  public_path_roots: Iterable[Mapping[str, str]] | None = None,
240
250
  ) -> str:
241
251
  if value.lower().startswith("file://"):
252
+ if all_redaction_suppressed():
253
+ return value
242
254
  return relativize_public_file_uri(value, public_path_roots) or "[PATH]"
243
255
  decoded = unquote(value)
244
256
  if decoded != value:
245
257
  if decoded.lower().startswith("file://"):
258
+ if all_redaction_suppressed():
259
+ return value
246
260
  return relativize_public_file_uri(decoded, public_path_roots) or "[PATH]"
247
261
  decoded_sanitized = sanitize_public_artifact_text(
248
262
  decoded,
@@ -287,6 +301,9 @@ def _replace_file_uri_tokens(
287
301
  *,
288
302
  public_path_roots: Iterable[Mapping[str, str]] | None = None,
289
303
  ) -> str:
304
+ if all_redaction_suppressed():
305
+ return value
306
+
290
307
  def replace_file_uri(match: re.Match[str]) -> str:
291
308
  uri = match.group(0)
292
309
  trailing = ""
@@ -330,7 +347,7 @@ def _replace_public_artifact_uri_tokens(
330
347
  trailing = uri[-1] + trailing
331
348
  uri = uri[:-1]
332
349
  if not is_valid_public_artifact_uri(uri):
333
- return "[PATH]"
350
+ return match.group(0) if all_redaction_suppressed() else "[PATH]"
334
351
  placeholder = f"{prefix}{len(placeholders)}__"
335
352
  placeholders[placeholder] = uri
336
353
  return f"{placeholder}{trailing}"
@@ -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: