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