iac-code 0.5.0__tar.gz → 0.7.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (423) hide show
  1. {iac_code-0.5.0 → iac_code-0.7.0}/PKG-INFO +2 -1
  2. {iac_code-0.5.0 → iac_code-0.7.0}/pyproject.toml +2 -0
  3. iac_code-0.7.0/setup.py +285 -0
  4. iac_code-0.7.0/src/iac_code/__init__.py +2 -0
  5. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/a2a/agent_card.py +38 -3
  6. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/a2a/app.py +72 -1
  7. iac_code-0.7.0/src/iac_code/a2a/artifacts.py +375 -0
  8. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/a2a/client.py +31 -4
  9. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/a2a/events.py +16 -19
  10. iac_code-0.7.0/src/iac_code/a2a/executor.py +1433 -0
  11. iac_code-0.7.0/src/iac_code/a2a/jsonrpc_passthrough.py +88 -0
  12. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/a2a/parts.py +112 -7
  13. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/a2a/persistence.py +47 -4
  14. iac_code-0.7.0/src/iac_code/a2a/pipeline_events.py +1379 -0
  15. iac_code-0.7.0/src/iac_code/a2a/pipeline_executor.py +2386 -0
  16. iac_code-0.7.0/src/iac_code/a2a/pipeline_journal.py +279 -0
  17. iac_code-0.7.0/src/iac_code/a2a/pipeline_paths.py +29 -0
  18. iac_code-0.7.0/src/iac_code/a2a/pipeline_recovery.py +383 -0
  19. iac_code-0.7.0/src/iac_code/a2a/pipeline_snapshot.py +1496 -0
  20. iac_code-0.7.0/src/iac_code/a2a/pipeline_stream.py +583 -0
  21. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/a2a/push.py +118 -34
  22. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/a2a/push_worker.py +30 -4
  23. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/a2a/task_store.py +269 -21
  24. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/a2a/transports/dispatcher.py +230 -2
  25. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/a2a/transports/grpc_jsonrpc.py +28 -4
  26. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/a2a/transports/redis_streams.py +57 -16
  27. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/a2a/transports/stdio.py +26 -5
  28. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/a2a/transports/websocket.py +40 -8
  29. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/a2a/types.py +3 -0
  30. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/acp/convert.py +16 -5
  31. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/acp/server.py +59 -31
  32. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/acp/session.py +68 -28
  33. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/acp/slash_registry.py +4 -3
  34. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/acp/state.py +9 -2
  35. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/agent/agent_loop.py +200 -12
  36. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/agent/agent_tool.py +3 -0
  37. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/agent/message.py +1 -0
  38. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/agent/system_prompt.py +61 -0
  39. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/cli/headless.py +17 -2
  40. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/cli/main.py +102 -36
  41. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/cli/output_formats.py +37 -3
  42. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/commands/auth.py +2 -2
  43. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/commands/memory.py +3 -2
  44. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/commands/prompt.py +428 -10
  45. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/config.py +12 -6
  46. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/i18n/__init__.py +18 -0
  47. iac_code-0.7.0/src/iac_code/i18n/locales/de/LC_MESSAGES/messages.mo +0 -0
  48. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/i18n/locales/de/LC_MESSAGES/messages.po +1790 -76
  49. iac_code-0.7.0/src/iac_code/i18n/locales/es/LC_MESSAGES/messages.mo +0 -0
  50. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/i18n/locales/es/LC_MESSAGES/messages.po +1793 -99
  51. iac_code-0.7.0/src/iac_code/i18n/locales/fr/LC_MESSAGES/messages.mo +0 -0
  52. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/i18n/locales/fr/LC_MESSAGES/messages.po +1809 -101
  53. iac_code-0.7.0/src/iac_code/i18n/locales/ja/LC_MESSAGES/messages.mo +0 -0
  54. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/i18n/locales/ja/LC_MESSAGES/messages.po +1659 -118
  55. iac_code-0.7.0/src/iac_code/i18n/locales/pt/LC_MESSAGES/messages.mo +0 -0
  56. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/i18n/locales/pt/LC_MESSAGES/messages.po +1787 -101
  57. iac_code-0.7.0/src/iac_code/i18n/locales/zh/LC_MESSAGES/messages.mo +0 -0
  58. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/i18n/locales/zh/LC_MESSAGES/messages.po +1627 -127
  59. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/memory/memory_tools.py +11 -1
  60. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/memory/project_memory.py +4 -1
  61. iac_code-0.7.0/src/iac_code/pipeline/__init__.py +83 -0
  62. iac_code-0.7.0/src/iac_code/pipeline/config.py +30 -0
  63. iac_code-0.7.0/src/iac_code/pipeline/constants.py +8 -0
  64. iac_code-0.7.0/src/iac_code/pipeline/display_names.py +67 -0
  65. iac_code-0.7.0/src/iac_code/pipeline/engine/__init__.py +57 -0
  66. iac_code-0.7.0/src/iac_code/pipeline/engine/ask_user_question_tool.py +106 -0
  67. iac_code-0.7.0/src/iac_code/pipeline/engine/cleanup.py +1054 -0
  68. iac_code-0.7.0/src/iac_code/pipeline/engine/complete_step_tool.py +566 -0
  69. iac_code-0.7.0/src/iac_code/pipeline/engine/completion_guard_state.py +83 -0
  70. iac_code-0.7.0/src/iac_code/pipeline/engine/context.py +113 -0
  71. iac_code-0.7.0/src/iac_code/pipeline/engine/display_replay.py +617 -0
  72. iac_code-0.7.0/src/iac_code/pipeline/engine/events.py +44 -0
  73. iac_code-0.7.0/src/iac_code/pipeline/engine/handoff.py +47 -0
  74. iac_code-0.7.0/src/iac_code/pipeline/engine/interrupt.py +319 -0
  75. iac_code-0.7.0/src/iac_code/pipeline/engine/loader.py +482 -0
  76. iac_code-0.7.0/src/iac_code/pipeline/engine/observability.py +716 -0
  77. iac_code-0.7.0/src/iac_code/pipeline/engine/pipeline_runner.py +4029 -0
  78. iac_code-0.7.0/src/iac_code/pipeline/engine/prompts/interrupt_judge.md +100 -0
  79. iac_code-0.7.0/src/iac_code/pipeline/engine/public_errors.py +17 -0
  80. iac_code-0.7.0/src/iac_code/pipeline/engine/recovery.py +82 -0
  81. iac_code-0.7.0/src/iac_code/pipeline/engine/resume_recovery.py +72 -0
  82. iac_code-0.7.0/src/iac_code/pipeline/engine/session.py +785 -0
  83. iac_code-0.7.0/src/iac_code/pipeline/engine/show_diagram_tool.py +354 -0
  84. iac_code-0.7.0/src/iac_code/pipeline/engine/state_machine.py +185 -0
  85. iac_code-0.7.0/src/iac_code/pipeline/engine/step_executor.py +740 -0
  86. iac_code-0.7.0/src/iac_code/pipeline/engine/step_spec.py +190 -0
  87. iac_code-0.7.0/src/iac_code/pipeline/engine/sub_pipeline_executor.py +986 -0
  88. iac_code-0.7.0/src/iac_code/pipeline/engine/transcript_storage.py +130 -0
  89. iac_code-0.7.0/src/iac_code/pipeline/engine/types.py +41 -0
  90. iac_code-0.7.0/src/iac_code/pipeline/engine/ui_contract.py +127 -0
  91. iac_code-0.7.0/src/iac_code/pipeline/engine/user_input.py +91 -0
  92. iac_code-0.7.0/src/iac_code/pipeline/selling/hooks/deploying.py +211 -0
  93. iac_code-0.7.0/src/iac_code/pipeline/selling/pipeline.yaml +268 -0
  94. iac_code-0.7.0/src/iac_code/pipeline/selling/prompts/architecture_planning.md +29 -0
  95. iac_code-0.7.0/src/iac_code/pipeline/selling/prompts/confirm_and_select.a2a.md +63 -0
  96. iac_code-0.7.0/src/iac_code/pipeline/selling/prompts/confirm_and_select.md +87 -0
  97. iac_code-0.7.0/src/iac_code/pipeline/selling/prompts/cost_estimating.md +18 -0
  98. iac_code-0.7.0/src/iac_code/pipeline/selling/prompts/deploying.md +48 -0
  99. iac_code-0.7.0/src/iac_code/pipeline/selling/prompts/evaluate_candidates.md +3 -0
  100. iac_code-0.7.0/src/iac_code/pipeline/selling/prompts/intent_parsing.md +35 -0
  101. iac_code-0.7.0/src/iac_code/pipeline/selling/prompts/reviewing.md +19 -0
  102. iac_code-0.7.0/src/iac_code/pipeline/selling/prompts/template_generating.md +29 -0
  103. iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-architecture/SKILL.md +122 -0
  104. iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-architecture/evals.json +177 -0
  105. iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/SKILL.md +174 -0
  106. iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/evals.json +141 -0
  107. iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/SKILL.md +145 -0
  108. iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/evals.json +191 -0
  109. iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/ecs.md +167 -0
  110. iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/oss.md +69 -0
  111. iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/rds.md +95 -0
  112. iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/redis.md +100 -0
  113. iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/slb.md +60 -0
  114. iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/vpc.md +54 -0
  115. iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/ros-template.md +155 -0
  116. iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/template-parameter-recommendation.md +165 -0
  117. iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/template-parameters.md +206 -0
  118. iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/terraform-template.md +101 -0
  119. iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-intent/SKILL.md +233 -0
  120. iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-intent/evals.json +144 -0
  121. iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-review/SKILL.md +76 -0
  122. iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/SKILL.md +102 -0
  123. iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/evals.json +77 -0
  124. iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/ecs.md +167 -0
  125. iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/oss.md +69 -0
  126. iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/rds.md +95 -0
  127. iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/redis.md +100 -0
  128. iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/slb.md +60 -0
  129. iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/vpc.md +54 -0
  130. iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/ros-template.md +155 -0
  131. iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/template-parameter-recommendation.md +165 -0
  132. iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/template-parameters.md +206 -0
  133. iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/terraform-template.md +101 -0
  134. iac_code-0.7.0/src/iac_code/pipeline/selling/tools/show_candidate_detail_tool.py +94 -0
  135. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/providers/kimi_provider.py +10 -0
  136. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/providers/manager.py +13 -3
  137. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/providers/minimax_provider.py +10 -0
  138. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/providers/registry.py +48 -19
  139. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/providers/thinking.py +55 -1
  140. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/providers/zhipu_provider.py +8 -0
  141. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/capabilities/auto_detect.py +1 -1
  142. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/capabilities/multimodal.py +3 -3
  143. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/context_manager.py +19 -4
  144. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/providers/aliyun.py +21 -0
  145. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/session_index.py +28 -4
  146. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/session_storage.py +56 -10
  147. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/telemetry/client.py +58 -19
  148. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/telemetry/config.py +41 -1
  149. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/telemetry/metrics.py +16 -0
  150. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/telemetry/names.py +46 -0
  151. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/skills/bundled/__init__.py +3 -0
  152. iac_code-0.7.0/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/ecs.md +167 -0
  153. iac_code-0.7.0/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/oss.md +69 -0
  154. iac_code-0.7.0/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/rds.md +95 -0
  155. iac_code-0.7.0/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/redis.md +100 -0
  156. iac_code-0.7.0/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/slb.md +60 -0
  157. iac_code-0.7.0/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/vpc.md +54 -0
  158. iac_code-0.7.0/src/iac_code/skills/bundled/iac_aliyun/references/ros-template.md +155 -0
  159. iac_code-0.7.0/src/iac_code/skills/bundled/iac_aliyun/references/template-parameter-recommendation.md +165 -0
  160. iac_code-0.7.0/src/iac_code/skills/bundled/iac_aliyun/references/template-parameters.md +206 -0
  161. iac_code-0.7.0/src/iac_code/skills/bundled/iac_aliyun/references/terraform-template.md +101 -0
  162. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/base.py +99 -3
  163. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/cloud/aliyun/aliyun_api.py +24 -0
  164. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/cloud/aliyun/aliyun_doc_search.py +18 -1
  165. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/cloud/aliyun/ros_stack.py +71 -2
  166. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/cloud/aliyun/ros_stack_instances.py +3 -0
  167. iac_code-0.7.0/src/iac_code/tools/cloud/aliyun/template_source.py +17 -0
  168. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/cloud/base_stack.py +22 -2
  169. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/path_safety.py +43 -3
  170. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/read_file.py +21 -4
  171. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/tool_executor.py +13 -3
  172. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/types/__init__.py +2 -0
  173. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/types/stream_events.py +86 -2
  174. iac_code-0.7.0/src/iac_code/ui/components/candidate_selection.py +394 -0
  175. iac_code-0.7.0/src/iac_code/ui/components/parallel_tabs.py +249 -0
  176. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/components/select.py +18 -1
  177. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/components/status_icon.py +19 -2
  178. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/core/prompt_input.py +67 -30
  179. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/core/raw_input.py +60 -9
  180. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/core/raw_input_win.py +98 -7
  181. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/dialogs/resume_picker.py +2 -1
  182. iac_code-0.7.0/src/iac_code/ui/pipeline_display_replay.py +540 -0
  183. iac_code-0.7.0/src/iac_code/ui/pipeline_styles.py +24 -0
  184. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/renderer.py +308 -63
  185. iac_code-0.7.0/src/iac_code/ui/repl.py +5036 -0
  186. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/spinner.py +21 -3
  187. iac_code-0.7.0/src/iac_code/ui/stream_accumulator.py +183 -0
  188. iac_code-0.7.0/src/iac_code/utils/console.py +114 -0
  189. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/utils/file_security.py +8 -24
  190. iac_code-0.7.0/src/iac_code/utils/image/__init__.py +0 -0
  191. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/utils/image/processor.py +1 -0
  192. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/utils/image/store.py +60 -1
  193. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/utils/json_utils.py +61 -1
  194. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/utils/log.py +48 -5
  195. iac_code-0.7.0/src/iac_code/utils/path_locks.py +35 -0
  196. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/utils/project_paths.py +11 -3
  197. iac_code-0.7.0/src/iac_code/utils/public_errors.py +298 -0
  198. iac_code-0.7.0/src/iac_code/utils/state_io.py +200 -0
  199. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/utils/tool_input_parser.py +2 -2
  200. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code.egg-info/PKG-INFO +2 -1
  201. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code.egg-info/SOURCES.txt +102 -0
  202. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code.egg-info/requires.txt +5 -0
  203. iac_code-0.5.0/setup.py +0 -151
  204. iac_code-0.5.0/src/iac_code/__init__.py +0 -2
  205. iac_code-0.5.0/src/iac_code/a2a/artifacts.py +0 -74
  206. iac_code-0.5.0/src/iac_code/a2a/executor.py +0 -436
  207. iac_code-0.5.0/src/iac_code/i18n/locales/de/LC_MESSAGES/messages.mo +0 -0
  208. iac_code-0.5.0/src/iac_code/i18n/locales/es/LC_MESSAGES/messages.mo +0 -0
  209. iac_code-0.5.0/src/iac_code/i18n/locales/fr/LC_MESSAGES/messages.mo +0 -0
  210. iac_code-0.5.0/src/iac_code/i18n/locales/ja/LC_MESSAGES/messages.mo +0 -0
  211. iac_code-0.5.0/src/iac_code/i18n/locales/pt/LC_MESSAGES/messages.mo +0 -0
  212. iac_code-0.5.0/src/iac_code/i18n/locales/zh/LC_MESSAGES/messages.mo +0 -0
  213. iac_code-0.5.0/src/iac_code/ui/repl.py +0 -1719
  214. iac_code-0.5.0/src/iac_code/utils/console.py +0 -37
  215. {iac_code-0.5.0 → iac_code-0.7.0}/LICENSE +0 -0
  216. {iac_code-0.5.0 → iac_code-0.7.0}/MANIFEST.in +0 -0
  217. {iac_code-0.5.0 → iac_code-0.7.0}/README.md +0 -0
  218. {iac_code-0.5.0 → iac_code-0.7.0}/setup.cfg +0 -0
  219. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/a2a/__init__.py +0 -0
  220. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/a2a/exposure.py +0 -0
  221. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/a2a/metrics.py +0 -0
  222. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/a2a/push_queue.py +0 -0
  223. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/a2a/push_secrets.py +0 -0
  224. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/a2a/router.py +0 -0
  225. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/a2a/signing.py +0 -0
  226. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/a2a/transport.py +0 -0
  227. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/a2a/transports/__init__.py +0 -0
  228. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/a2a/transports/base.py +0 -0
  229. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/a2a/transports/grpc.py +0 -0
  230. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/a2a/transports/http.py +0 -0
  231. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/a2a/transports/unix.py +0 -0
  232. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/acp/__init__.py +0 -0
  233. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/acp/http_sse.py +0 -0
  234. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/acp/mcp.py +0 -0
  235. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/acp/metrics.py +0 -0
  236. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/acp/tools.py +0 -0
  237. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/acp/types.py +0 -0
  238. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/acp/version.py +0 -0
  239. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/agent/__init__.py +0 -0
  240. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/agent/agent_types.py +0 -0
  241. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/cli/__init__.py +0 -0
  242. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/cli/install_git_bash.py +0 -0
  243. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/cli/update.py +0 -0
  244. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/commands/__init__.py +0 -0
  245. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/commands/clear.py +0 -0
  246. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/commands/compact.py +0 -0
  247. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/commands/debug.py +0 -0
  248. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/commands/effort.py +0 -0
  249. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/commands/exit.py +0 -0
  250. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/commands/help.py +0 -0
  251. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/commands/model.py +0 -0
  252. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/commands/registry.py +0 -0
  253. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/commands/rename.py +0 -0
  254. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/commands/resume.py +0 -0
  255. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/commands/skills.py +0 -0
  256. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/commands/status.py +0 -0
  257. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/commands/tasks.py +0 -0
  258. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/memory/__init__.py +0 -0
  259. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/memory/memory_manager.py +0 -0
  260. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/memory/recall.py +0 -0
  261. {iac_code-0.5.0/src/iac_code/skills/bundled/iac_aliyun → iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost}/references/cloud-products/ecs.md +0 -0
  262. {iac_code-0.5.0/src/iac_code/skills/bundled/iac_aliyun → iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost}/references/cloud-products/oss.md +0 -0
  263. {iac_code-0.5.0/src/iac_code/skills/bundled/iac_aliyun → iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost}/references/cloud-products/rds.md +0 -0
  264. {iac_code-0.5.0/src/iac_code/skills/bundled/iac_aliyun → iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost}/references/cloud-products/redis.md +0 -0
  265. {iac_code-0.5.0/src/iac_code/skills/bundled/iac_aliyun → iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost}/references/cloud-products/slb.md +0 -0
  266. {iac_code-0.5.0/src/iac_code/skills/bundled/iac_aliyun → iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost}/references/cloud-products/vpc.md +0 -0
  267. {iac_code-0.5.0/src/iac_code/skills/bundled/iac_aliyun → iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost}/references/ros-template.md +0 -0
  268. {iac_code-0.5.0/src/iac_code/skills/bundled/iac_aliyun → iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost}/references/template-parameter-recommendation.md +0 -0
  269. {iac_code-0.5.0/src/iac_code/skills/bundled/iac_aliyun → iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost}/references/template-parameters.md +0 -0
  270. {iac_code-0.5.0/src/iac_code/skills/bundled/iac_aliyun → iac_code-0.7.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost}/references/terraform-template.md +0 -0
  271. {iac_code-0.5.0/src/iac_code/tools/cloud → iac_code-0.7.0/src/iac_code/pipeline/selling/tools}/__init__.py +0 -0
  272. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/providers/__init__.py +0 -0
  273. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/providers/anthropic_provider.py +0 -0
  274. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/providers/azure_openai_provider.py +0 -0
  275. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/providers/base.py +0 -0
  276. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/providers/dashscope_provider.py +0 -0
  277. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/providers/deepseek_provider.py +0 -0
  278. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/providers/gemini_provider.py +0 -0
  279. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/providers/lmstudio_provider.py +0 -0
  280. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/providers/modelscope_provider.py +0 -0
  281. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/providers/ollama_provider.py +0 -0
  282. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/providers/openai_provider.py +0 -0
  283. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/providers/openrouter_provider.py +0 -0
  284. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/providers/retry.py +0 -0
  285. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/providers/siliconflow_provider.py +0 -0
  286. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/providers/stream_watchdog.py +0 -0
  287. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/providers/volcengine_provider.py +0 -0
  288. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/__init__.py +0 -0
  289. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/agent_factory.py +0 -0
  290. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/capabilities/__init__.py +0 -0
  291. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/cloud_credentials.py +0 -0
  292. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/permissions/__init__.py +0 -0
  293. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/permissions/loader.py +0 -0
  294. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/permissions/pipeline.py +0 -0
  295. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/permissions/storage.py +0 -0
  296. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/permissions/trusted_roots.py +0 -0
  297. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/providers/__init__.py +0 -0
  298. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/providers/aliyun_oauth.py +0 -0
  299. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/qwenpaw_source.py +0 -0
  300. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/session_metadata.py +0 -0
  301. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/session_resolver.py +0 -0
  302. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/session_usage.py +0 -0
  303. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/telemetry/__init__.py +0 -0
  304. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/telemetry/attributes.py +0 -0
  305. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/telemetry/constants.py +0 -0
  306. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/telemetry/content_serializer.py +0 -0
  307. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/telemetry/events.py +0 -0
  308. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/telemetry/fallback.py +0 -0
  309. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/telemetry/identity.py +0 -0
  310. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/telemetry/sanitize.py +0 -0
  311. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/telemetry/sink.py +0 -0
  312. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/telemetry/tracing.py +0 -0
  313. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/telemetry/types.py +0 -0
  314. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/token_budget.py +0 -0
  315. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/token_counter.py +0 -0
  316. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/services/update_checker.py +0 -0
  317. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/skills/__init__.py +0 -0
  318. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/skills/auto_trigger.py +0 -0
  319. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/skills/bundled/iac_aliyun/SKILL.md +0 -0
  320. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/skills/bundled/iac_aliyun/__init__.py +0 -0
  321. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/skills/bundled/iac_aliyun/auto_trigger.py +0 -0
  322. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/skills/bundled/iac_aliyun/scripts/tf2ros.py +0 -0
  323. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/skills/bundled/pac_aliyun/SKILL.md +0 -0
  324. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/skills/bundled/pac_aliyun/__init__.py +0 -0
  325. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/skills/bundled/pac_aliyun/auto_trigger.py +0 -0
  326. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/skills/bundled/pac_aliyun/references/infraguard-policy-generation.md +0 -0
  327. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/skills/bundled/simplify.py +0 -0
  328. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/skills/discovery.py +0 -0
  329. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/skills/frontmatter.py +0 -0
  330. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/skills/listing.py +0 -0
  331. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/skills/loader.py +0 -0
  332. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/skills/management.py +0 -0
  333. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/skills/processor.py +0 -0
  334. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/skills/renderer.py +0 -0
  335. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/skills/settings.py +0 -0
  336. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/skills/skill_definition.py +0 -0
  337. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/skills/skill_tool.py +0 -0
  338. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/state/__init__.py +0 -0
  339. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/state/app_state.py +0 -0
  340. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tasks/__init__.py +0 -0
  341. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tasks/notification_queue.py +0 -0
  342. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tasks/task_state.py +0 -0
  343. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tasks/task_tools.py +0 -0
  344. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/__init__.py +0 -0
  345. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/bash/__init__.py +0 -0
  346. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/bash/argv_safety.py +0 -0
  347. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/bash/bash_tool.py +0 -0
  348. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/bash/command_parser.py +0 -0
  349. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/bash/mode_validation.py +0 -0
  350. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/bash/path_validation.py +0 -0
  351. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/bash/permissions.py +0 -0
  352. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/bash/readonly_commands.py +0 -0
  353. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/bash/rule_matching.py +0 -0
  354. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/bash/safety_checks.py +0 -0
  355. {iac_code-0.5.0/src/iac_code/tools/cloud/aliyun → iac_code-0.7.0/src/iac_code/tools/cloud}/__init__.py +0 -0
  356. {iac_code-0.5.0/src/iac_code/tools/cloud/aliyun/hooks → iac_code-0.7.0/src/iac_code/tools/cloud/aliyun}/__init__.py +0 -0
  357. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/cloud/aliyun/api_hooks.py +0 -0
  358. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/cloud/aliyun/endpoints.yml +0 -0
  359. {iac_code-0.5.0/src/iac_code/ui/components → iac_code-0.7.0/src/iac_code/tools/cloud/aliyun/hooks}/__init__.py +0 -0
  360. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/cloud/aliyun/hooks/ros_parameters.py +0 -0
  361. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py +0 -0
  362. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/cloud/aliyun/ros_client.py +0 -0
  363. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/cloud/aliyun/ros_yaml.py +0 -0
  364. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/cloud/aliyun/user_agent.py +0 -0
  365. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/cloud/base_api.py +0 -0
  366. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/cloud/registry.py +0 -0
  367. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/cloud/types.py +0 -0
  368. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/edit_file.py +0 -0
  369. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/glob.py +0 -0
  370. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/grep.py +0 -0
  371. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/list_files.py +0 -0
  372. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/result_storage.py +0 -0
  373. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/web_fetch.py +0 -0
  374. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/tools/write_file.py +0 -0
  375. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/types/permissions.py +0 -0
  376. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/types/skill_source.py +0 -0
  377. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/__init__.py +0 -0
  378. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/banner.py +0 -0
  379. {iac_code-0.5.0/src/iac_code/ui/core → iac_code-0.7.0/src/iac_code/ui/components}/__init__.py +0 -0
  380. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/components/dialog.py +0 -0
  381. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/components/divider.py +0 -0
  382. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/components/fuzzy_picker.py +0 -0
  383. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/components/progress_bar.py +0 -0
  384. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/components/search_box.py +0 -0
  385. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/components/tabs.py +0 -0
  386. {iac_code-0.5.0/src/iac_code/ui/dialogs → iac_code-0.7.0/src/iac_code/ui/core}/__init__.py +0 -0
  387. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/core/in_place_render.py +0 -0
  388. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/core/input_history.py +0 -0
  389. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/core/key_event.py +0 -0
  390. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/core/screen.py +0 -0
  391. {iac_code-0.5.0/src/iac_code/ui/keybindings → iac_code-0.7.0/src/iac_code/ui/dialogs}/__init__.py +0 -0
  392. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/dialogs/global_search.py +0 -0
  393. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/dialogs/history_search.py +0 -0
  394. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/dialogs/memory.py +0 -0
  395. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/dialogs/memory_editor.py +0 -0
  396. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/dialogs/model_picker.py +0 -0
  397. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/dialogs/quick_open.py +0 -0
  398. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/dialogs/skills_picker.py +0 -0
  399. {iac_code-0.5.0/src/iac_code/ui/suggestions → iac_code-0.7.0/src/iac_code/ui/keybindings}/__init__.py +0 -0
  400. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/keybindings/manager.py +0 -0
  401. {iac_code-0.5.0/src/iac_code/utils → iac_code-0.7.0/src/iac_code/ui/suggestions}/__init__.py +0 -0
  402. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/suggestions/aggregator.py +0 -0
  403. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/suggestions/command_provider.py +0 -0
  404. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/suggestions/directory_provider.py +0 -0
  405. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/suggestions/file_provider.py +0 -0
  406. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/suggestions/shell_history_provider.py +0 -0
  407. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/suggestions/skill_provider.py +0 -0
  408. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/suggestions/token_extractor.py +0 -0
  409. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/suggestions/types.py +0 -0
  410. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/ui/transcript_view.py +0 -0
  411. {iac_code-0.5.0/src/iac_code/utils/image → iac_code-0.7.0/src/iac_code/utils}/__init__.py +0 -0
  412. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/utils/background_housekeeping.py +0 -0
  413. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/utils/cleanup.py +0 -0
  414. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/utils/image/clipboard.py +0 -0
  415. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/utils/image/format_detect.py +0 -0
  416. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/utils/image/pasted_content.py +0 -0
  417. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/utils/image/resizer.py +0 -0
  418. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/utils/platform.py +0 -0
  419. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/utils/signals.py +0 -0
  420. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code/utils/windows_paths.py +0 -0
  421. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code.egg-info/dependency_links.txt +0 -0
  422. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code.egg-info/entry_points.txt +0 -0
  423. {iac_code-0.5.0 → iac_code-0.7.0}/src/iac_code.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: iac_code
