agentcore-cli 0.31.1__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 (655) hide show
  1. agentcore/__init__.py +1 -0
  2. agentcore/agent_inspector/NOTICE +9 -0
  3. agentcore/agent_inspector/favicon.svg +60 -0
  4. agentcore/agent_inspector/index.css +1 -0
  5. agentcore/agent_inspector/index.html +14 -0
  6. agentcore/agent_inspector/index.js +289 -0
  7. agentcore/assets/AGENTS.md +60 -0
  8. agentcore/assets/README.md +108 -0
  9. agentcore/assets/agents/AGENTS.md +218 -0
  10. agentcore/assets/cdk/.prettierrc +8 -0
  11. agentcore/assets/cdk/README.md +26 -0
  12. agentcore/assets/cdk/bin/cdk.ts +216 -0
  13. agentcore/assets/cdk/cdk.json +88 -0
  14. agentcore/assets/cdk/gitignore.template +9 -0
  15. agentcore/assets/cdk/jest.config.js +9 -0
  16. agentcore/assets/cdk/lib/cdk-stack.ts +291 -0
  17. agentcore/assets/cdk/npmignore.template +6 -0
  18. agentcore/assets/cdk/package.json +30 -0
  19. agentcore/assets/cdk/test/cdk.test.ts +31 -0
  20. agentcore/assets/cdk/tsconfig.json +28 -0
  21. agentcore/assets/container/python/Dockerfile +47 -0
  22. agentcore/assets/container/python/dockerignore.template +27 -0
  23. agentcore/assets/container/typescript/Dockerfile +25 -0
  24. agentcore/assets/container/typescript/dockerignore.template +24 -0
  25. agentcore/assets/datasets/predefined-v1.jsonl +3 -0
  26. agentcore/assets/datasets/simulated-v1.jsonl +3 -0
  27. agentcore/assets/evaluators/autoevals-lambda/execution-role-policy.json +15 -0
  28. agentcore/assets/evaluators/autoevals-lambda/lambda_function.py +37 -0
  29. agentcore/assets/evaluators/autoevals-lambda/pyproject.toml +22 -0
  30. agentcore/assets/evaluators/deepeval-lambda/execution-role-policy.json +15 -0
  31. agentcore/assets/evaluators/deepeval-lambda/lambda_function.py +29 -0
  32. agentcore/assets/evaluators/deepeval-lambda/pyproject.toml +19 -0
  33. agentcore/assets/evaluators/python-lambda/execution-role-policy.json +10 -0
  34. agentcore/assets/evaluators/python-lambda/lambda_function.py +19 -0
  35. agentcore/assets/evaluators/python-lambda/pyproject.toml +15 -0
  36. agentcore/assets/harness/invoke.py.template +74 -0
  37. agentcore/assets/mcp/python/README.md +27 -0
  38. agentcore/assets/mcp/python/pyproject.toml +22 -0
  39. agentcore/assets/mcp/python/server.py +117 -0
  40. agentcore/assets/mcp/python-lambda/README.md +22 -0
  41. agentcore/assets/mcp/python-lambda/handler.py +144 -0
  42. agentcore/assets/mcp/python-lambda/pyproject.toml +15 -0
  43. agentcore/assets/python/a2a/googleadk/base/README.md +22 -0
  44. agentcore/assets/python/a2a/googleadk/base/gitignore.template +41 -0
  45. agentcore/assets/python/a2a/googleadk/base/main.py +124 -0
  46. agentcore/assets/python/a2a/googleadk/base/model/__init__.py +1 -0
  47. agentcore/assets/python/a2a/googleadk/base/model/load.py +41 -0
  48. agentcore/assets/python/a2a/googleadk/base/pyproject.toml +22 -0
  49. agentcore/assets/python/a2a/langchain_langgraph/base/README.md +22 -0
  50. agentcore/assets/python/a2a/langchain_langgraph/base/gitignore.template +41 -0
  51. agentcore/assets/python/a2a/langchain_langgraph/base/main.py +144 -0
  52. agentcore/assets/python/a2a/langchain_langgraph/base/model/__init__.py +1 -0
  53. agentcore/assets/python/a2a/langchain_langgraph/base/model/load.py +123 -0
  54. agentcore/assets/python/a2a/langchain_langgraph/base/pyproject.toml +26 -0
  55. agentcore/assets/python/a2a/strands/base/README.md +22 -0
  56. agentcore/assets/python/a2a/strands/base/gitignore.template +41 -0
  57. agentcore/assets/python/a2a/strands/base/main.py +113 -0
  58. agentcore/assets/python/a2a/strands/base/model/__init__.py +1 -0
  59. agentcore/assets/python/a2a/strands/base/model/load.py +123 -0
  60. agentcore/assets/python/a2a/strands/base/pyproject.toml +23 -0
  61. agentcore/assets/python/a2a/strands/capabilities/memory/__init__.py +1 -0
  62. agentcore/assets/python/a2a/strands/capabilities/memory/session.py +46 -0
  63. agentcore/assets/python/agui/googleadk/base/README.md +30 -0
  64. agentcore/assets/python/agui/googleadk/base/gitignore.template +41 -0
  65. agentcore/assets/python/agui/googleadk/base/main.py +91 -0
  66. agentcore/assets/python/agui/googleadk/base/model/__init__.py +1 -0
  67. agentcore/assets/python/agui/googleadk/base/model/load.py +41 -0
  68. agentcore/assets/python/agui/googleadk/base/pyproject.toml +25 -0
  69. agentcore/assets/python/agui/langchain_langgraph/base/README.md +22 -0
  70. agentcore/assets/python/agui/langchain_langgraph/base/gitignore.template +41 -0
  71. agentcore/assets/python/agui/langchain_langgraph/base/main.py +130 -0
  72. agentcore/assets/python/agui/langchain_langgraph/base/model/__init__.py +1 -0
  73. agentcore/assets/python/agui/langchain_langgraph/base/model/load.py +123 -0
  74. agentcore/assets/python/agui/langchain_langgraph/base/pyproject.toml +31 -0
  75. agentcore/assets/python/agui/strands/base/README.md +22 -0
  76. agentcore/assets/python/agui/strands/base/gitignore.template +41 -0
  77. agentcore/assets/python/agui/strands/base/main.py +105 -0
  78. agentcore/assets/python/agui/strands/base/model/__init__.py +1 -0
  79. agentcore/assets/python/agui/strands/base/model/load.py +123 -0
  80. agentcore/assets/python/agui/strands/base/pyproject.toml +27 -0
  81. agentcore/assets/python/agui/strands/capabilities/memory/__init__.py +1 -0
  82. agentcore/assets/python/agui/strands/capabilities/memory/session.py +46 -0
  83. agentcore/assets/python/http/autogen/base/README.md +45 -0
  84. agentcore/assets/python/http/autogen/base/gitignore.template +41 -0
  85. agentcore/assets/python/http/autogen/base/main.py +145 -0
  86. agentcore/assets/python/http/autogen/base/mcp_client/__init__.py +1 -0
  87. agentcore/assets/python/http/autogen/base/mcp_client/client.py +28 -0
  88. agentcore/assets/python/http/autogen/base/model/__init__.py +1 -0
  89. agentcore/assets/python/http/autogen/base/model/load.py +136 -0
  90. agentcore/assets/python/http/autogen/base/pyproject.toml +34 -0
  91. agentcore/assets/python/http/bma/base/Dockerfile +41 -0
  92. agentcore/assets/python/http/bma/base/README.md +178 -0
  93. agentcore/assets/python/http/bma/base/client.py +200 -0
  94. agentcore/assets/python/http/bma/base/lifecycle/server.py +641 -0
  95. agentcore/assets/python/http/bma/base/otel/collector.yaml +69 -0
  96. agentcore/assets/python/http/bma/base/plugins/acr-report/.codex-plugin/plugin.json +6 -0
  97. agentcore/assets/python/http/bma/base/plugins/acr-report/skills/acr-report/SKILL.md +16 -0
  98. agentcore/assets/python/http/bma/base/policies/bma-acr-policy.json +11 -0
  99. agentcore/assets/python/http/bma/base/policies/bma-session-policy.json +35 -0
  100. agentcore/assets/python/http/bma/base/policies/bma-session-trust.json +20 -0
  101. agentcore/assets/python/http/bma/base/pyproject.toml +21 -0
  102. agentcore/assets/python/http/googleadk/base/README.md +45 -0
  103. agentcore/assets/python/http/googleadk/base/gitignore.template +41 -0
  104. agentcore/assets/python/http/googleadk/base/main.py +207 -0
  105. agentcore/assets/python/http/googleadk/base/mcp_client/__init__.py +1 -0
  106. agentcore/assets/python/http/googleadk/base/mcp_client/client.py +75 -0
  107. agentcore/assets/python/http/googleadk/base/model/__init__.py +1 -0
  108. agentcore/assets/python/http/googleadk/base/model/load.py +41 -0
  109. agentcore/assets/python/http/googleadk/base/pyproject.toml +24 -0
  110. agentcore/assets/python/http/langchain_langgraph/base/README.md +45 -0
  111. agentcore/assets/python/http/langchain_langgraph/base/gitignore.template +41 -0
  112. agentcore/assets/python/http/langchain_langgraph/base/main.py +227 -0
  113. agentcore/assets/python/http/langchain_langgraph/base/mcp_client/__init__.py +1 -0
  114. agentcore/assets/python/http/langchain_langgraph/base/mcp_client/client.py +79 -0
  115. agentcore/assets/python/http/langchain_langgraph/base/model/__init__.py +1 -0
  116. agentcore/assets/python/http/langchain_langgraph/base/model/load.py +123 -0
  117. agentcore/assets/python/http/langchain_langgraph/base/pyproject.toml +38 -0
  118. agentcore/assets/python/http/openaiagents/base/README.md +45 -0
  119. agentcore/assets/python/http/openaiagents/base/gitignore.template +41 -0
  120. agentcore/assets/python/http/openaiagents/base/main.py +200 -0
  121. agentcore/assets/python/http/openaiagents/base/mcp_client/__init__.py +1 -0
  122. agentcore/assets/python/http/openaiagents/base/mcp_client/client.py +74 -0
  123. agentcore/assets/python/http/openaiagents/base/model/__init__.py +1 -0
  124. agentcore/assets/python/http/openaiagents/base/model/load.py +37 -0
  125. agentcore/assets/python/http/openaiagents/base/pyproject.toml +21 -0
  126. agentcore/assets/python/http/strands/base/README.md +46 -0
  127. agentcore/assets/python/http/strands/base/gitignore.template +41 -0
  128. agentcore/assets/python/http/strands/base/main.py +714 -0
  129. agentcore/assets/python/http/strands/base/mcp_client/__init__.py +1 -0
  130. agentcore/assets/python/http/strands/base/mcp_client/client.py +116 -0
  131. agentcore/assets/python/http/strands/base/model/__init__.py +1 -0
  132. agentcore/assets/python/http/strands/base/model/load.py +239 -0
  133. agentcore/assets/python/http/strands/base/model/mantle_compat.py +21 -0
  134. agentcore/assets/python/http/strands/base/pyproject.toml +31 -0
  135. agentcore/assets/python/http/strands/base/skills/fetcher.py +279 -0
  136. agentcore/assets/python/http/strands/capabilities/execution-limits/hooks/execution_limits.py +54 -0
  137. agentcore/assets/python/http/strands/capabilities/memory/__init__.py +1 -0
  138. agentcore/assets/python/http/strands/capabilities/memory/session.py +47 -0
  139. agentcore/assets/python/http/strands/capabilities/payments/__init__.py +4 -0
  140. agentcore/assets/python/http/strands/capabilities/payments/payments.py +142 -0
  141. agentcore/assets/python/mcp/standalone/base/README.md +36 -0
  142. agentcore/assets/python/mcp/standalone/base/gitignore.template +41 -0
  143. agentcore/assets/python/mcp/standalone/base/main.py +83 -0
  144. agentcore/assets/python/mcp/standalone/base/pyproject.toml +16 -0
  145. agentcore/assets/typescript/.gitkeep +0 -0
  146. agentcore/assets/typescript/http/strands/base/README.md +42 -0
  147. agentcore/assets/typescript/http/strands/base/gitignore.template +22 -0
  148. agentcore/assets/typescript/http/strands/base/main.ts +149 -0
  149. agentcore/assets/typescript/http/strands/base/mcp_client/client.ts +11 -0
  150. agentcore/assets/typescript/http/strands/base/model/load.ts +102 -0
  151. agentcore/assets/typescript/http/strands/base/package.json +38 -0
  152. agentcore/assets/typescript/http/strands/base/tsconfig.json +19 -0
  153. agentcore/assets/typescript/http/strands/capabilities/memory/memory.ts +52 -0
  154. agentcore/assets/typescript/http/vercelai/base/README.md +42 -0
  155. agentcore/assets/typescript/http/vercelai/base/gitignore.template +22 -0
  156. agentcore/assets/typescript/http/vercelai/base/main.ts +70 -0
  157. agentcore/assets/typescript/http/vercelai/base/model/load.ts +121 -0
  158. agentcore/assets/typescript/http/vercelai/base/package.json +35 -0
  159. agentcore/assets/typescript/http/vercelai/base/tsconfig.json +19 -0
  160. agentcore/aws/__init__.py +263 -0
  161. agentcore/aws/_aws_errors.py +72 -0
  162. agentcore/aws/_http.py +176 -0
  163. agentcore/aws/_util.py +37 -0
  164. agentcore/aws/account.py +165 -0
  165. agentcore/aws/agentcore.py +971 -0
  166. agentcore/aws/agentcore_ab_tests.py +230 -0
  167. agentcore/aws/agentcore_batch_evaluation.py +227 -0
  168. agentcore/aws/agentcore_config_bundles.py +220 -0
  169. agentcore/aws/agentcore_control.py +994 -0
  170. agentcore/aws/agentcore_datasets.py +222 -0
  171. agentcore/aws/agentcore_harness.py +330 -0
  172. agentcore/aws/agentcore_payments.py +430 -0
  173. agentcore/aws/agentcore_recommendation.py +140 -0
  174. agentcore/aws/agui_parser.py +131 -0
  175. agentcore/aws/agui_types.py +342 -0
  176. agentcore/aws/api_client.py +87 -0
  177. agentcore/aws/arn.py +18 -0
  178. agentcore/aws/aws_context.py +23 -0
  179. agentcore/aws/bedrock.py +44 -0
  180. agentcore/aws/bedrock_agent.py +129 -0
  181. agentcore/aws/bedrock_import.py +252 -0
  182. agentcore/aws/bedrock_import_types.py +111 -0
  183. agentcore/aws/cloudwatch.py +136 -0
  184. agentcore/aws/connect_shell.py +266 -0
  185. agentcore/aws/iam.py +41 -0
  186. agentcore/aws/partition.py +58 -0
  187. agentcore/aws/policy_generation.py +116 -0
  188. agentcore/aws/region.py +54 -0
  189. agentcore/aws/retry.py +27 -0
  190. agentcore/aws/shell_framer.py +136 -0
  191. agentcore/aws/stage_endpoint.py +39 -0
  192. agentcore/aws/target_region.py +54 -0
  193. agentcore/aws/transaction_search.py +97 -0
  194. agentcore/cdk/__init__.py +10 -0
  195. agentcore/cdk/constants.py +13 -0
  196. agentcore/cdk/local_cdk_project.py +48 -0
  197. agentcore/cdk/toolkit.py +706 -0
  198. agentcore/cli/__init__.py +0 -0
  199. agentcore/cli/commands/__init__.py +0 -0
  200. agentcore/cli/commands/_jobs_common.py +39 -0
  201. agentcore/cli/commands/_run_wizards.py +639 -0
  202. agentcore/cli/commands/add/__init__.py +37 -0
  203. agentcore/cli/commands/add/_commander.py +52 -0
  204. agentcore/cli/commands/add/_common.py +47 -0
  205. agentcore/cli/commands/add/agent_wizard.py +528 -0
  206. agentcore/cli/commands/add/auth_options.py +154 -0
  207. agentcore/cli/commands/add/skill_action.py +105 -0
  208. agentcore/cli/commands/add/skill_command.py +87 -0
  209. agentcore/cli/commands/add/tool_action.py +160 -0
  210. agentcore/cli/commands/add/tool_command.py +117 -0
  211. agentcore/cli/commands/add/validate.py +333 -0
  212. agentcore/cli/commands/capacity_provider/__init__.py +86 -0
  213. agentcore/cli/commands/capacity_provider/action.py +114 -0
  214. agentcore/cli/commands/capacity_provider/constants.py +22 -0
  215. agentcore/cli/commands/config.py +91 -0
  216. agentcore/cli/commands/config_bundle.py +251 -0
  217. agentcore/cli/commands/create/__init__.py +643 -0
  218. agentcore/cli/commands/create/action.py +406 -0
  219. agentcore/cli/commands/create/dependencies.py +91 -0
  220. agentcore/cli/commands/create/harness_validate.py +82 -0
  221. agentcore/cli/commands/create/validate.py +195 -0
  222. agentcore/cli/commands/create/wizard.py +127 -0
  223. agentcore/cli/commands/dataset.py +119 -0
  224. agentcore/cli/commands/deploy/__init__.py +31 -0
  225. agentcore/cli/commands/deploy/_guards.py +25 -0
  226. agentcore/cli/commands/deploy/actions.py +840 -0
  227. agentcore/cli/commands/deploy/command.py +349 -0
  228. agentcore/cli/commands/deploy/progress.py +115 -0
  229. agentcore/cli/commands/deploy/types.py +68 -0
  230. agentcore/cli/commands/deploy/utils.py +43 -0
  231. agentcore/cli/commands/deploy/validate.py +21 -0
  232. agentcore/cli/commands/dev/__init__.py +5 -0
  233. agentcore/cli/commands/dev/_deps.py +50 -0
  234. agentcore/cli/commands/dev/browser_mode.py +270 -0
  235. agentcore/cli/commands/dev/command.py +450 -0
  236. agentcore/cli/commands/dev/terminal_mode.py +379 -0
  237. agentcore/cli/commands/exec/__init__.py +29 -0
  238. agentcore/cli/commands/exec/action.py +442 -0
  239. agentcore/cli/commands/exec/command.py +206 -0
  240. agentcore/cli/commands/exec/types.py +35 -0
  241. agentcore/cli/commands/export/__init__.py +114 -0
  242. agentcore/cli/commands/export/constants.py +21 -0
  243. agentcore/cli/commands/export/fetch_harness_spec.py +234 -0
  244. agentcore/cli/commands/export/harness_action.py +385 -0
  245. agentcore/cli/commands/export/harness_mapper.py +868 -0
  246. agentcore/cli/commands/export/harness_resolver.py +95 -0
  247. agentcore/cli/commands/export/types.py +90 -0
  248. agentcore/cli/commands/export/wizard.py +97 -0
  249. agentcore/cli/commands/feedback/__init__.py +69 -0
  250. agentcore/cli/commands/feedback/action.py +30 -0
  251. agentcore/cli/commands/feedback/consent_prompt.py +35 -0
  252. agentcore/cli/commands/feedback/wizard.py +49 -0
  253. agentcore/cli/commands/fetch/__init__.py +69 -0
  254. agentcore/cli/commands/fetch/action.py +62 -0
  255. agentcore/cli/commands/help.py +65 -0
  256. agentcore/cli/commands/import_/__init__.py +167 -0
  257. agentcore/cli/commands/import_/_js.py +72 -0
  258. agentcore/cli/commands/import_/actions.py +457 -0
  259. agentcore/cli/commands/import_/constants.py +45 -0
  260. agentcore/cli/commands/import_/import_evaluator.py +140 -0
  261. agentcore/cli/commands/import_/import_gateway.py +520 -0
  262. agentcore/cli/commands/import_/import_memory.py +128 -0
  263. agentcore/cli/commands/import_/import_online_eval.py +165 -0
  264. agentcore/cli/commands/import_/import_pipeline.py +145 -0
  265. agentcore/cli/commands/import_/import_runtime.py +214 -0
  266. agentcore/cli/commands/import_/import_utils.py +410 -0
  267. agentcore/cli/commands/import_/phase1_update.py +110 -0
  268. agentcore/cli/commands/import_/phase2_import.py +206 -0
  269. agentcore/cli/commands/import_/resource_import.py +228 -0
  270. agentcore/cli/commands/import_/template_utils.py +148 -0
  271. agentcore/cli/commands/import_/types.py +150 -0
  272. agentcore/cli/commands/import_/yaml_parser.py +265 -0
  273. agentcore/cli/commands/init.py +196 -0
  274. agentcore/cli/commands/invoke/__init__.py +32 -0
  275. agentcore/cli/commands/invoke/_deps.py +73 -0
  276. agentcore/cli/commands/invoke/action.py +840 -0
  277. agentcore/cli/commands/invoke/command.py +490 -0
  278. agentcore/cli/commands/invoke/constants.py +40 -0
  279. agentcore/cli/commands/invoke/guards.py +23 -0
  280. agentcore/cli/commands/invoke/interactive.py +604 -0
  281. agentcore/cli/commands/invoke/resolve.py +149 -0
  282. agentcore/cli/commands/invoke/resolve_prompt.py +60 -0
  283. agentcore/cli/commands/invoke/types.py +61 -0
  284. agentcore/cli/commands/invoke/validate.py +33 -0
  285. agentcore/cli/commands/job_actions.py +239 -0
  286. agentcore/cli/commands/job_history.py +380 -0
  287. agentcore/cli/commands/logs/__init__.py +53 -0
  288. agentcore/cli/commands/logs/action.py +159 -0
  289. agentcore/cli/commands/logs/filter_pattern.py +17 -0
  290. agentcore/cli/commands/logs/guards.py +51 -0
  291. agentcore/cli/commands/logs_evals.py +42 -0
  292. agentcore/cli/commands/package.py +118 -0
  293. agentcore/cli/commands/remove/__init__.py +172 -0
  294. agentcore/cli/commands/remove/skill_command.py +131 -0
  295. agentcore/cli/commands/remove/tool_command.py +59 -0
  296. agentcore/cli/commands/run.py +808 -0
  297. agentcore/cli/commands/run_ingest.py +97 -0
  298. agentcore/cli/commands/shared/__init__.py +0 -0
  299. agentcore/cli/commands/shared/arn_utils.py +9 -0
  300. agentcore/cli/commands/shared/filesystem_utils.py +421 -0
  301. agentcore/cli/commands/shared/header_utils.py +87 -0
  302. agentcore/cli/commands/shared/indexed_key_parser.py +76 -0
  303. agentcore/cli/commands/shared/lifecycle_utils.py +72 -0
  304. agentcore/cli/commands/shared/region_utils.py +20 -0
  305. agentcore/cli/commands/shared/vpc_utils.py +99 -0
  306. agentcore/cli/commands/status/__init__.py +30 -0
  307. agentcore/cli/commands/status/_guards.py +25 -0
  308. agentcore/cli/commands/status/action.py +741 -0
  309. agentcore/cli/commands/status/command.py +321 -0
  310. agentcore/cli/commands/status/constants.py +36 -0
  311. agentcore/cli/commands/status/format_knowledge_base.py +111 -0
  312. agentcore/cli/commands/telemetry.py +79 -0
  313. agentcore/cli/commands/traces/__init__.py +155 -0
  314. agentcore/cli/commands/traces/action.py +123 -0
  315. agentcore/cli/commands/update/__init__.py +63 -0
  316. agentcore/cli/commands/update/action.py +164 -0
  317. agentcore/cli/commands/validate.py +165 -0
  318. agentcore/cli/constants.py +96 -0
  319. agentcore/cli/errors.py +118 -0
  320. agentcore/cli/external_requirements/__init__.py +67 -0
  321. agentcore/cli/external_requirements/checks.py +280 -0
  322. agentcore/cli/external_requirements/detect.py +55 -0
  323. agentcore/cli/external_requirements/versions.py +57 -0
  324. agentcore/cli/groups.py +23 -0
  325. agentcore/cli/interactive.py +85 -0
  326. agentcore/cli/main.py +137 -0
  327. agentcore/cli/naming.py +11 -0
  328. agentcore/cli/notices.py +42 -0
  329. agentcore/cli/project.py +34 -0
  330. agentcore/cli/run_command.py +27 -0
  331. agentcore/cli/tree.py +135 -0
  332. agentcore/cli/update_notifier.py +123 -0
  333. agentcore/cli/variadic.py +50 -0
  334. agentcore/cloudformation/__init__.py +84 -0
  335. agentcore/cloudformation/bootstrap.py +64 -0
  336. agentcore/cloudformation/logical_ids.py +37 -0
  337. agentcore/cloudformation/outputs.py +566 -0
  338. agentcore/cloudformation/stack_discovery.py +75 -0
  339. agentcore/cloudformation/stack_events.py +107 -0
  340. agentcore/cloudformation/stack_status.py +98 -0
  341. agentcore/cloudformation/types.py +44 -0
  342. agentcore/lib/__init__.py +68 -0
  343. agentcore/lib/constants.py +77 -0
  344. agentcore/lib/dependency_management/__init__.py +23 -0
  345. agentcore/lib/dependency_management/messages.py +92 -0
  346. agentcore/lib/dependency_management/plan.py +98 -0
  347. agentcore/lib/dependency_management/semver.py +137 -0
  348. agentcore/lib/dependency_management/sync.py +139 -0
  349. agentcore/lib/dependency_management/types.py +56 -0
  350. agentcore/lib/errors/__init__.py +5 -0
  351. agentcore/lib/errors/types.py +352 -0
  352. agentcore/lib/errors/validation.py +121 -0
  353. agentcore/lib/packaging/__init__.py +81 -0
  354. agentcore/lib/packaging/build_args.py +23 -0
  355. agentcore/lib/packaging/build_context.py +26 -0
  356. agentcore/lib/packaging/build_context_dockerignore.py +45 -0
  357. agentcore/lib/packaging/container.py +95 -0
  358. agentcore/lib/packaging/helpers.py +289 -0
  359. agentcore/lib/packaging/node.py +153 -0
  360. agentcore/lib/packaging/python.py +135 -0
  361. agentcore/lib/packaging/types.py +69 -0
  362. agentcore/lib/packaging/uv.py +45 -0
  363. agentcore/lib/result.py +104 -0
  364. agentcore/lib/schemas/__init__.py +1 -0
  365. agentcore/lib/schemas/io/__init__.py +27 -0
  366. agentcore/lib/schemas/io/config_io.py +458 -0
  367. agentcore/lib/schemas/io/global_config.py +239 -0
  368. agentcore/lib/schemas/io/path_resolver.py +132 -0
  369. agentcore/lib/secrets/__init__.py +18 -0
  370. agentcore/lib/secrets/cipher.py +70 -0
  371. agentcore/lib/secrets/key_provider.py +163 -0
  372. agentcore/lib/secrets/sensitive_keys.py +55 -0
  373. agentcore/lib/time_constants.py +4 -0
  374. agentcore/lib/utils/__init__.py +47 -0
  375. agentcore/lib/utils/aws_account.py +15 -0
  376. agentcore/lib/utils/credentials.py +68 -0
  377. agentcore/lib/utils/dotenv.py +32 -0
  378. agentcore/lib/utils/env.py +105 -0
  379. agentcore/lib/utils/json_format.py +29 -0
  380. agentcore/lib/utils/json_rpc.py +22 -0
  381. agentcore/lib/utils/platform.py +33 -0
  382. agentcore/lib/utils/polling.py +86 -0
  383. agentcore/lib/utils/subprocess.py +135 -0
  384. agentcore/lib/utils/time_parser.py +48 -0
  385. agentcore/lib/utils/validation.py +106 -0
  386. agentcore/logging/__init__.py +10 -0
  387. agentcore/logging/_common.py +77 -0
  388. agentcore/logging/cdk_io_host.py +36 -0
  389. agentcore/logging/create_logger.py +107 -0
  390. agentcore/logging/dev_logger.py +63 -0
  391. agentcore/logging/exec_logger.py +159 -0
  392. agentcore/logging/invoke_logger.py +154 -0
  393. agentcore/logging/remove_logger.py +95 -0
  394. agentcore/operations/__init__.py +0 -0
  395. agentcore/operations/agent/__init__.py +0 -0
  396. agentcore/operations/agent/config_bundle_defaults.py +31 -0
  397. agentcore/operations/agent/generate/__init__.py +28 -0
  398. agentcore/operations/agent/generate/schema_mapper.py +319 -0
  399. agentcore/operations/agent/generate/types.py +172 -0
  400. agentcore/operations/agent/generate/write_agent_to_project.py +67 -0
  401. agentcore/operations/agent/import_/__init__.py +31 -0
  402. agentcore/operations/agent/import_/base_translator.py +449 -0
  403. agentcore/operations/agent/import_/constants.py +23 -0
  404. agentcore/operations/agent/import_/execute.py +127 -0
  405. agentcore/operations/agent/import_/langgraph_translator.py +294 -0
  406. agentcore/operations/agent/import_/pyproject_generator.py +73 -0
  407. agentcore/operations/agent/import_/strands_translator.py +289 -0
  408. agentcore/operations/config_bundle/__init__.py +1 -0
  409. agentcore/operations/config_bundle/bundle_name_variants.py +9 -0
  410. agentcore/operations/config_bundle/diff_versions.py +52 -0
  411. agentcore/operations/config_bundle/resolve_bundle.py +65 -0
  412. agentcore/operations/connectors/__init__.py +3 -0
  413. agentcore/operations/connectors/translators.py +63 -0
  414. agentcore/operations/dataset/__init__.py +21 -0
  415. agentcore/operations/dataset/delete.py +7 -0
  416. agentcore/operations/dataset/publish.py +16 -0
  417. agentcore/operations/dataset/pull.py +21 -0
  418. agentcore/operations/dataset/push.py +201 -0
  419. agentcore/operations/dataset/resolve_dataset.py +65 -0
  420. agentcore/operations/dataset/status.py +18 -0
  421. agentcore/operations/dataset/wait.py +25 -0
  422. agentcore/operations/deploy/__init__.py +152 -0
  423. agentcore/operations/deploy/backfill_vpc_id.py +90 -0
  424. agentcore/operations/deploy/change_detection.py +84 -0
  425. agentcore/operations/deploy/constants.py +58 -0
  426. agentcore/operations/deploy/dependency_sync.py +105 -0
  427. agentcore/operations/deploy/ensure_target.py +30 -0
  428. agentcore/operations/deploy/gateway_status.py +44 -0
  429. agentcore/operations/deploy/managed_memory_notice.py +36 -0
  430. agentcore/operations/deploy/payment_connector_authorization.py +106 -0
  431. agentcore/operations/deploy/post_deploy_datasets.py +96 -0
  432. agentcore/operations/deploy/post_deploy_knowledge_bases.py +104 -0
  433. agentcore/operations/deploy/post_deploy_observability.py +28 -0
  434. agentcore/operations/deploy/post_deploy_online_evals.py +60 -0
  435. agentcore/operations/deploy/pre_deploy_identity.py +505 -0
  436. agentcore/operations/deploy/preflight.py +385 -0
  437. agentcore/operations/deploy/region_override.py +45 -0
  438. agentcore/operations/deploy/teardown.py +153 -0
  439. agentcore/operations/dev/__init__.py +61 -0
  440. agentcore/operations/dev/_http.py +79 -0
  441. agentcore/operations/dev/_server.py +165 -0
  442. agentcore/operations/dev/codezip_dev_server.py +151 -0
  443. agentcore/operations/dev/config.py +128 -0
  444. agentcore/operations/dev/constants.py +9 -0
  445. agentcore/operations/dev/container_dev_server.py +237 -0
  446. agentcore/operations/dev/container_runtime.py +37 -0
  447. agentcore/operations/dev/dev_server.py +244 -0
  448. agentcore/operations/dev/gateway_env.py +25 -0
  449. agentcore/operations/dev/invoke.py +214 -0
  450. agentcore/operations/dev/invoke_a2a.py +204 -0
  451. agentcore/operations/dev/invoke_agui.py +88 -0
  452. agentcore/operations/dev/invoke_mcp.py +145 -0
  453. agentcore/operations/dev/invoke_types.py +30 -0
  454. agentcore/operations/dev/load_dev_env.py +26 -0
  455. agentcore/operations/dev/memory_env.py +19 -0
  456. agentcore/operations/dev/otel/__init__.py +5 -0
  457. agentcore/operations/dev/otel/collector.py +234 -0
  458. agentcore/operations/dev/otel/transforms.py +331 -0
  459. agentcore/operations/dev/payment_env.py +50 -0
  460. agentcore/operations/dev/server.py +28 -0
  461. agentcore/operations/dev/sse_transform.py +30 -0
  462. agentcore/operations/dev/utils.py +152 -0
  463. agentcore/operations/dev/web_ui/__init__.py +31 -0
  464. agentcore/operations/dev/web_ui/constants.py +25 -0
  465. agentcore/operations/dev/web_ui/handlers/__init__.py +36 -0
  466. agentcore/operations/dev/web_ui/handlers/_common.py +36 -0
  467. agentcore/operations/dev/web_ui/handlers/_deployed.py +37 -0
  468. agentcore/operations/dev/web_ui/handlers/a2a_proxy.py +37 -0
  469. agentcore/operations/dev/web_ui/handlers/cloudwatch_traces.py +71 -0
  470. agentcore/operations/dev/web_ui/handlers/harness_invocation.py +89 -0
  471. agentcore/operations/dev/web_ui/handlers/harness_utils.py +95 -0
  472. agentcore/operations/dev/web_ui/handlers/invocations.py +327 -0
  473. agentcore/operations/dev/web_ui/handlers/mcp_proxy.py +119 -0
  474. agentcore/operations/dev/web_ui/handlers/memory.py +84 -0
  475. agentcore/operations/dev/web_ui/handlers/resources.py +351 -0
  476. agentcore/operations/dev/web_ui/handlers/start.py +182 -0
  477. agentcore/operations/dev/web_ui/handlers/status.py +25 -0
  478. agentcore/operations/dev/web_ui/handlers/traces.py +50 -0
  479. agentcore/operations/dev/web_ui/run_web_ui.py +60 -0
  480. agentcore/operations/dev/web_ui/web_server.py +297 -0
  481. agentcore/operations/eval/__init__.py +8 -0
  482. agentcore/operations/eval/list_eval_runs.py +18 -0
  483. agentcore/operations/eval/logs_eval.py +119 -0
  484. agentcore/operations/eval/pause_resume.py +90 -0
  485. agentcore/operations/eval/run_eval.py +354 -0
  486. agentcore/operations/eval/shared/__init__.py +0 -0
  487. agentcore/operations/eval/shared/dataset_loader.py +68 -0
  488. agentcore/operations/eval/shared/dataset_session_provider.py +122 -0
  489. agentcore/operations/eval/shared/evaluator_runner.py +89 -0
  490. agentcore/operations/eval/shared/scenario_executor.py +71 -0
  491. agentcore/operations/eval/shared/span_collector.py +255 -0
  492. agentcore/operations/eval/storage.py +67 -0
  493. agentcore/operations/feedback/__init__.py +21 -0
  494. agentcore/operations/feedback/aperture_client.py +98 -0
  495. agentcore/operations/feedback/build_payload.py +97 -0
  496. agentcore/operations/feedback/constants.py +26 -0
  497. agentcore/operations/feedback/submit_feedback.py +150 -0
  498. agentcore/operations/fetch_access/__init__.py +36 -0
  499. agentcore/operations/fetch_access/_target.py +17 -0
  500. agentcore/operations/fetch_access/fetch_gateway_token.py +75 -0
  501. agentcore/operations/fetch_access/fetch_harness_token.py +72 -0
  502. agentcore/operations/fetch_access/fetch_runtime_token.py +76 -0
  503. agentcore/operations/fetch_access/list_agents.py +18 -0
  504. agentcore/operations/fetch_access/list_gateways.py +26 -0
  505. agentcore/operations/fetch_access/list_harnesses.py +23 -0
  506. agentcore/operations/fetch_access/oauth_token.py +162 -0
  507. agentcore/operations/fetch_access/types.py +34 -0
  508. agentcore/operations/harness/__init__.py +1 -0
  509. agentcore/operations/harness/orphan.py +84 -0
  510. agentcore/operations/harness/skill_utils.py +56 -0
  511. agentcore/operations/identity/__init__.py +33 -0
  512. agentcore/operations/identity/api_key_credential_provider.py +68 -0
  513. agentcore/operations/identity/oauth2_credential_provider.py +95 -0
  514. agentcore/operations/ingest/__init__.py +184 -0
  515. agentcore/operations/init/__init__.py +3 -0
  516. agentcore/operations/init/files.py +59 -0
  517. agentcore/operations/insights/__init__.py +21 -0
  518. agentcore/operations/insights/insights_storage.py +67 -0
  519. agentcore/operations/insights/run_insights.py +148 -0
  520. agentcore/operations/invoke/__init__.py +5 -0
  521. agentcore/operations/invoke/resolve_agent_context.py +85 -0
  522. agentcore/operations/jobs/__init__.py +38 -0
  523. agentcore/operations/jobs/ab_test/__init__.py +0 -0
  524. agentcore/operations/jobs/ab_test/build_options.py +126 -0
  525. agentcore/operations/jobs/ab_test/format.py +121 -0
  526. agentcore/operations/jobs/ab_test/handler.py +412 -0
  527. agentcore/operations/jobs/ab_test/promote.py +142 -0
  528. agentcore/operations/jobs/ab_test/resolve.py +221 -0
  529. agentcore/operations/jobs/batch_evaluation/__init__.py +0 -0
  530. agentcore/operations/jobs/batch_evaluation/build_source.py +68 -0
  531. agentcore/operations/jobs/batch_evaluation/dataset_phase1.py +95 -0
  532. agentcore/operations/jobs/batch_evaluation/format.py +58 -0
  533. agentcore/operations/jobs/batch_evaluation/handler.py +203 -0
  534. agentcore/operations/jobs/insights/__init__.py +0 -0
  535. agentcore/operations/jobs/insights/format.py +65 -0
  536. agentcore/operations/jobs/insights/handler.py +178 -0
  537. agentcore/operations/jobs/recommendation/__init__.py +0 -0
  538. agentcore/operations/jobs/recommendation/apply_to_bundle.py +76 -0
  539. agentcore/operations/jobs/recommendation/build_config.py +271 -0
  540. agentcore/operations/jobs/recommendation/fetch_session_spans.py +93 -0
  541. agentcore/operations/jobs/recommendation/format.py +77 -0
  542. agentcore/operations/jobs/recommendation/handler.py +331 -0
  543. agentcore/operations/jobs/shared/__init__.py +0 -0
  544. agentcore/operations/jobs/shared/constants.py +85 -0
  545. agentcore/operations/jobs/shared/engine.py +187 -0
  546. agentcore/operations/jobs/shared/format.py +104 -0
  547. agentcore/operations/jobs/shared/region.py +34 -0
  548. agentcore/operations/jobs/shared/resolve_agent_state.py +30 -0
  549. agentcore/operations/jobs/shared/storage.py +117 -0
  550. agentcore/operations/jobs/shared/wait.py +30 -0
  551. agentcore/operations/knowledge_base/__init__.py +33 -0
  552. agentcore/operations/knowledge_base/connector_config.py +105 -0
  553. agentcore/operations/knowledge_base/hydrate_data_sources.py +59 -0
  554. agentcore/operations/mcp/__init__.py +4 -0
  555. agentcore/operations/memory/__init__.py +13 -0
  556. agentcore/operations/memory/_records.py +72 -0
  557. agentcore/operations/memory/list_memory_records.py +45 -0
  558. agentcore/operations/memory/retrieve_memory_records.py +52 -0
  559. agentcore/operations/node/__init__.py +15 -0
  560. agentcore/operations/node/setup.py +36 -0
  561. agentcore/operations/python/__init__.py +17 -0
  562. agentcore/operations/python/setup.py +47 -0
  563. agentcore/operations/resolve_agent.py +159 -0
  564. agentcore/operations/session/__init__.py +86 -0
  565. agentcore/operations/traces/__init__.py +29 -0
  566. agentcore/operations/traces/get_trace.py +202 -0
  567. agentcore/operations/traces/insights_query.py +74 -0
  568. agentcore/operations/traces/list_traces.py +46 -0
  569. agentcore/operations/traces/trace_url.py +25 -0
  570. agentcore/operations/traces/types.py +55 -0
  571. agentcore/primitives/__init__.py +0 -0
  572. agentcore/primitives/_gateway_target_wizard.py +293 -0
  573. agentcore/primitives/_gateway_validation.py +442 -0
  574. agentcore/primitives/_harness_cli.py +557 -0
  575. agentcore/primitives/_harness_validation.py +163 -0
  576. agentcore/primitives/_harness_wizard.py +726 -0
  577. agentcore/primitives/_knowledge_base_wizard.py +259 -0
  578. agentcore/primitives/_payment_wizard.py +331 -0
  579. agentcore/primitives/_policy_form.py +160 -0
  580. agentcore/primitives/agent.py +817 -0
  581. agentcore/primitives/auth_utils.py +77 -0
  582. agentcore/primitives/base.py +178 -0
  583. agentcore/primitives/capacity_provider.py +501 -0
  584. agentcore/primitives/config_bundle.py +329 -0
  585. agentcore/primitives/credential.py +387 -0
  586. agentcore/primitives/credential_utils.py +45 -0
  587. agentcore/primitives/dataset.py +211 -0
  588. agentcore/primitives/deployed_gateways.py +34 -0
  589. agentcore/primitives/evaluator.py +909 -0
  590. agentcore/primitives/gateway.py +496 -0
  591. agentcore/primitives/gateway_target.py +988 -0
  592. agentcore/primitives/harness.py +706 -0
  593. agentcore/primitives/knowledge_base.py +477 -0
  594. agentcore/primitives/memory.py +387 -0
  595. agentcore/primitives/online_eval_config.py +365 -0
  596. agentcore/primitives/online_insights.py +275 -0
  597. agentcore/primitives/payment_connector.py +427 -0
  598. agentcore/primitives/payment_eligible.py +20 -0
  599. agentcore/primitives/payment_manager.py +605 -0
  600. agentcore/primitives/payment_validation.py +68 -0
  601. agentcore/primitives/policy.py +622 -0
  602. agentcore/primitives/policy_engine.py +358 -0
  603. agentcore/primitives/registry.py +56 -0
  604. agentcore/primitives/runtime_endpoint.py +361 -0
  605. agentcore/primitives/secret_flag_warning.py +17 -0
  606. agentcore/schema/__init__.py +14 -0
  607. agentcore/schema/_zod.py +395 -0
  608. agentcore/schema/constants.py +306 -0
  609. agentcore/schema/schemas/__init__.py +40 -0
  610. agentcore/schema/schemas/agent_env.py +545 -0
  611. agentcore/schema/schemas/agentcore_project.py +530 -0
  612. agentcore/schema/schemas/auth.py +286 -0
  613. agentcore/schema/schemas/aws_targets.py +72 -0
  614. agentcore/schema/schemas/connections.py +187 -0
  615. agentcore/schema/schemas/deployed_state.py +322 -0
  616. agentcore/schema/schemas/mcp.py +650 -0
  617. agentcore/schema/schemas/mcp_defs.py +54 -0
  618. agentcore/schema/schemas/primitives/__init__.py +52 -0
  619. agentcore/schema/schemas/primitives/ab_test.py +162 -0
  620. agentcore/schema/schemas/primitives/capacity_provider.py +214 -0
  621. agentcore/schema/schemas/primitives/config_bundle.py +48 -0
  622. agentcore/schema/schemas/primitives/dataset.py +55 -0
  623. agentcore/schema/schemas/primitives/evaluator.py +171 -0
  624. agentcore/schema/schemas/primitives/harness.py +710 -0
  625. agentcore/schema/schemas/primitives/knowledge_base.py +90 -0
  626. agentcore/schema/schemas/primitives/memory.py +113 -0
  627. agentcore/schema/schemas/primitives/online_eval_config.py +77 -0
  628. agentcore/schema/schemas/primitives/payment.py +114 -0
  629. agentcore/schema/schemas/primitives/policy.py +83 -0
  630. agentcore/schema/schemas/primitives/tags.py +50 -0
  631. agentcore/schema/schemas/zod_util.py +5 -0
  632. agentcore/schema/types/__init__.py +3 -0
  633. agentcore/schema/types/path.py +16 -0
  634. agentcore/templates/__init__.py +115 -0
  635. agentcore/templates/_handlebars.py +782 -0
  636. agentcore/templates/_js.py +164 -0
  637. agentcore/templates/base_renderer.py +107 -0
  638. agentcore/templates/cdk_renderer.py +129 -0
  639. agentcore/templates/evaluator_renderer.py +39 -0
  640. agentcore/templates/gateway_target_renderer.py +69 -0
  641. agentcore/templates/llm_context/README.md +16 -0
  642. agentcore/templates/llm_context/agentcore.ts +685 -0
  643. agentcore/templates/llm_context/aws-targets.ts +51 -0
  644. agentcore/templates/profiles.py +151 -0
  645. agentcore/templates/render.py +92 -0
  646. agentcore/templates/renderers.py +83 -0
  647. agentcore/templates/schema_assets.py +23 -0
  648. agentcore/templates/template_root.py +28 -0
  649. agentcore/templates/types.py +192 -0
  650. agentcore_cli-0.31.1.dist-info/METADATA +84 -0
  651. agentcore_cli-0.31.1.dist-info/RECORD +655 -0
  652. agentcore_cli-0.31.1.dist-info/WHEEL +4 -0
  653. agentcore_cli-0.31.1.dist-info/entry_points.txt +2 -0
  654. agentcore_cli-0.31.1.dist-info/licenses/LICENSE +175 -0
  655. agentcore_cli-0.31.1.dist-info/licenses/NOTICE +88 -0
