iac-code 0.2.2__tar.gz → 0.2.3__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.
- {iac_code-0.2.2 → iac_code-0.2.3}/PKG-INFO +1 -1
- iac_code-0.2.3/src/iac_code/__init__.py +2 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/a2a/events.py +10 -8
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/a2a/executor.py +22 -1
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/acp/session.py +11 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/cli/main.py +166 -6
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/i18n/locales/de/LC_MESSAGES/messages.mo +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/i18n/locales/de/LC_MESSAGES/messages.po +82 -8
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/i18n/locales/es/LC_MESSAGES/messages.mo +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/i18n/locales/es/LC_MESSAGES/messages.po +89 -8
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/i18n/locales/fr/LC_MESSAGES/messages.mo +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/i18n/locales/fr/LC_MESSAGES/messages.po +89 -8
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/i18n/locales/ja/LC_MESSAGES/messages.mo +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/i18n/locales/ja/LC_MESSAGES/messages.po +76 -8
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/i18n/locales/pt/LC_MESSAGES/messages.mo +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/i18n/locales/pt/LC_MESSAGES/messages.po +84 -8
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/i18n/locales/zh/LC_MESSAGES/messages.mo +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/i18n/locales/zh/LC_MESSAGES/messages.po +74 -8
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/providers/manager.py +3 -3
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/services/telemetry/__init__.py +11 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/services/telemetry/client.py +27 -6
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/skills/bundled/iac_aliyun/SKILL.md +14 -13
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tools/cloud/aliyun/api_hooks.py +8 -3
- iac_code-0.2.3/src/iac_code/tools/cloud/aliyun/hooks/ros_parameters.py +76 -0
- iac_code-0.2.3/src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py +157 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tools/cloud/aliyun/ros_stack.py +15 -5
- iac_code-0.2.3/src/iac_code/tools/cloud/aliyun/ros_yaml.py +102 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/core/prompt_input.py +71 -29
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code.egg-info/PKG-INFO +1 -1
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code.egg-info/SOURCES.txt +2 -0
- iac_code-0.2.2/src/iac_code/__init__.py +0 -2
- iac_code-0.2.2/src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py +0 -57
- {iac_code-0.2.2 → iac_code-0.2.3}/LICENSE +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/MANIFEST.in +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/README.md +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/pyproject.toml +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/setup.cfg +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/setup.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/a2a/__init__.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/a2a/agent_card.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/a2a/app.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/a2a/artifacts.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/a2a/client.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/a2a/metrics.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/a2a/parts.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/a2a/persistence.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/a2a/push.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/a2a/push_queue.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/a2a/push_secrets.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/a2a/push_worker.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/a2a/router.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/a2a/signing.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/a2a/task_store.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/a2a/transport.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/a2a/transports/__init__.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/a2a/transports/base.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/a2a/transports/dispatcher.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/a2a/transports/grpc.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/a2a/transports/grpc_jsonrpc.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/a2a/transports/http.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/a2a/transports/redis_streams.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/a2a/transports/stdio.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/a2a/transports/unix.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/a2a/transports/websocket.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/a2a/types.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/acp/__init__.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/acp/convert.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/acp/http_sse.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/acp/mcp.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/acp/metrics.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/acp/server.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/acp/slash_registry.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/acp/state.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/acp/tools.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/acp/types.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/acp/version.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/agent/__init__.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/agent/agent_loop.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/agent/agent_tool.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/agent/agent_types.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/agent/message.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/agent/system_prompt.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/cli/__init__.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/cli/headless.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/cli/output_formats.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/commands/__init__.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/commands/auth.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/commands/clear.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/commands/compact.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/commands/debug.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/commands/effort.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/commands/exit.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/commands/help.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/commands/model.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/commands/registry.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/commands/resume.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/commands/tasks.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/config.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/i18n/__init__.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/memory/__init__.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/memory/memory_manager.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/memory/memory_tools.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/providers/__init__.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/providers/anthropic_provider.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/providers/azure_openai_provider.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/providers/base.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/providers/dashscope_provider.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/providers/deepseek_provider.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/providers/gemini_provider.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/providers/kimi_provider.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/providers/lmstudio_provider.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/providers/minimax_provider.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/providers/modelscope_provider.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/providers/ollama_provider.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/providers/openai_provider.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/providers/openrouter_provider.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/providers/registry.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/providers/retry.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/providers/siliconflow_provider.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/providers/stream_watchdog.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/providers/thinking.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/providers/volcengine_provider.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/providers/zhipu_provider.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/services/__init__.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/services/agent_factory.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/services/capabilities/__init__.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/services/capabilities/auto_detect.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/services/capabilities/multimodal.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/services/cloud_credentials.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/services/context_manager.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/services/permissions/__init__.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/services/permissions/loader.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/services/permissions/pipeline.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/services/permissions/storage.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/services/providers/__init__.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/services/providers/aliyun.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/services/qwenpaw_source.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/services/session_index.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/services/session_storage.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/services/telemetry/attributes.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/services/telemetry/config.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/services/telemetry/constants.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/services/telemetry/content_serializer.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/services/telemetry/events.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/services/telemetry/fallback.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/services/telemetry/identity.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/services/telemetry/metrics.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/services/telemetry/names.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/services/telemetry/sanitize.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/services/telemetry/sink.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/services/telemetry/tracing.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/services/telemetry/types.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/services/token_budget.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/services/token_counter.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/skills/__init__.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/skills/bundled/__init__.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/skills/bundled/iac_aliyun/__init__.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/ecs.md +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/oss.md +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/rds.md +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/redis.md +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/slb.md +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/vpc.md +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/skills/bundled/iac_aliyun/references/ros-template.md +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/skills/bundled/iac_aliyun/references/template-parameters.md +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/skills/bundled/iac_aliyun/references/terraform-template.md +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/skills/bundled/iac_aliyun/scripts/tf2ros.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/skills/bundled/simplify.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/skills/discovery.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/skills/frontmatter.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/skills/listing.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/skills/loader.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/skills/processor.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/skills/renderer.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/skills/skill_definition.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/skills/skill_tool.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/state/__init__.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/state/app_state.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tasks/__init__.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tasks/notification_queue.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tasks/task_state.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tasks/task_tools.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tools/__init__.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tools/base.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tools/bash/__init__.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tools/bash/bash_tool.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tools/bash/command_parser.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tools/bash/mode_validation.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tools/bash/path_validation.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tools/bash/permissions.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tools/bash/readonly_commands.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tools/bash/rule_matching.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tools/bash/safety_checks.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tools/cloud/__init__.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tools/cloud/aliyun/__init__.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tools/cloud/aliyun/aliyun_api.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tools/cloud/aliyun/aliyun_doc_search.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tools/cloud/aliyun/endpoints.yml +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tools/cloud/aliyun/hooks/__init__.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tools/cloud/aliyun/ros_client.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tools/cloud/aliyun/ros_stack_instances.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tools/cloud/base_api.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tools/cloud/base_stack.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tools/cloud/registry.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tools/cloud/types.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tools/edit_file.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tools/glob.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tools/grep.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tools/list_files.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tools/read_file.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tools/result_storage.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tools/tool_executor.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tools/web_fetch.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/tools/write_file.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/types/__init__.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/types/permissions.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/types/skill_source.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/types/stream_events.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/__init__.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/banner.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/components/__init__.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/components/dialog.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/components/divider.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/components/fuzzy_picker.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/components/progress_bar.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/components/search_box.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/components/select.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/components/status_icon.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/components/tabs.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/core/__init__.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/core/in_place_render.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/core/input_history.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/core/key_event.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/core/raw_input.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/core/screen.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/dialogs/__init__.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/dialogs/global_search.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/dialogs/history_search.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/dialogs/model_picker.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/dialogs/quick_open.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/dialogs/resume_picker.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/keybindings/__init__.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/keybindings/manager.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/renderer.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/repl.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/spinner.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/suggestions/__init__.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/suggestions/aggregator.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/suggestions/command_provider.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/suggestions/directory_provider.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/suggestions/file_provider.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/suggestions/shell_history_provider.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/suggestions/token_extractor.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/suggestions/types.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/ui/transcript_view.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/utils/__init__.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/utils/background_housekeeping.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/utils/cleanup.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/utils/image/__init__.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/utils/image/clipboard.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/utils/image/format_detect.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/utils/image/pasted_content.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/utils/image/processor.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/utils/image/resizer.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/utils/image/store.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/utils/json_utils.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/utils/log.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/utils/project_paths.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code/utils/tool_input_parser.py +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code.egg-info/dependency_links.txt +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code.egg-info/entry_points.txt +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code.egg-info/requires.txt +0 -0
- {iac_code-0.2.2 → iac_code-0.2.3}/src/iac_code.egg-info/top_level.txt +0 -0
|
@@ -31,6 +31,7 @@ from iac_code.types.stream_events import (
|
|
|
31
31
|
)
|
|
32
32
|
|
|
33
33
|
_METADATA_MAX_CHARS = 4000
|
|
34
|
+
_ERROR_TEXT_MAX_CHARS = 1000
|
|
34
35
|
_METADATA_MAX_DEPTH = 32
|
|
35
36
|
logger = logging.getLogger(__name__)
|
|
36
37
|
A2APermissionResolver: TypeAlias = Callable[[PermissionRequestEvent], "bool | Awaitable[bool]"]
|
|
@@ -298,18 +299,19 @@ async def publish_stream_event(
|
|
|
298
299
|
return None
|
|
299
300
|
|
|
300
301
|
if isinstance(event, ErrorEvent):
|
|
302
|
+
if event.is_retryable:
|
|
303
|
+
text = "A temporary error occurred. Please retry."
|
|
304
|
+
state = TaskState.TASK_STATE_INPUT_REQUIRED
|
|
305
|
+
else:
|
|
306
|
+
raw = event.error or "Unknown error"
|
|
307
|
+
text = raw[:_ERROR_TEXT_MAX_CHARS]
|
|
308
|
+
state = TaskState.TASK_STATE_FAILED
|
|
301
309
|
await _enqueue_status(
|
|
302
310
|
event_queue,
|
|
303
311
|
task_id=task_id,
|
|
304
312
|
context_id=context_id,
|
|
305
|
-
state=
|
|
306
|
-
message=_agent_text_message(
|
|
307
|
-
task_id=task_id,
|
|
308
|
-
context_id=context_id,
|
|
309
|
-
text="A temporary error occurred. Please retry."
|
|
310
|
-
if event.is_retryable
|
|
311
|
-
else "An internal error occurred.",
|
|
312
|
-
),
|
|
313
|
+
state=state,
|
|
314
|
+
message=_agent_text_message(task_id=task_id, context_id=context_id, text=text),
|
|
313
315
|
)
|
|
314
316
|
return None
|
|
315
317
|
|
|
@@ -29,6 +29,16 @@ from iac_code.services.session_storage import SessionStorage
|
|
|
29
29
|
|
|
30
30
|
logger = logging.getLogger(__name__)
|
|
31
31
|
_CONTEXT_LOCK_ACQUIRE_TIMEOUT_SECONDS = 1
|
|
32
|
+
_ERROR_TEXT_MAX_CHARS = 1000
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
def _format_exception(exc: BaseException) -> str:
|
|
36
|
+
message = str(exc)
|
|
37
|
+
if not message:
|
|
38
|
+
return type(exc).__name__
|
|
39
|
+
return f"{type(exc).__name__}: {message[:_ERROR_TEXT_MAX_CHARS]}"
|
|
40
|
+
|
|
41
|
+
|
|
32
42
|
A2APermissionResolver: TypeAlias = Callable[[Any], "bool | Awaitable[bool]"]
|
|
33
43
|
|
|
34
44
|
|
|
@@ -274,6 +284,17 @@ class IacCodeA2AExecutor(AgentExecutor):
|
|
|
274
284
|
ctx.touch()
|
|
275
285
|
task.touch()
|
|
276
286
|
self._task_store.mirror_context(ctx)
|
|
287
|
+
# Force-flush telemetry between tasks. The a2a server may run in
|
|
288
|
+
# an ephemeral sandbox that's destroyed immediately after the
|
|
289
|
+
# response is delivered, before the natural batch interval or
|
|
290
|
+
# process-exit graceful_shutdown can run. Synchronous flush is
|
|
291
|
+
# offloaded to a worker thread so the event loop is not blocked.
|
|
292
|
+
from iac_code.services.telemetry import flush_telemetry
|
|
293
|
+
|
|
294
|
+
try:
|
|
295
|
+
await asyncio.to_thread(flush_telemetry)
|
|
296
|
+
except Exception:
|
|
297
|
+
logger.debug("flush_telemetry after task failed", exc_info=True)
|
|
277
298
|
finally:
|
|
278
299
|
lock.release()
|
|
279
300
|
|
|
@@ -338,7 +359,7 @@ class IacCodeA2AExecutor(AgentExecutor):
|
|
|
338
359
|
if status == 401:
|
|
339
360
|
return "Authentication required. Please configure your API credentials."
|
|
340
361
|
logger.exception("Unhandled A2A executor error")
|
|
341
|
-
return
|
|
362
|
+
return _format_exception(exc)
|
|
342
363
|
|
|
343
364
|
async def _publish_status(
|
|
344
365
|
self,
|
|
@@ -351,6 +351,17 @@ class ACPSession:
|
|
|
351
351
|
duration_ms = (time.monotonic() - prompt_start) * 1000
|
|
352
352
|
if self._metrics is not None:
|
|
353
353
|
self._metrics.record_prompt(duration_ms)
|
|
354
|
+
# Force-flush telemetry between prompts. The acp server may run in
|
|
355
|
+
# an ephemeral sandbox that's destroyed immediately after the
|
|
356
|
+
# response is delivered, before the natural batch interval or
|
|
357
|
+
# process-exit graceful_shutdown can run. Synchronous flush is
|
|
358
|
+
# offloaded to a worker thread so the event loop is not blocked.
|
|
359
|
+
from iac_code.services.telemetry import flush_telemetry
|
|
360
|
+
|
|
361
|
+
try:
|
|
362
|
+
await asyncio.to_thread(flush_telemetry)
|
|
363
|
+
except Exception:
|
|
364
|
+
logger.debug("flush_telemetry after prompt failed", exc_info=True)
|
|
354
365
|
|
|
355
366
|
self.touch()
|
|
356
367
|
|
|
@@ -311,14 +311,91 @@ def acp(
|
|
|
311
311
|
debug: bool = typer.Option(False, "--debug", "-d", help=_("Enable debug logging")),
|
|
312
312
|
) -> None:
|
|
313
313
|
"""Run iac-code as an ACP server."""
|
|
314
|
-
|
|
315
|
-
|
|
314
|
+
import atexit
|
|
315
|
+
import signal as _signal_mod
|
|
316
|
+
import time
|
|
317
|
+
|
|
318
|
+
from iac_code.services.telemetry import add_metric, bootstrap_telemetry, graceful_shutdown, log_event
|
|
319
|
+
from iac_code.services.telemetry.names import Events, Metrics
|
|
320
|
+
|
|
321
|
+
telemetry_session_id = f"acp-server-{uuid.uuid4()}"
|
|
322
|
+
bootstrap_telemetry(session_id=telemetry_session_id)
|
|
323
|
+
log_event(
|
|
324
|
+
Events.SESSION_STARTED,
|
|
325
|
+
{
|
|
326
|
+
"mode": "acp-server",
|
|
327
|
+
"transport": transport,
|
|
328
|
+
},
|
|
329
|
+
)
|
|
330
|
+
add_metric(Metrics.SESSION_COUNT, 1, {})
|
|
316
331
|
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
332
|
+
started = time.monotonic()
|
|
333
|
+
exit_reason = "normal"
|
|
334
|
+
_finalized = [False]
|
|
335
|
+
|
|
336
|
+
def _finalize_telemetry(reason_override: str | None = None) -> None:
|
|
337
|
+
if _finalized[0]:
|
|
338
|
+
return
|
|
339
|
+
_finalized[0] = True
|
|
340
|
+
final_reason = reason_override or exit_reason
|
|
341
|
+
try:
|
|
342
|
+
log_event(
|
|
343
|
+
Events.SESSION_EXITED,
|
|
344
|
+
{
|
|
345
|
+
"mode": "acp-server",
|
|
346
|
+
"reason": final_reason,
|
|
347
|
+
"duration_s": int(time.monotonic() - started),
|
|
348
|
+
},
|
|
349
|
+
)
|
|
350
|
+
finally:
|
|
351
|
+
graceful_shutdown()
|
|
352
|
+
|
|
353
|
+
atexit.register(_finalize_telemetry, "atexit")
|
|
354
|
+
|
|
355
|
+
def _telemetry_excepthook(exc_type, exc_value, traceback_obj):
|
|
356
|
+
try:
|
|
357
|
+
log_event(
|
|
358
|
+
Events.EXCEPTION_UNCAUGHT,
|
|
359
|
+
{
|
|
360
|
+
"error_name": exc_type.__name__,
|
|
361
|
+
"location": "acp",
|
|
362
|
+
},
|
|
363
|
+
)
|
|
364
|
+
_finalize_telemetry(f"exception:{exc_type.__name__}")
|
|
365
|
+
finally:
|
|
366
|
+
sys.__excepthook__(exc_type, exc_value, traceback_obj)
|
|
367
|
+
|
|
368
|
+
sys.excepthook = _telemetry_excepthook
|
|
369
|
+
|
|
370
|
+
_prev_sigterm = _signal_mod.getsignal(_signal_mod.SIGTERM)
|
|
371
|
+
_prev_sigint = _signal_mod.getsignal(_signal_mod.SIGINT)
|
|
372
|
+
|
|
373
|
+
def _telemetry_signal_handler(signum, frame):
|
|
374
|
+
_finalize_telemetry(f"signal:{signum}")
|
|
375
|
+
prev = _prev_sigterm if signum == _signal_mod.SIGTERM else _prev_sigint
|
|
376
|
+
if callable(prev):
|
|
377
|
+
prev(signum, frame) # ty: ignore[call-top-callable]
|
|
378
|
+
return
|
|
379
|
+
_signal_mod.signal(signum, _signal_mod.SIG_DFL)
|
|
380
|
+
os.kill(os.getpid(), signum)
|
|
381
|
+
|
|
382
|
+
_signal_mod.signal(_signal_mod.SIGTERM, _telemetry_signal_handler)
|
|
383
|
+
_signal_mod.signal(_signal_mod.SIGINT, _telemetry_signal_handler)
|
|
384
|
+
|
|
385
|
+
try:
|
|
386
|
+
if transport == "http":
|
|
387
|
+
from iac_code.acp import acp_main_http
|
|
320
388
|
|
|
321
|
-
|
|
389
|
+
acp_main_http(host=host, port=port, debug=debug)
|
|
390
|
+
else:
|
|
391
|
+
from iac_code.acp import acp_main
|
|
392
|
+
|
|
393
|
+
acp_main(debug=debug)
|
|
394
|
+
except Exception:
|
|
395
|
+
exit_reason = "error"
|
|
396
|
+
raise
|
|
397
|
+
finally:
|
|
398
|
+
_finalize_telemetry()
|
|
322
399
|
|
|
323
400
|
|
|
324
401
|
def _load_a2a_config(path: str) -> dict[str, Any]:
|
|
@@ -506,6 +583,86 @@ def a2a(
|
|
|
506
583
|
err=True,
|
|
507
584
|
)
|
|
508
585
|
raise typer.Exit(1) from exc
|
|
586
|
+
|
|
587
|
+
import atexit
|
|
588
|
+
import signal as _signal_mod
|
|
589
|
+
import time
|
|
590
|
+
|
|
591
|
+
from iac_code.services.telemetry import add_metric, bootstrap_telemetry, graceful_shutdown, log_event
|
|
592
|
+
from iac_code.services.telemetry.names import Events, Metrics
|
|
593
|
+
|
|
594
|
+
telemetry_session_id = f"a2a-server-{uuid.uuid4()}"
|
|
595
|
+
bootstrap_telemetry(session_id=telemetry_session_id)
|
|
596
|
+
log_event(
|
|
597
|
+
Events.SESSION_STARTED,
|
|
598
|
+
{
|
|
599
|
+
"mode": "a2a-server",
|
|
600
|
+
"transport": transport,
|
|
601
|
+
},
|
|
602
|
+
)
|
|
603
|
+
add_metric(Metrics.SESSION_COUNT, 1, {})
|
|
604
|
+
|
|
605
|
+
started = time.monotonic()
|
|
606
|
+
exit_reason = "normal"
|
|
607
|
+
_finalized = [False]
|
|
608
|
+
|
|
609
|
+
def _finalize_telemetry(reason_override: str | None = None) -> None:
|
|
610
|
+
if _finalized[0]:
|
|
611
|
+
return
|
|
612
|
+
_finalized[0] = True
|
|
613
|
+
final_reason = reason_override or exit_reason
|
|
614
|
+
try:
|
|
615
|
+
log_event(
|
|
616
|
+
Events.SESSION_EXITED,
|
|
617
|
+
{
|
|
618
|
+
"mode": "a2a-server",
|
|
619
|
+
"reason": final_reason,
|
|
620
|
+
"duration_s": int(time.monotonic() - started),
|
|
621
|
+
},
|
|
622
|
+
)
|
|
623
|
+
finally:
|
|
624
|
+
graceful_shutdown()
|
|
625
|
+
|
|
626
|
+
# atexit fires on normal interpreter exit, including after uvicorn returns
|
|
627
|
+
# from a graceful shutdown — covers the path where the finally below also
|
|
628
|
+
# ran (idempotent via the flag).
|
|
629
|
+
atexit.register(_finalize_telemetry, "atexit")
|
|
630
|
+
|
|
631
|
+
def _telemetry_excepthook(exc_type, exc_value, traceback_obj):
|
|
632
|
+
try:
|
|
633
|
+
log_event(
|
|
634
|
+
Events.EXCEPTION_UNCAUGHT,
|
|
635
|
+
{
|
|
636
|
+
"error_name": exc_type.__name__,
|
|
637
|
+
"location": "a2a",
|
|
638
|
+
},
|
|
639
|
+
)
|
|
640
|
+
_finalize_telemetry(f"exception:{exc_type.__name__}")
|
|
641
|
+
finally:
|
|
642
|
+
sys.__excepthook__(exc_type, exc_value, traceback_obj)
|
|
643
|
+
|
|
644
|
+
sys.excepthook = _telemetry_excepthook
|
|
645
|
+
|
|
646
|
+
# Install our own SIGTERM/SIGINT handlers BEFORE uvicorn does its own. In
|
|
647
|
+
# the common path uvicorn replaces these and triggers graceful shutdown
|
|
648
|
+
# itself, after which the finally below runs. These handlers only fire if
|
|
649
|
+
# a signal arrives before uvicorn installs its own (or if uvicorn never
|
|
650
|
+
# got a chance to) — the ARMS sandbox SIGTERM-then-SIGKILL pattern.
|
|
651
|
+
_prev_sigterm = _signal_mod.getsignal(_signal_mod.SIGTERM)
|
|
652
|
+
_prev_sigint = _signal_mod.getsignal(_signal_mod.SIGINT)
|
|
653
|
+
|
|
654
|
+
def _telemetry_signal_handler(signum, frame):
|
|
655
|
+
_finalize_telemetry(f"signal:{signum}")
|
|
656
|
+
prev = _prev_sigterm if signum == _signal_mod.SIGTERM else _prev_sigint
|
|
657
|
+
if callable(prev):
|
|
658
|
+
prev(signum, frame) # ty: ignore[call-top-callable]
|
|
659
|
+
return
|
|
660
|
+
_signal_mod.signal(signum, _signal_mod.SIG_DFL)
|
|
661
|
+
os.kill(os.getpid(), signum)
|
|
662
|
+
|
|
663
|
+
_signal_mod.signal(_signal_mod.SIGTERM, _telemetry_signal_handler)
|
|
664
|
+
_signal_mod.signal(_signal_mod.SIGINT, _telemetry_signal_handler)
|
|
665
|
+
|
|
509
666
|
try:
|
|
510
667
|
if transport == "unix" and not socket_path:
|
|
511
668
|
raise RuntimeError("socket-path is required in --config for --transport unix.")
|
|
@@ -547,8 +704,11 @@ def a2a(
|
|
|
547
704
|
auto_approve_permissions=auto_approve_permissions,
|
|
548
705
|
)
|
|
549
706
|
except RuntimeError as exc:
|
|
707
|
+
exit_reason = "error"
|
|
550
708
|
typer.echo(str(exc), err=True)
|
|
551
709
|
raise typer.Exit(1) from exc
|
|
710
|
+
finally:
|
|
711
|
+
_finalize_telemetry()
|
|
552
712
|
|
|
553
713
|
|
|
554
714
|
@a2a_client_app.command(name="call", help=_("Send a prompt to an A2A JSON-RPC endpoint."))
|
|
Binary file
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
#
|
|
5
5
|
msgid ""
|
|
6
6
|
msgstr ""
|
|
7
|
-
"Project-Id-Version: iac-code 0.2.
|
|
7
|
+
"Project-Id-Version: iac-code 0.2.3\n"
|
|
8
8
|
"Report-Msgid-Bugs-To: \n"
|
|
9
|
-
"POT-Creation-Date: 2026-05-
|
|
9
|
+
"POT-Creation-Date: 2026-05-25 15:02+0800\n"
|
|
10
10
|
"PO-Revision-Date: 2026-05-13 00:00+0000\n"
|
|
11
11
|
"Last-Translator: \n"
|
|
12
12
|
"Language: de\n"
|
|
@@ -544,14 +544,14 @@ msgid "[conversation id or search term]"
|
|
|
544
544
|
msgstr "[Konversations-ID oder Suchbegriff]"
|
|
545
545
|
|
|
546
546
|
#: src/iac_code/commands/auth.py:249 src/iac_code/commands/auth.py:883
|
|
547
|
-
#: src/iac_code/ui/core/prompt_input.py:
|
|
547
|
+
#: src/iac_code/ui/core/prompt_input.py:546
|
|
548
548
|
msgid "Navigate"
|
|
549
549
|
msgstr "Navigieren"
|
|
550
550
|
|
|
551
551
|
#: src/iac_code/commands/auth.py:249 src/iac_code/commands/auth.py:371
|
|
552
552
|
#: src/iac_code/commands/auth.py:405 src/iac_code/commands/auth.py:412
|
|
553
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:
|
|
554
|
+
#: src/iac_code/commands/auth.py:1073 src/iac_code/ui/core/prompt_input.py:546
|
|
555
555
|
msgid "Confirm"
|
|
556
556
|
msgstr "Bestätigen"
|
|
557
557
|
|
|
@@ -1584,7 +1584,7 @@ msgstr ""
|
|
|
1584
1584
|
"tool to read full document content if needed.Verwenden Sie bei Bedarf das"
|
|
1585
1585
|
" Tool web_fetch für den vollständigen Dokumentinhalt."
|
|
1586
1586
|
|
|
1587
|
-
#: src/iac_code/tools/cloud/aliyun/ros_stack.py:
|
|
1587
|
+
#: src/iac_code/tools/cloud/aliyun/ros_stack.py:143
|
|
1588
1588
|
msgid "ROS Stack"
|
|
1589
1589
|
msgstr "ROS Stack"
|
|
1590
1590
|
|
|
@@ -1592,6 +1592,80 @@ msgstr "ROS Stack"
|
|
|
1592
1592
|
msgid "CloudStackInstances"
|
|
1593
1593
|
msgstr "CloudStackInstances"
|
|
1594
1594
|
|
|
1595
|
+
#: src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py:48
|
|
1596
|
+
#, python-brace-format
|
|
1597
|
+
msgid "Template YAML syntax error: {}"
|
|
1598
|
+
msgstr "YAML-Syntaxfehler in der Vorlage: {}"
|
|
1599
|
+
|
|
1600
|
+
#: src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py:60
|
|
1601
|
+
#, python-brace-format
|
|
1602
|
+
msgid ""
|
|
1603
|
+
"Template YAML syntax error (line {line}, column {col}): {problem}\n"
|
|
1604
|
+
"Context:\n"
|
|
1605
|
+
"{context}"
|
|
1606
|
+
msgstr ""
|
|
1607
|
+
"YAML-Syntaxfehler in der Vorlage (Zeile {line}, Spalte {col}): {problem}\n"
|
|
1608
|
+
"Kontext:\n"
|
|
1609
|
+
"{context}"
|
|
1610
|
+
|
|
1611
|
+
#: src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py:66
|
|
1612
|
+
#, python-brace-format
|
|
1613
|
+
msgid "Template JSON syntax error (line {line}, column {col}): {msg}"
|
|
1614
|
+
msgstr "JSON-Syntaxfehler in der Vorlage (Zeile {line}, Spalte {col}): {msg}"
|
|
1615
|
+
|
|
1616
|
+
#: src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py:85
|
|
1617
|
+
#, python-brace-format
|
|
1618
|
+
msgid ""
|
|
1619
|
+
"Template {fmt} parse result is not an object (dict), please check the "
|
|
1620
|
+
"template format"
|
|
1621
|
+
msgstr ""
|
|
1622
|
+
"Das {fmt}-Parseergebnis der Vorlage ist kein Objekt (dict), bitte "
|
|
1623
|
+
"überprüfen Sie das Vorlagenformat"
|
|
1624
|
+
|
|
1625
|
+
#: src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py:104
|
|
1626
|
+
msgid ""
|
|
1627
|
+
"Template is missing ROSTemplateFormatVersion (ROS templates must include "
|
|
1628
|
+
"this field, e.g. '2015-09-01')"
|
|
1629
|
+
msgstr ""
|
|
1630
|
+
"In der Vorlage fehlt ROSTemplateFormatVersion (ROS-Vorlagen müssen dieses"
|
|
1631
|
+
" Feld enthalten, z.B. '2015-09-01')"
|
|
1632
|
+
|
|
1633
|
+
#: src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py:110
|
|
1634
|
+
msgid "Template is missing Resources (ROS templates must include Resources)"
|
|
1635
|
+
msgstr "In der Vorlage fehlt Resources (ROS-Vorlagen müssen Resources enthalten)"
|
|
1636
|
+
|
|
1637
|
+
#: src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py:112
|
|
1638
|
+
#, python-brace-format
|
|
1639
|
+
msgid "Resources must be an object (dict), current type is {}"
|
|
1640
|
+
msgstr "Resources muss ein Objekt (dict) sein, aktueller Typ ist {}"
|
|
1641
|
+
|
|
1642
|
+
#: src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py:117
|
|
1643
|
+
#, python-brace-format
|
|
1644
|
+
msgid ""
|
|
1645
|
+
"Resource '{name}' definition must be an object (dict), current type is "
|
|
1646
|
+
"{type}"
|
|
1647
|
+
msgstr ""
|
|
1648
|
+
"Die Definition der Ressource '{name}' muss ein Objekt (dict) sein, "
|
|
1649
|
+
"aktueller Typ ist {type}"
|
|
1650
|
+
|
|
1651
|
+
#: src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py:123
|
|
1652
|
+
#, python-brace-format
|
|
1653
|
+
msgid "Resource '{name}' is missing the Type field"
|
|
1654
|
+
msgstr "Bei Ressource '{name}' fehlt das Feld Type"
|
|
1655
|
+
|
|
1656
|
+
#: src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py:129
|
|
1657
|
+
#, python-brace-format
|
|
1658
|
+
msgid "Resource '{name}' has incorrect type '{wrong}', should be '{correct}'"
|
|
1659
|
+
msgstr "Ressource '{name}' hat den falschen Typ '{wrong}', sollte '{correct}' sein"
|
|
1660
|
+
|
|
1661
|
+
#: src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py:151
|
|
1662
|
+
msgid ""
|
|
1663
|
+
"Template structure validation found the following issues, please fix and "
|
|
1664
|
+
"retry:"
|
|
1665
|
+
msgstr ""
|
|
1666
|
+
"Die Strukturvalidierung der Vorlage hat folgende Probleme gefunden, bitte"
|
|
1667
|
+
" beheben und erneut versuchen:"
|
|
1668
|
+
|
|
1595
1669
|
#: src/iac_code/ui/banner.py:71
|
|
1596
1670
|
msgid "Your AI-powered Infrastructure as Code assistant"
|
|
1597
1671
|
msgstr "Ihr KI-gestützter Infrastructure-as-Code-Assistent"
|
|
@@ -1828,15 +1902,15 @@ msgstr "Vollständiges Protokoll · ctrl+o zum Umschalten"
|
|
|
1828
1902
|
msgid "No matches found"
|
|
1829
1903
|
msgstr "Keine Treffer"
|
|
1830
1904
|
|
|
1831
|
-
#: src/iac_code/ui/core/prompt_input.py:
|
|
1905
|
+
#: src/iac_code/ui/core/prompt_input.py:337
|
|
1832
1906
|
msgid "Image in clipboard · ctrl+v to paste"
|
|
1833
1907
|
msgstr "Bild in der Zwischenablage · Strg+V zum Einfügen"
|
|
1834
1908
|
|
|
1835
|
-
#: src/iac_code/ui/core/prompt_input.py:
|
|
1909
|
+
#: src/iac_code/ui/core/prompt_input.py:546
|
|
1836
1910
|
msgid "Fill"
|
|
1837
1911
|
msgstr "Ausfüllen"
|
|
1838
1912
|
|
|
1839
|
-
#: src/iac_code/ui/core/prompt_input.py:
|
|
1913
|
+
#: src/iac_code/ui/core/prompt_input.py:546
|
|
1840
1914
|
msgid "Dismiss"
|
|
1841
1915
|
msgstr "Schließen"
|
|
1842
1916
|
|
|
Binary file
|
|
@@ -4,9 +4,9 @@
|
|
|
4
4
|
#
|
|
5
5
|
msgid ""
|
|
6
6
|
msgstr ""
|
|
7
|
-
"Project-Id-Version: iac-code 0.2.
|
|
7
|
+
"Project-Id-Version: iac-code 0.2.3\n"
|
|
8
8
|
"Report-Msgid-Bugs-To: \n"
|
|
9
|
-
"POT-Creation-Date: 2026-05-
|
|
9
|
+
"POT-Creation-Date: 2026-05-25 15:02+0800\n"
|
|
10
10
|
"PO-Revision-Date: 2026-05-13 00:00+0000\n"
|
|
11
11
|
"Last-Translator: \n"
|
|
12
12
|
"Language: es\n"
|
|
@@ -545,14 +545,14 @@ msgid "[conversation id or search term]"
|
|
|
545
545
|
msgstr "[id de conversación o término de búsqueda]"
|
|
546
546
|
|
|
547
547
|
#: src/iac_code/commands/auth.py:249 src/iac_code/commands/auth.py:883
|
|
548
|
-
#: src/iac_code/ui/core/prompt_input.py:
|
|
548
|
+
#: src/iac_code/ui/core/prompt_input.py:546
|
|
549
549
|
msgid "Navigate"
|
|
550
550
|
msgstr "Navegar"
|
|
551
551
|
|
|
552
552
|
#: src/iac_code/commands/auth.py:249 src/iac_code/commands/auth.py:371
|
|
553
553
|
#: src/iac_code/commands/auth.py:405 src/iac_code/commands/auth.py:412
|
|
554
554
|
#: src/iac_code/commands/auth.py:436 src/iac_code/commands/auth.py:883
|
|
555
|
-
#: src/iac_code/commands/auth.py:1073 src/iac_code/ui/core/prompt_input.py:
|
|
555
|
+
#: src/iac_code/commands/auth.py:1073 src/iac_code/ui/core/prompt_input.py:546
|
|
556
556
|
msgid "Confirm"
|
|
557
557
|
msgstr "Confirmar"
|
|
558
558
|
|
|
@@ -1584,7 +1584,7 @@ msgstr ""
|
|
|
1584
1584
|
"tool to read full document content if needed.Si es necesario, utilice la "
|
|
1585
1585
|
"herramienta web_fetch para leer el documento completo."
|
|
1586
1586
|
|
|
1587
|
-
#: src/iac_code/tools/cloud/aliyun/ros_stack.py:
|
|
1587
|
+
#: src/iac_code/tools/cloud/aliyun/ros_stack.py:143
|
|
1588
1588
|
msgid "ROS Stack"
|
|
1589
1589
|
msgstr "ROS Stack"
|
|
1590
1590
|
|
|
@@ -1592,6 +1592,87 @@ msgstr "ROS Stack"
|
|
|
1592
1592
|
msgid "CloudStackInstances"
|
|
1593
1593
|
msgstr "CloudStackInstances"
|
|
1594
1594
|
|
|
1595
|
+
#: src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py:48
|
|
1596
|
+
#, python-brace-format
|
|
1597
|
+
msgid "Template YAML syntax error: {}"
|
|
1598
|
+
msgstr "Error de sintaxis YAML en la plantilla: {}"
|
|
1599
|
+
|
|
1600
|
+
#: src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py:60
|
|
1601
|
+
#, python-brace-format
|
|
1602
|
+
msgid ""
|
|
1603
|
+
"Template YAML syntax error (line {line}, column {col}): {problem}\n"
|
|
1604
|
+
"Context:\n"
|
|
1605
|
+
"{context}"
|
|
1606
|
+
msgstr ""
|
|
1607
|
+
"Error de sintaxis YAML en la plantilla (línea {line}, columna {col}): "
|
|
1608
|
+
"{problem}\n"
|
|
1609
|
+
"Contexto:\n"
|
|
1610
|
+
"{context}"
|
|
1611
|
+
|
|
1612
|
+
#: src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py:66
|
|
1613
|
+
#, python-brace-format
|
|
1614
|
+
msgid "Template JSON syntax error (line {line}, column {col}): {msg}"
|
|
1615
|
+
msgstr ""
|
|
1616
|
+
"Error de sintaxis JSON en la plantilla (línea {line}, columna {col}): "
|
|
1617
|
+
"{msg}"
|
|
1618
|
+
|
|
1619
|
+
#: src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py:85
|
|
1620
|
+
#, python-brace-format
|
|
1621
|
+
msgid ""
|
|
1622
|
+
"Template {fmt} parse result is not an object (dict), please check the "
|
|
1623
|
+
"template format"
|
|
1624
|
+
msgstr ""
|
|
1625
|
+
"El resultado del análisis {fmt} de la plantilla no es un objeto (dict), "
|
|
1626
|
+
"por favor verifique el formato de la plantilla"
|
|
1627
|
+
|
|
1628
|
+
#: src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py:104
|
|
1629
|
+
msgid ""
|
|
1630
|
+
"Template is missing ROSTemplateFormatVersion (ROS templates must include "
|
|
1631
|
+
"this field, e.g. '2015-09-01')"
|
|
1632
|
+
msgstr ""
|
|
1633
|
+
"Falta ROSTemplateFormatVersion en la plantilla (las plantillas ROS deben "
|
|
1634
|
+
"incluir este campo, ej. '2015-09-01')"
|
|
1635
|
+
|
|
1636
|
+
#: src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py:110
|
|
1637
|
+
msgid "Template is missing Resources (ROS templates must include Resources)"
|
|
1638
|
+
msgstr ""
|
|
1639
|
+
"Falta Resources en la plantilla (las plantillas ROS deben incluir "
|
|
1640
|
+
"Resources)"
|
|
1641
|
+
|
|
1642
|
+
#: src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py:112
|
|
1643
|
+
#, python-brace-format
|
|
1644
|
+
msgid "Resources must be an object (dict), current type is {}"
|
|
1645
|
+
msgstr "Resources debe ser un objeto (dict), el tipo actual es {}"
|
|
1646
|
+
|
|
1647
|
+
#: src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py:117
|
|
1648
|
+
#, python-brace-format
|
|
1649
|
+
msgid ""
|
|
1650
|
+
"Resource '{name}' definition must be an object (dict), current type is "
|
|
1651
|
+
"{type}"
|
|
1652
|
+
msgstr ""
|
|
1653
|
+
"La definición del recurso '{name}' debe ser un objeto (dict), el tipo "
|
|
1654
|
+
"actual es {type}"
|
|
1655
|
+
|
|
1656
|
+
#: src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py:123
|
|
1657
|
+
#, python-brace-format
|
|
1658
|
+
msgid "Resource '{name}' is missing the Type field"
|
|
1659
|
+
msgstr "Al recurso '{name}' le falta el campo Type"
|
|
1660
|
+
|
|
1661
|
+
#: src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py:129
|
|
1662
|
+
#, python-brace-format
|
|
1663
|
+
msgid "Resource '{name}' has incorrect type '{wrong}', should be '{correct}'"
|
|
1664
|
+
msgstr ""
|
|
1665
|
+
"El recurso '{name}' tiene el tipo incorrecto '{wrong}', debería ser "
|
|
1666
|
+
"'{correct}'"
|
|
1667
|
+
|
|
1668
|
+
#: src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py:151
|
|
1669
|
+
msgid ""
|
|
1670
|
+
"Template structure validation found the following issues, please fix and "
|
|
1671
|
+
"retry:"
|
|
1672
|
+
msgstr ""
|
|
1673
|
+
"La validación de la estructura de la plantilla encontró los siguientes "
|
|
1674
|
+
"problemas, por favor corrija y reintente:"
|
|
1675
|
+
|
|
1595
1676
|
#: src/iac_code/ui/banner.py:71
|
|
1596
1677
|
msgid "Your AI-powered Infrastructure as Code assistant"
|
|
1597
1678
|
msgstr "Su asistente de infraestructura como código con IA"
|
|
@@ -1829,15 +1910,15 @@ msgstr "Mostrando transcripción · ctrl+o para alternar"
|
|
|
1829
1910
|
msgid "No matches found"
|
|
1830
1911
|
msgstr "No se encontraron coincidencias"
|
|
1831
1912
|
|
|
1832
|
-
#: src/iac_code/ui/core/prompt_input.py:
|
|
1913
|
+
#: src/iac_code/ui/core/prompt_input.py:337
|
|
1833
1914
|
msgid "Image in clipboard · ctrl+v to paste"
|
|
1834
1915
|
msgstr "Imagen en el portapapeles · ctrl+v para pegar"
|
|
1835
1916
|
|
|
1836
|
-
#: src/iac_code/ui/core/prompt_input.py:
|
|
1917
|
+
#: src/iac_code/ui/core/prompt_input.py:546
|
|
1837
1918
|
msgid "Fill"
|
|
1838
1919
|
msgstr "Rellenar"
|
|
1839
1920
|
|
|
1840
|
-
#: src/iac_code/ui/core/prompt_input.py:
|
|
1921
|
+
#: src/iac_code/ui/core/prompt_input.py:546
|
|
1841
1922
|
msgid "Dismiss"
|
|
1842
1923
|
msgstr "Descartar"
|
|
1843
1924
|
|