3
- Version: 0.5.0
3
+ Version: 0.7.0
4
4
  Summary: Your AI-powered Infrastructure as Code assistant
5
5
  Classifier: Programming Language :: Python :: 3
6
6
  Classifier: Programming Language :: Python :: 3.10
@@ -14,6 +14,7 @@ Provides-Extra: a2a
14
14
  Provides-Extra: a2a-grpc
15
15
  Provides-Extra: a2a-redis
16
16
  Provides-Extra: a2a-signing
17
+ Provides-Extra: diagram
17
18
  Provides-Extra: http
18
19
  License-File: LICENSE
19
20
 
@@ -58,6 +58,7 @@ a2a-grpc = [
58
58
  a2a-redis = [
59
59
  "redis>=5.0.0",
60
60
  ]
61
+ diagram = ["termaid>=0.1; python_version >= '3.11'"]
61
62
 
62
63
  [dependency-groups]
63
64
  dev = [
@@ -73,6 +74,7 @@ dev = [
73
74
  "setuptools>=68.0",
74
75
  "wheel",
75
76
  "tomli>=2.0; python_version<\"3.11\"",
77
+ "pexpect>=4.9.0",
76
78
  ]
77
79
 
78
80
  [build-system]
@@ -0,0 +1,285 @@
1
+ """Custom build hook to inject __release_date__ at build time."""
2
+
3
+ import platform
4
+ import re
5
+ import shutil
6
+ import subprocess
7
+ import sys
8
+ from datetime import date
9
+ from pathlib import Path
10
+
11
+ from setuptools import find_namespace_packages, setup
12
+ from setuptools.command.build_py import build_py
13
+ from setuptools.command.sdist import sdist
14
+
15
+ INIT_PATH = Path("src/iac_code/__init__.py")
16
+ LOCALES_DIR = Path("src/iac_code/i18n/locales")
17
+ PROJECT_ROOT = Path(__file__).resolve().parent
18
+ IAC_ALIYUN_REFERENCES_DIR = PROJECT_ROOT / "src/iac_code/skills/bundled/iac_aliyun/references"
19
+ SELLING_IAC_ALIYUN_SKILLS = (
20
+ "iac-aliyun-template-generating",
21
+ "iac-aliyun-cost",
22
+ "iac-aliyun-deploying",
23
+ )
24
+ INSTALL_REQUIRES = [
25
+ "anthropic>=0.40",
26
+ "pydantic>=2.0",
27
+ "typer>=0.9.0",
28
+ "rich>=13.0",
29
+ "pyyaml>=6.0",
30
+ "pyperclip>=1.8.0",
31
+ "openai>=1.50",
32
+ "httpx>=0.27.0",
33
+ "packaging>=24.0",
34
+ "tiktoken>=0.7.0",
35
+ "jsonschema>=4.20",
36
+ "alibabacloud-ros20190910>=3.0.0",
37
+ "alibabacloud-credentials>=0.3.0",
38
+ "loguru>=0.7.0",
39
+ "opentelemetry-distro>=0.48b0",
40
+ "opentelemetry-exporter-otlp>=1.27.0",
41
+ "agent-client-protocol>=0.9.0",
42
+ "pillow==12.2.0",
43
+ "cryptography>=42.0",
44
+ "keyring>=25.0",
45
+ "tree-sitter>=0.25,<0.26",
46
+ "tree-sitter-bash>=0.25,<0.26",
47
+ ]
48
+ EXTRAS_REQUIRE = {
49
+ "http": [
50
+ "starlette>=0.39.0",
51
+ "uvicorn[standard]>=0.30.0",
52
+ ],
53
+ "a2a": [
54
+ "a2a-sdk[http-server,signing]>=1.0.2,<2",
55
+ "cryptography>=42.0",
56
+ "starlette>=0.39.0",
57
+ "uvicorn[standard]>=0.30.0",
58
+ ],
59
+ "a2a-signing": [
60
+ "a2a-sdk[signing]>=1.0.2,<2",
61
+ ],
62
+ "a2a-grpc": [
63
+ "grpcio>=1.60.0",
64
+ "grpcio-status>=1.60.0",
65
+ ],
66
+ "a2a-redis": [
67
+ "redis>=5.0.0",
68
+ ],
69
+ "diagram": [
70
+ "termaid>=0.1; python_version >= '3.11'",
71
+ ],
72
+ }
73
+ PACKAGE_DATA = {
74
+ "iac_code": [
75
+ "**/*.yml",
76
+ "**/*.yaml",
77
+ "**/*.json",
78
+ "**/*.md",
79
+ "**/*.rego",
80
+ "**/*.mo",
81
+ "**/*.po",
82
+ ],
83
+ }
84
+
85
+
86
+ def _read_version():
87
+ content = INIT_PATH.read_text(encoding="utf-8")
88
+ match = re.search(r'^__version__\s*=\s*"([^"]+)"', content, flags=re.MULTILINE)
89
+ if not match:
90
+ raise RuntimeError("unable to read package version from %s" % INIT_PATH)
91
+ return match.group(1)
92
+
93
+
94
+ def _read_long_description():
95
+ readme = Path("README.md")
96
+ return readme.read_text(encoding="utf-8") if readme.is_file() else ""
97
+
98
+
99
+ def _try_import_babel():
100
+ """Try importing babel, return (read_po, write_mo) or None."""
101
+ try:
102
+ from babel.messages.mofile import write_mo
103
+ from babel.messages.pofile import read_po
104
+
105
+ return read_po, write_mo
106
+ except ImportError:
107
+ return None
108
+
109
+
110
+ def _run(cmd):
111
+ subprocess.check_call(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
112
+
113
+
114
+ def _ensure_babel():
115
+ """Import babel, trying every available install method. Raise on total failure."""
116
+ result = _try_import_babel()
117
+ if result:
118
+ return result
119
+
120
+ attempts = []
121
+
122
+ # 1) pip install babel
123
+ try:
124
+ _run([sys.executable, "-m", "pip", "install", "babel"])
125
+ result = _try_import_babel()
126
+ if result:
127
+ return result
128
+ except Exception as exc:
129
+ attempts.append("pip install babel -> %s" % exc)
130
+
131
+ # 2) ensurepip + pip install babel
132
+ try:
133
+ _run([sys.executable, "-m", "ensurepip", "--default-pip"])
134
+ _run([sys.executable, "-m", "pip", "install", "babel"])
135
+ result = _try_import_babel()
136
+ if result:
137
+ return result
138
+ except Exception as exc:
139
+ attempts.append("ensurepip + pip -> %s" % exc)
140
+
141
+ # 3) apt-get install python3-babel on Linux builders
142
+ if sys.platform == "linux":
143
+ try:
144
+ _run(["apt-get", "update", "-qq"])
145
+ _run(["apt-get", "install", "-y", "-qq", "python3-babel"])
146
+ result = _try_import_babel()
147
+ if result:
148
+ return result
149
+ except Exception as exc:
150
+ attempts.append("apt-get install python3-babel -> %s" % exc)
151
+
152
+ # 4) download get-pip.py, bootstrap pip, then pip install babel
153
+ try:
154
+ import os
155
+ import tempfile
156
+
157
+ try:
158
+ from urllib.request import urlretrieve
159
+ except ImportError:
160
+ from urllib import urlretrieve
161
+
162
+ fd, get_pip = tempfile.mkstemp(suffix=".py")
163
+ os.close(fd)
164
+ urlretrieve("https://bootstrap.pypa.io/get-pip.py", get_pip)
165
+ _run([sys.executable, get_pip, "--break-system-packages", "--quiet"])
166
+ os.remove(get_pip)
167
+ _run([sys.executable, "-m", "pip", "install", "babel"])
168
+ result = _try_import_babel()
169
+ if result:
170
+ return result
171
+ except Exception as exc:
172
+ attempts.append("get-pip.py + pip -> %s" % exc)
173
+
174
+ raise RuntimeError(
175
+ "babel is required to compile translations. All install methods failed:\n " + "\n ".join(attempts)
176
+ )
177
+
178
+
179
+ def _compile_translations():
180
+ """Compile .po -> .mo for all locales."""
181
+ if not LOCALES_DIR.exists():
182
+ raise RuntimeError("locales directory not found: %s" % LOCALES_DIR)
183
+ po_files = sorted(LOCALES_DIR.rglob("*.po"))
184
+ if not po_files:
185
+ raise RuntimeError("no .po files found under %s" % LOCALES_DIR)
186
+ read_po, write_mo = _ensure_babel()
187
+ for po_file in po_files:
188
+ mo_file = po_file.with_suffix(".mo")
189
+ with open(po_file, "rb") as f:
190
+ catalog = read_po(f)
191
+ with open(mo_file, "wb") as f:
192
+ write_mo(f, catalog)
193
+ print("compiled %s -> %s" % (po_file, mo_file))
194
+
195
+
196
+ def _replace_release_date():
197
+ if platform.system() == 'Darwin':
198
+ return
199
+ content = INIT_PATH.read_text(encoding="utf-8")
200
+ today = date.today().isoformat()
201
+ content = re.sub(
202
+ r'^__release_date__\s*=\s*".*"',
203
+ f'__release_date__ = "{today}"',
204
+ content,
205
+ flags=re.MULTILINE,
206
+ )
207
+ INIT_PATH.write_text(content, encoding="utf-8")
208
+
209
+
210
+ def _copy_selling_skill_references_to_package_root(package_root) -> None:
211
+ """Expand selling-skill reference symlinks into real dirs under an iac_code package root."""
212
+ if not IAC_ALIYUN_REFERENCES_DIR.is_dir():
213
+ raise RuntimeError("references directory not found: %s" % IAC_ALIYUN_REFERENCES_DIR)
214
+
215
+ package_root = Path(package_root)
216
+ for skill_name in SELLING_IAC_ALIYUN_SKILLS:
217
+ target = package_root / "pipeline" / "selling" / "skills" / skill_name / "references"
218
+ if target.is_symlink() or target.is_file():
219
+ target.unlink()
220
+ elif target.exists():
221
+ shutil.rmtree(target)
222
+ target.parent.mkdir(parents=True, exist_ok=True)
223
+ shutil.copytree(IAC_ALIYUN_REFERENCES_DIR, target)
224
+
225
+
226
+ def _copy_selling_skill_references(build_lib: str) -> None:
227
+ """Expand selling-skill reference symlinks into real dirs for installed artifacts."""
228
+ _copy_selling_skill_references_to_package_root(Path(build_lib) / "iac_code")
229
+
230
+
231
+ def _copy_selling_skill_references_to_sdist_release_tree(base_dir: str) -> None:
232
+ """Expand selling-skill references inside an sdist release tree."""
233
+ _copy_selling_skill_references_to_package_root(Path(base_dir) / "src" / "iac_code")
234
+
235
+
236
+ class InjectReleaseDateBuildPy(build_py):
237
+ """Override build_py to stamp __release_date__ before copying source files."""
238
+
239
+ def run(self):
240
+ _replace_release_date()
241
+ _compile_translations()
242
+ super().run()
243
+ _copy_selling_skill_references(self.build_lib)
244
+
245
+
246
+ class CompileTranslationsSdist(sdist):
247
+ """Override sdist to compile translations before packaging source."""
248
+
249
+ def run(self):
250
+ _replace_release_date()
251
+ _compile_translations()
252
+ super().run()
253
+
254
+ def make_release_tree(self, base_dir, files):
255
+ super().make_release_tree(base_dir, files)
256
+ _copy_selling_skill_references_to_sdist_release_tree(base_dir)
257
+
258
+
259
+ setup(
260
+ name="iac_code",
261
+ version=_read_version(),
262
+ description="Your AI-powered Infrastructure as Code assistant",
263
+ long_description=_read_long_description(),
264
+ long_description_content_type="text/markdown",
265
+ python_requires=">=3.10",
266
+ classifiers=[
267
+ "Programming Language :: Python :: 3",
268
+ "Programming Language :: Python :: 3.10",
269
+ "Programming Language :: Python :: 3.11",
270
+ "Programming Language :: Python :: 3.12",
271
+ "Programming Language :: Python :: 3.13",
272
+ "Programming Language :: Python :: 3.14",
273
+ ],
274
+ packages=find_namespace_packages(where="src"),
275
+ package_dir={"": "src"},
276
+ include_package_data=True,
277
+ package_data=PACKAGE_DATA,
278
+ install_requires=INSTALL_REQUIRES,
279
+ extras_require=EXTRAS_REQUIRE,
280
+ entry_points={"console_scripts": ["iac-code=iac_code.cli.main:app"]},
281
+ cmdclass={
282
+ "build_py": InjectReleaseDateBuildPy,
283
+ "sdist": CompileTranslationsSdist,
284
+ }
285
+ )
@@ -0,0 +1,2 @@
1
+ __version__ = "0.7.0"
2
+ __release_date__ = "2026-06-24"
@@ -20,10 +20,17 @@ from google.protobuf.json_format import ParseDict
20
20
  from iac_code import __version__
21
21
  from iac_code.a2a.exposure import format_a2a_exposure_types
22
22
  from iac_code.a2a.parts import supported_input_mime_types
23
+ from iac_code.a2a.pipeline_events import PIPELINE_EVENTS_EXTENSION_URI
23
24
  from iac_code.a2a.signing import sign_agent_card_dict
25
+ from iac_code.i18n import _
26
+ from iac_code.pipeline.config import RunMode, get_run_mode
24
27
 
25
28
  IAC_CODE_ARTIFACT_METADATA_EXTENSION_URI = "urn:iac-code:a2a:artifact-metadata:v1"
29
+ IAC_CODE_PIPELINE_EVENTS_EXTENSION_URI = PIPELINE_EVENTS_EXTENSION_URI
26
30
  IAC_CODE_THINKING_EXPOSURE_EXTENSION_URI = "urn:iac-code:a2a:thinking-exposure:v1"
31
+ CANONICAL_CALLER_EXTENSION_URIS = {
32
+ IAC_CODE_PIPELINE_EVENTS_EXTENSION_URI,
33
+ }
27
34
 
28
35
 
29
36
  def _base_url(host: str, port: int) -> str:
@@ -168,8 +175,31 @@ def build_agent_card(
168
175
  )
169
176
  ParseDict({"enabledTypes": enabled_types}, extension.params)
170
177
  card.capabilities.extensions.append(extension)
171
- for item in _iter_agent_extensions(agent_extensions):
178
+ for item in _iter_agent_extensions(agent_extensions, excluded_uris=CANONICAL_CALLER_EXTENSION_URIS):
172
179
  card.capabilities.extensions.append(_agent_extension_from_dict(item))
180
+ pipeline_events_extension = AgentExtension(
181
+ uri=IAC_CODE_PIPELINE_EVENTS_EXTENSION_URI,
182
+ description=_(
183
+ "Optional iac-code pipeline event extension for state snapshots, replay, interrupts, "
184
+ "and parallel candidate streams."
185
+ ),
186
+ required=False,
187
+ )
188
+ run_mode = get_run_mode()
189
+ ParseDict(
190
+ {
191
+ "schemaVersion": "1.0",
192
+ "enabled": run_mode == RunMode.PIPELINE,
193
+ "mode": run_mode.value,
194
+ "supportsSnapshot": True,
195
+ "supportsReplay": True,
196
+ "supportsInterrupts": True,
197
+ "supportsParallelCandidates": True,
198
+ "stateEndpoint": "/iac-code/pipeline/state",
199
+ },
200
+ pipeline_events_extension.params,
201
+ )
202
+ card.capabilities.extensions.append(pipeline_events_extension)
173
203
 
174
204
  if token_enabled:
175
205
  card.security_schemes["bearerAuth"].http_auth_security_scheme.CopyFrom(HTTPAuthSecurityScheme(scheme="bearer"))
@@ -231,7 +261,12 @@ def _agent_extension_from_dict(item: dict[str, Any]) -> AgentExtension:
231
261
  return extension
232
262
 
233
263
 
234
- def _iter_agent_extensions(value: Any) -> list[dict[str, Any]]:
264
+ def _iter_agent_extensions(value: Any, *, excluded_uris: set[str] | None = None) -> list[dict[str, Any]]:
235
265
  if not isinstance(value, list):
236
266
  return []
237
- return [item for item in value if isinstance(item, dict) and isinstance(item.get("uri"), str)]
267
+ blocked_uris = excluded_uris or set()
268
+ return [
269
+ item
270
+ for item in value
271
+ if isinstance(item, dict) and isinstance(item.get("uri"), str) and item["uri"] not in blocked_uris
272
+ ]
@@ -6,6 +6,7 @@ import binascii
6
6
  import hashlib
7
7
  import hmac
8
8
  import json
9
+ import logging
9
10
  import os
10
11
  from contextlib import asynccontextmanager, suppress
11
12
  from email.utils import formatdate
@@ -13,6 +14,8 @@ from pathlib import Path
13
14
  from time import time
14
15
  from typing import Awaitable, Callable
15
16
 
17
+ from a2a.auth.user import User
18
+ from a2a.server.context import ServerCallContext
16
19
  from a2a.server.routes import create_jsonrpc_routes, create_rest_routes
17
20
  from a2a.utils.constants import AGENT_CARD_WELL_KNOWN_PATH
18
21
  from starlette.applications import Starlette
@@ -23,7 +26,13 @@ from starlette.responses import JSONResponse, Response
23
26
  from starlette.routing import BaseRoute, Route
24
27
 
25
28
  from iac_code.a2a.agent_card import agent_card_to_client_dict
29
+ from iac_code.a2a.jsonrpc_passthrough import (
30
+ install_jsonrpc_error_data_passthrough,
31
+ install_v03_jsonrpc_error_data_passthrough,
32
+ )
33
+ from iac_code.i18n import _
26
34
 
35
+ logger = logging.getLogger(__name__)
27
36
  _V03_JSONRPC_METHODS = frozenset(
28
37
  {
29
38
  "message/send",
@@ -38,6 +47,20 @@ _V03_JSONRPC_METHODS = frozenset(
38
47
  "agent/getAuthenticatedExtendedCard",
39
48
  }
40
49
  )
50
+ _MAX_AFTER_SEQUENCE_DIGITS = 20
51
+
52
+
53
+ class _PrincipalUser(User):
54
+ def __init__(self, principal: str) -> None:
55
+ self._principal = principal
56
+
57
+ @property
58
+ def is_authenticated(self) -> bool:
59
+ return True
60
+
61
+ @property
62
+ def user_name(self) -> str:
63
+ return self._principal
41
64
 
42
65
 
43
66
  def resolve_token(cli_token: str | None) -> str | None:
@@ -197,6 +220,7 @@ def create_app(
197
220
  auto_approve_permissions=auto_approve_permissions,
198
221
  thinking_exposure=thinking_exposure,
199
222
  )
223
+ from iac_code.a2a.pipeline_recovery import A2APipelineRecoveryService
200
224
 
201
225
  @asynccontextmanager
202
226
  async def lifespan(app: Starlette):
@@ -227,11 +251,37 @@ def create_app(
227
251
  return Response(status_code=304, headers=card_cache_headers)
228
252
  return JSONResponse(card_data, headers=card_cache_headers)
229
253
 
254
+ recovery_service = A2APipelineRecoveryService(task_store=components.task_store)
255
+
256
+ async def get_pipeline_state(request: Request) -> JSONResponse:
257
+ context_id = request.query_params.get("contextId") or None
258
+ task_id = request.query_params.get("taskId") or None
259
+ if not context_id and not task_id:
260
+ return JSONResponse({"error": _("contextId or taskId is required")}, status_code=400)
261
+
262
+ after_sequence, parse_error = _parse_after_sequence(request.query_params.get("afterSequence"))
263
+ if parse_error is not None:
264
+ return JSONResponse({"error": parse_error}, status_code=400)
265
+
266
+ try:
267
+ state = await recovery_service.get_state(
268
+ context_id=context_id,
269
+ task_id=task_id,
270
+ after_sequence=after_sequence,
271
+ call_context=_call_context_from_request(request),
272
+ )
273
+ except ValueError as exc:
274
+ return JSONResponse({"error": str(exc)}, status_code=404)
275
+ return JSONResponse(state)
276
+
230
277
  routes: list[BaseRoute] = [
231
278
  Route("/health", health, methods=["GET"]),
232
279
  Route(AGENT_CARD_WELL_KNOWN_PATH, get_agent_card, methods=["GET"]),
280
+ Route("/iac-code/pipeline/state", get_pipeline_state, methods=["GET"]),
233
281
  ]
282
+ install_jsonrpc_error_data_passthrough()
234
283
  jsonrpc_endpoint = create_jsonrpc_routes(components.handler, rpc_url="/", enable_v0_3_compat=True)[0].endpoint
284
+ install_v03_jsonrpc_error_data_passthrough(jsonrpc_endpoint)
235
285
 
236
286
  async def handle_jsonrpc(request: Request) -> Response:
237
287
  await normalize_v03_jsonrpc_version(request)
@@ -251,11 +301,32 @@ def create_app(
251
301
  return app
252
302
 
253
303
 
304
+ def _call_context_from_request(request: Request) -> ServerCallContext | None:
305
+ user = request.scope.get("user")
306
+ principal = getattr(user, "username", None) or getattr(user, "display_name", None)
307
+ if not isinstance(principal, str) or not principal:
308
+ return None
309
+ return ServerCallContext(user=_PrincipalUser(principal))
310
+
311
+
254
312
  def _agent_card_etag(card: dict[str, object]) -> str:
255
313
  body = json.dumps(card, sort_keys=True, separators=(",", ":"), ensure_ascii=False).encode("utf-8")
256
314
  return f'"sha256-{hashlib.sha256(body).hexdigest()}"'
257
315
 
258
316
 
317
+ def _parse_after_sequence(value: str | None) -> tuple[int | None, str | None]:
318
+ if value is None or value == "":
319
+ return None, None
320
+ if len(value) > _MAX_AFTER_SEQUENCE_DIGITS:
321
+ return None, _("afterSequence must be a non-negative integer")
322
+ if value.isascii() and value.isdecimal():
323
+ try:
324
+ return int(value), None
325
+ except ValueError:
326
+ pass
327
+ return None, _("afterSequence must be a non-negative integer")
328
+
329
+
259
330
  def run_server(
260
331
  *,
261
332
  host: str,
@@ -454,7 +525,7 @@ def run_server(
454
525
  try:
455
526
  import uvicorn
456
527
  except ImportError as exc:
457
- raise RuntimeError("A2A server dependencies are missing. Install iac-code with the 'a2a' extra.") from exc
528
+ raise RuntimeError("A2A server dependencies are missing. Install with: pip install 'iac-code[a2a]'") from exc
458
529
 
459
530
  uvicorn.run(
460
531
  app,