iac-code 0.1.0__py3-none-any.whl

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.
Files changed (184) hide show
  1. iac_code/__init__.py +2 -0
  2. iac_code/acp/__init__.py +97 -0
  3. iac_code/acp/convert.py +423 -0
  4. iac_code/acp/http_sse.py +448 -0
  5. iac_code/acp/mcp.py +54 -0
  6. iac_code/acp/metrics.py +71 -0
  7. iac_code/acp/server.py +662 -0
  8. iac_code/acp/session.py +446 -0
  9. iac_code/acp/slash_registry.py +125 -0
  10. iac_code/acp/state.py +99 -0
  11. iac_code/acp/tools.py +112 -0
  12. iac_code/acp/types.py +13 -0
  13. iac_code/acp/version.py +26 -0
  14. iac_code/agent/__init__.py +19 -0
  15. iac_code/agent/agent_loop.py +640 -0
  16. iac_code/agent/agent_tool.py +269 -0
  17. iac_code/agent/agent_types.py +87 -0
  18. iac_code/agent/message.py +153 -0
  19. iac_code/agent/system_prompt.py +313 -0
  20. iac_code/cli/__init__.py +3 -0
  21. iac_code/cli/headless.py +114 -0
  22. iac_code/cli/main.py +246 -0
  23. iac_code/cli/output_formats.py +125 -0
  24. iac_code/commands/__init__.py +93 -0
  25. iac_code/commands/auth.py +1055 -0
  26. iac_code/commands/clear.py +34 -0
  27. iac_code/commands/compact.py +43 -0
  28. iac_code/commands/debug.py +45 -0
  29. iac_code/commands/effort.py +116 -0
  30. iac_code/commands/exit.py +10 -0
  31. iac_code/commands/help.py +49 -0
  32. iac_code/commands/model.py +130 -0
  33. iac_code/commands/registry.py +245 -0
  34. iac_code/commands/resume.py +49 -0
  35. iac_code/commands/tasks.py +41 -0
  36. iac_code/config.py +304 -0
  37. iac_code/i18n/__init__.py +141 -0
  38. iac_code/i18n/locales/zh/LC_MESSAGES/messages.po +1355 -0
  39. iac_code/memory/__init__.py +1 -0
  40. iac_code/memory/memory_manager.py +92 -0
  41. iac_code/memory/memory_tools.py +88 -0
  42. iac_code/providers/__init__.py +1 -0
  43. iac_code/providers/anthropic_provider.py +284 -0
  44. iac_code/providers/base.py +128 -0
  45. iac_code/providers/dashscope_provider.py +47 -0
  46. iac_code/providers/deepseek_provider.py +36 -0
  47. iac_code/providers/manager.py +399 -0
  48. iac_code/providers/openai_provider.py +344 -0
  49. iac_code/providers/retry.py +58 -0
  50. iac_code/providers/stream_watchdog.py +47 -0
  51. iac_code/providers/thinking.py +164 -0
  52. iac_code/services/__init__.py +1 -0
  53. iac_code/services/agent_factory.py +127 -0
  54. iac_code/services/cloud_credentials.py +22 -0
  55. iac_code/services/context_manager.py +221 -0
  56. iac_code/services/providers/__init__.py +1 -0
  57. iac_code/services/providers/aliyun.py +232 -0
  58. iac_code/services/session_index.py +281 -0
  59. iac_code/services/session_storage.py +245 -0
  60. iac_code/services/telemetry/__init__.py +66 -0
  61. iac_code/services/telemetry/attributes.py +84 -0
  62. iac_code/services/telemetry/client.py +330 -0
  63. iac_code/services/telemetry/config.py +76 -0
  64. iac_code/services/telemetry/constants.py +75 -0
  65. iac_code/services/telemetry/content_serializer.py +124 -0
  66. iac_code/services/telemetry/events.py +42 -0
  67. iac_code/services/telemetry/fallback.py +59 -0
  68. iac_code/services/telemetry/identity.py +73 -0
  69. iac_code/services/telemetry/metrics.py +62 -0
  70. iac_code/services/telemetry/names.py +199 -0
  71. iac_code/services/telemetry/sanitize.py +88 -0
  72. iac_code/services/telemetry/sink.py +67 -0
  73. iac_code/services/telemetry/tracing.py +38 -0
  74. iac_code/services/telemetry/types.py +13 -0
  75. iac_code/services/token_budget.py +54 -0
  76. iac_code/services/token_counter.py +76 -0
  77. iac_code/skills/__init__.py +1 -0
  78. iac_code/skills/bundled/__init__.py +94 -0
  79. iac_code/skills/bundled/iac_aliyun/SKILL.md +192 -0
  80. iac_code/skills/bundled/iac_aliyun/__init__.py +16 -0
  81. iac_code/skills/bundled/iac_aliyun/references/cloud-products/ecs.md +167 -0
  82. iac_code/skills/bundled/iac_aliyun/references/cloud-products/oss.md +69 -0
  83. iac_code/skills/bundled/iac_aliyun/references/cloud-products/rds.md +95 -0
  84. iac_code/skills/bundled/iac_aliyun/references/cloud-products/redis.md +100 -0
  85. iac_code/skills/bundled/iac_aliyun/references/cloud-products/slb.md +60 -0
  86. iac_code/skills/bundled/iac_aliyun/references/cloud-products/vpc.md +54 -0
  87. iac_code/skills/bundled/iac_aliyun/references/ros-template.md +155 -0
  88. iac_code/skills/bundled/iac_aliyun/references/template-parameters.md +206 -0
  89. iac_code/skills/bundled/iac_aliyun/references/terraform-template.md +101 -0
  90. iac_code/skills/bundled/iac_aliyun/scripts/tf2ros.py +77 -0
  91. iac_code/skills/bundled/simplify.py +28 -0
  92. iac_code/skills/discovery.py +136 -0
  93. iac_code/skills/frontmatter.py +119 -0
  94. iac_code/skills/listing.py +92 -0
  95. iac_code/skills/loader.py +42 -0
  96. iac_code/skills/processor.py +81 -0
  97. iac_code/skills/renderer.py +157 -0
  98. iac_code/skills/skill_definition.py +82 -0
  99. iac_code/skills/skill_tool.py +261 -0
  100. iac_code/state/__init__.py +5 -0
  101. iac_code/state/app_state.py +122 -0
  102. iac_code/tasks/__init__.py +1 -0
  103. iac_code/tasks/notification_queue.py +28 -0
  104. iac_code/tasks/task_state.py +66 -0
  105. iac_code/tasks/task_tools.py +114 -0
  106. iac_code/tools/__init__.py +8 -0
  107. iac_code/tools/base.py +226 -0
  108. iac_code/tools/bash.py +133 -0
  109. iac_code/tools/cloud/__init__.py +0 -0
  110. iac_code/tools/cloud/aliyun/__init__.py +0 -0
  111. iac_code/tools/cloud/aliyun/aliyun_api.py +510 -0
  112. iac_code/tools/cloud/aliyun/aliyun_doc_search.py +145 -0
  113. iac_code/tools/cloud/aliyun/endpoints.yml +343 -0
  114. iac_code/tools/cloud/aliyun/ros_client.py +56 -0
  115. iac_code/tools/cloud/aliyun/ros_stack.py +633 -0
  116. iac_code/tools/cloud/aliyun/ros_stack_instances.py +247 -0
  117. iac_code/tools/cloud/base_api.py +162 -0
  118. iac_code/tools/cloud/base_stack.py +242 -0
  119. iac_code/tools/cloud/registry.py +20 -0
  120. iac_code/tools/cloud/types.py +105 -0
  121. iac_code/tools/edit_file.py +121 -0
  122. iac_code/tools/glob.py +103 -0
  123. iac_code/tools/grep.py +254 -0
  124. iac_code/tools/list_files.py +104 -0
  125. iac_code/tools/read_file.py +127 -0
  126. iac_code/tools/result_storage.py +39 -0
  127. iac_code/tools/tool_executor.py +165 -0
  128. iac_code/tools/web_fetch.py +177 -0
  129. iac_code/tools/write_file.py +88 -0
  130. iac_code/types/__init__.py +40 -0
  131. iac_code/types/permissions.py +26 -0
  132. iac_code/types/skill_source.py +11 -0
  133. iac_code/types/stream_events.py +227 -0
  134. iac_code/ui/__init__.py +5 -0
  135. iac_code/ui/banner.py +110 -0
  136. iac_code/ui/components/__init__.py +0 -0
  137. iac_code/ui/components/dialog.py +142 -0
  138. iac_code/ui/components/divider.py +20 -0
  139. iac_code/ui/components/fuzzy_picker.py +308 -0
  140. iac_code/ui/components/progress_bar.py +54 -0
  141. iac_code/ui/components/search_box.py +165 -0
  142. iac_code/ui/components/select.py +319 -0
  143. iac_code/ui/components/status_icon.py +42 -0
  144. iac_code/ui/components/tabs.py +128 -0
  145. iac_code/ui/core/__init__.py +0 -0
  146. iac_code/ui/core/in_place_render.py +129 -0
  147. iac_code/ui/core/input_history.py +118 -0
  148. iac_code/ui/core/key_event.py +41 -0
  149. iac_code/ui/core/prompt_input.py +507 -0
  150. iac_code/ui/core/raw_input.py +302 -0
  151. iac_code/ui/core/screen.py +80 -0
  152. iac_code/ui/dialogs/__init__.py +0 -0
  153. iac_code/ui/dialogs/global_search.py +178 -0
  154. iac_code/ui/dialogs/history_search.py +100 -0
  155. iac_code/ui/dialogs/model_picker.py +280 -0
  156. iac_code/ui/dialogs/quick_open.py +108 -0
  157. iac_code/ui/dialogs/resume_picker.py +749 -0
  158. iac_code/ui/keybindings/__init__.py +0 -0
  159. iac_code/ui/keybindings/manager.py +124 -0
  160. iac_code/ui/renderer.py +1535 -0
  161. iac_code/ui/repl.py +772 -0
  162. iac_code/ui/spinner.py +112 -0
  163. iac_code/ui/suggestions/__init__.py +0 -0
  164. iac_code/ui/suggestions/aggregator.py +171 -0
  165. iac_code/ui/suggestions/command_provider.py +43 -0
  166. iac_code/ui/suggestions/directory_provider.py +95 -0
  167. iac_code/ui/suggestions/file_provider.py +121 -0
  168. iac_code/ui/suggestions/shell_history_provider.py +108 -0
  169. iac_code/ui/suggestions/token_extractor.py +77 -0
  170. iac_code/ui/suggestions/types.py +45 -0
  171. iac_code/ui/transcript_view.py +199 -0
  172. iac_code/utils/__init__.py +0 -0
  173. iac_code/utils/background_housekeeping.py +53 -0
  174. iac_code/utils/cleanup.py +68 -0
  175. iac_code/utils/json_utils.py +60 -0
  176. iac_code/utils/log.py +150 -0
  177. iac_code/utils/project_paths.py +74 -0
  178. iac_code/utils/tool_input_parser.py +62 -0
  179. iac_code-0.1.0.dist-info/LICENSE +201 -0
  180. iac_code-0.1.0.dist-info/METADATA +64 -0
  181. iac_code-0.1.0.dist-info/RECORD +184 -0
  182. iac_code-0.1.0.dist-info/WHEEL +5 -0
  183. iac_code-0.1.0.dist-info/entry_points.txt +2 -0
  184. iac_code-0.1.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,74 @@
