iac-code 0.13.0__tar.gz → 0.13.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.
- {iac_code-0.13.0 → iac_code-0.13.1}/PKG-INFO +6 -9
- {iac_code-0.13.0 → iac_code-0.13.1}/pyproject.toml +1 -2
- {iac_code-0.13.0 → iac_code-0.13.1}/setup.py +14 -1
- iac_code-0.13.1/src/iac_code/__init__.py +2 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/app.py +102 -5
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/executor.py +30 -2
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/parts.py +15 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/persistence.py +3 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/runtime_overrides.py +4 -1
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/task_store.py +85 -7
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/types.py +1 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/cli/main.py +2 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/de/LC_MESSAGES/messages.mo +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/de/LC_MESSAGES/messages.po +1 -1
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/es/LC_MESSAGES/messages.mo +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/es/LC_MESSAGES/messages.po +1 -1
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/fr/LC_MESSAGES/messages.mo +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/fr/LC_MESSAGES/messages.po +1 -1
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/ja/LC_MESSAGES/messages.mo +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/ja/LC_MESSAGES/messages.po +1 -1
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/pt/LC_MESSAGES/messages.mo +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/pt/LC_MESSAGES/messages.po +1 -1
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/zh/LC_MESSAGES/messages.mo +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/zh/LC_MESSAGES/messages.po +1 -1
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/manager.py +78 -2
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/providers/aliyun.py +150 -48
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/telemetry/__init__.py +2 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/telemetry/attributes.py +29 -2
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/session_manager.py +3 -1
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/session_titler.py +18 -3
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/index.html +1 -1
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/app.js +341 -54
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code.egg-info/PKG-INFO +6 -9
- iac_code-0.13.0/src/iac_code/__init__.py +0 -2
- {iac_code-0.13.0 → iac_code-0.13.1}/LICENSE +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/MANIFEST.in +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/README.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/setup.cfg +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/agent_card.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/artifacts.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/backup.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/client.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/events.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/exposure.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/input_required.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/jsonrpc_passthrough.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/metadata_redaction.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/metrics.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/pipeline_delta_coalescing.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/pipeline_events.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/pipeline_executor.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/pipeline_flow_monitor.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/pipeline_journal.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/pipeline_outbound.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/pipeline_paths.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/pipeline_performance.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/pipeline_recovery.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/pipeline_snapshot.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/pipeline_stream.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/pipeline_transport_delivery.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/projection.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/push.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/push_queue.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/push_secrets.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/push_worker.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/router.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/runtime_registry.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/signing.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/thinking_metadata.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/transport.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/transports/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/transports/base.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/transports/dispatcher.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/transports/grpc.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/transports/grpc_jsonrpc.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/transports/http.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/transports/redis_streams.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/transports/stdio.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/transports/unix.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/a2a/transports/websocket.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/acp/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/acp/convert.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/acp/http_sse.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/acp/mcp.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/acp/metrics.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/acp/runner.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/acp/server.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/acp/session.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/acp/slash_registry.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/acp/state.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/acp/tools.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/acp/types.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/acp/version.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/agent/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/agent/agent_loop.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/agent/agent_tool.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/agent/agent_types.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/agent/message.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/agent/system_prompt.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/cli/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/cli/headless.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/cli/install_git_bash.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/cli/output_formats.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/cli/process_events.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/cli/process_mode.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/cli/process_protocol.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/cli/update.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/auth.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/clear.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/compact.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/debug.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/effort.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/exit.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/help.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/mcp.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/memory.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/model.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/prompt.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/registry.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/rename.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/resume.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/skills.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/status.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/tasks.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/commands/thinking_enabled.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/config.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/desktop/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/desktop/__main__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/desktop/control.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/desktop/controller.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/desktop/diagnostics.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/desktop/download_journal.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/desktop/external_env.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/desktop/git_bash.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/desktop/install_lock.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/desktop/loop_runner.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/desktop/native_preload_manifest.json +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/desktop/ports.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/desktop/probe_worker.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/desktop/runtime.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/desktop/tool_paths.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/html_extractor.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/de/LC_MESSAGES/webui.mo +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/de/LC_MESSAGES/webui.po +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/es/LC_MESSAGES/webui.mo +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/es/LC_MESSAGES/webui.po +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/fr/LC_MESSAGES/webui.mo +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/fr/LC_MESSAGES/webui.po +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/ja/LC_MESSAGES/webui.mo +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/ja/LC_MESSAGES/webui.po +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/pt/LC_MESSAGES/webui.mo +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/pt/LC_MESSAGES/webui.po +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/zh/LC_MESSAGES/webui.mo +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/i18n/locales/zh/LC_MESSAGES/webui.po +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/mcp/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/mcp/cli.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/mcp/client.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/mcp/config.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/mcp/env_expansion.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/mcp/errors.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/mcp/manager.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/mcp/oauth.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/mcp/output.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/mcp/progress.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/mcp/prompt_dispatch.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/mcp/prompts.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/mcp/redaction.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/mcp/skills.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/mcp/storage.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/mcp/tools.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/mcp/types.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/memory/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/memory/memory_manager.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/memory/memory_tools.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/memory/project_memory.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/memory/recall.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/config.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/constants.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/display_names.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/architecture_graph.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/architecture_meta.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/architecture_metas/Categories.json +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/architecture_metas/config.json +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/architecture_metas/products.json +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/architecture_resource_inventory.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/architecture_rule_candidates.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/architecture_rule_drafts.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/architecture_rule_facts.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/architecture_rules.json +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/architecture_rules.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/architecture_semantic_planning.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/ask_user_question_tool.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/cleanup.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/complete_step_tool.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/completion_guard_state.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/context.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/display_replay.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/events.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/handoff.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/hard_constraints.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/interrupt.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/loader.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/observability.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/pipeline_runner.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/prerequisites.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/prompts/interrupt_judge.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/public_errors.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/recovery.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/resume_recovery.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/session.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/show_diagram_tool.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/state_machine.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/step_executor.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/step_spec.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/sub_pipeline_executor.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/transcript_storage.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/types.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/ui_contract.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/engine/user_input.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/hooks/deploying.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/pipeline.yaml +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/prompts/architecture_planning.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/prompts/confirm_and_select.a2a.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/prompts/confirm_and_select.a2a.rich.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/prompts/confirm_and_select.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/prompts/cost_estimating.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/prompts/deploying.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/prompts/evaluate_candidates.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/prompts/intent_parsing.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/prompts/reviewing.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/prompts/template_generating.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/references/cloud-products/ecs.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/references/cloud-products/ga.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/references/cloud-products/oss.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/references/cloud-products/rds.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/references/cloud-products/redis.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/references/cloud-products/slb.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/references/cloud-products/vpc.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/references/ros-template.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/references/solutions/iac-code-web.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/references/solutions/iac-code-web.ros.yml +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/references/template-parameter-recommendation.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/references/template-parameters.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/references/terraform-template.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-architecture/SKILL.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-architecture/evals.json +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/SKILL.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/evals.json +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/ecs.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/ga.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/oss.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/rds.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/redis.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/slb.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/vpc.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/ros-template.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/solutions/iac-code-web.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/solutions/iac-code-web.ros.yml +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/template-parameter-recommendation.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/template-parameters.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/terraform-template.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/SKILL.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/evals.json +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/ecs.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/ga.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/oss.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/rds.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/redis.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/slb.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/vpc.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/ros-template.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/solutions/iac-code-web.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/solutions/iac-code-web.ros.yml +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/template-parameter-recommendation.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/template-parameters.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/terraform-template.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-intent/SKILL.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-intent/evals.json +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-review/SKILL.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-review/evals.json +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/SKILL.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/evals.json +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/ecs.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/ga.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/oss.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/rds.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/redis.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/slb.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/vpc.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/ros-template.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/solutions/iac-code-web.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/solutions/iac-code-web.ros.yml +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/template-parameter-recommendation.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/template-parameters.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/terraform-template.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/tools/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/tools/infraguard_scan_tool.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/tools/ros_deploy_tool.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/tools/ros_template_tools.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/pipeline/selling/tools/show_candidate_detail_tool.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/anthropic_provider.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/azure_openai_provider.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/base.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/dashscope_provider.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/deepseek_provider.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/gemini_provider.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/kimi_provider.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/lmstudio_provider.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/minimax_provider.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/modelscope_provider.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/ollama_provider.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/openai_provider.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/openrouter_provider.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/registry.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/request_logging.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/request_policy.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/retry.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/siliconflow_provider.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/stream_watchdog.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/thinking.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/volcengine_provider.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/providers/zhipu_provider.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/agent_factory.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/capabilities/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/capabilities/auto_detect.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/capabilities/multimodal.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/cloud_credentials.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/configuration_readiness.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/context_manager.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/git_bash.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/permissions/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/permissions/audit.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/permissions/loader.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/permissions/pipeline.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/permissions/rule_scope.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/permissions/storage.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/permissions/trusted_roots.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/providers/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/providers/aliyun_credentials_runtime.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/providers/aliyun_oauth.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/qwenpaw_source.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/session_backup.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/session_backup_staging.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/session_backup_state.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/session_index.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/session_layout.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/session_logging.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/session_metadata.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/session_resolver.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/session_storage.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/session_usage.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/telemetry/client.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/telemetry/config.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/telemetry/constants.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/telemetry/content_serializer.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/telemetry/events.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/telemetry/fallback.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/telemetry/identity.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/telemetry/metrics.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/telemetry/names.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/telemetry/sanitize.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/telemetry/scope.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/telemetry/sink.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/telemetry/tracing.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/telemetry/types.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/token_budget.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/token_counter.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/services/update_checker.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/auto_trigger.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/iac_aliyun/SKILL.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/iac_aliyun/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/iac_aliyun/auto_trigger.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/ecs.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/ga.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/oss.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/rds.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/redis.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/slb.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/vpc.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/iac_aliyun/references/ros-template.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/iac_aliyun/references/solutions/iac-code-web.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/iac_aliyun/references/solutions/iac-code-web.ros.yml +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/iac_aliyun/references/template-parameter-recommendation.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/iac_aliyun/references/template-parameters.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/iac_aliyun/references/terraform-template.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/iac_aliyun/scripts/tf2ros.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/pac_aliyun/SKILL.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/pac_aliyun/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/pac_aliyun/auto_trigger.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/pac_aliyun/references/infraguard-policy-generation.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/bundled/simplify.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/discovery.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/frontmatter.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/listing.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/loader.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/management.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/processor.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/renderer.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/settings.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/skill_definition.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/skills/skill_tool.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/state/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/state/app_state.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tasks/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tasks/notification_queue.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tasks/task_state.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tasks/task_tools.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/base.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/bash/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/bash/argv_safety.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/bash/bash_tool.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/bash/command_parser.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/bash/mode_validation.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/bash/path_validation.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/bash/permissions.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/bash/readonly_commands.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/bash/rule_matching.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/bash/safety_checks.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/acs3_transport.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/aliyun_api.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/aliyun_api_doc.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/aliyun_doc_search.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/api_contract.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/api_hooks.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/api_identifiers.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/contract_store.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/data/README.md +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/data/endpoints/catalog.json +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/data/endpoints/generation_report.json +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/data/endpoints/legacy.yml +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/data/endpoints/overrides.yml +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/data/endpoints/unavailable.json +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/data/openmeta/api_overrides.yml +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/data/openmeta/exclusions.yml +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/data/openmeta/product_aliases.yml +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/data/openmeta/product_catalog.json +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/data/oss/operation_catalog.json +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/data/validation/judgments.yml +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/data/validation/overrides.yml +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ecs_credential_errors.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/endpoint_resolver.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/hooks/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/hooks/ros_parameters.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/openmeta.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/oss_v4_adapter.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/product_resolver.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/public_errors.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/result_contract.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/retry_policy.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_client.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_lifecycle.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_stack.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_stack_instances.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_template_tools.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/action_policy.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/analyzer.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/association_property_specs.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/count.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_association_property_specs.json +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_official_resource_index.json +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_resource_value_specs.json +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_template_body_action_policies.json +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/facts.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/function_specs.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/model.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/outcome.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/parser.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/renderer.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/resource_value_specs.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/association_property.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/base.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/registry.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/symbols.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/template_kind.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/types.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_validation/validator.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/ros_yaml.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/runtime.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/template_source.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/user_agent.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/aliyun/validation_policy.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/base_api.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/base_stack.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/registry.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/cloud/types.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/edit_file.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/glob.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/grep.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/list_files.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/path_safety.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/read_file.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/result_storage.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/tool_executor.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/web_fetch.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/tools/write_file.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/types/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/types/permissions.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/types/skill_source.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/types/stream_events.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/assets/iac-code-terminal-logo.png +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/banner.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/components/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/components/candidate_selection.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/components/dialog.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/components/divider.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/components/fuzzy_picker.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/components/parallel_tabs.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/components/progress_bar.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/components/search_box.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/components/select.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/components/status_icon.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/components/tabs.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/core/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/core/in_place_render.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/core/input_history.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/core/key_event.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/core/prompt_input.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/core/raw_input.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/core/raw_input_win.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/core/screen.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/diagram_rendering.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/dialogs/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/dialogs/global_search.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/dialogs/history_search.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/dialogs/mcp_manager.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/dialogs/memory.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/dialogs/memory_editor.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/dialogs/model_picker.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/dialogs/quick_open.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/dialogs/resume_picker.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/dialogs/skills_picker.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/keybindings/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/keybindings/manager.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/pipeline_display_replay.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/pipeline_styles.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/renderer.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/repl.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/spinner.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/stream_accumulator.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/suggestions/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/suggestions/aggregator.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/suggestions/command_provider.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/suggestions/directory_provider.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/suggestions/file_provider.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/suggestions/shell_history_provider.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/suggestions/skill_provider.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/suggestions/token_extractor.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/suggestions/types.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/terminal_image.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/ui/transcript_view.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/async_lifecycle.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/background_housekeeping.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/cleanup.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/console.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/file_security.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/image/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/image/clipboard.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/image/format_detect.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/image/pasted_content.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/image/processor.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/image/resizer.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/image/store.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/json_utils.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/log.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/path_components.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/path_locks.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/platform.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/project_paths.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/public_errors.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/public_paths.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/signals.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/state_io.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/tool_input_parser.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/tool_result_redaction.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/utils/windows_paths.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/__init__.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/app.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/cleanup.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/commands.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/diagram_cache.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/diagram_optimizer.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/diagrams.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/events.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/files.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/images.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/mcp_settings.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/memory.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/outputs.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/permissions.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/pipeline.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/pipeline_actions.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/pipeline_prerequisites.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/pipeline_transcript.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/runtime.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/security.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/server.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/settings.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/shell.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/skills.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/icons/iac-code-logo.svg +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/icons/sidebar-new-thread.svg +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/icons/sidebar-project-open.svg +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/icons/sidebar-search.svg +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/icons/sidebar-settings.svg +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/icons/sidebar-skills.svg +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/api.js +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/components/blocking.js +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/components/composer.js +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/components/image_lightbox.js +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/components/output_panel.js +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/components/pipeline.js +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/components/tool_cards.js +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/components/workspace.js +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/events.js +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/i18n.js +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/mermaid_render.js +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/token_transport.js +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/vendor/markdown-it.LICENSE +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/vendor/markdown-it.min.js +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/vendor/mermaid.LICENSE +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/vendor/mermaid.min.js +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/js/vendor/token-crypto.js +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/static/styles.css +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code/web/token_transport.py +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code.egg-info/SOURCES.txt +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code.egg-info/dependency_links.txt +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code.egg-info/entry_points.txt +0 -0
- {iac_code-0.13.0 → iac_code-0.13.1}/src/iac_code.egg-info/requires.txt +0 -0
- {iac_code-0.13.0 → iac_code-0.13.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.13.
|
|
3
|
+
Version: 0.13.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
|
|
@@ -19,7 +19,7 @@ Provides-Extra: http
|
|
|
19
19
|
License-File: LICENSE
|
|
20
20
|
|
|
21
21
|
<p align="center">
|
|
22
|
-
<img src="website/static/img/logo-with-front.png" alt="iac-code" width="200">
|
|
22
|
+
<img src="https://raw.githubusercontent.com/aliyun/iac-code/main/website/static/img/logo-with-front.png" alt="iac-code" width="200">
|
|
23
23
|
</p>
|
|
24
24
|
<p align="center">
|
|
25
25
|
<em>AI-powered Infrastructure as Code assistant for cloud infrastructure through natural language interaction. Currently supports Alibaba Cloud ROS and Terraform workflows.</em>
|
|
@@ -29,9 +29,6 @@ License-File: LICENSE
|
|
|
29
29
|
<a href="https://pypi.org/project/iac-code"><img src="https://img.shields.io/pypi/v/iac-code?color=%2334D058&label=pypi%20package" alt="PyPI Package"></a>
|
|
30
30
|
<a href="https://pypi.org/project/iac-code"><img src="https://img.shields.io/pypi/pyversions/iac-code?color=%2334D058&label=python" alt="Python"></a>
|
|
31
31
|
</p>
|
|
32
|
-
<p align="center">
|
|
33
|
-
<strong>Language</strong>: English | <a href="readme/README.zh.md">中文</a> | <a href="readme/README.es.md">Español</a> | <a href="readme/README.fr.md">Français</a> | <a href="readme/README.de.md">Deutsch</a> | <a href="readme/README.ja.md">日本語</a> | <a href="readme/README.pt.md">Português</a>
|
|
34
|
-
</p>
|
|
35
32
|
|
|
36
33
|
> **Documentation**: [https://aliyun.github.io/iac-code/](https://aliyun.github.io/iac-code/)
|
|
37
34
|
|
|
@@ -56,7 +53,7 @@ No Python, pip, or terminal setup required — download the native app and start
|
|
|
56
53
|
The Desktop app runs the same IaC Code engine and uses the same providers, cloud credentials, settings, projects, and sessions as the CLI and Web app. On first launch, select the project directory you want IaC Code to work in. Windows also checks for Git Bash and guides you through installation if it is missing.
|
|
57
54
|
|
|
58
55
|
<p align="center">
|
|
59
|
-
<img src="website/static/img/screenshots/iac-code-desktop-en.jpg" alt="IaC Code Desktop app" width="100%">
|
|
56
|
+
<img src="https://raw.githubusercontent.com/aliyun/iac-code/main/website/static/img/screenshots/iac-code-desktop-en.jpg" alt="IaC Code Desktop app" width="100%">
|
|
60
57
|
</p>
|
|
61
58
|
|
|
62
59
|
macOS, Windows, and AppImage builds can check for and apply cryptographically signed updates in the app. The deb package is updated by installing a newer package. Stable macOS packages are signed with Apple Developer ID and notarized by Apple; stable Windows packages carry an Authenticode publisher signature. Always download from the official release page and verify the accompanying `SHA256SUMS`. See the [Desktop App guide](https://aliyun.github.io/iac-code/docs/desktop-app) for installation and troubleshooting details.
|
|
@@ -84,7 +81,7 @@ iac-code
|
|
|
84
81
|
```
|
|
85
82
|
|
|
86
83
|
<p align="center">
|
|
87
|
-
<img src="website/static/img/demo_en.gif" alt="iac-code demo" width="100%">
|
|
84
|
+
<img src="https://raw.githubusercontent.com/aliyun/iac-code/main/website/static/img/demo_en.gif" alt="iac-code demo" width="100%">
|
|
88
85
|
</p>
|
|
89
86
|
|
|
90
87
|
### Non-Interactive Mode
|
|
@@ -113,7 +110,7 @@ iac-code web
|
|
|
113
110
|
By default it opens `http://127.0.0.1:8766` in your browser (loopback only). See the [Web App guide](https://aliyun.github.io/iac-code/web-app) for details.
|
|
114
111
|
|
|
115
112
|
<p align="center">
|
|
116
|
-
<img src="website/static/img/screenshots/iac-code-web-en.jpg" alt="IaC Code Web app" width="100%">
|
|
113
|
+
<img src="https://raw.githubusercontent.com/aliyun/iac-code/main/website/static/img/screenshots/iac-code-web-en.jpg" alt="IaC Code Web app" width="100%">
|
|
117
114
|
</p>
|
|
118
115
|
|
|
119
116
|
## Contributing
|
|
@@ -134,4 +131,4 @@ See the [Contributing Guide](https://aliyun.github.io/iac-code/getting-started/c
|
|
|
134
131
|
|
|
135
132
|
| [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) |
|
|
136
133
|
| :----------------------------------------------------------: | :----------------------------------------------------------: |
|
|
137
|
-
| [<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) |
|
|
134
|
+
| [<img src="https://raw.githubusercontent.com/aliyun/iac-code/main/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="https://raw.githubusercontent.com/aliyun/iac-code/main/website/static/img/qrcode-discord.jpg" width="120" height="120" alt="Discord">](https://discord.gg/qECFuFBwF) |
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "iac_code"
|
|
3
|
-
dynamic = ["version"]
|
|
3
|
+
dynamic = ["version", "readme"]
|
|
4
4
|
description = "Your AI-powered Infrastructure as Code assistant"
|
|
5
|
-
readme = "README.md"
|
|
6
5
|
requires-python = ">=3.10"
|
|
7
6
|
classifiers = [
|
|
8
7
|
"Programming Language :: Python :: 3",
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
"""Custom build hook to inject __release_date__ at build time."""
|
|
2
2
|
|
|
3
|
+
import os
|
|
3
4
|
import platform
|
|
4
5
|
import re
|
|
5
6
|
import shutil
|
|
@@ -99,7 +100,19 @@ def _read_version():
|
|
|
99
100
|
|
|
100
101
|
def _read_long_description():
|
|
101
102
|
readme = Path("README.md")
|
|
102
|
-
|
|
103
|
+
if not readme.is_file():
|
|
104
|
+
return ""
|
|
105
|
+
text = readme.read_text(encoding="utf-8")
|
|
106
|
+
# PyPI renders the package description standalone, where the README's
|
|
107
|
+
# relative image paths have no repository base and show up broken.
|
|
108
|
+
# Rewrite them to absolute raw URLs at build time so the checked-in
|
|
109
|
+
# README keeps GitHub-friendly relative paths.
|
|
110
|
+
# The language switcher links point at in-repo translated READMEs, which
|
|
111
|
+
# cannot resolve on PyPI's standalone rendering; drop the line there.
|
|
112
|
+
text = re.sub(r'<p align="center">\s*<strong>Language</strong>.*?</p>\n?', "", text, flags=re.S)
|
|
113
|
+
ref = os.environ.get("IAC_CODE_README_IMG_REF", "main")
|
|
114
|
+
base = "https://raw.githubusercontent.com/aliyun/iac-code/{}/website/static/img/".format(ref)
|
|
115
|
+
return text.replace('src="website/static/img/', 'src="{}'.format(base))
|
|
103
116
|
|
|
104
117
|
|
|
105
118
|
def _try_import_babel():
|
|
@@ -7,7 +7,9 @@ import hashlib
|
|
|
7
7
|
import hmac
|
|
8
8
|
import json
|
|
9
9
|
import logging
|
|
10
|
+
import math
|
|
10
11
|
import os
|
|
12
|
+
import signal
|
|
11
13
|
from contextlib import asynccontextmanager, suppress
|
|
12
14
|
from email.utils import formatdate
|
|
13
15
|
from pathlib import Path
|
|
@@ -72,6 +74,58 @@ class _PrincipalUser(User):
|
|
|
72
74
|
return self._principal
|
|
73
75
|
|
|
74
76
|
|
|
77
|
+
class _A2AIdleShutdownController:
|
|
78
|
+
def __init__(self, timeout_seconds: float, callback: Callable[[], None]) -> None:
|
|
79
|
+
self._timeout_seconds = timeout_seconds
|
|
80
|
+
self._callback = callback
|
|
81
|
+
self._inflight_requests = 0
|
|
82
|
+
self._last_activity = 0.0
|
|
83
|
+
|
|
84
|
+
def touch(self) -> None:
|
|
85
|
+
self._last_activity = asyncio.get_running_loop().time()
|
|
86
|
+
|
|
87
|
+
def request_started(self) -> None:
|
|
88
|
+
self._inflight_requests += 1
|
|
89
|
+
self.touch()
|
|
90
|
+
|
|
91
|
+
def request_finished(self) -> None:
|
|
92
|
+
self._inflight_requests = max(0, self._inflight_requests - 1)
|
|
93
|
+
self.touch()
|
|
94
|
+
|
|
95
|
+
async def monitor(self, task_store: Any) -> None:
|
|
96
|
+
interval = min(1.0, max(0.05, self._timeout_seconds / 10))
|
|
97
|
+
while True:
|
|
98
|
+
await asyncio.sleep(interval)
|
|
99
|
+
if self._inflight_requests:
|
|
100
|
+
continue
|
|
101
|
+
now = asyncio.get_running_loop().time()
|
|
102
|
+
if now - self._last_activity < self._timeout_seconds:
|
|
103
|
+
continue
|
|
104
|
+
if await task_store.has_active_work():
|
|
105
|
+
self._last_activity = asyncio.get_running_loop().time()
|
|
106
|
+
continue
|
|
107
|
+
if self._inflight_requests:
|
|
108
|
+
continue
|
|
109
|
+
self._callback()
|
|
110
|
+
return
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
class _A2AIdleActivityMiddleware:
|
|
114
|
+
def __init__(self, app: Any, *, controller: _A2AIdleShutdownController) -> None:
|
|
115
|
+
self._app = app
|
|
116
|
+
self._controller = controller
|
|
117
|
+
|
|
118
|
+
async def __call__(self, scope: dict[str, Any], receive: Any, send: Any) -> None:
|
|
119
|
+
if scope["type"] != "http":
|
|
120
|
+
await self._app(scope, receive, send)
|
|
121
|
+
return
|
|
122
|
+
self._controller.request_started()
|
|
123
|
+
try:
|
|
124
|
+
await self._app(scope, receive, send)
|
|
125
|
+
finally:
|
|
126
|
+
self._controller.request_finished()
|
|
127
|
+
|
|
128
|
+
|
|
75
129
|
def resolve_token(cli_token: str | None) -> str | None:
|
|
76
130
|
return cli_token or os.environ.get("IACCODE_A2A_HTTP_TOKEN")
|
|
77
131
|
|
|
@@ -339,6 +393,8 @@ def create_app(
|
|
|
339
393
|
agent_extensions: object | None = None,
|
|
340
394
|
auto_approve_permissions: bool = False,
|
|
341
395
|
thinking_exposure: object | None = None,
|
|
396
|
+
idle_shutdown_seconds: float = 0,
|
|
397
|
+
idle_shutdown_callback: Callable[[], None] | None = None,
|
|
342
398
|
) -> Starlette:
|
|
343
399
|
from iac_code.a2a.transports.dispatcher import create_runtime_components
|
|
344
400
|
|
|
@@ -371,16 +427,31 @@ def create_app(
|
|
|
371
427
|
)
|
|
372
428
|
from iac_code.a2a.pipeline_recovery import A2APipelineRecoveryService
|
|
373
429
|
|
|
430
|
+
idle_controller: _A2AIdleShutdownController | None = None
|
|
431
|
+
if idle_shutdown_seconds > 0:
|
|
432
|
+
idle_controller = _A2AIdleShutdownController(
|
|
433
|
+
idle_shutdown_seconds,
|
|
434
|
+
idle_shutdown_callback or (lambda: os.kill(os.getpid(), signal.SIGTERM)),
|
|
435
|
+
)
|
|
436
|
+
|
|
374
437
|
@asynccontextmanager
|
|
375
438
|
async def lifespan(app: Starlette):
|
|
376
439
|
push_worker_task: asyncio.Task[None] | None = None
|
|
440
|
+
idle_shutdown_task: asyncio.Task[None] | None = None
|
|
377
441
|
components.start_background_services()
|
|
378
442
|
try:
|
|
379
443
|
await components.task_store.start_cleanup_loop()
|
|
380
444
|
if components.push_worker is not None:
|
|
381
445
|
push_worker_task = asyncio.create_task(components.push_worker.serve_forever())
|
|
446
|
+
if idle_controller is not None:
|
|
447
|
+
idle_controller.touch()
|
|
448
|
+
idle_shutdown_task = asyncio.create_task(idle_controller.monitor(components.task_store))
|
|
382
449
|
yield
|
|
383
450
|
finally:
|
|
451
|
+
if idle_shutdown_task is not None:
|
|
452
|
+
idle_shutdown_task.cancel()
|
|
453
|
+
with suppress(asyncio.CancelledError):
|
|
454
|
+
await idle_shutdown_task
|
|
384
455
|
if push_worker_task is not None:
|
|
385
456
|
push_worker_task.cancel()
|
|
386
457
|
with suppress(asyncio.CancelledError):
|
|
@@ -472,6 +543,8 @@ def create_app(
|
|
|
472
543
|
api_key=api_key,
|
|
473
544
|
api_key_header=api_key_header,
|
|
474
545
|
)
|
|
546
|
+
if idle_controller is not None:
|
|
547
|
+
app.add_middleware(_A2AIdleActivityMiddleware, controller=idle_controller)
|
|
475
548
|
return app
|
|
476
549
|
|
|
477
550
|
|
|
@@ -535,10 +608,20 @@ def run_server(
|
|
|
535
608
|
push_lease_timeout_ms: int = 300_000,
|
|
536
609
|
auto_approve_permissions: bool = False,
|
|
537
610
|
thinking_exposure: object | None = None,
|
|
611
|
+
idle_shutdown_seconds: float = 0,
|
|
538
612
|
) -> None:
|
|
539
613
|
from iac_code.a2a.transports.base import normalize_transport_name, validate_transport_for_platform
|
|
540
614
|
|
|
541
615
|
normalized_transport = normalize_transport_name(transport)
|
|
616
|
+
if isinstance(idle_shutdown_seconds, bool) or not isinstance(idle_shutdown_seconds, (int, float)):
|
|
617
|
+
raise ValueError("idle_shutdown_seconds must be a non-negative number.")
|
|
618
|
+
idle_shutdown_seconds = float(idle_shutdown_seconds)
|
|
619
|
+
if not math.isfinite(idle_shutdown_seconds):
|
|
620
|
+
raise ValueError("idle_shutdown_seconds must be a non-negative number.")
|
|
621
|
+
if idle_shutdown_seconds < 0:
|
|
622
|
+
raise ValueError("idle_shutdown_seconds must be a non-negative number.")
|
|
623
|
+
if idle_shutdown_seconds > 0 and normalized_transport != "http":
|
|
624
|
+
raise RuntimeError("idle_shutdown_seconds is only supported with the HTTP transport.")
|
|
542
625
|
if persistence_dir is None:
|
|
543
626
|
from iac_code.config import get_config_dir
|
|
544
627
|
|
|
@@ -663,6 +746,13 @@ def run_server(
|
|
|
663
746
|
)
|
|
664
747
|
return
|
|
665
748
|
|
|
749
|
+
idle_server_holder: dict[str, Any] = {}
|
|
750
|
+
|
|
751
|
+
def request_idle_shutdown() -> None:
|
|
752
|
+
server = idle_server_holder.get("server")
|
|
753
|
+
if server is not None:
|
|
754
|
+
server.should_exit = True
|
|
755
|
+
|
|
666
756
|
if normalized_transport == "websocket":
|
|
667
757
|
from iac_code.a2a.transports.websocket import WebSocketA2AServerApp
|
|
668
758
|
|
|
@@ -694,6 +784,8 @@ def run_server(
|
|
|
694
784
|
supported_interfaces=supported_interfaces,
|
|
695
785
|
auto_approve_permissions=auto_approve_permissions,
|
|
696
786
|
thinking_exposure=thinking_exposure,
|
|
787
|
+
idle_shutdown_seconds=idle_shutdown_seconds,
|
|
788
|
+
idle_shutdown_callback=request_idle_shutdown,
|
|
697
789
|
)
|
|
698
790
|
|
|
699
791
|
try:
|
|
@@ -701,11 +793,16 @@ def run_server(
|
|
|
701
793
|
except ImportError as exc:
|
|
702
794
|
raise RuntimeError("A2A server dependencies are missing. Install with: pip install 'iac-code[a2a]'") from exc
|
|
703
795
|
|
|
704
|
-
|
|
705
|
-
app,
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
796
|
+
if idle_shutdown_seconds > 0:
|
|
797
|
+
server = uvicorn.Server(uvicorn.Config(app, host=host, port=port))
|
|
798
|
+
idle_server_holder["server"] = server
|
|
799
|
+
server.run()
|
|
800
|
+
else:
|
|
801
|
+
uvicorn.run(
|
|
802
|
+
app,
|
|
803
|
+
host=host,
|
|
804
|
+
port=port,
|
|
805
|
+
)
|
|
709
806
|
|
|
710
807
|
|
|
711
808
|
async def _serve_async_transport(server, *, components) -> None:
|
|
@@ -40,6 +40,7 @@ from iac_code.a2a.parts import (
|
|
|
40
40
|
parts_to_prompt,
|
|
41
41
|
parts_to_user_input,
|
|
42
42
|
resolve_workspace_path,
|
|
43
|
+
trust_request_cwd,
|
|
43
44
|
)
|
|
44
45
|
from iac_code.a2a.pipeline_events import PipelineA2AContext, PipelineEventTranslator
|
|
45
46
|
from iac_code.a2a.pipeline_executor import (
|
|
@@ -110,6 +111,7 @@ from iac_code.services.session_backup_state import (
|
|
|
110
111
|
SessionBackupState,
|
|
111
112
|
)
|
|
112
113
|
from iac_code.services.session_storage import SessionStorage
|
|
114
|
+
from iac_code.services.telemetry.attributes import normalize_telemetry_channel
|
|
113
115
|
from iac_code.types.stream_events import MessageEndEvent, MessageStartEvent, TextDeltaEvent
|
|
114
116
|
from iac_code.utils.file_security import atomic_write_text, ensure_private_dir, ensure_private_file
|
|
115
117
|
from iac_code.utils.public_errors import sanitize_strict_text
|
|
@@ -1027,9 +1029,23 @@ class IacCodeA2AExecutor(AgentExecutor):
|
|
|
1027
1029
|
return permission_ack_message(response, approved=approved)
|
|
1028
1030
|
|
|
1029
1031
|
async def execute(self, context: RequestContext, event_queue: EventQueue) -> None:
|
|
1032
|
+
metadata = getattr(context, "metadata", None) or getattr(getattr(context, "message", None), "metadata", None)
|
|
1033
|
+
permission_response = parse_permission_response(getattr(context, "message", None))
|
|
1034
|
+
context_id = (
|
|
1035
|
+
context.context_id
|
|
1036
|
+
or (permission_response.context_id if permission_response is not None else None)
|
|
1037
|
+
or "ctx-" + uuid.uuid4().hex[:12]
|
|
1038
|
+
)
|
|
1039
|
+
telemetry_channel = await self._task_store.resolve_context_telemetry_channel(
|
|
1040
|
+
context_id,
|
|
1041
|
+
self._resolve_telemetry_channel(metadata),
|
|
1042
|
+
)
|
|
1043
|
+
with a2a_request_context(telemetry_channel=telemetry_channel):
|
|
1044
|
+
await self._execute(context, event_queue, context_id=context_id)
|
|
1045
|
+
|
|
1046
|
+
async def _execute(self, context: RequestContext, event_queue: EventQueue, *, context_id: str) -> None:
|
|
1030
1047
|
requested_task_id = context.task_id or None
|
|
1031
1048
|
task_id = requested_task_id or "task-" + uuid.uuid4().hex[:12]
|
|
1032
|
-
context_id = context.context_id or "ctx-" + uuid.uuid4().hex[:12]
|
|
1033
1049
|
permission_response = parse_permission_response(getattr(context, "message", None))
|
|
1034
1050
|
if permission_response is not None:
|
|
1035
1051
|
approved = await self._permission_input_registry.answer(permission_response)
|
|
@@ -1715,7 +1731,9 @@ class IacCodeA2AExecutor(AgentExecutor):
|
|
|
1715
1731
|
raise ValueError("Invalid A2A workspace metadata.")
|
|
1716
1732
|
logical_cwd = os.path.normpath(cwd)
|
|
1717
1733
|
resolved_cwd = resolve_workspace_path(Path(logical_cwd))
|
|
1718
|
-
if not
|
|
1734
|
+
if not trust_request_cwd() and not any(
|
|
1735
|
+
_is_relative_to(resolved_cwd, root) for root in _allowed_cwd_roots()
|
|
1736
|
+
):
|
|
1719
1737
|
raise ValueError("Invalid A2A workspace metadata.")
|
|
1720
1738
|
if resolved_cwd.exists():
|
|
1721
1739
|
if not resolved_cwd.is_dir():
|
|
@@ -1737,6 +1755,16 @@ class IacCodeA2AExecutor(AgentExecutor):
|
|
|
1737
1755
|
return raw_user_id.strip()
|
|
1738
1756
|
return None
|
|
1739
1757
|
|
|
1758
|
+
def _resolve_telemetry_channel(self, metadata: Any | None) -> str | None:
|
|
1759
|
+
if metadata is not None and hasattr(metadata, "DESCRIPTOR"):
|
|
1760
|
+
metadata = MessageToDict(metadata, preserving_proto_field_name=False)
|
|
1761
|
+
if not isinstance(metadata, Mapping):
|
|
1762
|
+
return None
|
|
1763
|
+
raw_iac_meta = metadata.get("iac_code")
|
|
1764
|
+
if not isinstance(raw_iac_meta, Mapping):
|
|
1765
|
+
return None
|
|
1766
|
+
return normalize_telemetry_channel(raw_iac_meta.get("channel"))
|
|
1767
|
+
|
|
1740
1768
|
def _resolve_preferred_language(self, metadata: Any | None) -> str | None:
|
|
1741
1769
|
if metadata is not None and hasattr(metadata, "DESCRIPTOR"):
|
|
1742
1770
|
metadata = MessageToDict(metadata, preserving_proto_field_name=False)
|
|
@@ -78,6 +78,21 @@ def allowed_cwd_roots() -> list[Path]:
|
|
|
78
78
|
return [resolve_workspace_path(path) for path in candidates if path.exists() and path.is_dir()]
|
|
79
79
|
|
|
80
80
|
|
|
81
|
+
def trust_request_cwd() -> bool:
|
|
82
|
+
"""Return whether authenticated callers may select any local user workspace.
|
|
83
|
+
|
|
84
|
+
The external Skill Runtime is a localhost-only, single-user process with a
|
|
85
|
+
random bearer token. It opts into this mode so one A2A server can serve
|
|
86
|
+
multiple per-context workspaces without widening the default A2A policy.
|
|
87
|
+
"""
|
|
88
|
+
return os.environ.get("IAC_CODE_A2A_TRUST_REQUEST_CWD", "").strip().lower() in {
|
|
89
|
+
"1",
|
|
90
|
+
"true",
|
|
91
|
+
"yes",
|
|
92
|
+
"on",
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
|
|
81
96
|
def is_relative_to(path: Path, root: Path) -> bool:
|
|
82
97
|
try:
|
|
83
98
|
path.relative_to(root)
|
|
@@ -10,6 +10,7 @@ from pathlib import Path
|
|
|
10
10
|
from typing import cast
|
|
11
11
|
|
|
12
12
|
from iac_code.a2a.types import validate_protocol_id
|
|
13
|
+
from iac_code.services.telemetry.attributes import normalize_telemetry_channel
|
|
13
14
|
from iac_code.utils.file_security import atomic_write_text
|
|
14
15
|
|
|
15
16
|
_INTERRUPTED_RESTORE_STATES = {"submitted", "working", "auth-required"}
|
|
@@ -48,6 +49,7 @@ class A2AContextSnapshot:
|
|
|
48
49
|
context_id: str
|
|
49
50
|
session_id: str
|
|
50
51
|
cwd: str
|
|
52
|
+
telemetry_channel: str | None = None
|
|
51
53
|
active_task_id: str | None = None
|
|
52
54
|
updated_at: float = field(default_factory=time.time)
|
|
53
55
|
|
|
@@ -185,6 +187,7 @@ class A2APersistenceStore:
|
|
|
185
187
|
context_id=context_id,
|
|
186
188
|
session_id=session_id,
|
|
187
189
|
cwd=cwd,
|
|
190
|
+
telemetry_channel=normalize_telemetry_channel(data.get("telemetry_channel")),
|
|
188
191
|
active_task_id=active_task_id if isinstance(active_task_id, str) else None,
|
|
189
192
|
updated_at=float(updated_at) if isinstance(updated_at, (int, float)) else time.time(),
|
|
190
193
|
)
|
|
@@ -7,7 +7,7 @@ from typing import Any
|
|
|
7
7
|
|
|
8
8
|
from iac_code.providers.request_policy import ProviderRequestPolicy
|
|
9
9
|
from iac_code.services.providers.aliyun import AliyunCredential, use_aliyun_credential
|
|
10
|
-
from iac_code.services.telemetry import use_session_id, use_user_id
|
|
10
|
+
from iac_code.services.telemetry import use_session_id, use_telemetry_channel, use_user_id
|
|
11
11
|
|
|
12
12
|
_RUNTIME_OVERRIDE_UNSET = object()
|
|
13
13
|
_preferred_language: contextvars.ContextVar[str | None] = contextvars.ContextVar(
|
|
@@ -28,8 +28,11 @@ def a2a_request_context(
|
|
|
28
28
|
user_id: str | None = None,
|
|
29
29
|
aliyun_credential: AliyunCredential | None = None,
|
|
30
30
|
preferred_language: str | None = None,
|
|
31
|
+
telemetry_channel: str | None = None,
|
|
31
32
|
) -> Iterator[None]:
|
|
32
33
|
with contextlib.ExitStack() as stack:
|
|
34
|
+
if telemetry_channel:
|
|
35
|
+
stack.enter_context(use_telemetry_channel(telemetry_channel))
|
|
33
36
|
if preferred_language:
|
|
34
37
|
token = _preferred_language.set(preferred_language)
|
|
35
38
|
stack.callback(_preferred_language.reset, token)
|
|
@@ -38,6 +38,7 @@ from iac_code.i18n import _
|
|
|
38
38
|
from iac_code.services.session_backup import SessionBackupService
|
|
39
39
|
from iac_code.services.session_layout import SessionPaths, ensure_session_owned_parent
|
|
40
40
|
from iac_code.services.session_storage import SessionStorage
|
|
41
|
+
from iac_code.services.telemetry.attributes import normalize_telemetry_channel
|
|
41
42
|
from iac_code.utils.file_security import atomic_write_text
|
|
42
43
|
|
|
43
44
|
logger = logging.getLogger(__name__)
|
|
@@ -61,6 +62,7 @@ class A2ATaskStore(TaskStore):
|
|
|
61
62
|
self._tasks: dict[str, A2ATaskRecord] = {}
|
|
62
63
|
self._task_persistence_dirty: set[str] = set()
|
|
63
64
|
self._contexts: dict[str, A2AContextRecord] = {}
|
|
65
|
+
self._pending_context_telemetry_channels: dict[str, str] = {}
|
|
64
66
|
self._expired_task_tombstones: dict[str, float] = {}
|
|
65
67
|
self._metrics = metrics or NoOpA2AMetrics()
|
|
66
68
|
self._persistence = persistence
|
|
@@ -294,6 +296,9 @@ class A2ATaskStore(TaskStore):
|
|
|
294
296
|
async with self._mutation_lock:
|
|
295
297
|
if context_id in self._contexts:
|
|
296
298
|
record = self._contexts[context_id]
|
|
299
|
+
pending_channel = self._pending_context_telemetry_channels.get(context_id)
|
|
300
|
+
if pending_channel is not None:
|
|
301
|
+
record.telemetry_channel = pending_channel
|
|
297
302
|
if record.expired:
|
|
298
303
|
raise ValueError(_("A2A context expired"))
|
|
299
304
|
if record.cwd != cwd:
|
|
@@ -306,15 +311,18 @@ class A2ATaskStore(TaskStore):
|
|
|
306
311
|
else:
|
|
307
312
|
record.touch()
|
|
308
313
|
self._mirror_context(record)
|
|
314
|
+
self._pending_context_telemetry_channels.pop(context_id, None)
|
|
309
315
|
return record
|
|
310
316
|
else:
|
|
311
317
|
session_id: str | None = None
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
+
telemetry_channel = self._pending_context_telemetry_channels.get(context_id)
|
|
319
|
+
snapshot = self._load_context_snapshot(context_id)
|
|
320
|
+
if snapshot is not None:
|
|
321
|
+
if snapshot.cwd != cwd:
|
|
322
|
+
raise ValueError(_("A2A context belongs to a different workspace"))
|
|
323
|
+
session_id = snapshot.session_id
|
|
324
|
+
if telemetry_channel is None:
|
|
325
|
+
telemetry_channel = snapshot.telemetry_channel
|
|
318
326
|
|
|
319
327
|
if session_id is None:
|
|
320
328
|
session_id = str(uuid.uuid4())
|
|
@@ -323,6 +331,7 @@ class A2ATaskStore(TaskStore):
|
|
|
323
331
|
context_id=context_id,
|
|
324
332
|
session_id=session_id,
|
|
325
333
|
cwd=cwd,
|
|
334
|
+
telemetry_channel=telemetry_channel,
|
|
326
335
|
runtime=None,
|
|
327
336
|
lock=asyncio.Lock(),
|
|
328
337
|
)
|
|
@@ -397,8 +406,48 @@ class A2ATaskStore(TaskStore):
|
|
|
397
406
|
await _close_runtime(runtime)
|
|
398
407
|
record.touch()
|
|
399
408
|
self._mirror_context(record)
|
|
409
|
+
self._pending_context_telemetry_channels.pop(context_id, None)
|
|
400
410
|
return record
|
|
401
411
|
|
|
412
|
+
async def resolve_context_telemetry_channel(
|
|
413
|
+
self,
|
|
414
|
+
context_id: str,
|
|
415
|
+
requested_channel: str | None,
|
|
416
|
+
) -> str | None:
|
|
417
|
+
"""Resolve and, when explicitly supplied, bind telemetry channel to an A2A context."""
|
|
418
|
+
|
|
419
|
+
context_id = validate_protocol_id(context_id)
|
|
420
|
+
requested_channel = normalize_telemetry_channel(requested_channel)
|
|
421
|
+
async with self._mutation_lock:
|
|
422
|
+
record = self._contexts.get(context_id)
|
|
423
|
+
if record is not None:
|
|
424
|
+
if requested_channel is not None and requested_channel != record.telemetry_channel:
|
|
425
|
+
record.telemetry_channel = requested_channel
|
|
426
|
+
record.touch()
|
|
427
|
+
self._mirror_context(record)
|
|
428
|
+
return record.telemetry_channel
|
|
429
|
+
|
|
430
|
+
snapshot = self._load_context_snapshot(context_id)
|
|
431
|
+
stored_channel = self._pending_context_telemetry_channels.get(context_id)
|
|
432
|
+
if stored_channel is None and snapshot is not None:
|
|
433
|
+
stored_channel = snapshot.telemetry_channel
|
|
434
|
+
effective_channel = requested_channel or stored_channel
|
|
435
|
+
if effective_channel is None:
|
|
436
|
+
return None
|
|
437
|
+
|
|
438
|
+
self._pending_context_telemetry_channels[context_id] = effective_channel
|
|
439
|
+
if snapshot is not None and snapshot.telemetry_channel != effective_channel:
|
|
440
|
+
snapshot = A2AContextSnapshot(
|
|
441
|
+
context_id=snapshot.context_id,
|
|
442
|
+
session_id=snapshot.session_id,
|
|
443
|
+
cwd=snapshot.cwd,
|
|
444
|
+
telemetry_channel=effective_channel,
|
|
445
|
+
active_task_id=snapshot.active_task_id,
|
|
446
|
+
updated_at=time.time(),
|
|
447
|
+
)
|
|
448
|
+
self._persist_context_snapshot(snapshot)
|
|
449
|
+
return effective_channel
|
|
450
|
+
|
|
402
451
|
async def get_context_record(self, context_id: str) -> A2AContextRecord:
|
|
403
452
|
context_id = validate_protocol_id(context_id)
|
|
404
453
|
async with self._mutation_lock:
|
|
@@ -408,6 +457,7 @@ class A2ATaskStore(TaskStore):
|
|
|
408
457
|
context_id=record.context_id,
|
|
409
458
|
session_id=record.session_id,
|
|
410
459
|
cwd=record.cwd,
|
|
460
|
+
telemetry_channel=record.telemetry_channel,
|
|
411
461
|
active_task_id=record.active_task_id,
|
|
412
462
|
expired=record.expired,
|
|
413
463
|
created_at=record.created_at,
|
|
@@ -421,6 +471,7 @@ class A2ATaskStore(TaskStore):
|
|
|
421
471
|
context_id=snapshot.context_id,
|
|
422
472
|
session_id=snapshot.session_id,
|
|
423
473
|
cwd=snapshot.cwd,
|
|
474
|
+
telemetry_channel=snapshot.telemetry_channel,
|
|
424
475
|
active_task_id=snapshot.active_task_id,
|
|
425
476
|
)
|
|
426
477
|
|
|
@@ -690,11 +741,14 @@ class A2ATaskStore(TaskStore):
|
|
|
690
741
|
context_id=context_id,
|
|
691
742
|
session_id=session_id,
|
|
692
743
|
cwd=cwd,
|
|
744
|
+
telemetry_channel=snapshot.telemetry_channel,
|
|
693
745
|
lock=asyncio.Lock(),
|
|
694
746
|
)
|
|
695
747
|
self._contexts[context_id] = record
|
|
696
748
|
elif record.session_id != session_id or record.cwd != cwd:
|
|
697
749
|
raise ValueError(_("A2A context belongs to a different workspace"))
|
|
750
|
+
elif record.telemetry_channel is None:
|
|
751
|
+
record.telemetry_channel = snapshot.telemetry_channel
|
|
698
752
|
runtime = record.runtime
|
|
699
753
|
record.runtime = None
|
|
700
754
|
record.active_task_id = None if clear_active_task_for_proven_handoff else snapshot.active_task_id
|
|
@@ -704,6 +758,7 @@ class A2ATaskStore(TaskStore):
|
|
|
704
758
|
context_id=record.context_id,
|
|
705
759
|
session_id=record.session_id,
|
|
706
760
|
cwd=record.cwd,
|
|
761
|
+
telemetry_channel=record.telemetry_channel,
|
|
707
762
|
active_task_id=record.active_task_id,
|
|
708
763
|
expired=record.expired,
|
|
709
764
|
created_at=record.created_at,
|
|
@@ -802,6 +857,23 @@ class A2ATaskStore(TaskStore):
|
|
|
802
857
|
async with self._mutation_lock:
|
|
803
858
|
return self._task_is_active_locked(task_id)
|
|
804
859
|
|
|
860
|
+
async def has_active_work(self) -> bool:
|
|
861
|
+
"""Return whether shutting down would interrupt in-process A2A work."""
|
|
862
|
+
async with self._mutation_lock:
|
|
863
|
+
return (
|
|
864
|
+
any(record.active_task is not None and not record.active_task.done() for record in self._tasks.values())
|
|
865
|
+
or any(not task.done() for task in self._context_runtime_tasks.values())
|
|
866
|
+
or any(
|
|
867
|
+
not task.done()
|
|
868
|
+
for starts in self._context_execution_starts.values()
|
|
869
|
+
for task in starts.values()
|
|
870
|
+
)
|
|
871
|
+
or any(self._context_reconciliation_waiters.values())
|
|
872
|
+
or any(lock.locked() for lock in self._reconciliation_locks.values())
|
|
873
|
+
or any(count > 0 for count in self._context_runtime_waiters.values())
|
|
874
|
+
or any(not task.done() for task in self._discarded_context_runtime_tasks)
|
|
875
|
+
)
|
|
876
|
+
|
|
805
877
|
def mirror_task(self, record: A2ATaskRecord) -> None:
|
|
806
878
|
record.updated_at = time.time()
|
|
807
879
|
self._mirror_task(record)
|
|
@@ -873,6 +945,7 @@ class A2ATaskStore(TaskStore):
|
|
|
873
945
|
for context_id, task in self._context_runtime_tasks.items()
|
|
874
946
|
]
|
|
875
947
|
self._contexts.clear()
|
|
948
|
+
self._pending_context_telemetry_channels.clear()
|
|
876
949
|
self._context_runtime_tasks.clear()
|
|
877
950
|
self._context_runtime_waiters.clear()
|
|
878
951
|
for task, waiters in runtime_tasks:
|
|
@@ -917,13 +990,17 @@ class A2ATaskStore(TaskStore):
|
|
|
917
990
|
context_id=record.context_id,
|
|
918
991
|
session_id=record.session_id,
|
|
919
992
|
cwd=record.cwd,
|
|
993
|
+
telemetry_channel=record.telemetry_channel,
|
|
920
994
|
active_task_id=record.active_task_id,
|
|
921
995
|
)
|
|
996
|
+
self._persist_context_snapshot(snapshot)
|
|
997
|
+
|
|
998
|
+
def _persist_context_snapshot(self, snapshot: A2AContextSnapshot) -> None:
|
|
922
999
|
if self._persistence is not None:
|
|
923
1000
|
try:
|
|
924
1001
|
self._persistence.save_context(snapshot)
|
|
925
1002
|
except Exception:
|
|
926
|
-
logger.exception("Failed to persist A2A context %s",
|
|
1003
|
+
logger.exception("Failed to persist A2A context %s", snapshot.context_id)
|
|
927
1004
|
self._mirror_session_context(snapshot)
|
|
928
1005
|
|
|
929
1006
|
def _mirror_session_task(self, snapshot: A2ATaskSnapshot) -> None:
|
|
@@ -1099,6 +1176,7 @@ def _load_session_context_snapshot(*, cwd: str, session_id: str) -> A2AContextSn
|
|
|
1099
1176
|
context_id=context_id,
|
|
1100
1177
|
session_id=snapshot_session_id,
|
|
1101
1178
|
cwd=snapshot_cwd,
|
|
1179
|
+
telemetry_channel=normalize_telemetry_channel(payload.get("telemetry_channel")),
|
|
1102
1180
|
active_task_id=active_task_id,
|
|
1103
1181
|
updated_at=float(updated_at) if isinstance(updated_at, (int, float)) else time.time(),
|
|
1104
1182
|
)
|
|
@@ -795,6 +795,7 @@ def a2a(
|
|
|
795
795
|
push_consumer_name = config.get("push_consumer_name", "")
|
|
796
796
|
push_lease_timeout_ms = config.get("push_lease_timeout_ms", 300000)
|
|
797
797
|
auto_approve_permissions = config.get("auto_approve_permissions", False)
|
|
798
|
+
idle_shutdown_seconds = config.get("idle_shutdown_seconds", 0)
|
|
798
799
|
log_to_stdout = _a2a_config_value(ctx, config, "log_to_stdout", log_to_stdout)
|
|
799
800
|
thinking_exposure = _a2a_config_value(ctx, config, "thinking_exposure", thinking_exposure)
|
|
800
801
|
model = load_saved_model() or DEFAULT_MODEL
|
|
@@ -938,6 +939,7 @@ def a2a(
|
|
|
938
939
|
consumer_group=consumer_group,
|
|
939
940
|
auto_approve_permissions=auto_approve_permissions,
|
|
940
941
|
thinking_exposure=thinking_exposure,
|
|
942
|
+
idle_shutdown_seconds=idle_shutdown_seconds,
|
|
941
943
|
)
|
|
942
944
|
except (RuntimeError, ValueError) as exc:
|
|
943
945
|
exit_reason = "error"
|
|
Binary file
|