iac-code 0.2.0__tar.gz → 0.2.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 (266) hide show
  1. {iac_code-0.2.0 → iac_code-0.2.1}/PKG-INFO +7 -1
  2. {iac_code-0.2.0 → iac_code-0.2.1}/README.md +7 -1
  3. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/__init__.py +1 -1
  4. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/commands/auth.py +62 -23
  5. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/commands/model.py +2 -2
  6. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/config.py +39 -2
  7. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/i18n/locales/de/LC_MESSAGES/messages.mo +0 -0
  8. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/i18n/locales/de/LC_MESSAGES/messages.po +78 -71
  9. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/i18n/locales/es/LC_MESSAGES/messages.mo +0 -0
  10. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/i18n/locales/es/LC_MESSAGES/messages.po +78 -71
  11. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/i18n/locales/fr/LC_MESSAGES/messages.mo +0 -0
  12. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/i18n/locales/fr/LC_MESSAGES/messages.po +78 -71
  13. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/i18n/locales/ja/LC_MESSAGES/messages.mo +0 -0
  14. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/i18n/locales/ja/LC_MESSAGES/messages.po +78 -71
  15. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/i18n/locales/pt/LC_MESSAGES/messages.mo +0 -0
  16. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/i18n/locales/pt/LC_MESSAGES/messages.po +78 -71
  17. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/i18n/locales/zh/LC_MESSAGES/messages.mo +0 -0
  18. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/i18n/locales/zh/LC_MESSAGES/messages.po +78 -71
  19. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/banner.py +5 -2
  20. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code.egg-info/PKG-INFO +7 -1
  21. {iac_code-0.2.0 → iac_code-0.2.1}/LICENSE +0 -0
  22. {iac_code-0.2.0 → iac_code-0.2.1}/MANIFEST.in +0 -0
  23. {iac_code-0.2.0 → iac_code-0.2.1}/pyproject.toml +0 -0
  24. {iac_code-0.2.0 → iac_code-0.2.1}/setup.cfg +0 -0
  25. {iac_code-0.2.0 → iac_code-0.2.1}/setup.py +0 -0
  26. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/a2a/__init__.py +0 -0
  27. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/a2a/agent_card.py +0 -0
  28. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/a2a/app.py +0 -0
  29. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/a2a/artifacts.py +0 -0
  30. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/a2a/client.py +0 -0
  31. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/a2a/events.py +0 -0
  32. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/a2a/executor.py +0 -0
  33. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/a2a/metrics.py +0 -0
  34. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/a2a/parts.py +0 -0
  35. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/a2a/persistence.py +0 -0
  36. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/a2a/push.py +0 -0
  37. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/a2a/push_queue.py +0 -0
  38. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/a2a/push_secrets.py +0 -0
  39. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/a2a/push_worker.py +0 -0
  40. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/a2a/router.py +0 -0
  41. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/a2a/signing.py +0 -0
  42. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/a2a/task_store.py +0 -0
  43. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/a2a/transport.py +0 -0
  44. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/a2a/transports/__init__.py +0 -0
  45. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/a2a/transports/base.py +0 -0
  46. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/a2a/transports/dispatcher.py +0 -0
  47. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/a2a/transports/grpc.py +0 -0
  48. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/a2a/transports/grpc_jsonrpc.py +0 -0
  49. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/a2a/transports/http.py +0 -0
  50. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/a2a/transports/redis_streams.py +0 -0
  51. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/a2a/transports/stdio.py +0 -0
  52. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/a2a/transports/unix.py +0 -0
  53. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/a2a/transports/websocket.py +0 -0
  54. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/a2a/types.py +0 -0
  55. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/acp/__init__.py +0 -0
  56. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/acp/convert.py +0 -0
  57. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/acp/http_sse.py +0 -0
  58. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/acp/mcp.py +0 -0
  59. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/acp/metrics.py +0 -0
  60. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/acp/server.py +0 -0
  61. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/acp/session.py +0 -0
  62. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/acp/slash_registry.py +0 -0
  63. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/acp/state.py +0 -0
  64. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/acp/tools.py +0 -0
  65. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/acp/types.py +0 -0
  66. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/acp/version.py +0 -0
  67. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/agent/__init__.py +0 -0
  68. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/agent/agent_loop.py +0 -0
  69. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/agent/agent_tool.py +0 -0
  70. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/agent/agent_types.py +0 -0
  71. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/agent/message.py +0 -0
  72. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/agent/system_prompt.py +0 -0
  73. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/cli/__init__.py +0 -0
  74. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/cli/headless.py +0 -0
  75. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/cli/main.py +0 -0
  76. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/cli/output_formats.py +0 -0
  77. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/commands/__init__.py +0 -0
  78. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/commands/clear.py +0 -0
  79. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/commands/compact.py +0 -0
  80. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/commands/debug.py +0 -0
  81. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/commands/effort.py +0 -0
  82. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/commands/exit.py +0 -0
  83. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/commands/help.py +0 -0
  84. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/commands/registry.py +0 -0
  85. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/commands/resume.py +0 -0
  86. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/commands/tasks.py +0 -0
  87. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/i18n/__init__.py +0 -0
  88. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/memory/__init__.py +0 -0
  89. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/memory/memory_manager.py +0 -0
  90. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/memory/memory_tools.py +0 -0
  91. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/providers/__init__.py +0 -0
  92. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/providers/anthropic_provider.py +0 -0
  93. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/providers/azure_openai_provider.py +0 -0
  94. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/providers/base.py +0 -0
  95. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/providers/dashscope_provider.py +0 -0
  96. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/providers/deepseek_provider.py +0 -0
  97. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/providers/gemini_provider.py +0 -0
  98. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/providers/kimi_provider.py +0 -0
  99. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/providers/lmstudio_provider.py +0 -0
  100. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/providers/manager.py +0 -0
  101. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/providers/minimax_provider.py +0 -0
  102. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/providers/modelscope_provider.py +0 -0
  103. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/providers/ollama_provider.py +0 -0
  104. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/providers/openai_provider.py +0 -0
  105. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/providers/openrouter_provider.py +0 -0
  106. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/providers/registry.py +0 -0
  107. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/providers/retry.py +0 -0
  108. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/providers/siliconflow_provider.py +0 -0
  109. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/providers/stream_watchdog.py +0 -0
  110. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/providers/thinking.py +0 -0
  111. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/providers/volcengine_provider.py +0 -0
  112. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/providers/zhipu_provider.py +0 -0
  113. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/services/__init__.py +0 -0
  114. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/services/agent_factory.py +0 -0
  115. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/services/capabilities/__init__.py +0 -0
  116. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/services/capabilities/auto_detect.py +0 -0
  117. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/services/capabilities/multimodal.py +0 -0
  118. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/services/cloud_credentials.py +0 -0
  119. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/services/context_manager.py +0 -0
  120. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/services/permissions/__init__.py +0 -0
  121. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/services/permissions/loader.py +0 -0
  122. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/services/permissions/pipeline.py +0 -0
  123. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/services/permissions/storage.py +0 -0
  124. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/services/providers/__init__.py +0 -0
  125. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/services/providers/aliyun.py +0 -0
  126. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/services/qwenpaw_source.py +0 -0
  127. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/services/session_index.py +0 -0
  128. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/services/session_storage.py +0 -0
  129. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/services/telemetry/__init__.py +0 -0
  130. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/services/telemetry/attributes.py +0 -0
  131. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/services/telemetry/client.py +0 -0
  132. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/services/telemetry/config.py +0 -0
  133. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/services/telemetry/constants.py +0 -0
  134. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/services/telemetry/content_serializer.py +0 -0
  135. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/services/telemetry/events.py +0 -0
  136. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/services/telemetry/fallback.py +0 -0
  137. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/services/telemetry/identity.py +0 -0
  138. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/services/telemetry/metrics.py +0 -0
  139. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/services/telemetry/names.py +0 -0
  140. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/services/telemetry/sanitize.py +0 -0
  141. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/services/telemetry/sink.py +0 -0
  142. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/services/telemetry/tracing.py +0 -0
  143. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/services/telemetry/types.py +0 -0
  144. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/services/token_budget.py +0 -0
  145. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/services/token_counter.py +0 -0
  146. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/skills/__init__.py +0 -0
  147. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/skills/bundled/__init__.py +0 -0
  148. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/skills/bundled/iac_aliyun/SKILL.md +0 -0
  149. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/skills/bundled/iac_aliyun/__init__.py +0 -0
  150. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/ecs.md +0 -0
  151. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/oss.md +0 -0
  152. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/rds.md +0 -0
  153. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/redis.md +0 -0
  154. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/slb.md +0 -0
  155. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/vpc.md +0 -0
  156. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/skills/bundled/iac_aliyun/references/ros-template.md +0 -0
  157. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/skills/bundled/iac_aliyun/references/template-parameters.md +0 -0
  158. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/skills/bundled/iac_aliyun/references/terraform-template.md +0 -0
  159. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/skills/bundled/iac_aliyun/scripts/tf2ros.py +0 -0
  160. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/skills/bundled/simplify.py +0 -0
  161. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/skills/discovery.py +0 -0
  162. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/skills/frontmatter.py +0 -0
  163. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/skills/listing.py +0 -0
  164. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/skills/loader.py +0 -0
  165. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/skills/processor.py +0 -0
  166. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/skills/renderer.py +0 -0
  167. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/skills/skill_definition.py +0 -0
  168. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/skills/skill_tool.py +0 -0
  169. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/state/__init__.py +0 -0
  170. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/state/app_state.py +0 -0
  171. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tasks/__init__.py +0 -0
  172. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tasks/notification_queue.py +0 -0
  173. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tasks/task_state.py +0 -0
  174. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tasks/task_tools.py +0 -0
  175. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tools/__init__.py +0 -0
  176. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tools/base.py +0 -0
  177. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tools/bash/__init__.py +0 -0
  178. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tools/bash/bash_tool.py +0 -0
  179. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tools/bash/command_parser.py +0 -0
  180. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tools/bash/mode_validation.py +0 -0
  181. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tools/bash/path_validation.py +0 -0
  182. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tools/bash/permissions.py +0 -0
  183. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tools/bash/readonly_commands.py +0 -0
  184. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tools/bash/rule_matching.py +0 -0
  185. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tools/bash/safety_checks.py +0 -0
  186. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tools/cloud/__init__.py +0 -0
  187. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tools/cloud/aliyun/__init__.py +0 -0
  188. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tools/cloud/aliyun/aliyun_api.py +0 -0
  189. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tools/cloud/aliyun/aliyun_doc_search.py +0 -0
  190. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tools/cloud/aliyun/endpoints.yml +0 -0
  191. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tools/cloud/aliyun/ros_client.py +0 -0
  192. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tools/cloud/aliyun/ros_stack.py +0 -0
  193. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tools/cloud/aliyun/ros_stack_instances.py +0 -0
  194. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tools/cloud/base_api.py +0 -0
  195. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tools/cloud/base_stack.py +0 -0
  196. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tools/cloud/registry.py +0 -0
  197. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tools/cloud/types.py +0 -0
  198. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tools/edit_file.py +0 -0
  199. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tools/glob.py +0 -0
  200. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tools/grep.py +0 -0
  201. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tools/list_files.py +0 -0
  202. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tools/read_file.py +0 -0
  203. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tools/result_storage.py +0 -0
  204. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tools/tool_executor.py +0 -0
  205. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tools/web_fetch.py +0 -0
  206. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/tools/write_file.py +0 -0
  207. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/types/__init__.py +0 -0
  208. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/types/permissions.py +0 -0
  209. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/types/skill_source.py +0 -0
  210. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/types/stream_events.py +0 -0
  211. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/__init__.py +0 -0
  212. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/components/__init__.py +0 -0
  213. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/components/dialog.py +0 -0
  214. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/components/divider.py +0 -0
  215. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/components/fuzzy_picker.py +0 -0
  216. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/components/progress_bar.py +0 -0
  217. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/components/search_box.py +0 -0
  218. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/components/select.py +0 -0
  219. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/components/status_icon.py +0 -0
  220. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/components/tabs.py +0 -0
  221. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/core/__init__.py +0 -0
  222. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/core/in_place_render.py +0 -0
  223. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/core/input_history.py +0 -0
  224. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/core/key_event.py +0 -0
  225. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/core/prompt_input.py +0 -0
  226. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/core/raw_input.py +0 -0
  227. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/core/screen.py +0 -0
  228. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/dialogs/__init__.py +0 -0
  229. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/dialogs/global_search.py +0 -0
  230. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/dialogs/history_search.py +0 -0
  231. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/dialogs/model_picker.py +0 -0
  232. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/dialogs/quick_open.py +0 -0
  233. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/dialogs/resume_picker.py +0 -0
  234. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/keybindings/__init__.py +0 -0
  235. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/keybindings/manager.py +0 -0
  236. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/renderer.py +0 -0
  237. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/repl.py +0 -0
  238. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/spinner.py +0 -0
  239. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/suggestions/__init__.py +0 -0
  240. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/suggestions/aggregator.py +0 -0
  241. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/suggestions/command_provider.py +0 -0
  242. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/suggestions/directory_provider.py +0 -0
  243. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/suggestions/file_provider.py +0 -0
  244. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/suggestions/shell_history_provider.py +0 -0
  245. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/suggestions/token_extractor.py +0 -0
  246. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/suggestions/types.py +0 -0
  247. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/ui/transcript_view.py +0 -0
  248. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/utils/__init__.py +0 -0
  249. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/utils/background_housekeeping.py +0 -0
  250. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/utils/cleanup.py +0 -0
  251. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/utils/image/__init__.py +0 -0
  252. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/utils/image/clipboard.py +0 -0
  253. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/utils/image/format_detect.py +0 -0
  254. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/utils/image/pasted_content.py +0 -0
  255. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/utils/image/processor.py +0 -0
  256. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/utils/image/resizer.py +0 -0
  257. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/utils/image/store.py +0 -0
  258. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/utils/json_utils.py +0 -0
  259. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/utils/log.py +0 -0
  260. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/utils/project_paths.py +0 -0
  261. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code/utils/tool_input_parser.py +0 -0
  262. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code.egg-info/SOURCES.txt +0 -0
  263. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code.egg-info/dependency_links.txt +0 -0
  264. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code.egg-info/entry_points.txt +0 -0
  265. {iac_code-0.2.0 → iac_code-0.2.1}/src/iac_code.egg-info/requires.txt +0 -0
  266. {iac_code-0.2.0 → iac_code-0.2.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.2.0
3
+ Version: 0.2.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
@@ -65,3 +65,9 @@ Reading from stdin is also supported:
65
65
  ```bash
66
66
  echo "Create an OSS Bucket" | iac-code --prompt -
67
67
  ```
68
+
69
+ ## Contact Us
70
+
71
+ | [DingTalk](https://qr.dingtalk.com/action/joingroup?code=v1,k1,ubm/77U7qRh/STFZUNBP26X4PNg2z6+uhiPcLGtDNfU=&_dt_no_comment=1&origin=11) | [Discord](https://discord.gg/qECFuFBwF) |
72
+ | :----------------------------------------------------------: | :----------------------------------------------------------: |
73
+ | [<img src="website/static/img/qrcode-dingtalk.jpg" width="120" height="120" alt="DingTalk">](https://qr.dingtalk.com/action/joingroup?code=v1,k1,ubm/77U7qRh/STFZUNBP26X4PNg2z6+uhiPcLGtDNfU=&_dt_no_comment=1&origin=11) | [<img src="website/static/img/qrcode-discord.jpg" width="120" height="120" alt="Discord">](https://discord.gg/qECFuFBwF) |
@@ -45,4 +45,10 @@ Reading from stdin is also supported:
45
45
 
46
46
  ```bash
47
47
  echo "Create an OSS Bucket" | iac-code --prompt -
48
- ```
48
+ ```
49
+
50
+ ## Contact Us
51
+
52
+ | [DingTalk](https://qr.dingtalk.com/action/joingroup?code=v1,k1,ubm/77U7qRh/STFZUNBP26X4PNg2z6+uhiPcLGtDNfU=&_dt_no_comment=1&origin=11) | [Discord](https://discord.gg/qECFuFBwF) |
53
+ | :----------------------------------------------------------: | :----------------------------------------------------------: |
54
+ | [<img src="website/static/img/qrcode-dingtalk.jpg" width="120" height="120" alt="DingTalk">](https://qr.dingtalk.com/action/joingroup?code=v1,k1,ubm/77U7qRh/STFZUNBP26X4PNg2z6+uhiPcLGtDNfU=&_dt_no_comment=1&origin=11) | [<img src="website/static/img/qrcode-discord.jpg" width="120" height="120" alt="Discord">](https://discord.gg/qECFuFBwF) |
@@ -1,2 +1,2 @@
1
- __version__ = "0.2.0"
1
+ __version__ = "0.2.1"
2
2
  __release_date__ = "2026-05-20"
@@ -14,10 +14,14 @@ if TYPE_CHECKING:
14
14
 
15
15
  from iac_code.config import (
16
16
  _LEGACY_KEY_NAME_ALIASES,
17
+ PARTNER_SOURCES,
18
+ PartnerSource,
17
19
  _load_yaml,
18
20
  _save_yaml,
19
21
  get_active_provider_key,
22
+ get_available_partner_sources,
20
23
  get_credentials_path,
24
+ get_llm_source,
21
25
  get_provider_config,
22
26
  get_settings_path,
23
27
  )
@@ -595,6 +599,47 @@ def _get_active_key_name() -> str:
595
599
  return get_active_provider_key() or ""
596
600
 
597
601
 
602
+ def _third_party_auth_flow(
603
+ available_partners: list[PartnerSource],
604
+ current_llm_source: str,
605
+ ) -> str | None | _BackSentinel:
606
+ """Second-level selection within the Third-party category."""
607
+ candidates = list(available_partners)
608
+ if any(ps.key == current_llm_source for ps in PARTNER_SOURCES):
609
+ if not any(ps.key == current_llm_source for ps in candidates):
610
+ for ps in PARTNER_SOURCES:
611
+ if ps.key == current_llm_source:
612
+ candidates.append(ps)
613
+ break
614
+
615
+ if len(candidates) == 0:
616
+ return _BACK
617
+
618
+ options: list[str] = []
619
+ default_idx = 0
620
+ for i, ps in enumerate(candidates):
621
+ label = ps.display_name
622
+ if current_llm_source == ps.key:
623
+ label += _(" (current)")
624
+ default_idx = i
625
+ options.append(label)
626
+
627
+ idx = _select(_("Select provider — {group}").format(group=_("Third-party")), options, default_index=default_idx)
628
+ if idx is None:
629
+ return _BACK
630
+ partner = candidates[idx]
631
+
632
+ settings_path = get_settings_path()
633
+ config = _load_yaml(settings_path)
634
+ config.pop("activeProvider", None)
635
+ config["llm_source"] = partner.key
636
+ _save_yaml(settings_path, config)
637
+ return _("{status}: {provider}").format(
638
+ status=_("Configured"),
639
+ provider=partner.display_name,
640
+ )
641
+
642
+
598
643
  def _llm_auth_flow(console, store) -> str | None | _BackSentinel:
599
644
  """LLM provider auth flow with two-step vendor group selection."""
600
645
  active_key_name = _get_active_key_name()
@@ -621,49 +666,42 @@ def _llm_auth_flow(console, store) -> str | None | _BackSentinel:
621
666
 
622
667
  provider_map: dict[str, LLMProvider] = {str(p["key_name"]): p for p in PROVIDERS}
623
668
 
624
- from iac_code.config import PARTNER_SOURCES, get_llm_source
625
-
626
- num_partner_sources = len(PARTNER_SOURCES)
627
-
628
669
  current_llm_source = get_llm_source()
670
+ available_partners = get_available_partner_sources()
671
+ is_current_partner = any(ps.key == current_llm_source for ps in PARTNER_SOURCES)
672
+ show_third_party = len(available_partners) > 0 or is_current_partner
629
673
 
630
674
  while True:
631
- # Step 1: Select vendor group (partner sources shown at the top)
632
675
  group_options: list[str] = []
633
676
  group_default_idx = 0
634
677
 
635
- for i, ps in enumerate(PARTNER_SOURCES):
636
- label = ps["display_name"]
637
- if current_llm_source == ps["key"]:
678
+ if show_third_party:
679
+ label = _("Third-party")
680
+ if is_current_partner:
638
681
  label += _(" (current)")
639
- group_default_idx = i
682
+ group_default_idx = 0
640
683
  group_options.append(label)
641
684
 
642
685
  for i, (group_name, keys) in enumerate(provider_groups):
643
686
  label = _(group_name)
687
+ offset = 1 if show_third_party else 0
644
688
  if active_key_name in keys:
645
689
  label += _(" (current)")
646
- group_default_idx = i + num_partner_sources
690
+ group_default_idx = i + offset
647
691
  group_options.append(label)
648
692
 
649
693
  group_idx = _select(_("Select provider"), group_options, default_index=group_default_idx)
650
694
  if group_idx is None:
651
695
  return _BACK
652
696
 
653
- # Handle partner source selection
654
- if group_idx < num_partner_sources:
655
- partner = PARTNER_SOURCES[group_idx]
656
- settings_path = get_settings_path()
657
- config = _load_yaml(settings_path)
658
- config.pop("activeProvider", None)
659
- config["llm_source"] = partner["key"]
660
- _save_yaml(settings_path, config)
661
- return _("{status}: {provider}").format(
662
- status=_("Configured"),
663
- provider=partner["display_name"],
664
- )
697
+ if show_third_party and group_idx == 0:
698
+ result = _third_party_auth_flow(available_partners, current_llm_source)
699
+ if isinstance(result, _BackSentinel):
700
+ continue
701
+ return result
665
702
 
666
- group_name, group_keys = provider_groups[group_idx - num_partner_sources]
703
+ offset = 1 if show_third_party else 0
704
+ group_name, group_keys = provider_groups[group_idx - offset]
667
705
  group_providers = [provider_map[k] for k in group_keys if k in provider_map]
668
706
 
669
707
  # Step 2: Select provider within group (skip if only one)
@@ -755,6 +793,7 @@ def _llm_auth_flow(console, store) -> str | None | _BackSentinel:
755
793
 
756
794
 
757
795
  _GROUP_NAME_MARKERS = [
796
+ _("Third-party"),
758
797
  _("Alibaba Cloud"),
759
798
  _("ZhiPu AI"),
760
799
  _("Kimi"),
@@ -50,8 +50,8 @@ async def model_command(context: "CommandContext | None" = None, args: list[str]
50
50
 
51
51
  display_name = llm_source
52
52
  for ps in PARTNER_SOURCES:
53
- if ps["key"] == llm_source:
54
- display_name = ps["display_name"]
53
+ if ps.key == llm_source:
54
+ display_name = ps.display_name
55
55
  break
56
56
  return _(
57
57
  "Model is managed by '{source}'. To change model, modify it in {source} or switch provider via /auth."
@@ -9,6 +9,7 @@ expansion supported); when set, every persisted artifact follows.
9
9
  from __future__ import annotations
10
10
 
11
11
  import os
12
+ from dataclasses import dataclass
12
13
  from pathlib import Path
13
14
  from typing import Any
14
15
 
@@ -179,11 +180,47 @@ def get_llm_source() -> str:
179
180
  return "local"
180
181
 
181
182
 
182
- PARTNER_SOURCES: list[dict[str, str]] = [
183
- {"key": "qwenpaw", "display_name": "QwenPaw"},
183
+ @dataclass(frozen=True)
184
+ class PartnerSource:
185
+ key: str
186
+ display_name: str
187
+
188
+ def is_available(self) -> bool:
189
+ if self.key == "qwenpaw":
190
+ from iac_code.services.qwenpaw_source import _resolve_secret_dir
191
+
192
+ return _resolve_secret_dir() is not None
193
+ return False
194
+
195
+ def get_provider_display(self) -> str:
196
+ if self.key == "qwenpaw":
197
+ from iac_code.services.qwenpaw_source import load_from_qwenpaw
198
+
199
+ try:
200
+ config = load_from_qwenpaw()
201
+ except Exception:
202
+ return ""
203
+ if config:
204
+ from iac_code.providers.registry import PROVIDER_REGISTRY
205
+
206
+ desc = PROVIDER_REGISTRY.get(config.provider_key)
207
+ if desc:
208
+ from iac_code.i18n import _
209
+
210
+ return _(desc.display_name)
211
+ return config.provider_key
212
+ return ""
213
+
214
+
215
+ PARTNER_SOURCES: list[PartnerSource] = [
216
+ PartnerSource(key="qwenpaw", display_name="QwenPaw"),
184
217
  ]
185
218
 
186
219
 
220
+ def get_available_partner_sources() -> list[PartnerSource]:
221
+ return [ps for ps in PARTNER_SOURCES if ps.is_available()]
222
+
223
+
187
224
  # ---------------------------------------------------------------------------
188
225
  # Path helpers
189
226
  # ---------------------------------------------------------------------------
@@ -6,7 +6,7 @@ msgid ""
6
6
  msgstr ""
7
7
  "Project-Id-Version: iac-code 0.2.0\n"
8
8
  "Report-Msgid-Bugs-To: \n"
9
- "POT-Creation-Date: 2026-05-20 12:34+0800\n"
9
+ "POT-Creation-Date: 2026-05-20 15:23+0800\n"
10
10
  "PO-Revision-Date: 2026-05-13 00:00+0000\n"
11
11
  "Last-Translator: \n"
12
12
  "Language: de\n"
@@ -543,217 +543,224 @@ msgstr "Eine frühere Sitzung fortsetzen"
543
543
  msgid "[conversation id or search term]"
544
544
  msgstr "[Konversations-ID oder Suchbegriff]"
545
545
 
546
- #: src/iac_code/commands/auth.py:245 src/iac_code/commands/auth.py:844
546
+ #: src/iac_code/commands/auth.py:249 src/iac_code/commands/auth.py:883
547
547
  #: src/iac_code/ui/core/prompt_input.py:505
548
548
  msgid "Navigate"
549
549
  msgstr "Navigieren"
550
550
 
551
- #: src/iac_code/commands/auth.py:245 src/iac_code/commands/auth.py:367
552
- #: src/iac_code/commands/auth.py:401 src/iac_code/commands/auth.py:408
553
- #: src/iac_code/commands/auth.py:432 src/iac_code/commands/auth.py:844
554
- #: src/iac_code/commands/auth.py:1034 src/iac_code/ui/core/prompt_input.py:505
551
+ #: src/iac_code/commands/auth.py:249 src/iac_code/commands/auth.py:371
552
+ #: src/iac_code/commands/auth.py:405 src/iac_code/commands/auth.py:412
553
+ #: src/iac_code/commands/auth.py:436 src/iac_code/commands/auth.py:883
554
+ #: src/iac_code/commands/auth.py:1073 src/iac_code/ui/core/prompt_input.py:505
555
555
  msgid "Confirm"
556
556
  msgstr "Bestätigen"
557
557
 
558
- #: src/iac_code/commands/auth.py:245 src/iac_code/commands/auth.py:365
559
- #: src/iac_code/commands/auth.py:367 src/iac_code/commands/auth.py:401
560
- #: src/iac_code/commands/auth.py:408 src/iac_code/commands/auth.py:432
561
- #: src/iac_code/commands/auth.py:844 src/iac_code/commands/auth.py:929
562
- #: src/iac_code/commands/auth.py:1034
558
+ #: src/iac_code/commands/auth.py:249 src/iac_code/commands/auth.py:369
559
+ #: src/iac_code/commands/auth.py:371 src/iac_code/commands/auth.py:405
560
+ #: src/iac_code/commands/auth.py:412 src/iac_code/commands/auth.py:436
561
+ #: src/iac_code/commands/auth.py:883 src/iac_code/commands/auth.py:968
562
+ #: src/iac_code/commands/auth.py:1073
563
563
  msgid "Back"
564
564
  msgstr "Zurück"
565
565
 
566
- #: src/iac_code/commands/auth.py:365
566
+ #: src/iac_code/commands/auth.py:369
567
567
  msgid "Keep"
568
568
  msgstr "Behalten"
569
569
 
570
- #: src/iac_code/commands/auth.py:365
570
+ #: src/iac_code/commands/auth.py:369
571
571
  msgid "Re-enter"
572
572
  msgstr "Erneut eingeben"
573
573
 
574
- #: src/iac_code/commands/auth.py:507 src/iac_code/commands/auth.py:638
575
- #: src/iac_code/commands/auth.py:645 src/iac_code/commands/auth.py:678
574
+ #: src/iac_code/commands/auth.py:511 src/iac_code/commands/auth.py:623
575
+ #: src/iac_code/commands/auth.py:681 src/iac_code/commands/auth.py:689
576
+ #: src/iac_code/commands/auth.py:716
576
577
  msgid " (current)"
577
578
  msgstr " (aktuell)"
578
579
 
579
- #: src/iac_code/commands/auth.py:510
580
+ #: src/iac_code/commands/auth.py:514
580
581
  msgid "Custom model..."
581
582
  msgstr "Benutzerdefiniertes Modell …"
582
583
 
583
- #: src/iac_code/commands/auth.py:513
584
+ #: src/iac_code/commands/auth.py:517
584
585
  #, python-brace-format
585
586
  msgid "Select model for {provider}"
586
587
  msgstr "Modell für {provider} auswählen"
587
588
 
588
- #: src/iac_code/commands/auth.py:515
589
+ #: src/iac_code/commands/auth.py:519
589
590
  msgid "Select model"
590
591
  msgstr "Modell auswählen"
591
592
 
592
- #: src/iac_code/commands/auth.py:523
593
+ #: src/iac_code/commands/auth.py:527
593
594
  msgid "Enter custom model name: "
594
595
  msgstr "Benutzerdefinierten Modellnamen eingeben: "
595
596
 
596
- #: src/iac_code/commands/auth.py:549
597
+ #: src/iac_code/commands/auth.py:553
597
598
  msgid "Error: console not available"
598
599
  msgstr "Fehler: Konsole nicht verfügbar"
599
600
 
600
- #: src/iac_code/commands/auth.py:576
601
+ #: src/iac_code/commands/auth.py:580
601
602
  msgid "Configure LLM Provider"
602
603
  msgstr "LLM-Anbieter konfigurieren"
603
604
 
604
- #: src/iac_code/commands/auth.py:577
605
+ #: src/iac_code/commands/auth.py:581
605
606
  msgid "Configure IaC Cloud Service"
606
607
  msgstr "IaC-Cloud-Dienst konfigurieren"
607
608
 
608
- #: src/iac_code/commands/auth.py:579
609
+ #: src/iac_code/commands/auth.py:583
609
610
  msgid "Select configuration type"
610
611
  msgstr "Konfigurationstyp auswählen"
611
612
 
612
- #: src/iac_code/commands/auth.py:581 src/iac_code/commands/auth.py:703
613
- #: src/iac_code/commands/auth.py:719 src/iac_code/commands/auth.py:797
614
- #: src/iac_code/commands/auth.py:970 src/iac_code/commands/auth.py:1011
613
+ #: src/iac_code/commands/auth.py:585 src/iac_code/commands/auth.py:741
614
+ #: src/iac_code/commands/auth.py:757 src/iac_code/commands/auth.py:836
615
+ #: src/iac_code/commands/auth.py:1009 src/iac_code/commands/auth.py:1050
615
616
  msgid "Auth cancelled"
616
617
  msgstr "Authentifizierung abgebrochen"
617
618
 
618
- #: src/iac_code/commands/auth.py:649
619
- msgid "Select provider"
620
- msgstr "Anbieter auswählen"
619
+ #: src/iac_code/commands/auth.py:627 src/iac_code/commands/auth.py:721
620
+ #: src/iac_code/commands/auth.py:811
621
+ #, python-brace-format
622
+ msgid "Select provider — {group}"
623
+ msgstr "Anbieter auswählen — {group}"
621
624
 
622
- #: src/iac_code/commands/auth.py:661
625
+ #: src/iac_code/commands/auth.py:627 src/iac_code/commands/auth.py:679
626
+ #: src/iac_code/commands/auth.py:796
627
+ msgid "Third-party"
628
+ msgstr "Drittanbieter"
629
+
630
+ #: src/iac_code/commands/auth.py:637
623
631
  #, python-brace-format
624
632
  msgid "{status}: {provider}"
625
633
  msgstr "{status}: {provider}"
626
634
 
627
- #: src/iac_code/commands/auth.py:662 src/iac_code/commands/auth.py:751
635
+ #: src/iac_code/commands/auth.py:638 src/iac_code/commands/auth.py:789
628
636
  msgid "Configured"
629
637
  msgstr "Konfiguriert"
630
638
 
631
- #: src/iac_code/commands/auth.py:683 src/iac_code/commands/auth.py:772
632
- #, python-brace-format
633
- msgid "Select provider — {group}"
634
- msgstr "Anbieter auswählen — {group}"
639
+ #: src/iac_code/commands/auth.py:693
640
+ msgid "Select provider"
641
+ msgstr "Anbieter auswählen"
635
642
 
636
- #: src/iac_code/commands/auth.py:696
643
+ #: src/iac_code/commands/auth.py:734
637
644
  #, python-brace-format
638
645
  msgid "Configure {provider}"
639
646
  msgstr "{provider} konfigurieren"
640
647
 
641
- #: src/iac_code/commands/auth.py:712
648
+ #: src/iac_code/commands/auth.py:750
642
649
  #, python-brace-format
643
650
  msgid "Enter API key for {provider}"
644
651
  msgstr "API-Key für {provider} eingeben"
645
652
 
646
- #: src/iac_code/commands/auth.py:750
653
+ #: src/iac_code/commands/auth.py:788
647
654
  #, python-brace-format
648
655
  msgid "{status}: {provider} / {model}"
649
656
  msgstr "{status}: {provider} / {model}"
650
657
 
651
- #: src/iac_code/commands/auth.py:758 src/iac_code/commands/auth.py:779
658
+ #: src/iac_code/commands/auth.py:797 src/iac_code/commands/auth.py:818
652
659
  msgid "Alibaba Cloud"
653
660
  msgstr "Alibaba Cloud"
654
661
 
655
- #: src/iac_code/commands/auth.py:759 src/iac_code/providers/registry.py:423
662
+ #: src/iac_code/commands/auth.py:798 src/iac_code/providers/registry.py:423
656
663
  msgid "ZhiPu AI"
657
664
  msgstr "ZhiPu AI"
658
665
 
659
- #: src/iac_code/commands/auth.py:760
666
+ #: src/iac_code/commands/auth.py:799
660
667
  msgid "Kimi"
661
668
  msgstr "Kimi"
662
669
 
663
- #: src/iac_code/commands/auth.py:761
670
+ #: src/iac_code/commands/auth.py:800
664
671
  msgid "MiniMax"
665
672
  msgstr "MiniMax"
666
673
 
667
- #: src/iac_code/commands/auth.py:762 src/iac_code/providers/registry.py:425
674
+ #: src/iac_code/commands/auth.py:801 src/iac_code/providers/registry.py:425
668
675
  msgid "Volcengine"
669
676
  msgstr "Volcengine"
670
677
 
671
- #: src/iac_code/commands/auth.py:763
678
+ #: src/iac_code/commands/auth.py:802
672
679
  msgid "SiliconFlow"
673
680
  msgstr "SiliconFlow"
674
681
 
675
- #: src/iac_code/commands/auth.py:764 src/iac_code/providers/registry.py:416
682
+ #: src/iac_code/commands/auth.py:803 src/iac_code/providers/registry.py:416
676
683
  msgid "DeepSeek"
677
684
  msgstr "DeepSeek"
678
685
 
679
- #: src/iac_code/commands/auth.py:765 src/iac_code/providers/registry.py:414
686
+ #: src/iac_code/commands/auth.py:804 src/iac_code/providers/registry.py:414
680
687
  msgid "OpenAI"
681
688
  msgstr "OpenAI"
682
689
 
683
- #: src/iac_code/commands/auth.py:766 src/iac_code/providers/registry.py:415
690
+ #: src/iac_code/commands/auth.py:805 src/iac_code/providers/registry.py:415
684
691
  msgid "Anthropic"
685
692
  msgstr "Anthropic"
686
693
 
687
- #: src/iac_code/commands/auth.py:767 src/iac_code/providers/registry.py:418
694
+ #: src/iac_code/commands/auth.py:806 src/iac_code/providers/registry.py:418
688
695
  msgid "Google Gemini"
689
696
  msgstr "Google Gemini"
690
697
 
691
- #: src/iac_code/commands/auth.py:768 src/iac_code/providers/registry.py:431
698
+ #: src/iac_code/commands/auth.py:807 src/iac_code/providers/registry.py:431
692
699
  msgid "Azure OpenAI"
693
700
  msgstr "Azure OpenAI"
694
701
 
695
- #: src/iac_code/commands/auth.py:769 src/iac_code/providers/registry.py:430
702
+ #: src/iac_code/commands/auth.py:808 src/iac_code/providers/registry.py:430
696
703
  msgid "OpenRouter"
697
704
  msgstr "OpenRouter"
698
705
 
699
- #: src/iac_code/commands/auth.py:770
706
+ #: src/iac_code/commands/auth.py:809
700
707
  msgid "Local"
701
708
  msgstr "Lokal"
702
709
 
703
- #: src/iac_code/commands/auth.py:771
710
+ #: src/iac_code/commands/auth.py:810
704
711
  msgid "Compatible"
705
712
  msgstr "Kompatibel"
706
713
 
707
- #: src/iac_code/commands/auth.py:788
714
+ #: src/iac_code/commands/auth.py:827
708
715
  msgid "Select Cloud Provider"
709
716
  msgstr "Cloud-Anbieter auswählen"
710
717
 
711
- #: src/iac_code/commands/auth.py:804
718
+ #: src/iac_code/commands/auth.py:843
712
719
  msgid "Credential"
713
720
  msgstr "Anmeldedaten"
714
721
 
715
- #: src/iac_code/commands/auth.py:805 src/iac_code/commands/auth.py:902
716
- #: src/iac_code/commands/auth.py:1007 src/iac_code/ui/renderer.py:418
722
+ #: src/iac_code/commands/auth.py:844 src/iac_code/commands/auth.py:941
723
+ #: src/iac_code/commands/auth.py:1046 src/iac_code/ui/renderer.py:418
717
724
  msgid "Region"
718
725
  msgstr "Region"
719
726
 
720
- #: src/iac_code/commands/auth.py:807
727
+ #: src/iac_code/commands/auth.py:846
721
728
  msgid "Configure Alibaba Cloud"
722
729
  msgstr "Alibaba Cloud konfigurieren"
723
730
 
724
- #: src/iac_code/commands/auth.py:890
731
+ #: src/iac_code/commands/auth.py:929
725
732
  msgid "Current configuration"
726
733
  msgstr "Aktuelle Konfiguration"
727
734
 
728
- #: src/iac_code/commands/auth.py:892
735
+ #: src/iac_code/commands/auth.py:931
729
736
  msgid "Mode"
730
737
  msgstr "Modus"
731
738
 
732
- #: src/iac_code/commands/auth.py:899
739
+ #: src/iac_code/commands/auth.py:938
733
740
  msgid "(not set)"
734
741
  msgstr "(nicht gesetzt)"
735
742
 
736
- #: src/iac_code/commands/auth.py:916
743
+ #: src/iac_code/commands/auth.py:955
737
744
  msgid "Configure Alibaba Cloud credentials"
738
745
  msgstr "Alibaba Cloud-Anmeldedaten konfigurieren"
739
746
 
740
- #: src/iac_code/commands/auth.py:929
747
+ #: src/iac_code/commands/auth.py:968
741
748
  msgid "Reconfigure credential"
742
749
  msgstr "Anmeldedaten neu konfigurieren"
743
750
 
744
- #: src/iac_code/commands/auth.py:942
751
+ #: src/iac_code/commands/auth.py:981
745
752
  msgid "Select credential type"
746
753
  msgstr "Anmeldedatentyp auswählen"
747
754
 
748
- #: src/iac_code/commands/auth.py:992
755
+ #: src/iac_code/commands/auth.py:1031
749
756
  msgid "Configured: Alibaba Cloud credentials saved to ~/.iac-code"
750
757
  msgstr "Konfiguriert: Alibaba Cloud-Anmeldedaten unter ~/.iac-code gespeichert"
751
758
 
752
- #: src/iac_code/commands/auth.py:999
759
+ #: src/iac_code/commands/auth.py:1038
753
760
  msgid "Configure Alibaba Cloud region"
754
761
  msgstr "Alibaba Cloud-Region konfigurieren"
755
762
 
756
- #: src/iac_code/commands/auth.py:1025
763
+ #: src/iac_code/commands/auth.py:1064
757
764
  msgid "Configured: Alibaba Cloud region saved to ~/.iac-code"
758
765
  msgstr "Konfiguriert: Alibaba Cloud-Region unter ~/.iac-code gespeichert"
759
766
 
@@ -1585,23 +1592,23 @@ msgstr "ROS Stack"
1585
1592
  msgid "CloudStackInstances"
1586
1593
  msgstr "CloudStackInstances"
1587
1594
 
1588
- #: src/iac_code/ui/banner.py:68
1595
+ #: src/iac_code/ui/banner.py:71
1589
1596
  msgid "Your AI-powered Infrastructure as Code assistant"
1590
1597
  msgstr "Ihr KI-gestützter Infrastructure-as-Code-Assistent"
1591
1598
 
1592
- #: src/iac_code/ui/banner.py:92
1599
+ #: src/iac_code/ui/banner.py:95
1593
1600
  msgid "Welcome back"
1594
1601
  msgstr "Willkommen zurück"
1595
1602
 
1596
- #: src/iac_code/ui/banner.py:98
1603
+ #: src/iac_code/ui/banner.py:101
1597
1604
  msgid "Session"
1598
1605
  msgstr "Sitzung"
1599
1606
 
1600
- #: src/iac_code/ui/banner.py:108
1607
+ #: src/iac_code/ui/banner.py:111
1601
1608
  msgid "Debug mode"
1602
1609
  msgstr "Debug-Modus"
1603
1610
 
1604
- #: src/iac_code/ui/banner.py:109
1611
+ #: src/iac_code/ui/banner.py:112
1605
1612
  msgid "Log file"
1606
1613
  msgstr "Protokolldatei"
1607
1614