1
+ """Project-partitioned session storage paths and git helpers.
2
+
3
+ Sessions live under ``~/.iac-code/projects/<sanitize(cwd)>/<session_id>.jsonl``.
4
+
5
+ The directory name encodes the project's working directory; the same
6
+ ``cwd`` always maps to the same directory, so listing sessions for a
7
+ project is just a directory scan.
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import re
13
+ import subprocess
14
+ from hashlib import blake2b
15
+ from pathlib import Path
16
+
17
+ from iac_code.config import get_config_dir
18
+
19
+ MAX_SANITIZED_LENGTH = 200
20
+ _NON_ALNUM = re.compile(r"[^a-zA-Z0-9]")
21
+
22
+
23
+ def sanitize_path(name: str) -> str:
24
+ """Replace every non-alphanumeric character with ``-``.
25
+
26
+ Long names are truncated and a short hash is appended to keep
27
+ uniqueness while staying within filesystem name limits.
28
+ """
29
+ sanitized = _NON_ALNUM.sub("-", name)
30
+ if len(sanitized) <= MAX_SANITIZED_LENGTH:
31
+ return sanitized
32
+ digest = blake2b(name.encode("utf-8"), digest_size=6).hexdigest()
33
+ return f"{sanitized[:MAX_SANITIZED_LENGTH]}-{digest}"
34
+
35
+
36
+ def get_projects_dir() -> Path:
37
+ """Root directory holding all per-project session folders."""
38
+ return get_config_dir() / "projects"
39
+
40
+
41
+ def get_project_dir(cwd: str) -> Path:
42
+ """Directory holding session files for a specific working directory."""
43
+ return get_projects_dir() / sanitize_path(cwd)
44
+
45
+
46
+ def get_session_path(cwd: str, session_id: str) -> Path:
47
+ """JSONL file path for a session belonging to ``cwd``."""
48
+ return get_project_dir(cwd) / f"{session_id}.jsonl"
49
+
50
+
51
+ def get_git_branch(cwd: str) -> str | None:
52
+ """Return the current git branch name at ``cwd``, or ``None``.
53
+
54
+ ``None`` means either ``cwd`` is not inside a git repo, ``git`` is
55
+ unavailable, or the call timed out. Detached HEADs return ``"HEAD"``
56
+ from ``rev-parse --abbrev-ref``; we treat that as ``None``.
57
+ """
58
+ try:
59
+ result = subprocess.run(
60
+ ["git", "rev-parse", "--abbrev-ref", "HEAD"],
61
+ cwd=cwd,
62
+ capture_output=True,
63
+ text=True,
64
+ timeout=2.0,
65
+ check=False,
66
+ )
67
+ except (FileNotFoundError, subprocess.TimeoutExpired, OSError):
68
+ return None
69
+ if result.returncode != 0:
70
+ return None
71
+ branch = result.stdout.strip()
72
+ if not branch or branch == "HEAD":
73
+ return None
74
+ return branch
@@ -0,0 +1,62 @@
1
+ """Shared tool input JSON parsing for all providers.
2
+
3
+ Handles three cases:
4
+ 1. Valid single JSON object → one ToolUseEndEvent
5
+ 2. Concatenated JSON objects (model intended parallel calls) →
6
+ ToolUseEndEvent for the first, ToolUseStart+End pairs for the rest
7
+ 3. Unparseable → ToolUseEndEvent with empty {}
8
+ """
9
+
10
+ from __future__ import annotations
11
+
12
+ import uuid
13
+ from collections.abc import Generator
14
+
15
+ from loguru import logger
16
+
17
+ from iac_code.types.stream_events import StreamEvent, ToolUseEndEvent, ToolUseStartEvent
18
+ from iac_code.utils.json_utils import parse_concatenated_json, safe_parse_json
19
+
20
+
21
+ def parse_tool_input_events(
22
+ tool_use_id: str,
23
+ tool_name: str,
24
+ raw_json: str,
25
+ ) -> Generator[StreamEvent, None, None]:
26
+ """Parse tool input JSON and yield appropriate stream events.
27
+
28
+ Used by all providers (Anthropic, OpenAI, DashScope) to handle
29
+ tool input parsing consistently, including recovery from
30
+ concatenated JSON objects.
31
+ """
32
+ parsed = safe_parse_json(raw_json)
33
+ if isinstance(parsed, dict):
34
+ yield ToolUseEndEvent(tool_use_id=tool_use_id, input=parsed)
35
+ return
36
+
37
+ # Single parse failed on non-empty input — try concatenated JSON recovery
38
+ if raw_json:
39
+ parts = parse_concatenated_json(raw_json)
40
+ if parts:
41
+ logger.info(
42
+ "Recovered %d concatenated tool inputs for tool_use_id=%s",
43
+ len(parts),
44
+ tool_use_id,
45
+ )
46
+ # First part uses the original tool_use_id
47
+ yield ToolUseEndEvent(tool_use_id=tool_use_id, input=parts[0])
48
+ # Additional parts become new synthetic tool calls
49
+ for part in parts[1:]:
50
+ new_id = f"toolu_{uuid.uuid4().hex[:24]}"
51
+ yield ToolUseStartEvent(tool_use_id=new_id, name=tool_name)
52
+ yield ToolUseEndEvent(tool_use_id=new_id, input=part)
53
+ return
54
+
55
+ logger.warning(
56
+ "Tool input JSON parse failed: tool_use_id=%s, length=%d, raw=%s",
57
+ tool_use_id,
58
+ len(raw_json),
59
+ raw_json[:200],
60
+ )
61
+
62
+ yield ToolUseEndEvent(tool_use_id=tool_use_id, input={})
@@ -0,0 +1,201 @@
1
+ Apache License
2
+ Version 2.0, January 2004
3
+ http://www.apache.org/licenses/
4
+
5
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6
+
7
+ 1. Definitions.
8
+
9
+ "License" shall mean the terms and conditions for use, reproduction,
10
+ and distribution as defined by Sections 1 through 9 of this document.
11
+
12
+ "Licensor" shall mean the copyright owner or entity authorized by
13
+ the copyright owner that is granting the License.
14
+
15
+ "Legal Entity" shall mean the union of the acting entity and all
16
+ other entities that control, are controlled by, or are under common
17
+ control with that entity. For the purposes of this definition,
18
+ "control" means (i) the power, direct or indirect, to cause the
19
+ direction or management of such entity, whether by contract or
20
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
21
+ outstanding shares, or (iii) beneficial ownership of such entity.
22
+
23
+ "You" (or "Your") shall mean an individual or Legal Entity
24
+ exercising permissions granted by this License.
25
+
26
+ "Source" form shall mean the preferred form for making modifications,
27
+ including but not limited to software source code, documentation
28
+ source, and configuration files.
29
+
30
+ "Object" form shall mean any form resulting from mechanical
31
+ transformation or translation of a Source form, including but
32
+ not limited to compiled object code, generated documentation,
33
+ and conversions to other media types.
34
+
35
+ "Work" shall mean the work of authorship, whether in Source or
36
+ Object form, made available under the License, as indicated by a
37
+ copyright notice that is included in or attached to the work
38
+ (an example is provided in the Appendix below).
39
+
40
+ "Derivative Works" shall mean any work, whether in Source or Object
41
+ form, that is based on (or derived from) the Work and for which the
42
+ editorial revisions, annotations, elaborations, or other modifications
43
+ represent, as a whole, an original work of authorship. For the purposes
44
+ of this License, Derivative Works shall not include works that remain
45
+ separable from, or merely link (or bind by name) to the interfaces of,
46
+ the Work and Derivative Works thereof.
47
+
48
+ "Contribution" shall mean any work of authorship, including
49
+ the original version of the Work and any modifications or additions
50
+ to that Work or Derivative Works thereof, that is intentionally
51
+ submitted to Licensor for inclusion in the Work by the copyright owner
52
+ or by an individual or Legal Entity authorized to submit on behalf of
53
+ the copyright owner. For the purposes of this definition, "submitted"
54
+ means any form of electronic, verbal, or written communication sent
55
+ to the Licensor or its representatives, including but not limited to
56
+ communication on electronic mailing lists, source code control systems,
57
+ and issue tracking systems that are managed by, or on behalf of, the
58
+ Licensor for the purpose of discussing and improving the Work, but
59
+ excluding communication that is conspicuously marked or otherwise
60
+ designated in writing by the copyright owner as "Not a Contribution."
61
+
62
+ "Contributor" shall mean Licensor and any individual or Legal Entity
63
+ on behalf of whom a Contribution has been received by Licensor and
64
+ subsequently incorporated within the Work.
65
+
66
+ 2. Grant of Copyright License. Subject to the terms and conditions of
67
+ this License, each Contributor hereby grants to You a perpetual,
68
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69
+ copyright license to reproduce, prepare Derivative Works of,
70
+ publicly display, publicly perform, sublicense, and distribute the
71
+ Work and such Derivative Works in Source or Object form.
72
+
73
+ 3. Grant of Patent License. Subject to the terms and conditions of
74
+ this License, each Contributor hereby grants to You a perpetual,
75
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76
+ (except as stated in this section) patent license to make, have made,
77
+ use, offer to sell, sell, import, and otherwise transfer the Work,
78
+ where such license applies only to those patent claims licensable
79
+ by such Contributor that are necessarily infringed by their
80
+ Contribution(s) alone or by combination of their Contribution(s)
81
+ with the Work to which such Contribution(s) was submitted. If You
82
+ institute patent litigation against any entity (including a
83
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
84
+ or a Contribution incorporated within the Work constitutes direct
85
+ or contributory patent infringement, then any patent licenses
86
+ granted to You under this License for that Work shall terminate
87
+ as of the date such litigation is filed.
88
+
89
+ 4. Redistribution. You may reproduce and distribute copies of the
90
+ Work or Derivative Works thereof in any medium, with or without
91
+ modifications, and in Source or Object form, provided that You
92
+ meet the following conditions:
93
+
94
+ (a) You must give any other recipients of the Work or
95
+ Derivative Works a copy of this License; and
96
+
97
+ (b) You must cause any modified files to carry prominent notices
98
+ stating that You changed the files; and
99
+
100
+ (c) You must retain, in the Source form of any Derivative Works
101
+ that You distribute, all copyright, patent, trademark, and
102
+ attribution notices from the Source form of the Work,
103
+ excluding those notices that do not pertain to any part of
104
+ the Derivative Works; and
105
+
106
+ (d) If the Work includes a "NOTICE" text file as part of its
107
+ distribution, then any Derivative Works that You distribute must
108
+ include a readable copy of the attribution notices contained
109
+ within such NOTICE file, excluding those notices that do not
110
+ pertain to any part of the Derivative Works, in at least one
111
+ of the following places: within a NOTICE text file distributed
112
+ as part of the Derivative Works; within the Source form or
113
+ documentation, if provided along with the Derivative Works; or,
114
+ within a display generated by the Derivative Works, if and
115
+ wherever such third-party notices normally appear. The contents
116
+ of the NOTICE file are for informational purposes only and
117
+ do not modify the License. You may add Your own attribution
118
+ notices within Derivative Works that You distribute, alongside
119
+ or as an addendum to the NOTICE text from the Work, provided
120
+ that such additional attribution notices cannot be construed
121
+ as modifying the License.
122
+
123
+ You may add Your own copyright statement to Your modifications and
124
+ may provide additional or different license terms and conditions
125
+ for use, reproduction, or distribution of Your modifications, or
126
+ for any such Derivative Works as a whole, provided Your use,
127
+ reproduction, and distribution of the Work otherwise complies with
128
+ the conditions stated in this License.
129
+
130
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
131
+ any Contribution intentionally submitted for inclusion in the Work
132
+ by You to the Licensor shall be under the terms and conditions of
133
+ this License, without any additional terms or conditions.
134
+ Notwithstanding the above, nothing herein shall supersede or modify
135
+ the terms of any separate license agreement you may have executed
136
+ with Licensor regarding such Contributions.
137
+
138
+ 6. Trademarks. This License does not grant permission to use the trade
139
+ names, trademarks, service marks, or product names of the Licensor,
140
+ except as required for reasonable and customary use in describing the
141
+ origin of the Work and reproducing the content of the NOTICE file.
142
+
143
+ 7. Disclaimer of Warranty. Unless required by applicable law or
144
+ agreed to in writing, Licensor provides the Work (and each
145
+ Contributor provides its Contributions) on an "AS IS" BASIS,
146
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147
+ implied, including, without limitation, any warranties or conditions
148
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149
+ PARTICULAR PURPOSE. You are solely responsible for determining the
150
+ appropriateness of using or redistributing the Work and assume any
151
+ risks associated with Your exercise of permissions under this License.
152
+
153
+ 8. Limitation of Liability. In no event and under no legal theory,
154
+ whether in tort (including negligence), contract, or otherwise,
155
+ unless required by applicable law (such as deliberate and grossly
156
+ negligent acts) or agreed to in writing, shall any Contributor be
157
+ liable to You for damages, including any direct, indirect, special,
158
+ incidental, or consequential damages of any character arising as a
159
+ result of this License or out of the use or inability to use the
160
+ Work (including but not limited to damages for loss of goodwill,
161
+ work stoppage, computer failure or malfunction, or any and all
162
+ other commercial damages or losses), even if such Contributor
163
+ has been advised of the possibility of such damages.
164
+
165
+ 9. Accepting Warranty or Additional Liability. While redistributing
166
+ the Work or Derivative Works thereof, You may choose to offer,
167
+ and charge a fee for, acceptance of support, warranty, indemnity,
168
+ or other liability obligations and/or rights consistent with this
169
+ License. However, in accepting such obligations, You may act only
170
+ on Your own behalf and on Your sole responsibility, not on behalf
171
+ of any other Contributor, and only if You agree to indemnify,
172
+ defend, and hold each Contributor harmless for any liability
173
+ incurred by, or claims asserted against, such Contributor by reason
174
+ of your accepting any such warranty or additional liability.
175
+
176
+ END OF TERMS AND CONDITIONS
177
+
178
+ APPENDIX: How to apply the Apache License to your work.
179
+
180
+ To apply the Apache License to your work, attach the following
181
+ boilerplate notice, with the fields enclosed by brackets "[]"
182
+ replaced with your own identifying information. (Don't include
183
+ the brackets!) The text should be enclosed in the appropriate
184
+ comment syntax for the file format. We also recommend that a
185
+ file or class name and description of purpose be included on the
186
+ same "printed page" as the copyright notice for easier
187
+ identification within third-party archives.
188
+
189
+ Copyright [yyyy] [name of copyright owner]
190
+
191
+ Licensed under the Apache License, Version 2.0 (the "License");
192
+ you may not use this file except in compliance with the License.
193
+ You may obtain a copy of the License at
194
+
195
+ http://www.apache.org/licenses/LICENSE-2.0
196
+
197
+ Unless required by applicable law or agreed to in writing, software
198
+ distributed under the License is distributed on an "AS IS" BASIS,
199
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200
+ See the License for the specific language governing permissions and
201
+ limitations under the License.
@@ -0,0 +1,64 @@
1
+ Metadata-Version: 2.1
2
+ Name: iac-code
3
+ Version: 0.1.0
4
+ Summary: Your AI-powered Infrastructure as Code assistant
5
+ Requires-Python: >=3.12
6
+ Description-Content-Type: text/markdown
7
+ License-File: LICENSE
8
+ Requires-Dist: agent-client-protocol (>=0.9.0)
9
+ Requires-Dist: alibabacloud-credentials (>=0.3.0)
10
+ Requires-Dist: alibabacloud-ros20190910 (>=3.0.0)
11
+ Requires-Dist: anthropic (>=0.40)
12
+ Requires-Dist: httpx (>=0.27.0)
13
+ Requires-Dist: jsonschema (>=4.20)
14
+ Requires-Dist: loguru (>=0.7.0)
15
+ Requires-Dist: openai (>=1.50)
16
+ Requires-Dist: opentelemetry-distro (>=0.48b0)
17
+ Requires-Dist: opentelemetry-exporter-otlp (>=1.27.0)
18
+ Requires-Dist: pydantic (>=2.0)
19
+ Requires-Dist: pyperclip (>=1.8.0)
20
+ Requires-Dist: pyyaml (>=6.0)
21
+ Requires-Dist: rich (>=13.0)
22
+ Requires-Dist: tiktoken (>=0.7.0)
23
+ Requires-Dist: typer (>=0.9.0)
24
+ Provides-Extra: http
25
+ Requires-Dist: starlette (>=0.39.0) ; extra == 'http'
26
+ Requires-Dist: uvicorn[standard] (>=0.30.0) ; extra == 'http'
27
+
28
+ # iac-code
29
+
30
+ **Language**: English | [中文](readme/README.zh.md) | [Español](readme/README.es.md) | [Français](readme/README.fr.md) | [Deutsch](readme/README.de.md) | [日本語](readme/README.ja.md) | [Português](readme/README.pt.md)
31
+
32
+ AI-powered Infrastructure as Code (IaC) assistant that generates and manages Alibaba Cloud resource orchestration templates (ROS / Terraform) through natural language interaction.
33
+
34
+ ## Installation
35
+
36
+ ```bash
37
+ pip install iac-code
38
+ ```
39
+
40
+ ## Usage
41
+
42
+ On first use, configure the LLM provider and IaC cloud service by entering `/auth` in interactive mode.
43
+
44
+ ### Interactive Mode
45
+
46
+ Run directly to enter the interactive REPL:
47
+
48
+ ```bash
49
+ iac-code
50
+ ```
51
+
52
+ ### Non-Interactive Mode
53
+
54
+ Pass a one-shot prompt via `--prompt`:
55
+
56
+ ```bash
57
+ iac-code --prompt "Create a VPC and two ECS instances"
58
+ ```
59
+
60
+ Reading from stdin is also supported:
61
+
62
+ ```bash
63
+ echo "Create an OSS Bucket" | iac-code --prompt -
64
+ ```
@@ -0,0 +1,184 @@
1
+ iac_code/__init__.py,sha256=09ZXTaRqh7V6YdWV5UMJSwU60vuGxb4Dflb4_C7ruqs,54
2
+ iac_code/config.py,sha256=V1-FzKu1c_4O1zIg98HhdYF-OaGlFZOvIWEpo2BLb2s,10399
3
+ iac_code/acp/__init__.py,sha256=Eir12efi22JDtVDoaUYZjCkbQEFjIaF7dj6iC6UZtnk,3113
4
+ iac_code/acp/convert.py,sha256=8UrM5Pllr1T84ciIQvwxKKuds8Me3fSg1K5UtNHYaXg,16177
5
+ iac_code/acp/http_sse.py,sha256=r4UuVp9txCYSNJbTqZSX6uE-0aS-bTcDgga27ataRp8,16736
6
+ iac_code/acp/mcp.py,sha256=eNP_muUMVSPjmThUJn5T-xugDBpb3ZFG0eib1tRKMak,1662
7
+ iac_code/acp/metrics.py,sha256=nnE5heuZSwljuTey1gMSito1Q9USYeODTx38v9UZERs,2449
8
+ iac_code/acp/server.py,sha256=JjGrqdNi0kpidA7Zu7Jezaidk_iwJKzFGDPuDb9KkuQ,25801
9
+ iac_code/acp/session.py,sha256=zfqX-nNnQ3GNTC0iZCl62V9UOIIyyyOT3Wk-AvkS0MU,18168
10
+ iac_code/acp/slash_registry.py,sha256=e7ElEnhyTu2amN3ocmPsq9OG82yurH_kOaUtKAnluoQ,4879
11
+ iac_code/acp/state.py,sha256=rzmpA3ZZWd4OKSBwR-kSLGrJLALXZl1NhwwXPUswh3w,3108
12
+ iac_code/acp/tools.py,sha256=BI9c9eS0NoazBz9Lsf6xW8Tjy7J-lliW4i-TaqfQ4Xc,4389
13
+ iac_code/acp/types.py,sha256=ehn9ufxF4OjMUbn27wh30i12kOsk95QN-OdU4NEC2ZQ,348
14
+ iac_code/acp/version.py,sha256=Li3hmandpIcpKD02cRhcTxiy5EAuuuu7HiGRSVAswL8,770
15
+ iac_code/agent/__init__.py,sha256=xdDYKDpa-78bWo2SVLmgJBY-hBxfgAnCiWGXKmp1W7o,360
16
+ iac_code/agent/agent_loop.py,sha256=tU1WxNjpcheCV5Mf5Q44folvodwWjzPg0ES6bTOVq_M,28793
17
+ iac_code/agent/agent_tool.py,sha256=x_Op-p-jf3BvvqsiO5MIv18_vAqltqetvAHdcluSzX8,10436
18
+ iac_code/agent/agent_types.py,sha256=GzsPkmKPRr_GVgw3BYUrMFVLOgEZKko4tqgmZbicgJ4,2846
19
+ iac_code/agent/message.py,sha256=iMWtIz9nuShZqJmmRH3B_BCd16GFBfz0w8PJEATiMnM,5105
20
+ iac_code/agent/system_prompt.py,sha256=EVzg0i2rE-ijgBsnOqPNzpkBOgHoRIgfuUi3QgiO2Tc,10888
21
+ iac_code/cli/__init__.py,sha256=KPJz184YwHgR84WgARGSCOIb4_NpylnIBP-JDQK1vUs,53
22
+ iac_code/cli/headless.py,sha256=pZXEWFqmwlNC-6eVEQmjcQAS4CO8qAZhSnBsUO3f4YE,3556
23
+ iac_code/cli/main.py,sha256=DneU02CS3gc971h3TQ9CHLz8en_uDTrcFs7bsXshY0w,8689
24
+ iac_code/cli/output_formats.py,sha256=KBmwPBtyLoRwNgzOMWkJMu_yMXg2EIVuaRm980Dkm7g,4092
25
+ iac_code/commands/__init__.py,sha256=WCTj9KQ7u05X4KcwmyZ4g_1-cf6iEWRm4ny5HXLfhGI,2769
26
+ iac_code/commands/auth.py,sha256=E8s7sByowiOHnYchgBALO5ZkOis-O0U2s12mvxJWVE8,34223
27
+ iac_code/commands/clear.py,sha256=oY5Oe8CM3xIhxZn9n5toZ1qb6qihPSVWgu-j3ylZQ8Y,1107
28
+ iac_code/commands/compact.py,sha256=faZaHsFnx_PNoRQcZcwZCCnfSyCcZEIprMBzVZOPvls,1559
29
+ iac_code/commands/debug.py,sha256=X0tWtD-zBMOpcJY4tu62J7Wx2Frnh2eUH7LiqiToSQs,1296
30
+ iac_code/commands/effort.py,sha256=hmhumNjtpQrrRWuVQk0cf98C5Z0-94HxPwWyoS1JxO0,4039
31
+ iac_code/commands/exit.py,sha256=WbWSVxmcRVtBp0nWd4_24BDE0pWow0hwJ3Jcp0AZt-I,225
32
+ iac_code/commands/help.py,sha256=KznVICSIpgqc5JkPI4PhuWxFKtbj2RhP2yHRyUJI7Xk,1281
33
+ iac_code/commands/model.py,sha256=wf-PRxGXihlLFSnWR-x_R_hY9y2IS1PVMIAtH22OScE,4055
34
+ iac_code/commands/registry.py,sha256=b976IJkzEgHsfyv4ctkyCPED4_C57BtnaFugbyTT8fQ,8300
35
+ iac_code/commands/resume.py,sha256=VEuiE0DaxX-CVuy3U7JelyVyFLUVAw0rh9RgASqr1wQ,1624
36
+ iac_code/commands/tasks.py,sha256=37UxjmeuEKc4-vkXodr92neYDHwNB0ER4_Ke8wVVoOU,1380
37
+ iac_code/i18n/__init__.py,sha256=c9lU4MHfO2tiD9oE1pvuh4knWH1m_IWwGMKrD48igHE,4578
38
+ iac_code/i18n/locales/zh/LC_MESSAGES/messages.po,sha256=1eWiNE-Slo2iNf6bgaQDP8s1lrnAEsEMZAn3PCw_hBk,36433
39
+ iac_code/memory/__init__.py,sha256=jey_NEma8wfa2pIaa-Gixgw4V7t8a49MUJC2dAQQ6Ks,25
40
+ iac_code/memory/memory_manager.py,sha256=Eeno99lvJDVlAkoVXHLdelWtcF6yVh-FmbWltlUm0Fc,3344
41
+ iac_code/memory/memory_tools.py,sha256=74WhtQl_GQVMb1AbBZPYDsEHILgP3y__R7Bv_PciYjM,2942
42
+ iac_code/providers/__init__.py,sha256=b_TxceKDYMbkkVEYf-jgYBkM4xv_FFDzbqqQSFo123I,26
43
+ iac_code/providers/anthropic_provider.py,sha256=gCFBiO1PK4fP56WrnWYMNIh6_R0SNbWpx-KPhU82VcE,10786
44
+ iac_code/providers/base.py,sha256=HZzyFDROMET45AhxuzSKtr2PYrhrC-EYo086KQe74xU,3482
45
+ iac_code/providers/dashscope_provider.py,sha256=Edl9pmTq8oh_hVc6B6J_ELcqgOHwSHVTVNwkWA7V0y4,1674
46
+ iac_code/providers/deepseek_provider.py,sha256=utt4hGg_FxpFDRvQ5T3sxuAnVWbE41Fi4rtbfU06QKA,1151
47
+ iac_code/providers/manager.py,sha256=LvbvSF2dMildwm7uXCrSc2cDbdZyBdxygsjQNkYShpI,17910
48
+ iac_code/providers/openai_provider.py,sha256=VeYyuJ1lWoHm-T8DiXgcXHCRBJFJydbbgqbuIlrayJA,12989
49
+ iac_code/providers/retry.py,sha256=bza_L76VlhdB7Qv0GEHcoGe2w7ykcRdwy0-jWo0su90,1612
50
+ iac_code/providers/stream_watchdog.py,sha256=MJWnpqkeTWqRSvFVnSw3PusTfnSpT-yu49H2SfmJeDk,1377
51
+ iac_code/providers/thinking.py,sha256=SWzInKHO4QesOw7nAJk-nSAMg7N9eZkldq_fbR3CGnA,5865
52
+ iac_code/services/__init__.py,sha256=juqd9PbXs4yg45zMJ7BHAOPQjb7sgEbWE9InBtGZhfo,24
53
+ iac_code/services/agent_factory.py,sha256=w35822XARiIPQug0a-wuqg09g0HXS__cZ8DFHVdq9cM,4564
54
+ iac_code/services/cloud_credentials.py,sha256=Lycldvd8kLlvMsijaiU5kvTT0OgJ5YhxUf4Zm6VlZyA,790
55
+ iac_code/services/context_manager.py,sha256=DdOyP9grzZrmOKKwd6nfhfD1TnS7ZEJntFwFExNmpog,8944
56
+ iac_code/services/session_index.py,sha256=J1jJQV_PVOSwNC8-KuHzgFcGweZROa6h__GzUFdrPpI,9730
57
+ iac_code/services/session_storage.py,sha256=Aw2QgbD2JzE4imsEks-zqCO8BipemFSXTGXYQA3LwpE,9458
58
+ iac_code/services/token_budget.py,sha256=ipvsv6F8nVBOoQNj9LtBYAbPvVdbGo3hPhlZIHQN3cs,1559
59
+ iac_code/services/token_counter.py,sha256=j9nH6kWk9xfSvC0STFOVC8kwg1Dvt9f24mLWfNx9PnI,2517
60
+ iac_code/services/providers/__init__.py,sha256=juqd9PbXs4yg45zMJ7BHAOPQjb7sgEbWE9InBtGZhfo,24
61
+ iac_code/services/providers/aliyun.py,sha256=vfTCY3MVsBxS47HDtTQ8P9Z6VAqxfKaOtouC0wD7tis,8687
62
+ iac_code/services/telemetry/__init__.py,sha256=ebs6zbeOn_EOXxAE4uy7iApsgq5kzDTTPPAMQZ2hC2s,1595
63
+ iac_code/services/telemetry/attributes.py,sha256=8MT5WnDbnF1No_kkJ2Tl1rYuMh-swFyM_P24MFxzeE8,2663
64
+ iac_code/services/telemetry/client.py,sha256=2ZjUO4zWlz7sI4ZdCe2OrPEkkD5aB5uo9TSJ9SXSoM0,13054
65
+ iac_code/services/telemetry/config.py,sha256=qOCGPH7tY4Be9CskVSx3YoHtvh1mhb0jnEl4bGSYjPo,2318
66
+ iac_code/services/telemetry/constants.py,sha256=9tYFEOlDncmc79Pv1LtuPUgcHXuLFfMi84d6OfBE0zk,1768
67
+ iac_code/services/telemetry/content_serializer.py,sha256=8-fRIMSbWZ7PopiX_Z4fGFVsI_y0Di1TcJ47Ku2kCBM,4326
68
+ iac_code/services/telemetry/events.py,sha256=19lNn1O1hEHDXEXWk3Ebb7XSFcxBV6FJZp2FxdsNp48,1446
69
+ iac_code/services/telemetry/fallback.py,sha256=py-Wb7ri3AKQDfzN2vQwIzEvuD2xvXhvoqls6hW1Qtw,2016
70
+ iac_code/services/telemetry/identity.py,sha256=-QD0SePobFHsF9jCJKjSnYmmYBHHWPMI6ooH5LTDesw,2474
71
+ iac_code/services/telemetry/metrics.py,sha256=bZTeV3ksz035yijG59bP1XMVJttg6wfKHSR80bFYCys,2013
72
+ iac_code/services/telemetry/names.py,sha256=VAtZJHBTpkEASKX6-G_wDGRC5xq4vmZCAAE5Vgr-0QQ,6904
73
+ iac_code/services/telemetry/sanitize.py,sha256=auuc7GvUr7vq0A67IBMofdwdDc7-l3__N8lXVet6dXI,2824
74
+ iac_code/services/telemetry/sink.py,sha256=3f-dd6kKqHr60_B-Guic4Z1QBNC0fqWz7Vbnj8xOUv4,2342
75
+ iac_code/services/telemetry/tracing.py,sha256=Q9xxYnedQz0DBpT7lLwPpQuBiG8JA8bxVJq6OdRGFx4,1164
76
+ iac_code/services/telemetry/types.py,sha256=GW1ovQu1Yx2vXOefpHyjaiH___eqfcXMZn3KQhdwqGk,537
77
+ iac_code/skills/__init__.py,sha256=92v14ytsWxaoeUofR9hlzhqrjDlbCENajfj7SZvQyTQ,62
78
+ iac_code/skills/discovery.py,sha256=thW-KI8LIsxvBl8k3AAtVK5A_Dw2o-rchTXXgjU8els,4700
79
+ iac_code/skills/frontmatter.py,sha256=V9dKLNEeGR4b0cRw7rAyjuJ4ycQ7NwRTnFAYKo-lsZU,3859
80
+ iac_code/skills/listing.py,sha256=nyfpHj8CqrqYCP-779eCYJEiKcsji0RdjTHTb7ctmWA,2949
81
+ iac_code/skills/loader.py,sha256=1Vgmqp2CZzyQ2ZoGJz4rm1tJL6YwN2J70CJQKC_uqJM,1217
82
+ iac_code/skills/processor.py,sha256=eQQX25QgL0eXRnh7uAuTq6Il7c6Qr6shL4RHpFgrv-A,2653
83
+ iac_code/skills/renderer.py,sha256=LhxFadmhcSYAtcO3VaWuXBPoocyhCLj83VFX3xv9pbk,4884
84
+ iac_code/skills/skill_definition.py,sha256=vuUI9a-DmpMTcWjK65ia-hDDqABdydaUV5mKagGrgGI,2161
85
+ iac_code/skills/skill_tool.py,sha256=fvkkioF5B86yjL5HqLY041BwrhIKKs2AfcRzK_Izemc,9601
86
+ iac_code/skills/bundled/__init__.py,sha256=MrXnQ5TRk1397cZ_-Xwz8tn5zurSczTqCWvU3zG1fpI,2714
87
+ iac_code/skills/bundled/simplify.py,sha256=fyqFKi__9bo_cK_Bu5uPzGB7aaoLoSAve80OW8Tjikw,915
88
+ iac_code/skills/bundled/iac_aliyun/SKILL.md,sha256=DXLqgSACXsVmfxhFbUCUZaVobM8CbL6__7cBGxPbp-c,9989
89
+ iac_code/skills/bundled/iac_aliyun/__init__.py,sha256=KkV07hA_k657jXiB-3jHp3pG6Qy3fQ_fr9n7yWDVO3I,535
90
+ iac_code/skills/bundled/iac_aliyun/references/ros-template.md,sha256=xl_o0E2pznxawoYTjpvSE1fK-I23N96fpQxIYNZIiic,3534
91
+ iac_code/skills/bundled/iac_aliyun/references/template-parameters.md,sha256=Q9wUllkM7aOqFULF0zaOxR9AHTp8fOUhXRMBrzT-j4Y,6068
92
+ iac_code/skills/bundled/iac_aliyun/references/terraform-template.md,sha256=6C7cQoip5zL6-zpJOdW27P5g3JkXnWZ15xjkT3qyBKQ,3378
93
+ iac_code/skills/bundled/iac_aliyun/references/cloud-products/ecs.md,sha256=xIVdqKESOfTYEPnPcxys1N7TD09OghQErzhFgnmeGW0,10441
94
+ iac_code/skills/bundled/iac_aliyun/references/cloud-products/oss.md,sha256=ut_UK1625NCe4J4MEh1j6ajdckf6I027bf8IgIDbZr4,2557
95
+ iac_code/skills/bundled/iac_aliyun/references/cloud-products/rds.md,sha256=lNeCNegl37HNTTo3x4x9_v7_zp7R6Nguvkbg67Qdwkk,3357
96
+ iac_code/skills/bundled/iac_aliyun/references/cloud-products/redis.md,sha256=lBNf6RfUyWYH-ZG-BACg7tFCR6VV-6UE4tZKpIJoib8,3212
97
+ iac_code/skills/bundled/iac_aliyun/references/cloud-products/slb.md,sha256=vHUGwUmAsCt1-MGaNPVtVQLQJlUaqfsE7dVFWsgzqiI,2315
98
+ iac_code/skills/bundled/iac_aliyun/references/cloud-products/vpc.md,sha256=fkdb8PyYsieZmbbziLCnRwNcS9y_J6nYXoNtGk6w4kA,1984
99
+ iac_code/skills/bundled/iac_aliyun/scripts/tf2ros.py,sha256=GJqZQthUhQpgqnt6PIjQW0R3TYCUzs-tlzhzHATDFs8,2451
100
+ iac_code/state/__init__.py,sha256=_kzD_Fqui-zF7y9JHyvKVU7C2Ei4bMcv_tx8frVC0Mc,133
101
+ iac_code/state/app_state.py,sha256=ND12USD_oYgooGkqnCu3u9VqEEJ2KmR4i3tQPObANfw,3580
102
+ iac_code/tasks/__init__.py,sha256=hH8ItYQjbWSVrLgpkWTPL5M19YGAqLA0Azvw_hqqGRw,27
103
+ iac_code/tasks/notification_queue.py,sha256=pVBWgkkGKhr5GxQ9Pv9cbr9pnn5p-Ajh8Uj1iQ4Sot4,732
104
+ iac_code/tasks/task_state.py,sha256=ne-UYqL69i1k5VgNQfRVnaHdAOZFM6AjQUkYPcATyn4,1892
105
+ iac_code/tasks/task_tools.py,sha256=SRhVCDxYpQMYUPJDFW1A44aYwVr-4-NzBD6acPLQtm8,3607
106
+ iac_code/tools/__init__.py,sha256=Z7TjeHwNGwQRPy3Riro9_X4_J4j9gA1tWeh_E4JDwW8,160
107
+ iac_code/tools/base.py,sha256=NYQJb1Cdp7erpardCPSeI94JkfYjwyo7n4BsIUkTJHs,7637
108
+ iac_code/tools/bash.py,sha256=3q_N3NONtPoOp31nHGIP4lCf0B8pHBLCsc_6ut5u0lw,4619
109
+ iac_code/tools/edit_file.py,sha256=dKp9mqAorDo6CYYy26Lf-CNxSpYt09yM3ERtnuDTLTM,4403
110
+ iac_code/tools/glob.py,sha256=73k8kyZ22jRYYNY4-wVrOi3aKWBugtGaEA8SVvVIZzM,3556
111
+ iac_code/tools/grep.py,sha256=swjW9JnbId0hMS8NzBT5L-Hx0MuFX2rjZWOiuEvPUJ8,8604
112
+ iac_code/tools/list_files.py,sha256=YAu_McExQ5EHUkWFJH1CT_sXsJ81VtrZTrj9tZss4lA,3442
113
+ iac_code/tools/read_file.py,sha256=ac_ipm_nhC2WuTwwK6UhrYnQwJmHBvp8dGJCoZE4rAY,4737
114
+ iac_code/tools/result_storage.py,sha256=bvJh-xETkOz1neIf_vXgZBRK_KU1XbQ8jveMuvD0YJE,1306
115
+ iac_code/tools/tool_executor.py,sha256=tSG9lJ4iM2bZcxOk-gJ__YRTFufXp1iTxaLGLKhrZ_4,7052
116
+ iac_code/tools/web_fetch.py,sha256=Jw_JdSEU5wgSxoOOGDqQ3obvIXt-diECZoL2RkGDg_Y,6079
117
+ iac_code/tools/write_file.py,sha256=Ey_jw9c0iDCpWs-MgvRgh8QK3NUM8fDMN_BvubEmOB0,3027
118
+ iac_code/tools/cloud/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
119
+ iac_code/tools/cloud/base_api.py,sha256=0_cSdh6NagA7OL02Y8uhaGJyVfmhn4oiSclVrtk8rac,5768
120
+ iac_code/tools/cloud/base_stack.py,sha256=60Ymcem21q3nxdQyeURypSiDbStcIiP99pEL0gYmTMI,8424
121
+ iac_code/tools/cloud/registry.py,sha256=nXsod4ZiVp4Uki-i0vbQT-hIqVUeeI4C6Z8th65Jc6A,818
122
+ iac_code/tools/cloud/types.py,sha256=XOMaJ4CSmpoFglEnLOXkH5G1IViaohXGQoBJq0Ka4nw,2797
123
+ iac_code/tools/cloud/aliyun/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
124
+ iac_code/tools/cloud/aliyun/aliyun_api.py,sha256=vwKrW4EcqdMgbR0CqAUX7a8kgt_JEE296RUWAYQCRIA,19010
125
+ iac_code/tools/cloud/aliyun/aliyun_doc_search.py,sha256=M8J8-IT_Y_IwKwEyaKoAz3-Kz2cfeMSFjjFuU04fVFI,5150
126
+ iac_code/tools/cloud/aliyun/endpoints.yml,sha256=WMC-wrm0MSFFE0AUU1LL1K5s1F2QehByq-AQy-MaxXI,7342
127
+ iac_code/tools/cloud/aliyun/ros_client.py,sha256=NfN9oPAjgKei-OI0RVVkvgsIf75d2gHhABzFNXifmu4,2273
128
+ iac_code/tools/cloud/aliyun/ros_stack.py,sha256=BKYeqVL3oUkQ-hK8xqhUlm5RQC06S1b7OPCzYg1Fb7A,23973
129
+ iac_code/tools/cloud/aliyun/ros_stack_instances.py,sha256=iiCopINPQEtZWenyIzxI7cH2vjwcbidS9Jl7zs4QvGw,9979
130
+ iac_code/types/__init__.py,sha256=8fvtKSTqZ87qwlWVhhWMh5q8d59XGIuDFI_ZCopNtGs,875
131
+ iac_code/types/permissions.py,sha256=49tetN9qaaeX8oA71A4sem3GgtTHeUra4ODsZxL8F6o,604
132
+ iac_code/types/skill_source.py,sha256=5YnU0_FMo9D91b3HdY_yo6oX5W1lJZwumbbipOuhRkQ,250
133
+ iac_code/types/stream_events.py,sha256=6_EvDnYpQ8pspymQaxru3N7gNYeQzqxyyVuDLEn88fg,5351
134
+ iac_code/ui/__init__.py,sha256=kiua8t2I_T-zwlagEI8ZQsaR6G82wUsp7C5_8ph8Xzc,94
135
+ iac_code/ui/banner.py,sha256=d_vRhTv2c0IOL5xryqFheNk8nM6LQlfPcNxfdUg31Is,3581
136
+ iac_code/ui/renderer.py,sha256=jd-wfqGUf7FmBMY1nRt4yDXt8f3dnYdO9IRHDUF97m8,67997
137
+ iac_code/ui/repl.py,sha256=LYW6yewWJCzq0yeGbhlc6h_z6rMSHk4EMsKU_oUY6RY,32640
138
+ iac_code/ui/spinner.py,sha256=n6ermXacFicxDZN_SUQfMeAYgjUe2sAJ6ed9H9ATxDk,3031
139
+ iac_code/ui/transcript_view.py,sha256=vEzfI1nrXX7dZlVbJXwLUBVknT5VyRN8St4PmNVybvY,8014
140
+ iac_code/ui/components/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
141
+ iac_code/ui/components/dialog.py,sha256=LZ5VHOzzSNeL0q_8rEeIeAj_NoZN_MqOcZPDDhaTsm0,4942
142
+ iac_code/ui/components/divider.py,sha256=suN8-83Dpp22onJUuJgtcO0RKZwiSsDV0O0Urfho-hY,486
143
+ iac_code/ui/components/fuzzy_picker.py,sha256=K41vFHyyq3OQFUCeNKkYEizdJlINNbSDC5lRBjukh30,10279
144
+ iac_code/ui/components/progress_bar.py,sha256=whD0PgMDhgPKABanHrQT6Hgkg6fwGIETfppA9aDz1Yw,1609
145
+ iac_code/ui/components/search_box.py,sha256=z6tZJnsXvmg3TJ6X4PK4nIERlk3IqTtGLBC8g1Vtlhs,5372
146
+ iac_code/ui/components/select.py,sha256=TZiAqDJMJbfzBfhdHAACJFZW04hbes7A1i65ftq7zQ8,10002
147
+ iac_code/ui/components/status_icon.py,sha256=wmVrsoNL2TPwJh5KPR8LkWKckFrv6yb1-9os-XooI2U,973
148
+ iac_code/ui/components/tabs.py,sha256=govhjbtz-9Y-KjhuNmM2Hr-8lOm_-bAZQiCnHEKtviE,3805
149
+ iac_code/ui/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
150
+ iac_code/ui/core/in_place_render.py,sha256=Jse8SgHwsPfziDS0W1VNMqUEKtbsOzFzgLJqANhgP5Y,4941
151
+ iac_code/ui/core/input_history.py,sha256=-RwMizSmgZLn5NuW1Mmf-r4-ucTK9Y9XeaQF6M_1NJ0,4161
152
+ iac_code/ui/core/key_event.py,sha256=IC2updZjK7UwaIo3htFBxqNQ9SrAKT8_uE1evyoFmrE,1203
153
+ iac_code/ui/core/prompt_input.py,sha256=ZIkr2l-g2bjDLm9RRh0wBnj18WnvtJeJBi86Hchgw18,19330
154
+ iac_code/ui/core/raw_input.py,sha256=P-_LLxmlywW1Text94nGVxPU1Mi9sU9FvVJD6d1dq34,9469
155
+ iac_code/ui/core/screen.py,sha256=rQf6UXO-xqcuYruVxj2QZNJfpjs_-BFaCeeu_m77r5M,2980
156
+ iac_code/ui/dialogs/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
157
+ iac_code/ui/dialogs/global_search.py,sha256=HRcqp2TDkZvp5PFr4mz47VWpyMPI8uDg00yA-UzwETU,5496
158
+ iac_code/ui/dialogs/history_search.py,sha256=VYUVzpiQBcdYDvFPZRhRv44fcyl2n71gZi3Pge3htW0,3366
159
+ iac_code/ui/dialogs/model_picker.py,sha256=M12L67UAHRHs0wQ4Ugv2Jkurgi9vyKEEqCvmlefCar0,9772
160
+ iac_code/ui/dialogs/quick_open.py,sha256=7hCIpaLb6Wjb2NE5n2NbvpM_VEujCivE6huzYa8BxJw,3732
161
+ iac_code/ui/dialogs/resume_picker.py,sha256=V3JWFqMQCEQRQrPiTpgm4KBlLoh_B7nWybfqBi3nPTs,28221
162
+ iac_code/ui/keybindings/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
163
+ iac_code/ui/keybindings/manager.py,sha256=7vum2VsWSH9ew-_gdKVtAF6fXge2DRwTe0aEZxFAnrM,4512
164
+ iac_code/ui/suggestions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
165
+ iac_code/ui/suggestions/aggregator.py,sha256=2HitvtJ7dooAo_g0oo_PhHJhNAKd6bx7G-mw55NScAA,5839
166
+ iac_code/ui/suggestions/command_provider.py,sha256=b0WMHsaAQdsZDjviZwFHlrmIbACu4DtQl9EmvwuzTxY,1492
167
+ iac_code/ui/suggestions/directory_provider.py,sha256=Esco20IBqukyivsszN2-2fuqZHPsGRFCz2TXItfnBgg,3360
168
+ iac_code/ui/suggestions/file_provider.py,sha256=dEwF92QncAbxcZnRdJTmpVUAMyqrT1aNMBhes-sO2i4,3468
169
+ iac_code/ui/suggestions/shell_history_provider.py,sha256=B0_GDx-zmXO-HE3BmEF0Sf75Ke5RUEAzjcgZ-cINSHk,3275
170
+ iac_code/ui/suggestions/token_extractor.py,sha256=UstEnMTDaeAAxj95tbxyJPA8kfDTtxv6Vh6aq6xu3Aw,2183
171
+ iac_code/ui/suggestions/types.py,sha256=-_O2bQkfz8L3tZXPSrVc2fuiW0DKL3iXjW49DDHAF0M,1287
172
+ iac_code/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
173
+ iac_code/utils/background_housekeeping.py,sha256=3VukrshqkDRXRf6jQkvddq7rkrYFN9FPcrzDbhQkshU,1473
174
+ iac_code/utils/cleanup.py,sha256=kf-LFH8OtryrLKQ-xZ243yF-k5YMJTT0BwUvW-M3DK0,1745
175
+ iac_code/utils/json_utils.py,sha256=1RNYthW8DyqiilylZBgj9fvXVoG9LqochlB8097izN8,1755
176
+ iac_code/utils/log.py,sha256=kT5KhZS4hCtBejOtkJBoAbwMX5qBEhZrVFuCiFq7XwA,4135
177
+ iac_code/utils/project_paths.py,sha256=rZHD0P5XENdIVhHjxAvCcy1OnyUN7IRyYlyRLttPFkg,2332
178
+ iac_code/utils/tool_input_parser.py,sha256=7Zvr6tsYKkmUedE4zGDLm1sKvzrpBMwnAq3O_S0F6mg,2166
179
+ iac_code-0.1.0.dist-info/LICENSE,sha256=QwcOLU5TJoTeUhuIXzhdCEEDDvorGiC6-3YTOl4TecE,11356
180
+ iac_code-0.1.0.dist-info/METADATA,sha256=u2Z1FrIbYNl38v_GFcbBpEsZDrfCdu8gc7-OVGP6XKU,1848
181
+ iac_code-0.1.0.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
182
+ iac_code-0.1.0.dist-info/entry_points.txt,sha256=I0X4_t1jU9U6X81BbjSnf2Mnq8clLe-VNbsQTjwjW04,51
183
+ iac_code-0.1.0.dist-info/top_level.txt,sha256=gxcdXFokUDuYvFp4AmN-XbszhUvhNYIvhmZcTjSXlRE,9
184
+ iac_code-0.1.0.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: bdist_wheel (0.38.4)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1,2 @@
1
+ [console_scripts]
2
+ iac-code = iac_code.cli.main:app
@@ -0,0 +1 @@
1
+ iac_code