@@ -0,0 +1,121 @@
1
+ """Human-readable formatting of schema validation issues (port of ``src/lib/errors/zod.ts``).
2
+
3
+ Upstream formats Zod issues; here the input is Pydantic's ``ValidationError.errors()`` (or
4
+ issue dicts of the same shape: ``type``, ``loc``, ``msg``, optional ``input`` / ``ctx``). The
5
+ output format (`` - path: message`` per line, bracket path notation) matches upstream.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import json
11
+ import re
12
+ from collections.abc import Iterable, Mapping, Sequence
13
+ from typing import Any
14
+
15
+ # Pydantic error type -> the JSON type name Zod would report as "expected".
16
+ _TYPE_NAMES = {
17
+ "string_type": "string",
18
+ "int_type": "number",
19
+ "int_parsing": "number",
20
+ "int_from_float": "int",
21
+ "float_type": "number",
22
+ "float_parsing": "number",
23
+ "bool_type": "boolean",
24
+ "bool_parsing": "boolean",
25
+ "dict_type": "object",
26
+ "model_type": "object",
27
+ "model_attributes_type": "object",
28
+ "list_type": "array",
29
+ "tuple_type": "array",
30
+ }
31
+
32
+ _QUOTED = re.compile(r"'((?:[^'\\]|\\.)*)'")
33
+
34
+
35
+ def format_path(path: Sequence[Any]) -> str:
36
+ """Format a location tuple in bracket notation: ``agents[0].name``."""
37
+ if not path:
38
+ return "root"
39
+ out = []
40
+ for i, segment in enumerate(path):
41
+ if isinstance(segment, int) and not isinstance(segment, bool):
42
+ out.append(f"[{segment}]")
43
+ else:
44
+ out.append(str(segment) if i == 0 else f".{segment}")
45
+ return "".join(out)
46
+
47
+
48
+ def _expected_options(issue: Mapping[str, Any]) -> list[str] | None:
49
+ ctx = issue.get("ctx") or {}
50
+ expected = ctx.get("expected")
51
+ if isinstance(expected, (list, tuple)):
52
+ return [str(o) for o in expected]
53
+ if isinstance(expected, str):
54
+ found = _QUOTED.findall(expected)
55
+ if found:
56
+ return found
57
+ return None
58
+
59
+
60
+ def _format_issue(issue: Mapping[str, Any]) -> str:
61
+ path = format_path(tuple(issue.get("loc") or ()))
62
+ kind = issue.get("type", "")
63
+
64
+ if kind in _TYPE_NAMES:
65
+ return f'{path}: expected "{_TYPE_NAMES[kind]}"'
66
+
67
+ if kind in ("literal_error", "enum"):
68
+ options = _expected_options(issue)
69
+ if options:
70
+ expected = " | ".join(f'"{o}"' for o in options)
71
+ if "input" in issue:
72
+ return f"{path}: got {_json(issue['input'])}, expected {expected}"
73
+ return f"{path}: expected {expected}"
74
+
75
+ if kind in ("union_tag_invalid", "union_tag_not_found"):
76
+ discriminator = str((issue.get("ctx") or {}).get("discriminator", "")).strip("'")
77
+ if discriminator:
78
+ return f'{path}: invalid "{discriminator}" value'
79
+
80
+ message = issue.get("msg") or kind or "invalid value"
81
+ return f"{path}: {message}"
82
+
83
+
84
+ def _json(value: Any) -> str:
85
+ try:
86
+ return json.dumps(value, ensure_ascii=False, separators=(",", ":"))
87
+ except (TypeError, ValueError):
88
+ return json.dumps(str(value))
89
+
90
+
91
+ def format_validation_errors(issues: Iterable[Mapping[str, Any]]) -> str:
92
+ """Format all issues into a newline-separated `` - path: message`` list.
93
+
94
+ Pydantic reports each forbidden extra key separately; they are grouped per parent object
95
+ into Zod's single ``unknown keys (remove): "a", "b"`` line.
96
+ """
97
+ lines: list[str] = []
98
+ unknown_by_parent: dict[tuple[Any, ...], list[str]] = {}
99
+ unknown_line_index: dict[tuple[Any, ...], int] = {}
100
+
101
+ for issue in issues:
102
+ if issue.get("type") == "extra_forbidden" and issue.get("loc"):
103
+ loc = tuple(issue["loc"])
104
+ parent, key = loc[:-1], str(loc[-1])
105
+ if parent not in unknown_by_parent:
106
+ unknown_by_parent[parent] = []
107
+ unknown_line_index[parent] = len(lines)
108
+ lines.append("")
109
+ unknown_by_parent[parent].append(key)
110
+ continue
111
+ lines.append(f" - {_format_issue(issue)}")
112
+
113
+ for parent, keys in unknown_by_parent.items():
114
+ joined = ", ".join(f'"{k}"' for k in keys)
115
+ lines[unknown_line_index[parent]] = f" - {format_path(parent)}: unknown keys (remove): {joined}"
116
+
117
+ return "\n".join(lines)
118
+
119
+
120
+ # Upstream name, kept for literal ports of call sites.
121
+ format_zod_errors = format_validation_errors
@@ -0,0 +1,81 @@
1
+ """Deployment artifact packaging (port of ``src/lib/packaging``)."""
2
+
3
+ from __future__ import annotations
4
+
5
+ from typing import Any
6
+
7
+ from agentcore.lib.errors.types import PackagingError
8
+ from agentcore.lib.packaging.build_context import ResolvedBuildContext, resolve_build_context
9
+ from agentcore.lib.packaging.build_context_dockerignore import ensure_build_context_dockerignore
10
+ from agentcore.lib.packaging.container import ContainerPackager
11
+ from agentcore.lib.packaging.helpers import is_node_runtime, is_python_runtime, resolve_code_location
12
+ from agentcore.lib.packaging.node import NodeCodeZipPackager
13
+ from agentcore.lib.packaging.python import PythonCodeZipPackager, default_python_version
14
+ from agentcore.lib.packaging.types import (
15
+ ArtifactResult,
16
+ CodeBundleConfig,
17
+ CodeZipPackager,
18
+ PackageOptions,
19
+ RuntimePackager,
20
+ spec_field,
21
+ )
22
+
23
+
24
+ def validate_agent_exists(project: Any, agent_name: str) -> None:
25
+ """Raise ``PackagingError`` unless ``project.runtimes`` contains ``agent_name``."""
26
+ runtimes = spec_field(project, "runtimes", []) or []
27
+ if not any(spec_field(a, "name") == agent_name for a in runtimes):
28
+ available = ", ".join(str(spec_field(a, "name")) for a in runtimes)
29
+ raise PackagingError(f"Agent '{agent_name}' not found. Available agents: {available}")
30
+
31
+
32
+ def get_runtime_packager(runtime_version: str) -> RuntimePackager:
33
+ if is_python_runtime(runtime_version):
34
+ return PythonCodeZipPackager()
35
+ if is_node_runtime(runtime_version):
36
+ return NodeCodeZipPackager()
37
+ raise PackagingError(f"Unsupported runtime version: {runtime_version}")
38
+
39
+
40
+ def get_code_zip_packager(runtime_version: str) -> CodeZipPackager:
41
+ if is_python_runtime(runtime_version):
42
+ return PythonCodeZipPackager()
43
+ if is_node_runtime(runtime_version):
44
+ return NodeCodeZipPackager()
45
+ raise PackagingError(f"Unsupported runtime version: {runtime_version}")
46
+
47
+
48
+ def get_container_packager() -> RuntimePackager:
49
+ return ContainerPackager()
50
+
51
+
52
+ def pack_runtime(spec: Any, options: PackageOptions | None = None) -> ArtifactResult:
53
+ """Package a runtime, choosing the packager from build type and runtime version."""
54
+ if spec_field(spec, "build") == "Container":
55
+ return get_container_packager().pack(spec, options)
56
+ return get_runtime_packager(spec_field(spec, "runtimeVersion")).pack(spec, options)
57
+
58
+
59
+ def pack_code_zip_sync(config: Any, options: PackageOptions | None = None) -> ArtifactResult:
60
+ """Package a CodeZip bundle (defaults to Python when no runtime version is set)."""
61
+ runtime_version = spec_field(config, "runtimeVersion") or default_python_version()
62
+ return get_code_zip_packager(runtime_version).pack_code_zip(config, options)
63
+
64
+
65
+ __all__ = [
66
+ "ArtifactResult",
67
+ "CodeBundleConfig",
68
+ "CodeZipPackager",
69
+ "PackageOptions",
70
+ "ResolvedBuildContext",
71
+ "RuntimePackager",
72
+ "ensure_build_context_dockerignore",
73
+ "get_code_zip_packager",
74
+ "get_container_packager",
75
+ "get_runtime_packager",
76
+ "pack_code_zip_sync",
77
+ "pack_runtime",
78
+ "resolve_build_context",
79
+ "resolve_code_location",
80
+ "validate_agent_exists",
81
+ ]
@@ -0,0 +1,23 @@
1
+ from __future__ import annotations
2
+
3
+ from collections.abc import Mapping
4
+
5
+ from agentcore.lib.schemas.io.global_config import read_global_config_sync
6
+
7
+
8
+ def get_uv_build_args() -> list[str]:
9
+ """``--build-arg`` flags for UV index URLs configured in ``~/.agentcore/config.json``."""
10
+ config = read_global_config_sync()
11
+ args: list[str] = []
12
+ if config.get("uvDefaultIndex"):
13
+ args += ["--build-arg", f"UV_DEFAULT_INDEX={config['uvDefaultIndex']}"]
14
+ if config.get("uvIndex"):
15
+ args += ["--build-arg", f"UV_INDEX={config['uvIndex']}"]
16
+ return args
17
+
18
+
19
+ def get_custom_build_args(custom_docker_build_args: Mapping[str, str] | None = None) -> list[str]:
20
+ """``--build-arg KEY=VALUE`` flags for an agent's ``customDockerBuildArgs``."""
21
+ return [
22
+ part for key, value in (custom_docker_build_args or {}).items() for part in ("--build-arg", f"{key}={value}")
23
+ ]
@@ -0,0 +1,26 @@
1
+ from __future__ import annotations
2
+
3
+ from dataclasses import dataclass
4
+ from typing import Any
5
+
6
+ from agentcore.lib.constants import get_dockerfile_path
7
+ from agentcore.lib.packaging.helpers import resolve_code_location
8
+ from agentcore.lib.packaging.types import spec_field
9
+
10
+
11
+ @dataclass(frozen=True, slots=True)
12
+ class ResolvedBuildContext:
13
+ # Absolute Docker build context (buildContextPath when set, else codeLocation).
14
+ build_context: str
15
+ # Absolute Dockerfile path, resolved against the build context.
16
+ dockerfile_path: str
17
+
18
+
19
+ def resolve_build_context(spec: Any, base_dir: str) -> ResolvedBuildContext:
20
+ """Single resolver for a Container agent's build context + Dockerfile, shared by package/deploy/dev."""
21
+ location = spec_field(spec, "buildContextPath") or spec_field(spec, "codeLocation")
22
+ build_context = resolve_code_location(location, base_dir)
23
+ return ResolvedBuildContext(
24
+ build_context=build_context,
25
+ dockerfile_path=get_dockerfile_path(build_context, spec_field(spec, "dockerfile")),
26
+ )
@@ -0,0 +1,45 @@
1
+ from __future__ import annotations
2
+
3
+ import os
4
+
5
+ # Written at a Container agent's build-context root when buildContextPath is set and none exists.
6
+ BUILD_CONTEXT_DOCKERIGNORE_TEMPLATE = """# Generated by agentcore because this agent sets buildContextPath — the whole of this directory is the
7
+ # Docker build context, so secrets/junk here would otherwise be baked into the image and uploaded to
8
+ # CodeBuild. Patterns are listed both bare and '**/'-prefixed so nested copies (e.g.
9
+ # app/agent-one/node_modules, app/agent-one/.env) are excluded too, not just the top level — Docker
10
+ # matches .dockerignore patterns root-relative. Both 'agentcore dev'/'package' and 'agentcore deploy'
11
+ # honor this file. Edit freely; to intentionally include a file listed here (e.g. a non-secret
12
+ # .env.production), add a '!'-prefixed line for it below.
13
+ .env
14
+ .env.*
15
+ **/.env
16
+ **/.env.*
17
+ .git
18
+ **/.git
19
+ .venv
20
+ **/.venv
21
+ node_modules
22
+ **/node_modules
23
+ __pycache__
24
+ **/__pycache__
25
+ .pytest_cache
26
+ **/.pytest_cache
27
+ .DS_Store
28
+ **/.DS_Store
29
+ agentcore/
30
+ """
31
+
32
+
33
+ def ensure_build_context_dockerignore(resolved_build_context: str) -> str | None:
34
+ """Create ``.dockerignore`` at the build-context root unless the dir is missing or one exists.
35
+
36
+ Returns the created path, else ``None``. A user's existing file is never overwritten.
37
+ """
38
+ if not os.path.exists(resolved_build_context):
39
+ return None
40
+ path = os.path.join(resolved_build_context, ".dockerignore")
41
+ if os.path.exists(path):
42
+ return None
43
+ with open(path, "w", encoding="utf-8", newline="") as fh:
44
+ fh.write(BUILD_CONTEXT_DOCKERIGNORE_TEMPLATE)
45
+ return path
@@ -0,0 +1,95 @@
1
+ """Container packager (port of ``packaging/container.ts``): local image build + 1GB size check."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import os
6
+ import subprocess
7
+ from typing import Any
8
+
9
+ from agentcore.lib.constants import CONTAINER_RUNTIMES, DOCKERFILE_NAME, ONE_GB
10
+ from agentcore.lib.errors.types import PackagingError
11
+ from agentcore.lib.packaging.build_args import get_custom_build_args, get_uv_build_args
12
+ from agentcore.lib.packaging.build_context import resolve_build_context
13
+ from agentcore.lib.packaging.build_context_dockerignore import ensure_build_context_dockerignore
14
+ from agentcore.lib.packaging.helpers import resolve_code_location
15
+ from agentcore.lib.packaging.types import ArtifactResult, PackageOptions, spec_field
16
+
17
+
18
+ def _run(args: list[str]) -> subprocess.CompletedProcess[bytes] | None:
19
+ try:
20
+ return subprocess.run(args, stdin=subprocess.DEVNULL, capture_output=True)
21
+ except OSError:
22
+ return None
23
+
24
+
25
+ def detect_container_runtime() -> str | None:
26
+ """First runtime in CONTAINER_RUNTIMES order that ``which`` finds and that answers ``--version``."""
27
+ for runtime in CONTAINER_RUNTIMES:
28
+ found = _run(["which", runtime])
29
+ if found is not None and found.returncode == 0:
30
+ version = _run([runtime, "--version"])
31
+ if version is not None and version.returncode == 0:
32
+ return runtime
33
+ return None
34
+
35
+
36
+ class ContainerPackager:
37
+ def pack(self, spec: Any, options: PackageOptions | None = None) -> ArtifactResult:
38
+ options = options or PackageOptions()
39
+ if spec_field(spec, "build") != "Container":
40
+ raise PackagingError("ContainerPackager only supports Container build type.")
41
+
42
+ agent_name = options.agent_name or spec_field(spec, "name")
43
+ config_base_dir = options.artifact_dir or options.project_root or os.getcwd()
44
+ code_location = resolve_code_location(spec_field(spec, "codeLocation"), config_base_dir)
45
+ resolved = resolve_build_context(spec, config_base_dir)
46
+
47
+ if not os.path.exists(resolved.dockerfile_path):
48
+ raise PackagingError(
49
+ f"{spec_field(spec, 'dockerfile') or DOCKERFILE_NAME} not found at {resolved.dockerfile_path}. "
50
+ "Container agents require a Dockerfile."
51
+ )
52
+
53
+ # Dockerfile validated: when buildContextPath widens the context, keep secrets/junk out.
54
+ if spec_field(spec, "buildContextPath"):
55
+ ensure_build_context_dockerignore(resolved.build_context)
56
+
57
+ runtime = detect_container_runtime()
58
+ if not runtime:
59
+ # No local runtime: skip local build validation (deploy uses CodeBuild).
60
+ return ArtifactResult(artifact_path="", size_bytes=0, staging_path=code_location)
61
+
62
+ # Image tags must be lowercase; agent names may not be.
63
+ image_name = f"agentcore-package-{agent_name}".lower()
64
+ build = _run(
65
+ [
66
+ runtime,
67
+ "build",
68
+ "-t",
69
+ image_name,
70
+ "-f",
71
+ resolved.dockerfile_path,
72
+ *get_uv_build_args(),
73
+ *get_custom_build_args(spec_field(spec, "customDockerBuildArgs")),
74
+ resolved.build_context,
75
+ ]
76
+ )
77
+ if build is None or build.returncode != 0:
78
+ stderr = build.stderr.decode("utf-8", errors="replace") if build is not None else ""
79
+ raise PackagingError(f"Container build failed:\n{stderr}")
80
+
81
+ inspect = _run([runtime, "image", "inspect", image_name, "--format", "{{.Size}}"])
82
+ try:
83
+ size_bytes = int((inspect.stdout.decode().strip() if inspect else "") or "0")
84
+ except ValueError:
85
+ size_bytes = 0
86
+ if size_bytes > ONE_GB:
87
+ size_mb = f"{size_bytes / (1024 * 1024):.2f}"
88
+ raise PackagingError(
89
+ f"Container image exceeds 1GB limit ({size_mb}MB). "
90
+ "Optimize your Dockerfile: use multi-stage builds, minimize dependencies, add .dockerignore."
91
+ )
92
+
93
+ return ArtifactResult(
94
+ artifact_path=f"{runtime}://{image_name}", size_bytes=size_bytes, staging_path=code_location
95
+ )
@@ -0,0 +1,289 @@
1
+ """Shared packaging helpers (port of ``packaging/helpers.ts``)."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import os
6
+ import re
7
+ import shutil
8
+ import zipfile
9
+ from dataclasses import dataclass
10
+
11
+ from agentcore.lib.constants import CONFIG_DIR
12
+ from agentcore.lib.errors.types import ArtifactSizeError, MissingDependencyError, MissingProjectFileError
13
+ from agentcore.lib.packaging.types import PackageOptions
14
+ from agentcore.lib.utils.platform import is_windows
15
+ from agentcore.lib.utils.subprocess import check_subprocess, run_subprocess
16
+
17
+ MAX_ZIP_SIZE_BYTES = 250 * 1024 * 1024
18
+
19
+ _EXCLUDED_ENTRIES = frozenset({".git", ".venv", "__pycache__", ".pytest_cache", ".DS_Store", "node_modules"})
20
+
21
+
22
+ def is_python_runtime(runtime_version: str) -> bool:
23
+ return runtime_version.startswith("PYTHON_")
24
+
25
+
26
+ def is_node_runtime(runtime_version: str) -> bool:
27
+ return runtime_version.startswith("NODE_")
28
+
29
+
30
+ @dataclass(frozen=True, slots=True)
31
+ class ResolvedPaths:
32
+ project_root: str
33
+ src_dir: str
34
+ # For Node projects this points at package.json.
35
+ pyproject_path: str
36
+ artifact_dir: str
37
+ build_dir: str
38
+ staging_dir: str
39
+ artifacts_dir: str
40
+
41
+
42
+ def _is_env_secret_entry(name: str) -> bool:
43
+ """``.env`` / ``.env.local`` / ``.env.*``: per-environment secrets, excluded at every depth."""
44
+ return name in (".env", ".env.local") or name.startswith(".env.")
45
+
46
+
47
+ def _should_exclude_entry(name: str, source: str, root_dir: str) -> bool:
48
+ """Copy-stage filter. The project's ``agentcore/`` dir is skipped only at the source root, so
49
+ an in-tree dependency shipping its own ``agentcore/`` package is still packaged."""
50
+ if name in _EXCLUDED_ENTRIES:
51
+ return True
52
+ if name == CONFIG_DIR and os.path.abspath(source) == os.path.abspath(root_dir):
53
+ return True
54
+ return _is_env_secret_entry(name)
55
+
56
+
57
+ def _is_zip_excluded_entry(name: str) -> bool:
58
+ """Zip-stage filter. A top-level ``agentcore/`` in staging is a real package, so it's kept."""
59
+ return name in _EXCLUDED_ENTRIES or _is_env_secret_entry(name)
60
+
61
+
62
+ def resolve_code_location(code_location: str, config_base_dir: str) -> str:
63
+ """Resolve a ``codeLocation`` relative to the repository root (parent of ``agentcore/``)."""
64
+ if os.path.isabs(code_location):
65
+ return code_location
66
+ return os.path.abspath(os.path.join(os.path.dirname(config_base_dir), code_location))
67
+
68
+
69
+ def _find_up(file_name: str, start_dir: str) -> str | None:
70
+ current = os.path.abspath(start_dir)
71
+ while True:
72
+ candidate = os.path.join(current, file_name)
73
+ if os.path.exists(candidate):
74
+ return candidate
75
+ parent = os.path.dirname(current)
76
+ if parent == current:
77
+ return None
78
+ current = parent
79
+
80
+
81
+ def _derive_paths(project_root: str, manifest: str, options: PackageOptions, agent_name: str | None) -> ResolvedPaths:
82
+ src_dir = os.path.abspath(os.path.join(project_root, options.src_dir or "."))
83
+ artifact_dir = os.path.abspath(options.artifact_dir or os.path.join(project_root, CONFIG_DIR))
84
+ # Staging layout: <artifactDir>/<name>/staging
85
+ build_dir = os.path.join(artifact_dir, agent_name or "default")
86
+ return ResolvedPaths(
87
+ project_root=project_root,
88
+ src_dir=src_dir,
89
+ pyproject_path=manifest,
90
+ artifact_dir=artifact_dir,
91
+ build_dir=build_dir,
92
+ staging_dir=os.path.join(build_dir, "staging"),
93
+ artifacts_dir=artifact_dir,
94
+ )
95
+
96
+
97
+ def resolve_project_paths(options: PackageOptions | None = None, agent_name: str | None = None) -> ResolvedPaths:
98
+ """Paths for a Python project, locating ``pyproject.toml`` (explicit or nearest ancestor)."""
99
+ options = options or PackageOptions()
100
+ start_dir = os.path.abspath(options.project_root) if options.project_root else os.getcwd()
101
+ candidate = (
102
+ os.path.abspath(options.pyproject_path) if options.pyproject_path else _find_up("pyproject.toml", start_dir)
103
+ )
104
+ if not candidate or not os.path.exists(candidate):
105
+ raise MissingProjectFileError(options.pyproject_path or os.path.join(start_dir, "pyproject.toml"))
106
+ project_root = os.path.abspath(options.project_root) if options.project_root else os.path.dirname(candidate)
107
+ return _derive_paths(project_root, candidate, options, agent_name)
108
+
109
+
110
+ def resolve_node_project_paths(options: PackageOptions | None = None, agent_name: str | None = None) -> ResolvedPaths:
111
+ """Paths for a Node/TypeScript project, locating the nearest ``package.json``."""
112
+ options = options or PackageOptions()
113
+ start_dir = os.path.abspath(options.project_root) if options.project_root else os.getcwd()
114
+ candidate = _find_up("package.json", start_dir)
115
+ if not candidate or not os.path.exists(candidate):
116
+ raise MissingProjectFileError(os.path.join(start_dir, "package.json"))
117
+ project_root = os.path.abspath(options.project_root) if options.project_root else os.path.dirname(candidate)
118
+ return _derive_paths(project_root, candidate, options, agent_name)
119
+
120
+
121
+ def ensure_dir_clean(directory: str) -> None:
122
+ shutil.rmtree(directory, ignore_errors=True)
123
+ os.makedirs(directory, exist_ok=True)
124
+
125
+
126
+ def _copy_entry(source: str, destination: str, root_dir: str) -> None:
127
+ if os.path.isdir(source):
128
+ os.makedirs(destination, exist_ok=True)
129
+ for entry in os.listdir(source):
130
+ if _should_exclude_entry(entry, source, root_dir):
131
+ continue
132
+ _copy_entry(os.path.join(source, entry), os.path.join(destination, entry), root_dir)
133
+ return
134
+ # Content only (like a stream copy), following symlinks.
135
+ shutil.copyfile(source, destination)
136
+
137
+
138
+ def copy_source_tree(src_dir: str, destination: str) -> None:
139
+ if not os.path.exists(src_dir):
140
+ raise MissingProjectFileError(src_dir)
141
+ _copy_entry(src_dir, destination, src_dir)
142
+
143
+
144
+ def ensure_binary_available(binary: str, install_hint: str | None = None) -> None:
145
+ checks = [
146
+ lambda: check_subprocess("where" if is_windows else "which", [binary]),
147
+ lambda: check_subprocess(binary, ["--version"]),
148
+ lambda: check_subprocess(binary, ["-v"]),
149
+ ]
150
+ if any(check() for check in checks):
151
+ return
152
+ raise MissingDependencyError(binary, install_hint)
153
+
154
+
155
+ def run_command(command: str, args: list[str], cwd: str | None = None) -> None:
156
+ run_subprocess(command, args, cwd=cwd)
157
+
158
+
159
+ def _collect_files(directory: str, base_path: str = "") -> list[tuple[str, str]]:
160
+ """(absolute path, zip path) pairs. Like upstream, symlinks are neither files nor dirs here."""
161
+ result: list[tuple[str, str]] = []
162
+ with os.scandir(directory) as it:
163
+ entries = sorted(it, key=lambda e: e.name)
164
+ for entry in entries:
165
+ if _is_zip_excluded_entry(entry.name):
166
+ continue
167
+ zip_path = f"{base_path}/{entry.name}" if base_path else entry.name
168
+ if entry.is_dir(follow_symlinks=False):
169
+ result.extend(_collect_files(entry.path, zip_path))
170
+ elif entry.is_file(follow_symlinks=False):
171
+ result.append((entry.path, zip_path))
172
+ return result
173
+
174
+
175
+ def create_zip_from_dir(source_dir: str, output_zip: str) -> None:
176
+ """Zip regular files under ``source_dir`` (deflate level 6), preserving file modes."""
177
+ if os.path.exists(output_zip):
178
+ os.remove(output_zip)
179
+ os.makedirs(os.path.dirname(output_zip) or ".", exist_ok=True)
180
+ files = _collect_files(source_dir)
181
+ with zipfile.ZipFile(output_zip, "w", compression=zipfile.ZIP_DEFLATED, compresslevel=6) as zf:
182
+ for full_path, zip_path in files:
183
+ info = zipfile.ZipInfo.from_file(full_path, zip_path, strict_timestamps=False)
184
+ info.compress_type = zipfile.ZIP_DEFLATED
185
+ with open(full_path, "rb") as fh:
186
+ zf.writestr(info, fh.read(), compress_type=zipfile.ZIP_DEFLATED, compresslevel=6)
187
+
188
+
189
+ def enforce_zip_size_limit(zip_path: str) -> int:
190
+ size = os.stat(zip_path).st_size
191
+ if size > MAX_ZIP_SIZE_BYTES:
192
+ raise ArtifactSizeError(MAX_ZIP_SIZE_BYTES, size)
193
+ return size
194
+
195
+
196
+ # --- Console script fix-ups ---------------------------------------------------------------------
197
+
198
+ _PORTABLE_SHEBANG = "#!/usr/bin/env python3"
199
+
200
+ # Console scripts whose Windows .exe launchers are replaced by Linux scripts when cross-packaging.
201
+ _KNOWN_CONSOLE_SCRIPTS: dict[str, tuple[str, str]] = {
202
+ "opentelemetry-instrument": ("opentelemetry.instrumentation.auto_instrumentation", "run"),
203
+ "opentelemetry-bootstrap": ("opentelemetry.instrumentation.bootstrap", "run"),
204
+ }
205
+
206
+ _HARDCODED_SHEBANG = re.compile(r"^#!/(?:Users|home|opt|var|tmp)/.*python")
207
+
208
+
209
+ def _generate_linux_console_script(module_path: str, func_name: str) -> str:
210
+ return (
211
+ "#!/usr/bin/env python3\n"
212
+ "# -*- coding: utf-8 -*-\n"
213
+ "import re\n"
214
+ "import sys\n"
215
+ f"from {module_path} import {func_name}\n"
216
+ "if __name__ == '__main__':\n"
217
+ " sys.argv[0] = re.sub(r'(-script\\.pyw|\\.exe)?$', '', sys.argv[0])\n"
218
+ f" sys.exit({func_name}())\n"
219
+ )
220
+
221
+
222
+ def _write_executable(path: str, content: str) -> None:
223
+ with open(path, "w", encoding="utf-8", newline="") as fh:
224
+ fh.write(content)
225
+ os.chmod(path, 0o755)
226
+
227
+
228
+ def _rewrite_unix_shebangs(staging_dir: str) -> None:
229
+ """Replace hardcoded interpreter paths in ``bin/`` scripts with ``#!/usr/bin/env python3``."""
230
+ bin_dir = os.path.join(staging_dir, "bin")
231
+ if not os.path.exists(bin_dir):
232
+ return
233
+ for entry in os.listdir(bin_dir):
234
+ script_path = os.path.join(bin_dir, entry)
235
+ if not os.path.isfile(script_path):
236
+ continue
237
+ with open(script_path, "rb") as fh:
238
+ content = fh.read().decode("utf-8", errors="replace")
239
+ first_line = content.split("\n", 1)[0]
240
+ if first_line and _HARDCODED_SHEBANG.search(first_line):
241
+ # Rewrites in place; like upstream, the existing file mode is kept.
242
+ with open(script_path, "w", encoding="utf-8", newline="") as fh:
243
+ fh.write(content.replace(first_line, _PORTABLE_SHEBANG, 1))
244
+
245
+
246
+ def convert_windows_scripts_to_linux(staging_dir: str) -> None:
247
+ """Make console scripts runnable on Linux: rewrite .exe launchers (Windows) or shebangs (Unix)."""
248
+ if not is_windows:
249
+ _rewrite_unix_shebangs(staging_dir)
250
+ return
251
+ bin_dir = os.path.join(staging_dir, "bin")
252
+ if not os.path.exists(bin_dir):
253
+ return
254
+ for entry in os.listdir(bin_dir):
255
+ if not entry.endswith(".exe"):
256
+ continue
257
+ script_name = entry[:-4]
258
+ entry_point = _KNOWN_CONSOLE_SCRIPTS.get(script_name)
259
+ if entry_point:
260
+ os.unlink(os.path.join(bin_dir, entry))
261
+ _write_executable(os.path.join(bin_dir, script_name), _generate_linux_console_script(*entry_point))
262
+
263
+
264
+ # Upstream keeps *Sync twins for CDK bundling; Python is synchronous throughout.
265
+ resolve_project_paths_sync = resolve_project_paths
266
+ resolve_node_project_paths_sync = resolve_node_project_paths
267
+ ensure_dir_clean_sync = ensure_dir_clean
268
+ copy_source_tree_sync = copy_source_tree
269
+ ensure_binary_available_sync = ensure_binary_available
270
+ create_zip_from_dir_sync = create_zip_from_dir
271
+ enforce_zip_size_limit_sync = enforce_zip_size_limit
272
+ convert_windows_scripts_to_linux_sync = convert_windows_scripts_to_linux
273
+
274
+ __all__ = [
275
+ "MAX_ZIP_SIZE_BYTES",
276
+ "ResolvedPaths",
277
+ "convert_windows_scripts_to_linux",
278
+ "copy_source_tree",
279
+ "create_zip_from_dir",
280
+ "enforce_zip_size_limit",
281
+ "ensure_binary_available",
282
+ "ensure_dir_clean",
283
+ "is_node_runtime",
284
+ "is_python_runtime",
285
+ "resolve_code_location",
286
+ "resolve_node_project_paths",
287
+ "resolve_project_paths",
288
+ "run_command",
289
+ ]