iac-code 0.4.1__tar.gz → 0.6.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.4.1 → iac_code-0.6.0}/MANIFEST.in +1 -1
- {iac_code-0.4.1 → iac_code-0.6.0}/PKG-INFO +3 -2
- {iac_code-0.4.1 → iac_code-0.6.0}/README.md +2 -2
- {iac_code-0.4.1 → iac_code-0.6.0}/pyproject.toml +2 -0
- iac_code-0.6.0/setup.py +285 -0
- iac_code-0.6.0/src/iac_code/__init__.py +2 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/a2a/agent_card.py +38 -3
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/a2a/app.py +63 -0
- iac_code-0.6.0/src/iac_code/a2a/artifacts.py +375 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/a2a/events.py +16 -19
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/a2a/executor.py +118 -13
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/a2a/persistence.py +49 -7
- iac_code-0.6.0/src/iac_code/a2a/pipeline_events.py +1346 -0
- iac_code-0.6.0/src/iac_code/a2a/pipeline_executor.py +1999 -0
- iac_code-0.6.0/src/iac_code/a2a/pipeline_journal.py +224 -0
- iac_code-0.6.0/src/iac_code/a2a/pipeline_paths.py +29 -0
- iac_code-0.6.0/src/iac_code/a2a/pipeline_recovery.py +276 -0
- iac_code-0.6.0/src/iac_code/a2a/pipeline_snapshot.py +1215 -0
- iac_code-0.6.0/src/iac_code/a2a/pipeline_stream.py +491 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/a2a/push.py +119 -34
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/a2a/push_queue.py +17 -4
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/a2a/push_secrets.py +9 -1
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/a2a/push_worker.py +30 -4
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/a2a/task_store.py +276 -27
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/a2a/transports/dispatcher.py +215 -2
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/a2a/transports/grpc_jsonrpc.py +28 -4
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/a2a/transports/redis_streams.py +65 -17
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/a2a/transports/stdio.py +26 -5
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/a2a/transports/unix.py +18 -2
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/a2a/transports/websocket.py +40 -8
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/a2a/types.py +3 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/acp/convert.py +16 -5
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/acp/http_sse.py +53 -3
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/acp/server.py +110 -32
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/acp/session.py +79 -29
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/acp/slash_registry.py +15 -11
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/acp/state.py +9 -2
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/agent/agent_loop.py +572 -21
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/agent/agent_tool.py +7 -3
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/agent/message.py +58 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/agent/system_prompt.py +109 -6
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/cli/headless.py +17 -2
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/cli/main.py +11 -2
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/cli/output_formats.py +37 -3
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/commands/__init__.py +22 -3
- iac_code-0.6.0/src/iac_code/commands/memory.py +242 -0
- iac_code-0.6.0/src/iac_code/commands/prompt.py +835 -0
- iac_code-0.6.0/src/iac_code/commands/status.py +203 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/i18n/__init__.py +18 -0
- iac_code-0.6.0/src/iac_code/i18n/locales/de/LC_MESSAGES/messages.mo +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/i18n/locales/de/LC_MESSAGES/messages.po +1550 -60
- iac_code-0.6.0/src/iac_code/i18n/locales/es/LC_MESSAGES/messages.mo +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/i18n/locales/es/LC_MESSAGES/messages.po +1546 -60
- iac_code-0.6.0/src/iac_code/i18n/locales/fr/LC_MESSAGES/messages.mo +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/i18n/locales/fr/LC_MESSAGES/messages.po +1539 -50
- iac_code-0.6.0/src/iac_code/i18n/locales/ja/LC_MESSAGES/messages.mo +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/i18n/locales/ja/LC_MESSAGES/messages.po +1475 -67
- iac_code-0.6.0/src/iac_code/i18n/locales/pt/LC_MESSAGES/messages.mo +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/i18n/locales/pt/LC_MESSAGES/messages.po +1534 -53
- iac_code-0.6.0/src/iac_code/i18n/locales/zh/LC_MESSAGES/messages.mo +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/i18n/locales/zh/LC_MESSAGES/messages.po +1463 -67
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/memory/memory_manager.py +24 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/memory/memory_tools.py +15 -9
- iac_code-0.6.0/src/iac_code/memory/project_memory.py +149 -0
- iac_code-0.6.0/src/iac_code/memory/recall.py +452 -0
- iac_code-0.6.0/src/iac_code/pipeline/__init__.py +81 -0
- iac_code-0.6.0/src/iac_code/pipeline/config.py +30 -0
- iac_code-0.6.0/src/iac_code/pipeline/display_names.py +67 -0
- iac_code-0.6.0/src/iac_code/pipeline/engine/__init__.py +43 -0
- iac_code-0.6.0/src/iac_code/pipeline/engine/ask_user_question_tool.py +106 -0
- iac_code-0.6.0/src/iac_code/pipeline/engine/complete_step_tool.py +398 -0
- iac_code-0.6.0/src/iac_code/pipeline/engine/context.py +113 -0
- iac_code-0.6.0/src/iac_code/pipeline/engine/display_replay.py +617 -0
- iac_code-0.6.0/src/iac_code/pipeline/engine/events.py +43 -0
- iac_code-0.6.0/src/iac_code/pipeline/engine/handoff.py +47 -0
- iac_code-0.6.0/src/iac_code/pipeline/engine/interrupt.py +290 -0
- iac_code-0.6.0/src/iac_code/pipeline/engine/loader.py +435 -0
- iac_code-0.6.0/src/iac_code/pipeline/engine/observability.py +716 -0
- iac_code-0.6.0/src/iac_code/pipeline/engine/pipeline_runner.py +3296 -0
- iac_code-0.6.0/src/iac_code/pipeline/engine/prompts/interrupt_judge.md +100 -0
- iac_code-0.6.0/src/iac_code/pipeline/engine/public_errors.py +17 -0
- iac_code-0.6.0/src/iac_code/pipeline/engine/recovery.py +84 -0
- iac_code-0.6.0/src/iac_code/pipeline/engine/session.py +799 -0
- iac_code-0.6.0/src/iac_code/pipeline/engine/show_diagram_tool.py +354 -0
- iac_code-0.6.0/src/iac_code/pipeline/engine/state_machine.py +191 -0
- iac_code-0.6.0/src/iac_code/pipeline/engine/step_executor.py +678 -0
- iac_code-0.6.0/src/iac_code/pipeline/engine/step_spec.py +169 -0
- iac_code-0.6.0/src/iac_code/pipeline/engine/sub_pipeline_executor.py +968 -0
- iac_code-0.6.0/src/iac_code/pipeline/engine/transcript_storage.py +130 -0
- iac_code-0.6.0/src/iac_code/pipeline/engine/types.py +51 -0
- iac_code-0.6.0/src/iac_code/pipeline/engine/ui_contract.py +90 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/hooks/deploying.py +106 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/pipeline.yaml +258 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/prompts/architecture_planning.md +27 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/prompts/confirm_and_select.md +61 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/prompts/cost_estimating.md +23 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/prompts/deploying.md +36 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/prompts/evaluate_candidates.md +3 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/prompts/intent_parsing.md +31 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/prompts/reviewing.md +19 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/prompts/template_generating.md +29 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-architecture/SKILL.md +122 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-architecture/evals.json +177 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/SKILL.md +158 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost/evals.json +95 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/SKILL.md +112 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/evals.json +174 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/ecs.md +167 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/oss.md +69 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/rds.md +95 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/redis.md +100 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/slb.md +60 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/cloud-products/vpc.md +54 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/ros-template.md +155 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/template-parameter-recommendation.md +165 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/template-parameters.md +206 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-deploying/references/terraform-template.md +101 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-intent/SKILL.md +216 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-intent/evals.json +144 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-review/SKILL.md +76 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/SKILL.md +124 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/evals.json +77 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/ecs.md +167 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/oss.md +69 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/rds.md +95 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/redis.md +100 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/slb.md +60 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/cloud-products/vpc.md +54 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/ros-template.md +155 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/template-parameter-recommendation.md +165 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/template-parameters.md +206 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-template-generating/references/terraform-template.md +101 -0
- iac_code-0.6.0/src/iac_code/pipeline/selling/tools/show_candidate_detail_tool.py +94 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/providers/anthropic_provider.py +28 -8
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/providers/base.py +1 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/providers/dashscope_provider.py +21 -2
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/providers/kimi_provider.py +10 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/providers/manager.py +33 -6
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/providers/minimax_provider.py +10 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/providers/openai_provider.py +3 -1
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/providers/registry.py +43 -14
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/providers/thinking.py +55 -1
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/providers/zhipu_provider.py +8 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/agent_factory.py +31 -4
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/context_manager.py +26 -1
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/session_index.py +17 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/telemetry/client.py +58 -19
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/telemetry/config.py +41 -1
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/telemetry/metrics.py +16 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/telemetry/names.py +46 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/skills/auto_trigger.py +16 -3
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/skills/bundled/__init__.py +7 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/skills/bundled/iac_aliyun/SKILL.md +4 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/skills/bundled/iac_aliyun/auto_trigger.py +10 -0
- iac_code-0.6.0/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/ecs.md +167 -0
- iac_code-0.6.0/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/oss.md +69 -0
- iac_code-0.6.0/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/rds.md +95 -0
- iac_code-0.6.0/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/redis.md +100 -0
- iac_code-0.6.0/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/slb.md +60 -0
- iac_code-0.6.0/src/iac_code/skills/bundled/iac_aliyun/references/cloud-products/vpc.md +54 -0
- iac_code-0.6.0/src/iac_code/skills/bundled/iac_aliyun/references/ros-template.md +155 -0
- iac_code-0.6.0/src/iac_code/skills/bundled/iac_aliyun/references/template-parameter-recommendation.md +165 -0
- iac_code-0.6.0/src/iac_code/skills/bundled/iac_aliyun/references/template-parameters.md +206 -0
- iac_code-0.6.0/src/iac_code/skills/bundled/iac_aliyun/references/terraform-template.md +101 -0
- iac_code-0.6.0/src/iac_code/skills/bundled/pac_aliyun/SKILL.md +65 -0
- iac_code-0.6.0/src/iac_code/skills/bundled/pac_aliyun/__init__.py +20 -0
- iac_code-0.6.0/src/iac_code/skills/bundled/pac_aliyun/auto_trigger.py +87 -0
- iac_code-0.6.0/src/iac_code/skills/bundled/pac_aliyun/references/infraguard-policy-generation.md +75 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/skills/skill_tool.py +3 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/state/app_state.py +1 -1
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/base.py +60 -1
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/cloud/aliyun/aliyun_doc_search.py +18 -1
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/cloud/aliyun/ros_stack.py +62 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/cloud/aliyun/ros_stack_instances.py +3 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/cloud/base_stack.py +3 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/tool_executor.py +9 -3
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/types/__init__.py +2 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/types/stream_events.py +69 -2
- iac_code-0.6.0/src/iac_code/ui/components/candidate_selection.py +394 -0
- iac_code-0.6.0/src/iac_code/ui/components/parallel_tabs.py +249 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/ui/components/select.py +18 -1
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/ui/components/status_icon.py +19 -2
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/ui/core/prompt_input.py +56 -29
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/ui/core/raw_input.py +60 -9
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/ui/core/raw_input_win.py +98 -7
- iac_code-0.6.0/src/iac_code/ui/dialogs/memory.py +150 -0
- iac_code-0.6.0/src/iac_code/ui/dialogs/memory_editor.py +341 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/ui/dialogs/resume_picker.py +3 -1
- iac_code-0.6.0/src/iac_code/ui/pipeline_display_replay.py +540 -0
- iac_code-0.6.0/src/iac_code/ui/pipeline_styles.py +24 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/ui/renderer.py +239 -55
- iac_code-0.6.0/src/iac_code/ui/repl.py +4099 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/ui/spinner.py +21 -3
- iac_code-0.6.0/src/iac_code/ui/stream_accumulator.py +183 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/ui/suggestions/command_provider.py +15 -7
- iac_code-0.6.0/src/iac_code/utils/console.py +114 -0
- iac_code-0.6.0/src/iac_code/utils/image/__init__.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/utils/json_utils.py +61 -1
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/utils/project_paths.py +10 -2
- iac_code-0.6.0/src/iac_code/utils/public_errors.py +298 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/utils/tool_input_parser.py +2 -2
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code.egg-info/PKG-INFO +3 -2
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code.egg-info/SOURCES.txt +101 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code.egg-info/requires.txt +5 -0
- iac_code-0.4.1/setup.py +0 -151
- iac_code-0.4.1/src/iac_code/__init__.py +0 -2
- iac_code-0.4.1/src/iac_code/a2a/artifacts.py +0 -74
- iac_code-0.4.1/src/iac_code/commands/memory.py +0 -85
- iac_code-0.4.1/src/iac_code/commands/status.py +0 -104
- iac_code-0.4.1/src/iac_code/i18n/locales/de/LC_MESSAGES/messages.mo +0 -0
- iac_code-0.4.1/src/iac_code/i18n/locales/es/LC_MESSAGES/messages.mo +0 -0
- iac_code-0.4.1/src/iac_code/i18n/locales/fr/LC_MESSAGES/messages.mo +0 -0
- iac_code-0.4.1/src/iac_code/i18n/locales/ja/LC_MESSAGES/messages.mo +0 -0
- iac_code-0.4.1/src/iac_code/i18n/locales/pt/LC_MESSAGES/messages.mo +0 -0
- iac_code-0.4.1/src/iac_code/i18n/locales/zh/LC_MESSAGES/messages.mo +0 -0
- iac_code-0.4.1/src/iac_code/ui/repl.py +0 -1678
- iac_code-0.4.1/src/iac_code/utils/console.py +0 -37
- {iac_code-0.4.1 → iac_code-0.6.0}/LICENSE +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/setup.cfg +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/a2a/__init__.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/a2a/client.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/a2a/exposure.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/a2a/metrics.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/a2a/parts.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/a2a/router.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/a2a/signing.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/a2a/transport.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/a2a/transports/__init__.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/a2a/transports/base.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/a2a/transports/grpc.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/a2a/transports/http.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/acp/__init__.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/acp/mcp.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/acp/metrics.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/acp/tools.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/acp/types.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/acp/version.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/agent/__init__.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/agent/agent_types.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/cli/__init__.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/cli/install_git_bash.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/cli/update.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/commands/auth.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/commands/clear.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/commands/compact.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/commands/debug.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/commands/effort.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/commands/exit.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/commands/help.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/commands/model.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/commands/registry.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/commands/rename.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/commands/resume.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/commands/skills.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/commands/tasks.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/config.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/memory/__init__.py +0 -0
- {iac_code-0.4.1/src/iac_code/skills/bundled/iac_aliyun → iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost}/references/cloud-products/ecs.md +0 -0
- {iac_code-0.4.1/src/iac_code/skills/bundled/iac_aliyun → iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost}/references/cloud-products/oss.md +0 -0
- {iac_code-0.4.1/src/iac_code/skills/bundled/iac_aliyun → iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost}/references/cloud-products/rds.md +0 -0
- {iac_code-0.4.1/src/iac_code/skills/bundled/iac_aliyun → iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost}/references/cloud-products/redis.md +0 -0
- {iac_code-0.4.1/src/iac_code/skills/bundled/iac_aliyun → iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost}/references/cloud-products/slb.md +0 -0
- {iac_code-0.4.1/src/iac_code/skills/bundled/iac_aliyun → iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost}/references/cloud-products/vpc.md +0 -0
- {iac_code-0.4.1/src/iac_code/skills/bundled/iac_aliyun → iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost}/references/ros-template.md +0 -0
- {iac_code-0.4.1/src/iac_code/skills/bundled/iac_aliyun → iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost}/references/template-parameter-recommendation.md +0 -0
- {iac_code-0.4.1/src/iac_code/skills/bundled/iac_aliyun → iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost}/references/template-parameters.md +0 -0
- {iac_code-0.4.1/src/iac_code/skills/bundled/iac_aliyun → iac_code-0.6.0/src/iac_code/pipeline/selling/skills/iac-aliyun-cost}/references/terraform-template.md +0 -0
- {iac_code-0.4.1/src/iac_code/tools/cloud → iac_code-0.6.0/src/iac_code/pipeline/selling/tools}/__init__.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/providers/__init__.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/providers/azure_openai_provider.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/providers/deepseek_provider.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/providers/gemini_provider.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/providers/lmstudio_provider.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/providers/modelscope_provider.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/providers/ollama_provider.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/providers/openrouter_provider.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/providers/retry.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/providers/siliconflow_provider.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/providers/stream_watchdog.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/providers/volcengine_provider.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/__init__.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/capabilities/__init__.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/capabilities/auto_detect.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/capabilities/multimodal.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/cloud_credentials.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/permissions/__init__.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/permissions/loader.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/permissions/pipeline.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/permissions/storage.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/permissions/trusted_roots.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/providers/__init__.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/providers/aliyun.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/providers/aliyun_oauth.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/qwenpaw_source.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/session_metadata.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/session_resolver.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/session_storage.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/session_usage.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/telemetry/__init__.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/telemetry/attributes.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/telemetry/constants.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/telemetry/content_serializer.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/telemetry/events.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/telemetry/fallback.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/telemetry/identity.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/telemetry/sanitize.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/telemetry/sink.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/telemetry/tracing.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/telemetry/types.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/token_budget.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/token_counter.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/services/update_checker.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/skills/__init__.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/skills/bundled/iac_aliyun/__init__.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/skills/bundled/iac_aliyun/scripts/tf2ros.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/skills/bundled/simplify.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/skills/discovery.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/skills/frontmatter.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/skills/listing.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/skills/loader.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/skills/management.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/skills/processor.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/skills/renderer.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/skills/settings.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/skills/skill_definition.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/state/__init__.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tasks/__init__.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tasks/notification_queue.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tasks/task_state.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tasks/task_tools.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/__init__.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/bash/__init__.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/bash/argv_safety.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/bash/bash_tool.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/bash/command_parser.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/bash/mode_validation.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/bash/path_validation.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/bash/permissions.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/bash/readonly_commands.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/bash/rule_matching.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/bash/safety_checks.py +0 -0
- {iac_code-0.4.1/src/iac_code/tools/cloud/aliyun → iac_code-0.6.0/src/iac_code/tools/cloud}/__init__.py +0 -0
- {iac_code-0.4.1/src/iac_code/tools/cloud/aliyun/hooks → iac_code-0.6.0/src/iac_code/tools/cloud/aliyun}/__init__.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/cloud/aliyun/aliyun_api.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/cloud/aliyun/api_hooks.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/cloud/aliyun/endpoints.yml +0 -0
- {iac_code-0.4.1/src/iac_code/ui/components → iac_code-0.6.0/src/iac_code/tools/cloud/aliyun/hooks}/__init__.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/cloud/aliyun/hooks/ros_parameters.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/cloud/aliyun/hooks/ros_validate.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/cloud/aliyun/ros_client.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/cloud/aliyun/ros_yaml.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/cloud/aliyun/user_agent.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/cloud/base_api.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/cloud/registry.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/cloud/types.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/edit_file.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/glob.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/grep.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/list_files.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/path_safety.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/read_file.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/result_storage.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/web_fetch.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/tools/write_file.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/types/permissions.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/types/skill_source.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/ui/__init__.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/ui/banner.py +0 -0
- {iac_code-0.4.1/src/iac_code/ui/core → iac_code-0.6.0/src/iac_code/ui/components}/__init__.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/ui/components/dialog.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/ui/components/divider.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/ui/components/fuzzy_picker.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/ui/components/progress_bar.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/ui/components/search_box.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/ui/components/tabs.py +0 -0
- {iac_code-0.4.1/src/iac_code/ui/dialogs → iac_code-0.6.0/src/iac_code/ui/core}/__init__.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/ui/core/in_place_render.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/ui/core/input_history.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/ui/core/key_event.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/ui/core/screen.py +0 -0
- {iac_code-0.4.1/src/iac_code/ui/keybindings → iac_code-0.6.0/src/iac_code/ui/dialogs}/__init__.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/ui/dialogs/global_search.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/ui/dialogs/history_search.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/ui/dialogs/model_picker.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/ui/dialogs/quick_open.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/ui/dialogs/skills_picker.py +0 -0
- {iac_code-0.4.1/src/iac_code/ui/suggestions → iac_code-0.6.0/src/iac_code/ui/keybindings}/__init__.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/ui/keybindings/manager.py +0 -0
- {iac_code-0.4.1/src/iac_code/utils → iac_code-0.6.0/src/iac_code/ui/suggestions}/__init__.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/ui/suggestions/aggregator.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/ui/suggestions/directory_provider.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/ui/suggestions/file_provider.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/ui/suggestions/shell_history_provider.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/ui/suggestions/skill_provider.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/ui/suggestions/token_extractor.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/ui/suggestions/types.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/ui/transcript_view.py +0 -0
- {iac_code-0.4.1/src/iac_code/utils/image → iac_code-0.6.0/src/iac_code/utils}/__init__.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/utils/background_housekeeping.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/utils/cleanup.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/utils/file_security.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/utils/image/clipboard.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/utils/image/format_detect.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/utils/image/pasted_content.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/utils/image/processor.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/utils/image/resizer.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/utils/image/store.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/utils/log.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/utils/platform.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/utils/signals.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code/utils/windows_paths.py +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code.egg-info/dependency_links.txt +0 -0
- {iac_code-0.4.1 → iac_code-0.6.0}/src/iac_code.egg-info/entry_points.txt +0 -0
- {iac_code-0.4.1 → iac_code-0.6.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.6.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
|
|
|
@@ -21,7 +22,7 @@ License-File: LICENSE
|
|
|
21
22
|
<img src="website/static/img/logo-with-front.png" alt="iac-code" width="200">
|
|
22
23
|
</p>
|
|
23
24
|
<p align="center">
|
|
24
|
-
<em>AI-powered Infrastructure as Code assistant for Alibaba Cloud
|
|
25
|
+
<em>AI-powered Infrastructure as Code assistant for cloud infrastructure through natural language interaction. Currently supports Alibaba Cloud ROS and Terraform workflows.</em>
|
|
25
26
|
</p>
|
|
26
27
|
<p align="center">
|
|
27
28
|
<a href="https://github.com/aliyun/iac-code/actions/workflows/test.yml"><img src="https://github.com/aliyun/iac-code/actions/workflows/test.yml/badge.svg" alt="Test"></a>
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
<img src="website/static/img/logo-with-front.png" alt="iac-code" width="200">
|
|
3
3
|
</p>
|
|
4
4
|
<p align="center">
|
|
5
|
-
<em>AI-powered Infrastructure as Code assistant for Alibaba Cloud
|
|
5
|
+
<em>AI-powered Infrastructure as Code assistant for cloud infrastructure through natural language interaction. Currently supports Alibaba Cloud ROS and Terraform workflows.</em>
|
|
6
6
|
</p>
|
|
7
7
|
<p align="center">
|
|
8
8
|
<a href="https://github.com/aliyun/iac-code/actions/workflows/test.yml"><img src="https://github.com/aliyun/iac-code/actions/workflows/test.yml/badge.svg" alt="Test"></a>
|
|
@@ -73,4 +73,4 @@ See the [Contributing Guide](https://aliyun.github.io/iac-code/getting-started/c
|
|
|
73
73
|
|
|
74
74
|
| [DingTalk](https://qr.dingtalk.com/action/joingroup?code=v1,k1,ubm/77U7qRh/STFZUNBP26X4PNg2z6+uhiPcLGtDNfU=&_dt_no_comment=1&origin=11) | [Discord](https://discord.gg/qECFuFBwF) |
|
|
75
75
|
| :----------------------------------------------------------: | :----------------------------------------------------------: |
|
|
76
|
-
| [<img src="website/static/img/qrcode-dingtalk.jpg" width="120" height="120" alt="DingTalk">](https://qr.dingtalk.com/action/joingroup?code=v1,k1,ubm/77U7qRh/STFZUNBP26X4PNg2z6+uhiPcLGtDNfU=&_dt_no_comment=1&origin=11) | [<img src="website/static/img/qrcode-discord.jpg" width="120" height="120" alt="Discord">](https://discord.gg/qECFuFBwF) |
|
|
76
|
+
| [<img src="website/static/img/qrcode-dingtalk.jpg" width="120" height="120" alt="DingTalk">](https://qr.dingtalk.com/action/joingroup?code=v1,k1,ubm/77U7qRh/STFZUNBP26X4PNg2z6+uhiPcLGtDNfU=&_dt_no_comment=1&origin=11) | [<img src="website/static/img/qrcode-discord.jpg" width="120" height="120" alt="Discord">](https://discord.gg/qECFuFBwF) |
|
|
@@ -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 = [
|
|
@@ -91,6 +92,7 @@ version = {attr = "iac_code.__version__"}
|
|
|
91
92
|
"**/*.yaml",
|
|
92
93
|
"**/*.json",
|
|
93
94
|
"**/*.md",
|
|
95
|
+
"**/*.rego",
|
|
94
96
|
"**/*.mo",
|
|
95
97
|
"**/*.po",
|
|
96
98
|
]
|
iac_code-0.6.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
|
+
]
|
|
@@ -13,6 +13,8 @@ from pathlib import Path
|
|
|
13
13
|
from time import time
|
|
14
14
|
from typing import Awaitable, Callable
|
|
15
15
|
|
|
16
|
+
from a2a.auth.user import User
|
|
17
|
+
from a2a.server.context import ServerCallContext
|
|
16
18
|
from a2a.server.routes import create_jsonrpc_routes, create_rest_routes
|
|
17
19
|
from a2a.utils.constants import AGENT_CARD_WELL_KNOWN_PATH
|
|
18
20
|
from starlette.applications import Starlette
|
|
@@ -23,6 +25,7 @@ from starlette.responses import JSONResponse, Response
|
|
|
23
25
|
from starlette.routing import BaseRoute, Route
|
|
24
26
|
|
|
25
27
|
from iac_code.a2a.agent_card import agent_card_to_client_dict
|
|
28
|
+
from iac_code.i18n import _
|
|
26
29
|
|
|
27
30
|
_V03_JSONRPC_METHODS = frozenset(
|
|
28
31
|
{
|
|
@@ -38,6 +41,20 @@ _V03_JSONRPC_METHODS = frozenset(
|
|
|
38
41
|
"agent/getAuthenticatedExtendedCard",
|
|
39
42
|
}
|
|
40
43
|
)
|
|
44
|
+
_MAX_AFTER_SEQUENCE_DIGITS = 20
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
class _PrincipalUser(User):
|
|
48
|
+
def __init__(self, principal: str) -> None:
|
|
49
|
+
self._principal = principal
|
|
50
|
+
|
|
51
|
+
@property
|
|
52
|
+
def is_authenticated(self) -> bool:
|
|
53
|
+
return True
|
|
54
|
+
|
|
55
|
+
@property
|
|
56
|
+
def user_name(self) -> str:
|
|
57
|
+
return self._principal
|
|
41
58
|
|
|
42
59
|
|
|
43
60
|
def resolve_token(cli_token: str | None) -> str | None:
|
|
@@ -197,6 +214,7 @@ def create_app(
|
|
|
197
214
|
auto_approve_permissions=auto_approve_permissions,
|
|
198
215
|
thinking_exposure=thinking_exposure,
|
|
199
216
|
)
|
|
217
|
+
from iac_code.a2a.pipeline_recovery import A2APipelineRecoveryService
|
|
200
218
|
|
|
201
219
|
@asynccontextmanager
|
|
202
220
|
async def lifespan(app: Starlette):
|
|
@@ -227,9 +245,33 @@ def create_app(
|
|
|
227
245
|
return Response(status_code=304, headers=card_cache_headers)
|
|
228
246
|
return JSONResponse(card_data, headers=card_cache_headers)
|
|
229
247
|
|
|
248
|
+
recovery_service = A2APipelineRecoveryService(task_store=components.task_store)
|
|
249
|
+
|
|
250
|
+
async def get_pipeline_state(request: Request) -> JSONResponse:
|
|
251
|
+
context_id = request.query_params.get("contextId") or None
|
|
252
|
+
task_id = request.query_params.get("taskId") or None
|
|
253
|
+
if not context_id and not task_id:
|
|
254
|
+
return JSONResponse({"error": _("contextId or taskId is required")}, status_code=400)
|
|
255
|
+
|
|
256
|
+
after_sequence, parse_error = _parse_after_sequence(request.query_params.get("afterSequence"))
|
|
257
|
+
if parse_error is not None:
|
|
258
|
+
return JSONResponse({"error": parse_error}, status_code=400)
|
|
259
|
+
|
|
260
|
+
try:
|
|
261
|
+
state = await recovery_service.get_state(
|
|
262
|
+
context_id=context_id,
|
|
263
|
+
task_id=task_id,
|
|
264
|
+
after_sequence=after_sequence,
|
|
265
|
+
call_context=_call_context_from_request(request),
|
|
266
|
+
)
|
|
267
|
+
except ValueError as exc:
|
|
268
|
+
return JSONResponse({"error": str(exc)}, status_code=404)
|
|
269
|
+
return JSONResponse(state)
|
|
270
|
+
|
|
230
271
|
routes: list[BaseRoute] = [
|
|
231
272
|
Route("/health", health, methods=["GET"]),
|
|
232
273
|
Route(AGENT_CARD_WELL_KNOWN_PATH, get_agent_card, methods=["GET"]),
|
|
274
|
+
Route("/iac-code/pipeline/state", get_pipeline_state, methods=["GET"]),
|
|
233
275
|
]
|
|
234
276
|
jsonrpc_endpoint = create_jsonrpc_routes(components.handler, rpc_url="/", enable_v0_3_compat=True)[0].endpoint
|
|
235
277
|
|
|
@@ -251,11 +293,32 @@ def create_app(
|
|
|
251
293
|
return app
|
|
252
294
|
|
|
253
295
|
|
|
296
|
+
def _call_context_from_request(request: Request) -> ServerCallContext | None:
|
|
297
|
+
user = request.scope.get("user")
|
|
298
|
+
principal = getattr(user, "username", None) or getattr(user, "display_name", None)
|
|
299
|
+
if not isinstance(principal, str) or not principal:
|
|
300
|
+
return None
|
|
301
|
+
return ServerCallContext(user=_PrincipalUser(principal))
|
|
302
|
+
|
|
303
|
+
|
|
254
304
|
def _agent_card_etag(card: dict[str, object]) -> str:
|
|
255
305
|
body = json.dumps(card, sort_keys=True, separators=(",", ":"), ensure_ascii=False).encode("utf-8")
|
|
256
306
|
return f'"sha256-{hashlib.sha256(body).hexdigest()}"'
|
|
257
307
|
|
|
258
308
|
|
|
309
|
+
def _parse_after_sequence(value: str | None) -> tuple[int | None, str | None]:
|
|
310
|
+
if value is None or value == "":
|
|
311
|
+
return None, None
|
|
312
|
+
if len(value) > _MAX_AFTER_SEQUENCE_DIGITS:
|
|
313
|
+
return None, _("afterSequence must be a non-negative integer")
|
|
314
|
+
if value.isascii() and value.isdecimal():
|
|
315
|
+
try:
|
|
316
|
+
return int(value), None
|
|
317
|
+
except ValueError:
|
|
318
|
+
pass
|
|
319
|
+
return None, _("afterSequence must be a non-negative integer")
|
|
320
|
+
|
|
321
|
+
|
|
259
322
|
def run_server(
|
|
260
323
|
*,
|
|
261
324
|
host: str,
|