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,28 @@
1
+ """Port of operations/dev/server.ts: dev server barrel + factory."""
2
+
3
+ from agentcore.operations.dev.codezip_dev_server import CodeZipDevServer
4
+ from agentcore.operations.dev.config import DevConfig
5
+ from agentcore.operations.dev.container_dev_server import ContainerDevServer
6
+ from agentcore.operations.dev.dev_server import DevServer, DevServerCallbacks, DevServerOptions, LogLevel
7
+ from agentcore.operations.dev.utils import find_available_port, wait_for_port, wait_for_server_ready
8
+
9
+
10
+ def create_dev_server(config: DevConfig, options: DevServerOptions) -> DevServer:
11
+ """Container builds run in Docker/Podman/Finch; everything else runs as a local process."""
12
+ if config.build_type == "Container":
13
+ return ContainerDevServer(config, options)
14
+ return CodeZipDevServer(config, options)
15
+
16
+
17
+ __all__ = [
18
+ "CodeZipDevServer",
19
+ "ContainerDevServer",
20
+ "DevServer",
21
+ "DevServerCallbacks",
22
+ "DevServerOptions",
23
+ "LogLevel",
24
+ "create_dev_server",
25
+ "find_available_port",
26
+ "wait_for_port",
27
+ "wait_for_server_ready",
28
+ ]
@@ -0,0 +1,30 @@
1
+ """Port of operations/dev/sse-transform.ts: normalize an agent SSE stream for the browser."""
2
+
3
+ import codecs
4
+ import json
5
+ from collections.abc import Callable, Iterable
6
+
7
+ from agentcore.operations.dev.invoke import parse_sse_line
8
+
9
+
10
+ def _emit(line: str, write: Callable[[str], None]) -> None:
11
+ content, error = parse_sse_line(line)
12
+ if error:
13
+ write(f"data: {json.dumps({'error': error}, ensure_ascii=False, separators=(',', ':'))}\n\n")
14
+ elif content:
15
+ write(f"data: {json.dumps(content, ensure_ascii=False)}\n\n")
16
+
17
+
18
+ def pipe_sse_transformed(chunks: Iterable[bytes], write: Callable[[str], None], end: Callable[[], None]) -> None:
19
+ """Re-emit each ``data:`` event as ``data: "text"`` (or ``data: {"error": ...}``), then end."""
20
+ decoder = codecs.getincrementaldecoder("utf-8")(errors="replace")
21
+ buffer = ""
22
+ for chunk in chunks:
23
+ buffer += decoder.decode(chunk)
24
+ lines = buffer.split("\n")
25
+ buffer = lines.pop()
26
+ for line in lines:
27
+ _emit(line, write)
28
+ if buffer:
29
+ _emit(buffer, write)
30
+ end()
@@ -0,0 +1,152 @@
1
+ """Port of operations/dev/utils.ts: port probing, readiness polling and display helpers."""
2
+
3
+ import signal
4
+ import socket
5
+ import threading
6
+ import time
7
+ import webbrowser
8
+ from collections.abc import Callable
9
+ from typing import Any
10
+
11
+
12
+ def _check_port(port: int, host: str) -> bool:
13
+ """True if ``port`` can be bound on ``host`` (mirrors net.createServer().listen)."""
14
+ sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
15
+ try:
16
+ # Node's listen() sets SO_REUSEADDR on POSIX; do the same so TIME_WAIT sockets don't count.
17
+ if hasattr(socket, "SO_REUSEADDR"):
18
+ sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
19
+ sock.bind((host, port))
20
+ sock.listen(1)
21
+ return True
22
+ except OSError:
23
+ return False
24
+ finally:
25
+ sock.close()
26
+
27
+
28
+ def is_port_available(port: int) -> bool:
29
+ """Available on both 127.0.0.1 and 0.0.0.0 (checked sequentially, as upstream)."""
30
+ if not _check_port(port, "127.0.0.1"):
31
+ return False
32
+ return _check_port(port, "0.0.0.0")
33
+
34
+
35
+ def find_available_port(start_port: int) -> int:
36
+ port = start_port
37
+ while not is_port_available(port):
38
+ port += 1
39
+ return port
40
+
41
+
42
+ def wait_for_port(port: int, timeout_ms: int = 3000) -> bool:
43
+ """Wait for ``port`` to become free."""
44
+ start = time.monotonic()
45
+ while (time.monotonic() - start) * 1000 < timeout_ms:
46
+ if is_port_available(port):
47
+ return True
48
+ time.sleep(0.1)
49
+ return False
50
+
51
+
52
+ def _is_listening(port: int) -> bool:
53
+ try:
54
+ with socket.create_connection(("127.0.0.1", port), timeout=1):
55
+ return True
56
+ except OSError:
57
+ return False
58
+
59
+
60
+ def wait_for_server_ready(port: int, timeout_ms: int = 60000) -> bool:
61
+ """Wait until something accepts connections on 127.0.0.1:``port``."""
62
+ start = time.monotonic()
63
+ while (time.monotonic() - start) * 1000 < timeout_ms:
64
+ if _is_listening(port):
65
+ return True
66
+ time.sleep(0.5)
67
+ return False
68
+
69
+
70
+ def sleep(ms: float) -> None:
71
+ time.sleep(ms / 1000)
72
+
73
+
74
+ def get_endpoint_url(port: int, protocol: str) -> str:
75
+ if protocol == "MCP":
76
+ return f"http://localhost:{port}/mcp"
77
+ if protocol == "A2A":
78
+ return f"http://localhost:{port}/"
79
+ return f"http://localhost:{port}/invocations"
80
+
81
+
82
+ def format_mcp_tool_list(tools: list[dict[str, Any]]) -> str:
83
+ lines = []
84
+ for t in tools:
85
+ props = (t.get("inputSchema") or {}).get("properties")
86
+ params = (
87
+ ", ".join(f"{name}: {(schema or {}).get('type') or 'any'}" for name, schema in props.items())
88
+ if props
89
+ else ""
90
+ )
91
+ desc = f" - {t['description']}" if t.get("description") else ""
92
+ lines.append(f" {t['name']}({params}){desc}")
93
+ joined = "\n".join(lines)
94
+ return (
95
+ f"Available tools ({len(tools)}):\n{joined}\n\n"
96
+ 'Type: tool_name {"arg": "value"} to call a tool. Type "list" to refresh.'
97
+ )
98
+
99
+
100
+ class FetchFailedError(ConnectionError):
101
+ """Raised when a local HTTP request cannot connect (Node's ``TypeError: fetch failed``)."""
102
+
103
+ def __init__(self, cause: BaseException | None = None):
104
+ super().__init__("fetch failed")
105
+ self.__cause__ = cause
106
+
107
+
108
+ def is_connection_error(error: BaseException) -> bool:
109
+ """Only network-level failures (connection refused / fetch failed), not application errors."""
110
+ message = str(error)
111
+ return (
112
+ isinstance(error, (FetchFailedError, ConnectionRefusedError))
113
+ or "ECONNREFUSED" in message
114
+ or (message == "fetch failed")
115
+ )
116
+
117
+
118
+ def convert_entrypoint_to_module(entrypoint: str) -> str:
119
+ if ":" in entrypoint:
120
+ return entrypoint
121
+ path = entrypoint.removesuffix(".py")
122
+ return f"{path.replace('/', '.')}:app"
123
+
124
+
125
+ def on_shutdown_signal(handler: Callable[[], None]) -> None:
126
+ """Run ``handler`` once on the first SIGINT/SIGTERM (``process.once`` semantics)."""
127
+ fired = threading.Event()
128
+ previous: dict[int, Any] = {}
129
+
130
+ def _handle(signum: int, _frame: Any) -> None:
131
+ for sig, prev in previous.items():
132
+ try:
133
+ signal.signal(sig, prev)
134
+ except (ValueError, OSError):
135
+ pass
136
+ if not fired.is_set():
137
+ fired.set()
138
+ handler()
139
+
140
+ for sig in (signal.SIGINT, signal.SIGTERM):
141
+ try:
142
+ previous[sig] = signal.getsignal(sig)
143
+ signal.signal(sig, _handle)
144
+ except (ValueError, OSError): # not the main thread
145
+ pass
146
+
147
+
148
+ def open_browser(url: str) -> None:
149
+ try:
150
+ webbrowser.open(url)
151
+ except Exception: # noqa: BLE001 - best effort, like the detached spawn upstream
152
+ pass
@@ -0,0 +1,31 @@
1
+ """Local web UI server for `agentcore dev` (port of operations/dev/web-ui)."""
2
+
3
+ from agentcore.operations.dev.web_ui.constants import (
4
+ WEB_UI_DEFAULT_PORT,
5
+ WEB_UI_LOCAL_URL,
6
+ AgentError,
7
+ AgentInfo,
8
+ HarnessInfo,
9
+ )
10
+ from agentcore.operations.dev.web_ui.run_web_ui import run_web_ui
11
+ from agentcore.operations.dev.web_ui.web_server import (
12
+ CSP_HEADER,
13
+ RunningAgent,
14
+ WebUIOptions,
15
+ WebUIServer,
16
+ resolve_ui_dist_dir,
17
+ )
18
+
19
+ __all__ = [
20
+ "CSP_HEADER",
21
+ "WEB_UI_DEFAULT_PORT",
22
+ "WEB_UI_LOCAL_URL",
23
+ "AgentError",
24
+ "AgentInfo",
25
+ "HarnessInfo",
26
+ "RunningAgent",
27
+ "WebUIOptions",
28
+ "WebUIServer",
29
+ "resolve_ui_dist_dir",
30
+ "run_web_ui",
31
+ ]
@@ -0,0 +1,25 @@
1
+ """Port of operations/dev/web-ui/constants.ts."""
2
+
3
+ from dataclasses import dataclass
4
+ from typing import Any
5
+
6
+ WEB_UI_LOCAL_URL = "http://localhost:5173"
7
+
8
+ # Default port for the web UI proxy server. Agent ports start above this.
9
+ WEB_UI_DEFAULT_PORT = 8081
10
+
11
+ # Metadata about an available agent: {"name", "buildType", "protocol", "runtimeIndex"?} (StatusAgent).
12
+ AgentInfo = dict[str, Any]
13
+
14
+
15
+ @dataclass
16
+ class AgentError:
17
+ message: str
18
+ timestamp: int
19
+
20
+
21
+ @dataclass
22
+ class HarnessInfo:
23
+ name: str
24
+ harness_arn: str
25
+ region: str
@@ -0,0 +1,36 @@
1
+ """Web UI route handlers (port of operations/dev/web-ui/handlers). The RouteContext is the WebUIServer."""
2
+
3
+ from agentcore.operations.dev.web_ui.handlers.a2a_proxy import handle_a2a_agent_card
4
+ from agentcore.operations.dev.web_ui.handlers.cloudwatch_traces import (
5
+ handle_get_cloud_watch_trace,
6
+ handle_list_cloud_watch_traces,
7
+ )
8
+ from agentcore.operations.dev.web_ui.handlers.harness_invocation import (
9
+ handle_harness_invocation,
10
+ handle_harness_tool_response,
11
+ )
12
+ from agentcore.operations.dev.web_ui.handlers.invocations import handle_invocations
13
+ from agentcore.operations.dev.web_ui.handlers.mcp_proxy import handle_mcp_proxy
14
+ from agentcore.operations.dev.web_ui.handlers.memory import handle_list_memory_records, handle_retrieve_memory_records
15
+ from agentcore.operations.dev.web_ui.handlers.resources import handle_resources
16
+ from agentcore.operations.dev.web_ui.handlers.start import handle_start, resolve_agent_target_port
17
+ from agentcore.operations.dev.web_ui.handlers.status import handle_status
18
+ from agentcore.operations.dev.web_ui.handlers.traces import handle_get_trace, handle_list_traces
19
+
20
+ __all__ = [
21
+ "handle_a2a_agent_card",
22
+ "handle_get_cloud_watch_trace",
23
+ "handle_get_trace",
24
+ "handle_harness_invocation",
25
+ "handle_harness_tool_response",
26
+ "handle_invocations",
27
+ "handle_list_cloud_watch_traces",
28
+ "handle_list_memory_records",
29
+ "handle_list_traces",
30
+ "handle_mcp_proxy",
31
+ "handle_resources",
32
+ "handle_retrieve_memory_records",
33
+ "handle_start",
34
+ "handle_status",
35
+ "resolve_agent_target_port",
36
+ ]
@@ -0,0 +1,36 @@
1
+ """Shared helpers for web UI route handlers (RouteContext is the WebUIServer)."""
2
+
3
+ import math
4
+ from typing import Any
5
+
6
+ from agentcore.operations.dev._server import Response, js_dumps
7
+
8
+
9
+ def send_json(ctx: Any, res: Response, origin: str | None, status: int, body: Any, cors: bool = True) -> None:
10
+ if cors:
11
+ ctx.set_cors_headers(res, origin)
12
+ res.write_head(status, {"Content-Type": "application/json"})
13
+ res.end(js_dumps(body))
14
+
15
+
16
+ def parse_time_params(
17
+ ctx: Any, res: Response, origin: str | None, param: Any
18
+ ) -> tuple[bool, float | None, float | None]:
19
+ """Optional startTime/endTime epoch-ms query params; sends a 400 and returns ok=False if invalid."""
20
+ values: list[float | None] = []
21
+ for key in ("startTime", "endTime"):
22
+ raw = param(key)
23
+ if not raw:
24
+ values.append(None)
25
+ continue
26
+ try:
27
+ number = float(raw)
28
+ if math.isnan(number):
29
+ raise ValueError
30
+ except ValueError:
31
+ send_json(
32
+ ctx, res, origin, 400, {"success": False, "error": f"{key} must be a number (epoch milliseconds)"}
33
+ )
34
+ return False, None, None
35
+ values.append(int(number) if number.is_integer() else number)
36
+ return True, values[0], values[1]
@@ -0,0 +1,37 @@
1
+ """Shared config loading + target resolution for ``?target=deployed`` routes."""
2
+
3
+ from typing import Any
4
+
5
+ from agentcore.lib.schemas.io.config_io import ConfigIO
6
+ from agentcore.operations.dev._server import Response
7
+ from agentcore.operations.dev.web_ui.handlers._common import send_json
8
+
9
+
10
+ def resolve_deployed(
11
+ ctx: Any, res: Response, origin: str | None, agent_name: str | None, target_name: str | None, session_id: str | None
12
+ ) -> Any | None:
13
+ """Return the resolved invoke target, or None after sending the error response."""
14
+ config_io = ConfigIO(base_dir=ctx.options.config_root)
15
+ try:
16
+ project = config_io.read_project_spec()
17
+ deployed_state = config_io.read_deployed_state()
18
+ aws_targets = config_io.read_aws_deployment_targets()
19
+ except Exception as err: # noqa: BLE001
20
+ send_json(ctx, res, origin, 500, {"success": False, "error": f"Failed to load config: {err}"})
21
+ return None
22
+
23
+ from agentcore.cli.commands.invoke.resolve import resolve_invoke_target
24
+
25
+ resolved = resolve_invoke_target(
26
+ project=project,
27
+ deployed_state=deployed_state,
28
+ aws_targets=aws_targets,
29
+ agent_name=agent_name,
30
+ target_name=target_name,
31
+ session_id=session_id,
32
+ config_io=config_io,
33
+ )
34
+ if not resolved.success:
35
+ send_json(ctx, res, origin, 400, {"success": False, "error": str(resolved.error)})
36
+ return None
37
+ return resolved
@@ -0,0 +1,37 @@
1
+ """GET /api/a2a/agent-card (port of handlers/a2a-proxy.ts)."""
2
+
3
+ from typing import Any
4
+
5
+ from agentcore.operations.dev._http import fetch
6
+ from agentcore.operations.dev._server import Request, Response
7
+ from agentcore.operations.dev.web_ui.handlers._common import send_json
8
+
9
+
10
+ def handle_a2a_agent_card(ctx: Any, req: Request, res: Response, origin: str | None = None) -> None:
11
+ from agentcore.operations.dev.web_ui.web_server import parse_request_url
12
+
13
+ ctx.set_cors_headers(res, origin)
14
+ _, param = parse_request_url(req)
15
+ agent_name = param("agentName")
16
+ if not agent_name:
17
+ send_json(ctx, res, origin, 400, {"success": False, "error": "agentName query parameter is required"}, False)
18
+ return
19
+ running = ctx.running_agents.get(agent_name)
20
+ if not running:
21
+ send_json(ctx, res, origin, 400, {"success": False, "error": f'Agent "{agent_name}" is not running'}, False)
22
+ return
23
+ try:
24
+ headers = {"Accept": "application/json"}
25
+ card_res = fetch(f"http://localhost:{running.port}/.well-known/agent-card.json", headers=headers)
26
+ if card_res.status == 404:
27
+ card_res.close()
28
+ card_res = fetch(f"http://localhost:{running.port}/.well-known/agent.json", headers=headers)
29
+ if not card_res.ok:
30
+ card_res.close()
31
+ error = f"Agent card not available ({card_res.status})"
32
+ send_json(ctx, res, origin, 502, {"success": False, "error": error}, False)
33
+ return
34
+ card = card_res.json()
35
+ send_json(ctx, res, origin, 200, {"success": True, "card": card}, False)
36
+ except Exception as err: # noqa: BLE001
37
+ send_json(ctx, res, origin, 502, {"success": False, "error": f"Failed to fetch agent card: {err}"}, False)
@@ -0,0 +1,71 @@
1
+ """GET /api/cloudwatch-traces[/:traceId] (port of handlers/cloudwatch-traces.ts)."""
2
+
3
+ import re
4
+ from typing import Any
5
+
6
+ from agentcore.operations.dev._server import Request, Response
7
+ from agentcore.operations.dev.web_ui.handlers._common import parse_time_params, send_json
8
+
9
+ _ONE_OF = "Either agentName or harnessName query parameter is required"
10
+ _NOT_BOTH = "Provide either agentName or harnessName, not both"
11
+
12
+
13
+ def _check_target(ctx: Any, res: Response, origin: str | None, agent: str | None, harness: str | None) -> bool:
14
+ if not agent and not harness:
15
+ send_json(ctx, res, origin, 400, {"success": False, "error": _ONE_OF})
16
+ return False
17
+ if agent and harness:
18
+ send_json(ctx, res, origin, 400, {"success": False, "error": _NOT_BOTH})
19
+ return False
20
+ return True
21
+
22
+
23
+ def handle_list_cloud_watch_traces(ctx: Any, req: Request, res: Response, origin: str | None = None) -> None:
24
+ from agentcore.operations.dev.web_ui.web_server import parse_request_url
25
+
26
+ _, param = parse_request_url(req)
27
+ handler = ctx.options.on_list_cloud_watch_traces
28
+ if not handler:
29
+ send_json(ctx, res, origin, 404, {"success": False, "error": "CloudWatch traces are not available"})
30
+ return
31
+ agent, harness = param("agentName"), param("harnessName")
32
+ if not _check_target(ctx, res, origin, agent, harness):
33
+ return
34
+ ok, start, end = parse_time_params(ctx, res, origin, param)
35
+ if not ok:
36
+ return
37
+ try:
38
+ result = handler(agent, harness, start, end)
39
+ send_json(ctx, res, origin, 200 if result.get("success") else 500, result)
40
+ except Exception as err: # noqa: BLE001
41
+ ctx.log("error", f"List CloudWatch traces error: {err}")
42
+ send_json(ctx, res, origin, 500, {"success": False, "error": "Failed to list CloudWatch traces"})
43
+
44
+
45
+ def handle_get_cloud_watch_trace(ctx: Any, req: Request, res: Response, origin: str | None = None) -> None:
46
+ from agentcore.operations.dev.web_ui.web_server import parse_request_url
47
+
48
+ pathname, param = parse_request_url(req)
49
+ handler = ctx.options.on_get_cloud_watch_trace
50
+ if not handler:
51
+ send_json(ctx, res, origin, 404, {"success": False, "error": "CloudWatch traces are not available"})
52
+ return
53
+ trace_id = pathname.replace("/api/cloudwatch-traces/", "", 1)
54
+ agent, harness = param("agentName"), param("harnessName")
55
+ if not trace_id:
56
+ send_json(ctx, res, origin, 400, {"success": False, "error": "traceId is required in the URL path"})
57
+ return
58
+ if not re.fullmatch(r"[a-fA-F0-9-]+", trace_id):
59
+ send_json(ctx, res, origin, 400, {"success": False, "error": "Invalid trace ID format"})
60
+ return
61
+ if not _check_target(ctx, res, origin, agent, harness):
62
+ return
63
+ ok, start, end = parse_time_params(ctx, res, origin, param)
64
+ if not ok:
65
+ return
66
+ try:
67
+ result = handler(agent, harness, trace_id, start, end)
68
+ send_json(ctx, res, origin, 200 if result.get("success") else 500, result)
69
+ except Exception as err: # noqa: BLE001
70
+ ctx.log("error", f"Get CloudWatch trace error: {err}")
71
+ send_json(ctx, res, origin, 500, {"success": False, "error": "Failed to get CloudWatch trace"})
@@ -0,0 +1,89 @@
1
+ """Harness invocation over SSE (port of handlers/harness-invocation.ts and harness-tool-response.ts)."""
2
+
3
+ import json
4
+ import uuid
5
+ from typing import Any
6
+
7
+ from agentcore.operations.dev._server import Request, Response, js_dumps
8
+ from agentcore.operations.dev.web_ui.handlers._common import send_json
9
+ from agentcore.operations.dev.web_ui.handlers.harness_utils import build_invoke_options, read_local_harness_model
10
+
11
+
12
+ def _invoke_harness(**kwargs: Any): # type: ignore[no-untyped-def]
13
+ from agentcore.aws import agentcore_harness
14
+
15
+ return agentcore_harness.invoke_harness(**kwargs)
16
+
17
+
18
+ def _stream_harness(ctx: Any, res: Response, origin: str | None, session_id: str, invoke_opts: dict[str, Any]) -> None:
19
+ ctx.set_cors_headers(res, origin)
20
+ res.write_head(
21
+ 200,
22
+ {
23
+ "Content-Type": "text/event-stream",
24
+ "Cache-Control": "no-cache",
25
+ "Connection": "keep-alive",
26
+ "x-session-id": session_id,
27
+ },
28
+ )
29
+ try:
30
+ for event in _invoke_harness(**invoke_opts):
31
+ res.write(f"data: {js_dumps(event)}\n\n")
32
+ except Exception as err: # noqa: BLE001 - surfaced to the browser as an SSE error event
33
+ res.write(f"data: {js_dumps({'type': 'error', 'errorType': 'invocationError', 'message': str(err)})}\n\n")
34
+ res.end()
35
+
36
+
37
+ def _find_harness(ctx: Any, name: str) -> Any | None:
38
+ return next((h for h in ctx.options.harnesses or [] if h.name == name), None)
39
+
40
+
41
+ def handle_harness_invocation(ctx: Any, body: dict[str, Any], res: Response, origin: str | None = None) -> None:
42
+ harness_name = body.get("harnessName")
43
+ prompt = body.get("prompt")
44
+ if not harness_name or not prompt:
45
+ error = "harnessName is required" if not harness_name else "prompt is required"
46
+ send_json(ctx, res, origin, 400, {"success": False, "error": error})
47
+ return
48
+ session_id = body.get("sessionId") or str(uuid.uuid4())
49
+ harness = _find_harness(ctx, harness_name)
50
+ if harness is None:
51
+ send_json(ctx, res, origin, 404, {"success": False, "error": f'Harness "{harness_name}" not found'})
52
+ return
53
+ messages = [{"role": "user", "content": [{"text": prompt}]}]
54
+ spec_model = read_local_harness_model(ctx.options.config_root, harness_name)
55
+ opts = build_invoke_options(
56
+ harness.harness_arn, harness.region, session_id, messages, body.get("harnessOverrides"), spec_model
57
+ )
58
+ _stream_harness(ctx, res, origin, session_id, opts)
59
+
60
+
61
+ def handle_harness_tool_response(ctx: Any, req: Request, res: Response, origin: str | None = None) -> None:
62
+ body = ctx.read_body(req)
63
+ try:
64
+ raw = json.loads(body)
65
+ if not isinstance(raw, dict):
66
+ raise ValueError
67
+ except ValueError:
68
+ send_json(ctx, res, origin, 400, {"success": False, "error": "Invalid JSON"})
69
+ return
70
+ if not raw.get("harnessName"):
71
+ error = "harnessName is required"
72
+ elif not raw.get("messages") or not isinstance(raw.get("messages"), list):
73
+ error = "messages array is required"
74
+ elif not raw.get("sessionId"):
75
+ error = "sessionId is required"
76
+ else:
77
+ error = None
78
+ if error:
79
+ send_json(ctx, res, origin, 400, {"success": False, "error": error})
80
+ return
81
+ harness = _find_harness(ctx, raw["harnessName"])
82
+ if harness is None:
83
+ send_json(ctx, res, origin, 404, {"success": False, "error": f'Harness "{raw["harnessName"]}" not found'})
84
+ return
85
+ spec_model = read_local_harness_model(ctx.options.config_root, raw["harnessName"])
86
+ opts = build_invoke_options(
87
+ harness.harness_arn, harness.region, raw["sessionId"], raw["messages"], raw.get("harnessOverrides"), spec_model
88
+ )
89
+ _stream_harness(ctx, res, origin, raw["sessionId"], opts)
@@ -0,0 +1,95 @@
1
+ """Port of handlers/harness-utils.ts: build InvokeHarness kwargs for dev invocations."""
2
+
3
+ from typing import Any
4
+
5
+ from agentcore.lib.schemas.io.config_io import ConfigIO
6
+
7
+ DEFAULT_MAX_ITERATIONS = 75
8
+
9
+
10
+ def build_model_override(spec_model: Any) -> dict[str, Any] | None:
11
+ """Map the local harness spec's model onto the invoke API's model configuration."""
12
+ common: dict[str, Any] = {"modelId": spec_model.model_id}
13
+ if spec_model.temperature is not None:
14
+ common["temperature"] = spec_model.temperature
15
+ if spec_model.top_p is not None:
16
+ common["topP"] = spec_model.top_p
17
+ if spec_model.max_tokens is not None:
18
+ common["maxTokens"] = spec_model.max_tokens
19
+ provider = spec_model.provider
20
+ if provider == "bedrock":
21
+ return {
22
+ "bedrockModelConfig": {**common, **({"apiFormat": spec_model.api_format} if spec_model.api_format else {})}
23
+ }
24
+ if provider == "open_ai":
25
+ extra: dict[str, Any] = {}
26
+ if spec_model.api_key_arn:
27
+ extra["apiKeyArn"] = spec_model.api_key_arn
28
+ if spec_model.api_format and spec_model.api_format != "converse_stream":
29
+ extra["apiFormat"] = spec_model.api_format
30
+ return {"openAiModelConfig": {**common, **extra}}
31
+ if provider == "gemini":
32
+ extra = {}
33
+ if spec_model.api_key_arn:
34
+ extra["apiKeyArn"] = spec_model.api_key_arn
35
+ if spec_model.top_k is not None:
36
+ extra["topK"] = spec_model.top_k
37
+ return {"geminiModelConfig": {**common, **extra}}
38
+ if provider == "lite_llm":
39
+ extra = {}
40
+ if spec_model.api_key_arn:
41
+ extra["apiKeyArn"] = spec_model.api_key_arn
42
+ if spec_model.api_base:
43
+ extra["apiBase"] = spec_model.api_base
44
+ if spec_model.additional_params:
45
+ extra["additionalParams"] = spec_model.additional_params
46
+ return {"liteLlmModelConfig": {**common, **extra}}
47
+ return None
48
+
49
+
50
+ def read_local_harness_model(config_root: str | None, harness_name: str) -> Any | None:
51
+ if not config_root:
52
+ return None
53
+ try:
54
+ return ConfigIO(base_dir=config_root).read_harness_spec(harness_name).model
55
+ except Exception: # noqa: BLE001 - best effort, as upstream
56
+ return None
57
+
58
+
59
+ def build_invoke_options(
60
+ harness_arn: str,
61
+ region: str,
62
+ session_id: str,
63
+ messages: list[dict[str, Any]],
64
+ overrides: dict[str, Any] | None = None,
65
+ spec_model: Any | None = None,
66
+ ) -> dict[str, Any]:
67
+ """Keyword arguments for :func:`agentcore.aws.agentcore_harness.invoke_harness`."""
68
+ overrides = overrides or {}
69
+ opts: dict[str, Any] = {
70
+ "region": region,
71
+ "harness_arn": harness_arn,
72
+ "runtime_session_id": session_id,
73
+ "messages": messages,
74
+ }
75
+ if overrides.get("model"):
76
+ opts["model"] = overrides["model"]
77
+ elif spec_model is not None:
78
+ opts["model"] = build_model_override(spec_model)
79
+ if overrides.get("systemPrompt"):
80
+ opts["system_prompt"] = [{"text": overrides["systemPrompt"]}]
81
+ if overrides.get("skills"):
82
+ opts["skills"] = overrides["skills"]
83
+ if overrides.get("actorId"):
84
+ opts["actor_id"] = overrides["actorId"]
85
+ max_iterations = overrides.get("maxIterations")
86
+ opts["max_iterations"] = max_iterations if max_iterations is not None else DEFAULT_MAX_ITERATIONS
87
+ if overrides.get("maxTokens") is not None:
88
+ opts["max_tokens"] = overrides["maxTokens"]
89
+ if overrides.get("timeoutSeconds") is not None:
90
+ opts["timeout_seconds"] = overrides["timeoutSeconds"]
91
+ if overrides.get("allowedTools"):
92
+ opts["allowed_tools"] = overrides["allowedTools"]
93
+ if overrides.get("tools"):
94
+ opts["tools"] = overrides["tools"]
95
+ return opts