iac-code 0.11.0__tar.gz → 0.11.2__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.11.0 → iac_code-0.11.2}/PKG-INFO +3 -2
- {iac_code-0.11.0 → iac_code-0.11.2}/README.md +2 -1
- iac_code-0.11.2/src/iac_code/__init__.py +2 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/app.py +170 -4
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/events.py +42 -23
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/executor.py +16 -15
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/jsonrpc_passthrough.py +6 -1
- iac_code-0.11.2/src/iac_code/a2a/metadata_redaction.py +32 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/pipeline_events.py +10 -16
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/pipeline_executor.py +5 -23
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/pipeline_flow_monitor.py +1 -1
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/pipeline_recovery.py +2 -8
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/pipeline_snapshot.py +38 -65
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/pipeline_stream.py +16 -36
- iac_code-0.11.2/src/iac_code/a2a/projection.py +406 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/push.py +17 -6
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/push_worker.py +24 -8
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/task_store.py +48 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/transports/dispatcher.py +46 -13
- iac_code-0.11.2/src/iac_code/a2a/transports/grpc.py +113 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/transports/grpc_jsonrpc.py +15 -7
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/transports/redis_streams.py +9 -2
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/transports/stdio.py +12 -3
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/transports/websocket.py +11 -3
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/acp/convert.py +5 -7
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/acp/server.py +9 -16
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/acp/session.py +16 -44
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/acp/slash_registry.py +6 -6
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/cli/headless.py +6 -6
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/cli/output_formats.py +5 -31
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/cli/process_events.py +3 -4
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/config.py +2 -1
- iac_code-0.11.2/src/iac_code/i18n/locales/de/LC_MESSAGES/messages.mo +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/i18n/locales/de/LC_MESSAGES/messages.po +1002 -23
- iac_code-0.11.2/src/iac_code/i18n/locales/de/LC_MESSAGES/webui.mo +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/i18n/locales/de/LC_MESSAGES/webui.po +78 -14
- iac_code-0.11.2/src/iac_code/i18n/locales/es/LC_MESSAGES/messages.mo +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/i18n/locales/es/LC_MESSAGES/messages.po +1004 -23
- iac_code-0.11.2/src/iac_code/i18n/locales/es/LC_MESSAGES/webui.mo +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/i18n/locales/es/LC_MESSAGES/webui.po +81 -14
- iac_code-0.11.2/src/iac_code/i18n/locales/fr/LC_MESSAGES/messages.mo +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/i18n/locales/fr/LC_MESSAGES/messages.po +1008 -23
- iac_code-0.11.2/src/iac_code/i18n/locales/fr/LC_MESSAGES/webui.mo +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/i18n/locales/fr/LC_MESSAGES/webui.po +81 -14
- iac_code-0.11.2/src/iac_code/i18n/locales/ja/LC_MESSAGES/messages.mo +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/i18n/locales/ja/LC_MESSAGES/messages.po +841 -23
- iac_code-0.11.2/src/iac_code/i18n/locales/ja/LC_MESSAGES/webui.mo +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/i18n/locales/ja/LC_MESSAGES/webui.po +72 -14
- iac_code-0.11.2/src/iac_code/i18n/locales/pt/LC_MESSAGES/messages.mo +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/i18n/locales/pt/LC_MESSAGES/messages.po +999 -23
- iac_code-0.11.2/src/iac_code/i18n/locales/pt/LC_MESSAGES/webui.mo +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/i18n/locales/pt/LC_MESSAGES/webui.po +80 -14
- iac_code-0.11.2/src/iac_code/i18n/locales/zh/LC_MESSAGES/messages.mo +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/i18n/locales/zh/LC_MESSAGES/messages.po +829 -19
- iac_code-0.11.2/src/iac_code/i18n/locales/zh/LC_MESSAGES/webui.mo +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/i18n/locales/zh/LC_MESSAGES/webui.po +72 -14
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/mcp/cli.py +2 -2
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/mcp/oauth.py +62 -40
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/mcp/storage.py +6 -2
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/cleanup.py +14 -15
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/complete_step_tool.py +18 -25
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/events.py +2 -4
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/handoff.py +14 -1
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/observability.py +2 -2
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/pipeline_runner.py +31 -22
- iac_code-0.11.2/src/iac_code/pipeline/engine/public_errors.py +57 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/sub_pipeline_executor.py +35 -34
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/hooks/deploying.py +18 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/prompts/cost_estimating.md +1 -1
- {iac_code-0.11.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost → iac_code-0.11.2/src/iac_code/pipeline/selling}/references/template-parameter-recommendation.md +7 -7
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/SKILL.md +1 -1
- {iac_code-0.11.0/src/iac_code/pipeline/selling → iac_code-0.11.2/src/iac_code/pipeline/selling/skills/iac-aliyun-cost}/references/template-parameter-recommendation.md +7 -7
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/SKILL.md +1 -1
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/template-parameter-recommendation.md +7 -7
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/template-parameter-recommendation.md +7 -7
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/tools/ros_deploy_tool.py +7 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/anthropic_provider.py +6 -1
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/dashscope_provider.py +2 -2
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/deepseek_provider.py +5 -1
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/manager.py +6 -1
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/registry.py +8 -2
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/thinking.py +79 -13
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/agent_factory.py +4 -1
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/context_manager.py +6 -2
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/telemetry/constants.py +4 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/telemetry/content_serializer.py +59 -14
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/telemetry/sanitize.py +4 -2
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/analyzer.py +29 -11
- iac_code-0.11.2/src/iac_code/tools/cloud/aliyun/ros_validation/association_property_specs.py +693 -0
- iac_code-0.11.2/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_association_property_specs.json +12563 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/model.py +5 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/outcome.py +1 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/renderer.py +53 -5
- iac_code-0.11.2/src/iac_code/tools/cloud/aliyun/ros_validation/rules/association_property.py +3248 -0
- iac_code-0.11.2/src/iac_code/tools/cloud/aliyun/ros_validation/template_kind.py +16 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/validator.py +6 -1
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/renderer.py +2 -9
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/repl.py +4 -15
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/public_errors.py +29 -1
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/public_paths.py +125 -1
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/app.py +33 -22
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/events.py +12 -50
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/pipeline_actions.py +2 -6
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/runtime.py +25 -5
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/server.py +2 -2
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/session_manager.py +85 -0
- iac_code-0.11.2/src/iac_code/web/session_titler.py +82 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/settings.py +33 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/shell.py +3 -4
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/index.html +2 -2
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/js/api.js +15 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/js/app.js +136 -24
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/js/components/composer.js +32 -16
- iac_code-0.11.2/src/iac_code/web/static/js/components/image_lightbox.js +77 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/js/components/output_panel.js +5 -2
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/js/components/workspace.js +315 -88
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/styles.css +131 -16
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code.egg-info/PKG-INFO +3 -2
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code.egg-info/SOURCES.txt +7 -0
- iac_code-0.11.0/src/iac_code/__init__.py +0 -2
- iac_code-0.11.0/src/iac_code/a2a/metadata_redaction.py +0 -89
- iac_code-0.11.0/src/iac_code/a2a/transports/grpc.py +0 -52
- iac_code-0.11.0/src/iac_code/i18n/locales/de/LC_MESSAGES/messages.mo +0 -0
- iac_code-0.11.0/src/iac_code/i18n/locales/de/LC_MESSAGES/webui.mo +0 -0
- iac_code-0.11.0/src/iac_code/i18n/locales/es/LC_MESSAGES/messages.mo +0 -0
- iac_code-0.11.0/src/iac_code/i18n/locales/es/LC_MESSAGES/webui.mo +0 -0
- iac_code-0.11.0/src/iac_code/i18n/locales/fr/LC_MESSAGES/messages.mo +0 -0
- iac_code-0.11.0/src/iac_code/i18n/locales/fr/LC_MESSAGES/webui.mo +0 -0
- iac_code-0.11.0/src/iac_code/i18n/locales/ja/LC_MESSAGES/messages.mo +0 -0
- iac_code-0.11.0/src/iac_code/i18n/locales/ja/LC_MESSAGES/webui.mo +0 -0
- iac_code-0.11.0/src/iac_code/i18n/locales/pt/LC_MESSAGES/messages.mo +0 -0
- iac_code-0.11.0/src/iac_code/i18n/locales/pt/LC_MESSAGES/webui.mo +0 -0
- iac_code-0.11.0/src/iac_code/i18n/locales/zh/LC_MESSAGES/messages.mo +0 -0
- iac_code-0.11.0/src/iac_code/i18n/locales/zh/LC_MESSAGES/webui.mo +0 -0
- iac_code-0.11.0/src/iac_code/pipeline/engine/public_errors.py +0 -17
- {iac_code-0.11.0 → iac_code-0.11.2}/LICENSE +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/MANIFEST.in +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/pyproject.toml +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/setup.cfg +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/setup.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/agent_card.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/artifacts.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/backup.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/client.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/exposure.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/metrics.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/parts.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/persistence.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/pipeline_delta_coalescing.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/pipeline_journal.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/pipeline_outbound.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/pipeline_paths.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/pipeline_performance.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/pipeline_transport_delivery.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/push_queue.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/push_secrets.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/router.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/runtime_overrides.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/runtime_registry.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/signing.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/thinking_metadata.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/transport.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/transports/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/transports/base.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/transports/http.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/transports/unix.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/a2a/types.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/acp/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/acp/http_sse.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/acp/mcp.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/acp/metrics.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/acp/runner.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/acp/state.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/acp/tools.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/acp/types.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/acp/version.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/agent/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/agent/agent_loop.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/agent/agent_tool.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/agent/agent_types.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/agent/message.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/agent/system_prompt.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/cli/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/cli/install_git_bash.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/cli/main.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/cli/process_mode.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/cli/process_protocol.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/cli/update.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/auth.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/clear.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/compact.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/debug.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/effort.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/exit.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/help.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/mcp.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/memory.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/model.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/prompt.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/registry.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/rename.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/resume.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/skills.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/status.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/tasks.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/commands/thinking_enabled.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/i18n/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/i18n/html_extractor.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/mcp/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/mcp/client.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/mcp/config.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/mcp/env_expansion.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/mcp/errors.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/mcp/manager.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/mcp/output.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/mcp/progress.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/mcp/prompt_dispatch.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/mcp/prompts.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/mcp/redaction.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/mcp/skills.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/mcp/tools.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/mcp/types.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/memory/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/memory/memory_manager.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/memory/memory_tools.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/memory/project_memory.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/memory/recall.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/config.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/constants.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/display_names.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/architecture_graph.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/architecture_meta.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/architecture_metas/Categories.json +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/architecture_metas/config.json +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/architecture_metas/products.json +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/architecture_resource_inventory.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/architecture_rule_candidates.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/architecture_rule_drafts.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/architecture_rule_facts.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/architecture_rules.json +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/architecture_rules.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/architecture_semantic_planning.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/ask_user_question_tool.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/completion_guard_state.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/context.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/display_replay.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/interrupt.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/loader.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/prerequisites.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/prompts/interrupt_judge.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/recovery.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/resume_recovery.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/session.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/show_diagram_tool.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/state_machine.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/step_executor.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/step_spec.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/transcript_storage.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/types.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/ui_contract.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/engine/user_input.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/pipeline.yaml +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/prompts/architecture_planning.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/prompts/confirm_and_select.a2a.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/prompts/confirm_and_select.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/prompts/deploying.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/prompts/evaluate_candidates.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/prompts/intent_parsing.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/prompts/reviewing.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/prompts/template_generating.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/references/cloud-products/ecs.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/references/cloud-products/oss.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/references/cloud-products/rds.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/references/cloud-products/redis.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/references/cloud-products/slb.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/references/cloud-products/vpc.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/references/ros-template.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/references/template-parameters.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/references/terraform-template.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-architecture/SKILL.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-architecture/evals.json +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/evals.json +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/ecs.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/oss.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/rds.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/redis.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/slb.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/cloud-products/vpc.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/ros-template.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/template-parameters.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/references/terraform-template.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/evals.json +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/ecs.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/oss.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/rds.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/redis.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/slb.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/vpc.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/ros-template.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/template-parameters.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/terraform-template.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-intent/SKILL.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-intent/evals.json +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-review/SKILL.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-review/evals.json +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/SKILL.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/evals.json +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/ecs.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/oss.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/rds.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/redis.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/slb.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/vpc.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/ros-template.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/template-parameters.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/terraform-template.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/tools/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/tools/infraguard_scan_tool.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/tools/ros_template_tools.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/pipeline/selling/tools/show_candidate_detail_tool.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/azure_openai_provider.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/base.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/gemini_provider.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/kimi_provider.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/lmstudio_provider.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/minimax_provider.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/modelscope_provider.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/ollama_provider.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/openai_provider.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/openrouter_provider.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/request_logging.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/request_policy.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/retry.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/siliconflow_provider.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/stream_watchdog.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/volcengine_provider.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/providers/zhipu_provider.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/capabilities/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/capabilities/auto_detect.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/capabilities/multimodal.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/cloud_credentials.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/permissions/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/permissions/audit.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/permissions/loader.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/permissions/pipeline.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/permissions/rule_scope.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/permissions/storage.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/permissions/trusted_roots.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/providers/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/providers/aliyun.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/providers/aliyun_oauth.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/qwenpaw_source.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/session_backup.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/session_backup_state.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/session_index.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/session_layout.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/session_metadata.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/session_resolver.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/session_storage.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/session_usage.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/telemetry/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/telemetry/attributes.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/telemetry/client.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/telemetry/config.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/telemetry/events.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/telemetry/fallback.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/telemetry/identity.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/telemetry/metrics.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/telemetry/names.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/telemetry/scope.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/telemetry/sink.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/telemetry/tracing.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/telemetry/types.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/token_budget.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/token_counter.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/services/update_checker.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/auto_trigger.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/iac_aliyun/SKILL.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/iac_aliyun/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/iac_aliyun/auto_trigger.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/ecs.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/oss.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/rds.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/redis.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/slb.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/vpc.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/iac_aliyun/references/ros-template.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/iac_aliyun/references/template-parameter-recommendation.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/iac_aliyun/references/template-parameters.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/iac_aliyun/references/terraform-template.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/iac_aliyun/scripts/tf2ros.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/pac_aliyun/SKILL.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/pac_aliyun/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/pac_aliyun/auto_trigger.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/pac_aliyun/references/infraguard-policy-generation.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/bundled/simplify.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/discovery.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/frontmatter.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/listing.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/loader.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/management.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/processor.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/renderer.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/settings.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/skill_definition.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/skills/skill_tool.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/state/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/state/app_state.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tasks/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tasks/notification_queue.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tasks/task_state.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tasks/task_tools.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/base.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/bash/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/bash/argv_safety.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/bash/bash_tool.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/bash/command_parser.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/bash/mode_validation.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/bash/path_validation.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/bash/permissions.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/bash/readonly_commands.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/bash/rule_matching.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/bash/safety_checks.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/acs3_transport.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/aliyun_api.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/aliyun_api_doc.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/aliyun_doc_search.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/api_contract.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/api_hooks.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/api_identifiers.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/contract_store.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/data/README.md +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/data/endpoints/catalog.json +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/data/endpoints/generation_report.json +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/data/endpoints/legacy.yml +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/data/endpoints/overrides.yml +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/data/endpoints/unavailable.json +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/data/openmeta/api_overrides.yml +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/data/openmeta/exclusions.yml +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/data/openmeta/product_aliases.yml +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/data/openmeta/product_catalog.json +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/data/oss/operation_catalog.json +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/data/validation/judgments.yml +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/data/validation/overrides.yml +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/endpoint_resolver.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/hooks/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/hooks/ros_parameters.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/openmeta.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/oss_v4_adapter.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/product_resolver.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/public_errors.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/result_contract.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/retry_policy.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_client.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_stack.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_stack_instances.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_template_tools.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/action_policy.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/count.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_official_resource_index.json +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_resource_value_specs.json +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/data/ros_template_body_action_policies.json +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/facts.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/function_specs.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/parser.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/resource_value_specs.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/base.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/rules/registry.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/symbols.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_validation/types.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/ros_yaml.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/runtime.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/template_source.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/user_agent.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/aliyun/validation_policy.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/base_api.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/base_stack.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/registry.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/cloud/types.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/edit_file.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/glob.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/grep.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/list_files.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/path_safety.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/read_file.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/result_storage.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/tool_executor.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/web_fetch.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/tools/write_file.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/types/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/types/permissions.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/types/skill_source.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/types/stream_events.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/banner.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/components/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/components/candidate_selection.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/components/dialog.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/components/divider.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/components/fuzzy_picker.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/components/parallel_tabs.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/components/progress_bar.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/components/search_box.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/components/select.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/components/status_icon.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/components/tabs.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/core/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/core/in_place_render.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/core/input_history.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/core/key_event.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/core/prompt_input.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/core/raw_input.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/core/raw_input_win.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/core/screen.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/diagram_rendering.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/dialogs/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/dialogs/global_search.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/dialogs/history_search.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/dialogs/mcp_manager.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/dialogs/memory.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/dialogs/memory_editor.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/dialogs/model_picker.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/dialogs/quick_open.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/dialogs/resume_picker.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/dialogs/skills_picker.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/keybindings/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/keybindings/manager.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/pipeline_display_replay.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/pipeline_styles.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/spinner.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/stream_accumulator.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/suggestions/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/suggestions/aggregator.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/suggestions/command_provider.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/suggestions/directory_provider.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/suggestions/file_provider.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/suggestions/shell_history_provider.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/suggestions/skill_provider.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/suggestions/token_extractor.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/suggestions/types.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/ui/transcript_view.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/async_lifecycle.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/background_housekeeping.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/cleanup.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/console.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/file_security.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/image/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/image/clipboard.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/image/format_detect.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/image/pasted_content.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/image/processor.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/image/resizer.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/image/store.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/json_utils.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/log.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/path_components.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/path_locks.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/platform.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/project_paths.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/signals.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/state_io.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/tool_input_parser.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/tool_result_redaction.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/utils/windows_paths.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/__init__.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/cleanup.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/commands.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/diagram_cache.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/diagram_optimizer.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/diagrams.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/files.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/images.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/mcp_settings.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/memory.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/outputs.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/permissions.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/pipeline.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/pipeline_prerequisites.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/pipeline_transcript.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/security.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/skills.py +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/icons/sidebar-new-thread.svg +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/icons/sidebar-project-open.svg +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/icons/sidebar-search.svg +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/icons/sidebar-settings.svg +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/icons/sidebar-skills.svg +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/js/components/blocking.js +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/js/components/pipeline.js +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/js/components/tool_cards.js +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/js/events.js +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/js/i18n.js +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/js/mermaid_render.js +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/js/vendor/markdown-it.LICENSE +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/js/vendor/markdown-it.min.js +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/js/vendor/mermaid.LICENSE +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code/web/static/js/vendor/mermaid.min.js +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code.egg-info/dependency_links.txt +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code.egg-info/entry_points.txt +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/src/iac_code.egg-info/requires.txt +0 -0
- {iac_code-0.11.0 → iac_code-0.11.2}/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.11.
|
|
3
|
+
Version: 0.11.2
|
|
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
|
|
@@ -77,9 +77,10 @@ echo "Create an OSS Bucket" | iac-code --prompt -
|
|
|
77
77
|
|
|
78
78
|
### Web App
|
|
79
79
|
|
|
80
|
-
Prefer a graphical interface? Launch the local web app, which runs the same engine as the CLI and shares the same sessions:
|
|
80
|
+
Prefer a graphical interface? Launch the local web app, which runs the same engine as the CLI and shares the same sessions. The web app needs the `http` extra, so install it first:
|
|
81
81
|
|
|
82
82
|
```bash
|
|
83
|
+
pip install 'iac-code[http]'
|
|
83
84
|
iac-code web
|
|
84
85
|
```
|
|
85
86
|
|
|
@@ -57,9 +57,10 @@ echo "Create an OSS Bucket" | iac-code --prompt -
|
|
|
57
57
|
|
|
58
58
|
### Web App
|
|
59
59
|
|
|
60
|
-
Prefer a graphical interface? Launch the local web app, which runs the same engine as the CLI and shares the same sessions:
|
|
60
|
+
Prefer a graphical interface? Launch the local web app, which runs the same engine as the CLI and shares the same sessions. The web app needs the `http` extra, so install it first:
|
|
61
61
|
|
|
62
62
|
```bash
|
|
63
|
+
pip install 'iac-code[http]'
|
|
63
64
|
iac-code web
|
|
64
65
|
```
|
|
65
66
|
|
|
@@ -12,7 +12,7 @@ from contextlib import asynccontextmanager, suppress
|
|
|
12
12
|
from email.utils import formatdate
|
|
13
13
|
from pathlib import Path
|
|
14
14
|
from time import time
|
|
15
|
-
from typing import Awaitable, Callable
|
|
15
|
+
from typing import Any, AsyncIterator, Awaitable, Callable, cast
|
|
16
16
|
|
|
17
17
|
from a2a.auth.user import User
|
|
18
18
|
from a2a.server.context import ServerCallContext
|
|
@@ -30,6 +30,12 @@ from iac_code.a2a.jsonrpc_passthrough import (
|
|
|
30
30
|
install_jsonrpc_error_data_passthrough,
|
|
31
31
|
install_v03_jsonrpc_error_data_passthrough,
|
|
32
32
|
)
|
|
33
|
+
from iac_code.a2a.projection import (
|
|
34
|
+
project_a2a_data,
|
|
35
|
+
project_a2a_text,
|
|
36
|
+
resolve_a2a_public_path_roots,
|
|
37
|
+
resolve_a2a_public_path_roots_for_data,
|
|
38
|
+
)
|
|
33
39
|
from iac_code.i18n import _
|
|
34
40
|
|
|
35
41
|
logger = logging.getLogger(__name__)
|
|
@@ -144,6 +150,146 @@ class A2AAuthMiddleware(BaseHTTPMiddleware):
|
|
|
144
150
|
)
|
|
145
151
|
|
|
146
152
|
|
|
153
|
+
class A2AProjectionMiddleware(BaseHTTPMiddleware):
|
|
154
|
+
"""Apply the current A2A delivery policy at the HTTP wire boundary."""
|
|
155
|
+
|
|
156
|
+
def __init__(self, app: Any, *, task_store: Any) -> None:
|
|
157
|
+
super().__init__(app)
|
|
158
|
+
self._task_store = task_store
|
|
159
|
+
|
|
160
|
+
async def dispatch(self, request: Request, call_next: Callable[[Request], Awaitable[Response]]) -> Response:
|
|
161
|
+
request_data = await _a2a_request_data(request)
|
|
162
|
+
response = await call_next(request)
|
|
163
|
+
request_data = _with_a2a_path_parameters(request, request_data)
|
|
164
|
+
if request.url.path in {"/health", AGENT_CARD_WELL_KNOWN_PATH}:
|
|
165
|
+
return response
|
|
166
|
+
|
|
167
|
+
content_type = response.headers.get("content-type", "").lower()
|
|
168
|
+
streaming_response = cast(Any, response)
|
|
169
|
+
if content_type.startswith("text/event-stream"):
|
|
170
|
+
streaming_response.body_iterator = self._project_sse(
|
|
171
|
+
streaming_response.body_iterator,
|
|
172
|
+
request_data=request_data,
|
|
173
|
+
)
|
|
174
|
+
return response
|
|
175
|
+
if "json" not in content_type:
|
|
176
|
+
return response
|
|
177
|
+
|
|
178
|
+
body = b"".join([_response_chunk_bytes(chunk) async for chunk in streaming_response.body_iterator])
|
|
179
|
+
try:
|
|
180
|
+
data = json.loads(body)
|
|
181
|
+
except (UnicodeDecodeError, json.JSONDecodeError):
|
|
182
|
+
return Response(
|
|
183
|
+
body,
|
|
184
|
+
status_code=response.status_code,
|
|
185
|
+
headers=_response_headers_without_length(response),
|
|
186
|
+
background=response.background,
|
|
187
|
+
)
|
|
188
|
+
roots = await self._resolve_roots(data, request_data)
|
|
189
|
+
projected = project_a2a_data(data, public_path_roots=roots)
|
|
190
|
+
return Response(
|
|
191
|
+
json.dumps(projected, ensure_ascii=False, separators=(",", ":")).encode("utf-8"),
|
|
192
|
+
status_code=response.status_code,
|
|
193
|
+
headers=_response_headers_without_length(response),
|
|
194
|
+
background=response.background,
|
|
195
|
+
)
|
|
196
|
+
|
|
197
|
+
async def _project_sse(self, body_iterator: Any, *, request_data: Any) -> AsyncIterator[bytes]:
|
|
198
|
+
pending = b""
|
|
199
|
+
async for chunk in body_iterator:
|
|
200
|
+
pending += _response_chunk_bytes(chunk)
|
|
201
|
+
while True:
|
|
202
|
+
frame, separator, pending = _take_sse_frame(pending)
|
|
203
|
+
if separator is None:
|
|
204
|
+
pending = frame
|
|
205
|
+
break
|
|
206
|
+
yield await self._project_sse_frame(frame, request_data=request_data) + separator
|
|
207
|
+
if pending:
|
|
208
|
+
yield await self._project_sse_frame(pending, request_data=request_data)
|
|
209
|
+
|
|
210
|
+
async def _project_sse_frame(self, frame: bytes, *, request_data: Any) -> bytes:
|
|
211
|
+
output: list[bytes] = []
|
|
212
|
+
for line in frame.splitlines(keepends=True):
|
|
213
|
+
stripped = line.lstrip()
|
|
214
|
+
if not stripped.startswith(b"data:"):
|
|
215
|
+
output.append(line)
|
|
216
|
+
continue
|
|
217
|
+
prefix_length = len(line) - len(stripped)
|
|
218
|
+
payload_with_ending = stripped.removeprefix(b"data:")
|
|
219
|
+
ending = b""
|
|
220
|
+
if payload_with_ending.endswith(b"\r\n"):
|
|
221
|
+
payload_with_ending, ending = payload_with_ending[:-2], b"\r\n"
|
|
222
|
+
elif payload_with_ending.endswith(b"\n"):
|
|
223
|
+
payload_with_ending, ending = payload_with_ending[:-1], b"\n"
|
|
224
|
+
try:
|
|
225
|
+
data = json.loads(payload_with_ending.strip())
|
|
226
|
+
except (UnicodeDecodeError, json.JSONDecodeError):
|
|
227
|
+
output.append(line)
|
|
228
|
+
continue
|
|
229
|
+
roots = await self._resolve_roots(data, request_data)
|
|
230
|
+
projected = project_a2a_data(data, public_path_roots=roots)
|
|
231
|
+
encoded = json.dumps(projected, ensure_ascii=False, separators=(",", ":")).encode("utf-8")
|
|
232
|
+
output.append(line[:prefix_length] + b"data: " + encoded + ending)
|
|
233
|
+
return b"".join(output)
|
|
234
|
+
|
|
235
|
+
async def _resolve_roots(self, response_data: Any, request_data: Any) -> list[dict[str, str]]:
|
|
236
|
+
return await resolve_a2a_public_path_roots_for_data(
|
|
237
|
+
self._task_store,
|
|
238
|
+
response_data=response_data,
|
|
239
|
+
request_data=request_data,
|
|
240
|
+
)
|
|
241
|
+
|
|
242
|
+
|
|
243
|
+
async def _a2a_request_data(request: Request) -> Any:
|
|
244
|
+
data: dict[str, Any] = dict(request.query_params)
|
|
245
|
+
if request.method in {"POST", "PUT", "PATCH"}:
|
|
246
|
+
try:
|
|
247
|
+
body = await request.json()
|
|
248
|
+
except Exception:
|
|
249
|
+
body = None
|
|
250
|
+
if isinstance(body, dict):
|
|
251
|
+
data.update(body)
|
|
252
|
+
elif body is not None:
|
|
253
|
+
data["body"] = body
|
|
254
|
+
return data
|
|
255
|
+
|
|
256
|
+
|
|
257
|
+
def _with_a2a_path_parameters(request: Request, request_data: Any) -> dict[str, Any]:
|
|
258
|
+
"""Add REST route identity after routing has populated ``path_params``."""
|
|
259
|
+
|
|
260
|
+
data = dict(request_data) if isinstance(request_data, dict) else {"body": request_data}
|
|
261
|
+
path_params = request.scope.get("path_params")
|
|
262
|
+
if not isinstance(path_params, dict):
|
|
263
|
+
return data
|
|
264
|
+
task_id = path_params.get("id")
|
|
265
|
+
if isinstance(task_id, str) and task_id and "/tasks/" in request.url.path:
|
|
266
|
+
data.setdefault("taskId", task_id)
|
|
267
|
+
context_id = path_params.get("context_id") or path_params.get("contextId")
|
|
268
|
+
if isinstance(context_id, str) and context_id:
|
|
269
|
+
data.setdefault("contextId", context_id)
|
|
270
|
+
return data
|
|
271
|
+
|
|
272
|
+
|
|
273
|
+
def _response_chunk_bytes(chunk: Any) -> bytes:
|
|
274
|
+
if isinstance(chunk, bytes):
|
|
275
|
+
return chunk
|
|
276
|
+
if isinstance(chunk, memoryview):
|
|
277
|
+
return chunk.tobytes()
|
|
278
|
+
return str(chunk).encode("utf-8")
|
|
279
|
+
|
|
280
|
+
|
|
281
|
+
def _response_headers_without_length(response: Response) -> dict[str, str]:
|
|
282
|
+
return {key: value for key, value in response.headers.items() if key.lower() != "content-length"}
|
|
283
|
+
|
|
284
|
+
|
|
285
|
+
def _take_sse_frame(data: bytes) -> tuple[bytes, bytes | None, bytes]:
|
|
286
|
+
candidates = [(index, separator) for separator in (b"\r\n\r\n", b"\n\n") if (index := data.find(separator)) >= 0]
|
|
287
|
+
if not candidates:
|
|
288
|
+
return data, None, b""
|
|
289
|
+
index, separator = min(candidates, key=lambda item: item[0])
|
|
290
|
+
return data[:index], separator, data[index + len(separator) :]
|
|
291
|
+
|
|
292
|
+
|
|
147
293
|
async def health(request: Request) -> JSONResponse:
|
|
148
294
|
return JSONResponse({"status": "healthy"})
|
|
149
295
|
|
|
@@ -253,6 +399,13 @@ def create_app(
|
|
|
253
399
|
|
|
254
400
|
recovery_service = A2APipelineRecoveryService(task_store=components.task_store)
|
|
255
401
|
|
|
402
|
+
async def recovery_path_roots(*, context_id: str | None, task_id: str | None) -> list[dict[str, str]]:
|
|
403
|
+
return await resolve_a2a_public_path_roots(
|
|
404
|
+
components.task_store,
|
|
405
|
+
task_id=task_id,
|
|
406
|
+
context_id=context_id,
|
|
407
|
+
)
|
|
408
|
+
|
|
256
409
|
async def get_pipeline_state(request: Request) -> JSONResponse:
|
|
257
410
|
context_id = request.query_params.get("contextId") or None
|
|
258
411
|
task_id = request.query_params.get("taskId") or None
|
|
@@ -263,16 +416,28 @@ def create_app(
|
|
|
263
416
|
if parse_error is not None:
|
|
264
417
|
return JSONResponse({"error": parse_error}, status_code=400)
|
|
265
418
|
|
|
419
|
+
call_context = _call_context_from_request(request)
|
|
266
420
|
try:
|
|
267
421
|
state = await recovery_service.get_state(
|
|
268
422
|
context_id=context_id,
|
|
269
423
|
task_id=task_id,
|
|
270
424
|
after_sequence=after_sequence,
|
|
271
|
-
call_context=
|
|
425
|
+
call_context=call_context,
|
|
272
426
|
)
|
|
273
427
|
except ValueError as exc:
|
|
274
|
-
|
|
275
|
-
|
|
428
|
+
roots = await recovery_path_roots(
|
|
429
|
+
context_id=context_id,
|
|
430
|
+
task_id=task_id,
|
|
431
|
+
)
|
|
432
|
+
return JSONResponse(
|
|
433
|
+
{"error": project_a2a_text(str(exc), public_path_roots=roots)},
|
|
434
|
+
status_code=404,
|
|
435
|
+
)
|
|
436
|
+
roots = await recovery_path_roots(
|
|
437
|
+
context_id=context_id,
|
|
438
|
+
task_id=task_id,
|
|
439
|
+
)
|
|
440
|
+
return JSONResponse(project_a2a_data(state, public_path_roots=roots))
|
|
276
441
|
|
|
277
442
|
routes: list[BaseRoute] = [
|
|
278
443
|
Route("/health", health, methods=["GET"]),
|
|
@@ -290,6 +455,7 @@ def create_app(
|
|
|
290
455
|
routes.append(Route("/", handle_jsonrpc, methods=["POST"]))
|
|
291
456
|
routes.extend(create_rest_routes(components.handler, enable_v0_3_compat=True))
|
|
292
457
|
app = Starlette(routes=routes, lifespan=lifespan)
|
|
458
|
+
app.add_middleware(A2AProjectionMiddleware, task_store=components.task_store)
|
|
293
459
|
app.add_middleware(
|
|
294
460
|
A2AAuthMiddleware,
|
|
295
461
|
token=token,
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from __future__ import annotations
|
|
2
2
|
|
|
3
|
+
import copy
|
|
3
4
|
import inspect
|
|
4
5
|
import logging
|
|
5
6
|
from collections.abc import Awaitable, Callable
|
|
@@ -18,15 +19,10 @@ from a2a.types import (
|
|
|
18
19
|
)
|
|
19
20
|
from google.protobuf.json_format import ParseDict
|
|
20
21
|
|
|
21
|
-
from iac_code.a2a.artifacts import
|
|
22
|
-
sanitize_public_artifact_text,
|
|
23
|
-
sanitize_public_tool_output_data,
|
|
24
|
-
)
|
|
22
|
+
from iac_code.a2a.artifacts import sanitize_public_artifact_text
|
|
25
23
|
from iac_code.a2a.exposure import A2AExposureType, normalize_a2a_exposure_types
|
|
26
|
-
from iac_code.a2a.metadata_redaction import A2AMetadataEchoRedactor
|
|
27
24
|
from iac_code.i18n import _
|
|
28
25
|
from iac_code.mcp.progress import mcp_progress_metadata, mcp_progress_public_name
|
|
29
|
-
from iac_code.mcp.redaction import sanitize_mcp_public_data
|
|
30
26
|
from iac_code.services.permissions.audit import (
|
|
31
27
|
build_input_summary,
|
|
32
28
|
build_redacted_tool_input,
|
|
@@ -51,10 +47,11 @@ from iac_code.types.stream_events import (
|
|
|
51
47
|
_METADATA_MAX_CHARS = 4000
|
|
52
48
|
_ERROR_TEXT_MAX_CHARS = 1000
|
|
53
49
|
_METADATA_MAX_DEPTH = 32
|
|
50
|
+
_ARTIFACT_CONTAINER_KEYS = {"artifact", "artifacts"}
|
|
51
|
+
_ARTIFACT_PAYLOAD_KEYS = {"content", "bytes", "base64", "raw", "path"}
|
|
54
52
|
logger = logging.getLogger(__name__)
|
|
55
53
|
A2APermissionResolver: TypeAlias = Callable[[PermissionRequestEvent], "bool | Awaitable[bool]"]
|
|
56
54
|
IAC_CODE_SESSION_ID_METADATA_KEY = "iacCodeSessionId"
|
|
57
|
-
_METADATA_REDACTOR = A2AMetadataEchoRedactor()
|
|
58
55
|
|
|
59
56
|
|
|
60
57
|
def iac_code_session_metadata(session_id: str) -> dict[str, Any]:
|
|
@@ -75,7 +72,7 @@ def _truncate(value: Any, *, _depth: int = 0) -> Any:
|
|
|
75
72
|
if _depth >= _METADATA_MAX_DEPTH:
|
|
76
73
|
return "[truncated-depth]"
|
|
77
74
|
if isinstance(value, str):
|
|
78
|
-
return
|
|
75
|
+
return value[:_METADATA_MAX_CHARS]
|
|
79
76
|
if isinstance(value, dict):
|
|
80
77
|
return {str(k): _truncate(v, _depth=_depth + 1) for k, v in value.items()}
|
|
81
78
|
if isinstance(value, list):
|
|
@@ -83,10 +80,6 @@ def _truncate(value: Any, *, _depth: int = 0) -> Any:
|
|
|
83
80
|
return value
|
|
84
81
|
|
|
85
82
|
|
|
86
|
-
def _sanitize_trace_input(value: Any) -> Any:
|
|
87
|
-
return _METADATA_REDACTOR.redact(_truncate(value))
|
|
88
|
-
|
|
89
|
-
|
|
90
83
|
def _public_tool_input_metadata(tool_name: str, tool_input: dict[str, Any]) -> dict[str, Any]:
|
|
91
84
|
return {"inputSummary": build_input_summary(tool_name, tool_input)}
|
|
92
85
|
|
|
@@ -183,10 +176,40 @@ def _tool_result_metadata(
|
|
|
183
176
|
is_error: bool = False,
|
|
184
177
|
public_path_roots: list[dict[str, str]] | None = None,
|
|
185
178
|
) -> Any:
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
179
|
+
del is_error, public_path_roots
|
|
180
|
+
return _tool_result_metadata_value(copy.deepcopy(result))
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
def _tool_result_metadata_value(value: Any, *, _depth: int = 0, _artifact_scope: bool = False) -> Any:
|
|
184
|
+
"""Build protobuf-safe trace metadata without applying redaction.
|
|
185
|
+
|
|
186
|
+
Artifact payload bodies remain outside the trace metadata, matching the
|
|
187
|
+
existing artifact externalization contract. All other already-exposed
|
|
188
|
+
values are preserved, subject only to the existing depth/string bounds.
|
|
189
|
+
"""
|
|
190
|
+
|
|
191
|
+
if _depth >= _METADATA_MAX_DEPTH:
|
|
192
|
+
return "[truncated-depth]"
|
|
193
|
+
if isinstance(value, str):
|
|
194
|
+
return value[:_METADATA_MAX_CHARS]
|
|
195
|
+
if isinstance(value, dict):
|
|
196
|
+
output: dict[str, Any] = {}
|
|
197
|
+
for key, item in value.items():
|
|
198
|
+
key_text = str(key)
|
|
199
|
+
key_lower = key_text.lower()
|
|
200
|
+
if _artifact_scope and key_lower in _ARTIFACT_PAYLOAD_KEYS:
|
|
201
|
+
continue
|
|
202
|
+
output[key_text] = _tool_result_metadata_value(
|
|
203
|
+
item,
|
|
204
|
+
_depth=_depth + 1,
|
|
205
|
+
_artifact_scope=_artifact_scope or key_lower in _ARTIFACT_CONTAINER_KEYS,
|
|
206
|
+
)
|
|
207
|
+
return output
|
|
208
|
+
if isinstance(value, list | tuple):
|
|
209
|
+
return [_tool_result_metadata_value(item, _depth=_depth + 1, _artifact_scope=_artifact_scope) for item in value]
|
|
210
|
+
if value is None or isinstance(value, bool | int | float):
|
|
211
|
+
return value
|
|
212
|
+
return str(value)[:_METADATA_MAX_CHARS]
|
|
190
213
|
|
|
191
214
|
|
|
192
215
|
def _artifact_update_event(*, task_id: str, context_id: str, metadata: dict[str, Any]) -> TaskArtifactUpdateEvent:
|
|
@@ -355,13 +378,7 @@ async def publish_stream_event(
|
|
|
355
378
|
_artifact_update_event(task_id=task_id, context_id=context_id, metadata=artifact_metadata)
|
|
356
379
|
)
|
|
357
380
|
return None
|
|
358
|
-
result_metadata = _tool_result_metadata(
|
|
359
|
-
event.result,
|
|
360
|
-
is_error=event.is_error,
|
|
361
|
-
public_path_roots=event.public_path_roots,
|
|
362
|
-
)
|
|
363
|
-
if event.tool_name.startswith("mcp__"):
|
|
364
|
-
result_metadata = sanitize_mcp_public_data(result_metadata, fallback_summary="")
|
|
381
|
+
result_metadata = _tool_result_metadata(event.result, is_error=event.is_error)
|
|
365
382
|
tool_metadata = {
|
|
366
383
|
"status": "failed" if event.is_error else "completed",
|
|
367
384
|
"toolUseId": event.tool_use_id,
|
|
@@ -476,6 +493,8 @@ async def publish_stream_event(
|
|
|
476
493
|
state = TaskState.TASK_STATE_INPUT_REQUIRED
|
|
477
494
|
else:
|
|
478
495
|
raw = event.error or "Unknown error"
|
|
496
|
+
# Provider ErrorEvent is an explicitly retained compatibility
|
|
497
|
+
# exception; ordinary A2A payloads are projected at the wire edge.
|
|
479
498
|
text = sanitize_public_artifact_text(raw)[:_ERROR_TEXT_MAX_CHARS]
|
|
480
499
|
state = TaskState.TASK_STATE_FAILED
|
|
481
500
|
await _enqueue_status(
|
|
@@ -45,6 +45,7 @@ from iac_code.a2a.pipeline_snapshot import (
|
|
|
45
45
|
snapshot_needs_backup_commit_repair,
|
|
46
46
|
)
|
|
47
47
|
from iac_code.a2a.pipeline_stream import BACKUP_COMMITTED_EVENT_TYPE, PipelineA2AEventPublisher
|
|
48
|
+
from iac_code.a2a.projection import a2a_safe_mode_enabled
|
|
48
49
|
from iac_code.a2a.runtime_overrides import (
|
|
49
50
|
a2a_request_context,
|
|
50
51
|
configure_runtime_model,
|
|
@@ -101,7 +102,7 @@ from iac_code.services.session_backup_state import (
|
|
|
101
102
|
from iac_code.services.session_storage import SessionStorage
|
|
102
103
|
from iac_code.types.stream_events import TextDeltaEvent
|
|
103
104
|
from iac_code.utils.file_security import atomic_write_text, ensure_private_dir, ensure_private_file
|
|
104
|
-
from iac_code.utils.public_errors import
|
|
105
|
+
from iac_code.utils.public_errors import sanitize_strict_text
|
|
105
106
|
from iac_code.utils.public_paths import build_public_path_roots
|
|
106
107
|
|
|
107
108
|
logger = logging.getLogger(__name__)
|
|
@@ -109,16 +110,16 @@ _CONTEXT_LOCK_ACQUIRE_TIMEOUT_SECONDS = 1
|
|
|
109
110
|
_CANCEL_ACTIVE_TASK_DRAIN_TIMEOUT_SECONDS = 30
|
|
110
111
|
_ERROR_TEXT_MAX_CHARS = 1000
|
|
111
112
|
_DEFERRED_CLEANUP_PROMPTS_FILENAME = "cleanup-deferred-prompts.json"
|
|
112
|
-
_A2A_SAFE_MODE_ENV = "IAC_CODE_A2A_SAFE_MODE"
|
|
113
|
-
_TRUTHY_ENV_VALUES = {"1", "true", "yes", "on"}
|
|
114
113
|
|
|
115
114
|
|
|
116
115
|
def _format_exception(exc: BaseException) -> str:
|
|
117
|
-
|
|
116
|
+
message = str(exc)
|
|
117
|
+
raw = type(exc).__name__ if not message else f"{type(exc).__name__}: {message}"
|
|
118
|
+
return raw[:_ERROR_TEXT_MAX_CHARS]
|
|
118
119
|
|
|
119
120
|
|
|
120
121
|
def _a2a_safe_mode_enabled() -> bool:
|
|
121
|
-
return
|
|
122
|
+
return a2a_safe_mode_enabled()
|
|
122
123
|
|
|
123
124
|
|
|
124
125
|
A2APermissionResolver: TypeAlias = Callable[[Any], "bool | Awaitable[bool]"]
|
|
@@ -741,7 +742,7 @@ def _cleanup_resource_event_data(resource: Any, *, resource_count: int) -> dict[
|
|
|
741
742
|
def _public_cleanup_error(value: Any) -> str | None:
|
|
742
743
|
if not value:
|
|
743
744
|
return None
|
|
744
|
-
text =
|
|
745
|
+
text = str(value)
|
|
745
746
|
return text[:_ERROR_TEXT_MAX_CHARS] + "..." if len(text) > _ERROR_TEXT_MAX_CHARS else text
|
|
746
747
|
|
|
747
748
|
|
|
@@ -1020,13 +1021,13 @@ class IacCodeA2AExecutor(AgentExecutor):
|
|
|
1020
1021
|
try:
|
|
1021
1022
|
pipeline_input = self._pipeline_input_from_context(context, cwd=cwd)
|
|
1022
1023
|
except ValueError as exc:
|
|
1023
|
-
raise InvalidParamsError(
|
|
1024
|
+
raise InvalidParamsError(str(exc)) from exc
|
|
1024
1025
|
self._validate_pipeline_request_input(pipeline_input, model=model)
|
|
1025
1026
|
else:
|
|
1026
1027
|
try:
|
|
1027
1028
|
normal_input = self._normal_input_from_context(context, cwd=cwd)
|
|
1028
1029
|
except ValueError as exc:
|
|
1029
|
-
raise InvalidParamsError(
|
|
1030
|
+
raise InvalidParamsError(str(exc)) from exc
|
|
1030
1031
|
if normal_input.has_images:
|
|
1031
1032
|
self._validate_pipeline_request_input(normal_input, model=model)
|
|
1032
1033
|
if pipeline_mode and requested_task_id is None:
|
|
@@ -1068,7 +1069,7 @@ class IacCodeA2AExecutor(AgentExecutor):
|
|
|
1068
1069
|
task_id=task_id,
|
|
1069
1070
|
context_id=context_id,
|
|
1070
1071
|
state=TaskState.TASK_STATE_FAILED,
|
|
1071
|
-
text=
|
|
1072
|
+
text=str(exc),
|
|
1072
1073
|
)
|
|
1073
1074
|
if task is not None:
|
|
1074
1075
|
task.state = TASK_STATE_FAILED
|
|
@@ -1672,7 +1673,7 @@ class IacCodeA2AExecutor(AgentExecutor):
|
|
|
1672
1673
|
cwd = self._resolve_cwd(metadata)
|
|
1673
1674
|
pipeline_input = parts_to_user_input(message.parts, cwd=cwd)
|
|
1674
1675
|
except ValueError as exc:
|
|
1675
|
-
raise InvalidParamsError(
|
|
1676
|
+
raise InvalidParamsError(str(exc)) from exc
|
|
1676
1677
|
model = self._resolve_model(metadata) or self._model
|
|
1677
1678
|
self._validate_pipeline_request_input(pipeline_input, model=model)
|
|
1678
1679
|
|
|
@@ -1736,7 +1737,7 @@ class IacCodeA2AExecutor(AgentExecutor):
|
|
|
1736
1737
|
"A2A terminal session backup blocked task publication reason=%s retry_count=%s error=%s",
|
|
1737
1738
|
reason.value,
|
|
1738
1739
|
getattr(exc, "retry_count", 0),
|
|
1739
|
-
|
|
1740
|
+
sanitize_strict_text(str(exc))[:_ERROR_TEXT_MAX_CHARS],
|
|
1740
1741
|
)
|
|
1741
1742
|
record_backup_blocked = getattr(self._metrics, "record_backup_blocked", None)
|
|
1742
1743
|
if callable(record_backup_blocked):
|
|
@@ -1761,7 +1762,7 @@ class IacCodeA2AExecutor(AgentExecutor):
|
|
|
1761
1762
|
"backupBlocked": {
|
|
1762
1763
|
"reason": reason.value,
|
|
1763
1764
|
"blockedTerminalState": blocked_terminal_state,
|
|
1764
|
-
"error":
|
|
1765
|
+
"error": _format_exception(exc),
|
|
1765
1766
|
"recoverable": True,
|
|
1766
1767
|
}
|
|
1767
1768
|
}
|
|
@@ -1993,7 +1994,7 @@ class IacCodeA2AExecutor(AgentExecutor):
|
|
|
1993
1994
|
return None
|
|
1994
1995
|
|
|
1995
1996
|
def _log_executor_exception(self, stage: str, *, task_id: str, context_id: str) -> None:
|
|
1996
|
-
logger.
|
|
1997
|
+
logger.error("A2A executor %s failed (task_id=%s, context_id=%s)", stage, task_id, context_id)
|
|
1997
1998
|
|
|
1998
1999
|
async def _publish_mcp_status(
|
|
1999
2000
|
self,
|
|
@@ -2121,8 +2122,8 @@ class IacCodeA2AExecutor(AgentExecutor):
|
|
|
2121
2122
|
return
|
|
2122
2123
|
try:
|
|
2123
2124
|
await self._push_notifier.notify_task_state(task_id=task_id, context_id=context_id, state=state)
|
|
2124
|
-
except Exception:
|
|
2125
|
-
logger.warning("A2A push notification failed",
|
|
2125
|
+
except Exception as exc:
|
|
2126
|
+
logger.warning("A2A push notification failed: %s", sanitize_strict_text(str(exc)))
|
|
2126
2127
|
|
|
2127
2128
|
|
|
2128
2129
|
def _normal_handoff_has_backup_ack(handoff: dict[str, Any], journal_events: list[dict[str, Any]]) -> bool:
|
|
@@ -10,6 +10,8 @@ from jsonrpc.jsonrpc2 import JSONRPC20Response
|
|
|
10
10
|
from sse_starlette.sse import EventSourceResponse
|
|
11
11
|
from starlette.responses import Response
|
|
12
12
|
|
|
13
|
+
from iac_code.utils.public_errors import sanitize_strict_text
|
|
14
|
+
|
|
13
15
|
logger = logging.getLogger(__name__)
|
|
14
16
|
|
|
15
17
|
|
|
@@ -72,7 +74,10 @@ def install_v03_jsonrpc_error_data_passthrough(jsonrpc_endpoint: Callable[..., A
|
|
|
72
74
|
async for item in stream:
|
|
73
75
|
yield {"data": item.model_dump_json(by_alias=True, exclude_none=True)}
|
|
74
76
|
except Exception as exc:
|
|
75
|
-
logger.
|
|
77
|
+
logger.error(
|
|
78
|
+
"Error during stream generation in v0.3 JSONRPCAdapter: %s",
|
|
79
|
+
sanitize_strict_text(str(exc)),
|
|
80
|
+
)
|
|
76
81
|
if getattr(exc, "jsonrpc_error_data_passthrough", False):
|
|
77
82
|
error = types_v03.InvalidParamsError(message=str(exc), data=getattr(exc, "data", None))
|
|
78
83
|
else:
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import copy
|
|
4
|
+
from collections.abc import Iterable, Mapping
|
|
5
|
+
from typing import Any
|
|
6
|
+
|
|
7
|
+
from a2a.types import Message
|
|
8
|
+
from google.protobuf.json_format import MessageToDict, ParseDict
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class A2AMetadataEchoRedactor:
|
|
12
|
+
"""Compatibility wrapper that now preserves canonical A2A message data."""
|
|
13
|
+
|
|
14
|
+
def redact_message_echo(
|
|
15
|
+
self,
|
|
16
|
+
message: Message,
|
|
17
|
+
*,
|
|
18
|
+
public_path_roots: Iterable[Mapping[str, str]] | None = None,
|
|
19
|
+
) -> Message:
|
|
20
|
+
del public_path_roots
|
|
21
|
+
result = Message()
|
|
22
|
+
ParseDict(MessageToDict(message, preserving_proto_field_name=False), result)
|
|
23
|
+
return result
|
|
24
|
+
|
|
25
|
+
def redact(
|
|
26
|
+
self,
|
|
27
|
+
value: Any,
|
|
28
|
+
*,
|
|
29
|
+
public_path_roots: Iterable[Mapping[str, str]] | None = None,
|
|
30
|
+
) -> Any:
|
|
31
|
+
del public_path_roots
|
|
32
|
+
return copy.deepcopy(value)
|
|
@@ -8,8 +8,9 @@ from datetime import datetime, timezone
|
|
|
8
8
|
from pathlib import Path
|
|
9
9
|
from typing import Any
|
|
10
10
|
|
|
11
|
-
from iac_code.a2a.artifacts import UnsafeArtifactNameError, artifact_filename_from_path
|
|
12
|
-
from iac_code.a2a.events import
|
|
11
|
+
from iac_code.a2a.artifacts import UnsafeArtifactNameError, artifact_filename_from_path
|
|
12
|
+
from iac_code.a2a.events import _truncate
|
|
13
|
+
from iac_code.a2a.pipeline_journal import to_json_safe
|
|
13
14
|
from iac_code.mcp.progress import mcp_progress_metadata
|
|
14
15
|
from iac_code.pipeline.engine.events import PipelineEvent, PipelineEventType
|
|
15
16
|
from iac_code.services.permissions.audit import build_input_summary, build_redacted_tool_input, fingerprint_text
|
|
@@ -369,7 +370,7 @@ class PipelineEventTranslator:
|
|
|
369
370
|
data={
|
|
370
371
|
"candidateScope": candidate_scope,
|
|
371
372
|
"targetCandidateStepId": target_candidate_step_id,
|
|
372
|
-
"reason":
|
|
373
|
+
"reason": str(reason),
|
|
373
374
|
},
|
|
374
375
|
)
|
|
375
376
|
]
|
|
@@ -381,7 +382,7 @@ class PipelineEventTranslator:
|
|
|
381
382
|
"candidateScope": candidate_scope,
|
|
382
383
|
"targetCandidateStepId": target_candidate_step_id,
|
|
383
384
|
"nextCandidateAttempt": state.attempt + 1,
|
|
384
|
-
"reason":
|
|
385
|
+
"reason": str(reason),
|
|
385
386
|
}
|
|
386
387
|
envelope = self._envelope("candidate_restart_requested", "candidate", "working", data)
|
|
387
388
|
self._add_candidate_coordinates(envelope, state)
|
|
@@ -1208,8 +1209,7 @@ def _event_data(data: dict[str, Any]) -> dict[str, Any]:
|
|
|
1208
1209
|
|
|
1209
1210
|
|
|
1210
1211
|
def _warning_event_data(data: dict[str, Any]) -> dict[str, Any]:
|
|
1211
|
-
|
|
1212
|
-
return _event_data({key: value for key, value in data.items() if str(key) not in private_keys})
|
|
1212
|
+
return _event_data(data)
|
|
1213
1213
|
|
|
1214
1214
|
|
|
1215
1215
|
def _sanitize_event_value(key: str, value: Any) -> Any:
|
|
@@ -1219,8 +1219,6 @@ def _sanitize_event_value(key: str, value: Any) -> Any:
|
|
|
1219
1219
|
|
|
1220
1220
|
return sanitize_mcp_status_metadata(value)
|
|
1221
1221
|
if isinstance(value, str):
|
|
1222
|
-
if any(marker in key_lower for marker in ("reason", "error", "message", "traceback")):
|
|
1223
|
-
return sanitize_public_artifact_text(value)
|
|
1224
1222
|
return value
|
|
1225
1223
|
if isinstance(value, list):
|
|
1226
1224
|
return [_sanitize_event_value(key, item) for item in value]
|
|
@@ -1486,17 +1484,13 @@ def _tool_result_data(event: ToolResultEvent) -> dict[str, Any]:
|
|
|
1486
1484
|
"toolName": event.tool_name,
|
|
1487
1485
|
"toolUseId": event.tool_use_id,
|
|
1488
1486
|
"isError": event.is_error,
|
|
1489
|
-
"result":
|
|
1490
|
-
event.result,
|
|
1491
|
-
is_error=event.is_error,
|
|
1492
|
-
public_path_roots=event.public_path_roots,
|
|
1493
|
-
),
|
|
1487
|
+
"result": to_json_safe(event.result),
|
|
1494
1488
|
}
|
|
1495
1489
|
|
|
1496
1490
|
|
|
1497
1491
|
def _sanitize_tool_input(tool_input: dict[str, Any]) -> dict[str, Any]:
|
|
1498
|
-
#
|
|
1499
|
-
#
|
|
1492
|
+
# Journal 是 canonical 功能数据;远程出口只在实际 A2A wire boundary
|
|
1493
|
+
# 按当前 safe mode 投影副本,不能反向污染这里的真实工具输入。
|
|
1500
1494
|
return dict(tool_input) if isinstance(tool_input, dict) else {}
|
|
1501
1495
|
|
|
1502
1496
|
|
|
@@ -1627,7 +1621,7 @@ def _artifact_from_spec(spec: Any, root: dict[str, Any]) -> dict[str, Any] | Non
|
|
|
1627
1621
|
"mediaType": media_type,
|
|
1628
1622
|
"content": content,
|
|
1629
1623
|
"role": role,
|
|
1630
|
-
"supersedesPath":
|
|
1624
|
+
"supersedesPath": supersedes_path,
|
|
1631
1625
|
"supersedesKey": fingerprint_text(supersedes_path),
|
|
1632
1626
|
}
|
|
1633
1627
|
|