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,297 @@
1
+ """Port of operations/dev/web-ui/web-server.ts: the local web UI / API proxy server.
2
+
3
+ Binds 127.0.0.1 only. Owns lifecycle, Host/Origin checks, CORS and routing; route handlers live
4
+ in ``handlers/``. Agent servers are started on demand when the frontend selects an agent, and the
5
+ prebuilt agent-inspector frontend is served as static files.
6
+ """
7
+
8
+ import os
9
+ import threading
10
+ from collections.abc import Callable
11
+ from concurrent.futures import Future
12
+ from dataclasses import dataclass, field
13
+ from importlib import resources
14
+ from typing import Any
15
+ from urllib.parse import parse_qs, urlsplit
16
+
17
+ from agentcore.operations.dev._server import Request, Response, make_server
18
+ from agentcore.operations.dev.config import DevConfig
19
+ from agentcore.operations.dev.dev_server import DevServer
20
+ from agentcore.operations.dev.web_ui.constants import WEB_UI_LOCAL_URL, AgentError, AgentInfo, HarnessInfo
21
+
22
+ MIME_TYPES = {
23
+ ".html": "text/html",
24
+ ".js": "application/javascript",
25
+ ".css": "text/css",
26
+ ".map": "application/json",
27
+ ".svg": "image/svg+xml",
28
+ }
29
+
30
+ # CSP header to block inline script injection from malicious agent responses.
31
+ CSP_HEADER = (
32
+ "default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; connect-src 'self'; "
33
+ "img-src 'self' data:; font-src 'self' data:"
34
+ )
35
+
36
+ OnLog = Callable[[str, str], None]
37
+
38
+
39
+ def resolve_ui_dist_dir() -> str | None:
40
+ """Frontend assets: ``AGENT_INSPECTOR_PATH`` override, else the vendored ``agentcore/agent_inspector``."""
41
+ candidates: list[str] = []
42
+ override = os.environ.get("AGENT_INSPECTOR_PATH")
43
+ if override:
44
+ candidates.append(override)
45
+ try:
46
+ candidates.append(str(resources.files("agentcore").joinpath("agent_inspector")))
47
+ except (ModuleNotFoundError, TypeError):
48
+ pass
49
+ for directory in candidates:
50
+ if os.path.exists(os.path.join(directory, "index.html")):
51
+ return directory
52
+ return None
53
+
54
+
55
+ @dataclass
56
+ class RunningAgent:
57
+ server: DevServer
58
+ port: int
59
+ protocol: str
60
+
61
+
62
+ @dataclass
63
+ class WebUIOptions:
64
+ mode: str
65
+ ui_port: int
66
+ agents: list[AgentInfo]
67
+ agent_base_port: int | None = None
68
+ harnesses: list[HarnessInfo] = field(default_factory=list)
69
+ get_dev_config: Callable[[str], DevConfig | None] | None = None
70
+ env_vars: dict[str, str] | None = None
71
+ get_env_vars: Callable[[], dict[str, str]] | None = None
72
+ config_root: str | None = None
73
+ on_ready: Callable[[str], None] | None = None
74
+ on_log: OnLog | None = None
75
+ on_start: Callable[[str], dict[str, Any]] | None = None
76
+ on_list_traces: Callable[..., dict[str, Any]] | None = None
77
+ on_get_trace: Callable[..., dict[str, Any]] | None = None
78
+ on_list_cloud_watch_traces: Callable[..., dict[str, Any]] | None = None
79
+ on_get_cloud_watch_trace: Callable[..., dict[str, Any]] | None = None
80
+ on_list_memory_records: Callable[[dict[str, Any]], dict[str, Any]] | None = None
81
+ on_retrieve_memory_records: Callable[[dict[str, Any]], dict[str, Any]] | None = None
82
+ selected_agent: str | None = None
83
+ selected_harness: str | None = None
84
+ reload_agents: Callable[[], list[AgentInfo]] | None = None
85
+
86
+
87
+ def parse_request_url(req: Request) -> tuple[str, Callable[[str], str | None]]:
88
+ """``(pathname, param)`` where ``param(name)`` returns the first query value or None."""
89
+ parts = urlsplit(req.url or "")
90
+ query = parse_qs(parts.query, keep_blank_values=True)
91
+
92
+ def param(name: str) -> str | None:
93
+ values = query.get(name)
94
+ return values[0] if values else None
95
+
96
+ return parts.path, param
97
+
98
+
99
+ class WebUIServer:
100
+ """Also serves as the handlers' RouteContext."""
101
+
102
+ def __init__(self, options: WebUIOptions):
103
+ self.options = options
104
+ self.running_agents: dict[str, RunningAgent] = {}
105
+ self.starting_agents: dict[str, Future[dict[str, Any]]] = {}
106
+ self.agent_errors: dict[str, AgentError] = {}
107
+ self.state_lock = threading.Lock()
108
+ self._server = None
109
+ self._thread: threading.Thread | None = None
110
+ self._watcher: threading.Thread | None = None
111
+ self._watch_stop = threading.Event()
112
+
113
+ # --- lifecycle --------------------------------------------------------------------------
114
+
115
+ def log(self, level: str, message: str) -> None:
116
+ if self.options.on_log:
117
+ self.options.on_log(level, message)
118
+
119
+ def start(self) -> None:
120
+ ui_port = self.options.ui_port
121
+ try:
122
+ self._server = make_server("127.0.0.1", ui_port, self._handle)
123
+ except OSError as err:
124
+ self.log("error", f"Web UI server error: {err}")
125
+ return
126
+ if ui_port == 0: # ephemeral (tests): adopt the bound port so origin checks line up
127
+ self.options.ui_port = self._server.server_address[1]
128
+ self._thread = threading.Thread(target=self._server.serve_forever, daemon=True)
129
+ self._thread.start()
130
+ if self.options.on_ready:
131
+ self.options.on_ready(f"http://localhost:{self.options.ui_port}")
132
+ self._start_config_watcher()
133
+
134
+ def stop(self) -> None:
135
+ self._watch_stop.set()
136
+ for agent in list(self.running_agents.values()):
137
+ agent.server.kill()
138
+ self.running_agents.clear()
139
+ if self._server is not None:
140
+ self._server.shutdown()
141
+ self._server.server_close()
142
+ self._server = None
143
+
144
+ def _start_config_watcher(self) -> None:
145
+ """Poll agentcore.json for changes and reload the agents list (fs.watch equivalent)."""
146
+ config_root, reload_agents = self.options.config_root, self.options.reload_agents
147
+ if not config_root or not reload_agents:
148
+ return
149
+ config_path = os.path.join(config_root, "agentcore.json")
150
+ try:
151
+ last = os.stat(config_path).st_mtime_ns
152
+ except OSError as err:
153
+ self.log("warn", f"Could not watch agentcore.json: {err}")
154
+ return
155
+
156
+ def watch() -> None:
157
+ nonlocal last
158
+ while not self._watch_stop.wait(0.5):
159
+ try:
160
+ mtime = os.stat(config_path).st_mtime_ns
161
+ except OSError:
162
+ continue
163
+ if mtime == last:
164
+ continue
165
+ last = mtime
166
+ try:
167
+ agents = reload_agents()
168
+ self.options.agents = agents
169
+ self.log("info", f"Reloaded agents from agentcore.json ({len(agents)} agent(s))")
170
+ except Exception as err: # noqa: BLE001
171
+ self.log("warn", f"Failed to reload agentcore.json: {err}")
172
+
173
+ self._watcher = threading.Thread(target=watch, daemon=True)
174
+ self._watcher.start()
175
+
176
+ # --- HTTP -------------------------------------------------------------------------------
177
+
178
+ @property
179
+ def allowed_origins(self) -> list[str]:
180
+ return [f"http://localhost:{self.options.ui_port}", WEB_UI_LOCAL_URL]
181
+
182
+ def set_cors_headers(self, res: Response, origin: str | None = None) -> None:
183
+ allowed = self.allowed_origins
184
+ res.set_header("Access-Control-Allow-Origin", origin if origin and origin in allowed else allowed[0])
185
+ res.set_header("Access-Control-Allow-Methods", "GET, POST, OPTIONS")
186
+ res.set_header("Access-Control-Allow-Headers", "Content-Type, X-Agentcore-Local, Mcp-Session-Id")
187
+ res.set_header("Access-Control-Expose-Headers", "Mcp-Session-Id, x-session-id")
188
+ res.set_header("Vary", "Origin")
189
+
190
+ def read_body(self, req: Request) -> str:
191
+ return req.text()
192
+
193
+ def _handle(self, req: Request, res: Response) -> None:
194
+ import re
195
+
196
+ # DNS rebinding protection: only localhost / 127.0.0.1 Host headers.
197
+ host = re.sub(r":\d+$", "", req.header("host") or "")
198
+ if host not in ("localhost", "127.0.0.1"):
199
+ self.log("warn", f"Blocked request with unexpected Host: {req.header('host')}")
200
+ res.write_head(403, {"Content-Type": "text/plain"})
201
+ res.end("Forbidden")
202
+ return
203
+
204
+ origin = req.header("origin")
205
+ # Server-side origin validation before any side effects.
206
+ if origin and origin not in self.allowed_origins:
207
+ self.log("warn", f"Blocked cross-origin request from {origin}")
208
+ res.write_head(403, {"Content-Type": "text/plain"})
209
+ res.end("Forbidden")
210
+ return
211
+
212
+ if req.method == "OPTIONS":
213
+ self.set_cors_headers(res, origin)
214
+ res.write_head(204)
215
+ res.end()
216
+ return
217
+
218
+ # Custom header on POSTs forces a CORS preflight for cross-origin callers.
219
+ if req.method == "POST" and not req.header("x-agentcore-local"):
220
+ res.write_head(403, {"Content-Type": "text/plain"})
221
+ res.end("Forbidden: missing X-Agentcore-Local header")
222
+ return
223
+
224
+ try:
225
+ self._route(req, res, origin)
226
+ except Exception as err: # noqa: BLE001 - request boundary
227
+ self.log("error", f"Request error: {err}")
228
+ if not res.headers_sent:
229
+ self.set_cors_headers(res, origin)
230
+ res.write_head(500, {"Content-Type": "text/plain"})
231
+ res.end("Internal Server Error")
232
+
233
+ def _route(self, req: Request, res: Response, origin: str | None) -> None:
234
+ from agentcore.operations.dev.web_ui import handlers as h
235
+
236
+ method, url = req.method, req.url or ""
237
+ if method == "GET" and url == "/api/status":
238
+ h.handle_status(self, res, origin)
239
+ elif method == "GET" and url == "/api/resources":
240
+ h.handle_resources(self, res, origin)
241
+ elif method == "GET" and url.startswith("/api/traces/"):
242
+ h.handle_get_trace(self, req, res, origin)
243
+ elif method == "GET" and url.startswith("/api/traces"):
244
+ h.handle_list_traces(self, req, res, origin)
245
+ elif method == "GET" and url.startswith("/api/cloudwatch-traces/"):
246
+ h.handle_get_cloud_watch_trace(self, req, res, origin)
247
+ elif method == "GET" and url.startswith("/api/cloudwatch-traces"):
248
+ h.handle_list_cloud_watch_traces(self, req, res, origin)
249
+ elif method == "POST" and url == "/api/start":
250
+ h.handle_start(self, req, res, origin)
251
+ elif method == "POST" and url == "/api/harness/tool-response":
252
+ h.handle_harness_tool_response(self, req, res, origin)
253
+ elif method == "POST" and (url == "/invocations" or url.startswith("/invocations?")):
254
+ h.handle_invocations(self, req, res, origin)
255
+ elif method == "POST" and (url == "/api/mcp" or url.startswith("/api/mcp?")):
256
+ h.handle_mcp_proxy(self, req, res, origin)
257
+ elif method == "GET" and url.startswith("/api/a2a/agent-card"):
258
+ h.handle_a2a_agent_card(self, req, res, origin)
259
+ elif method == "GET" and url.startswith("/api/memory"):
260
+ h.handle_list_memory_records(self, req, res, origin)
261
+ elif method == "POST" and url == "/api/memory/search":
262
+ h.handle_retrieve_memory_records(self, req, res, origin)
263
+ elif method == "GET" and self._serve_static_file(req, res):
264
+ pass
265
+ else:
266
+ self.set_cors_headers(res, origin)
267
+ res.write_head(404, {"Content-Type": "text/plain"})
268
+ res.end("Not Found")
269
+
270
+ def _serve_static_file(self, req: Request, res: Response) -> bool:
271
+ dist_dir = resolve_ui_dist_dir()
272
+ if not dist_dir:
273
+ return False
274
+ url_path = (req.url or "/").split("?")[0]
275
+ ext = os.path.splitext(url_path)[1]
276
+ if ext and ext in MIME_TYPES:
277
+ file_path = os.path.normpath(os.path.join(dist_dir, url_path.lstrip("/")))
278
+ if not file_path.startswith(os.path.normpath(dist_dir)):
279
+ return False
280
+ if os.path.isfile(file_path):
281
+ headers = {"Content-Type": MIME_TYPES[ext]}
282
+ if ext == ".html":
283
+ headers["Content-Security-Policy"] = CSP_HEADER
284
+ res.write_head(200, headers)
285
+ with open(file_path, "rb") as f:
286
+ while chunk := f.read(65536):
287
+ res.write(chunk)
288
+ res.end()
289
+ return True
290
+ index = os.path.join(dist_dir, "index.html")
291
+ if os.path.exists(index): # SPA fallback
292
+ res.write_head(200, {"Content-Type": "text/html", "Content-Security-Policy": CSP_HEADER})
293
+ with open(index, "rb") as f:
294
+ res.write(f.read())
295
+ res.end()
296
+ return True
297
+ return False
@@ -0,0 +1,8 @@
1
+ """On-demand evaluation operations (port of operations/eval/index.ts)."""
2
+
3
+ from agentcore.operations.eval.list_eval_runs import handle_list_eval_runs
4
+ from agentcore.operations.eval.logs_eval import handle_logs_eval
5
+ from agentcore.operations.eval.pause_resume import handle_pause_resume
6
+ from agentcore.operations.eval.run_eval import discover_sessions, handle_run_eval
7
+
8
+ __all__ = ["discover_sessions", "handle_list_eval_runs", "handle_logs_eval", "handle_pause_resume", "handle_run_eval"]
@@ -0,0 +1,18 @@
1
+ """List saved eval runs (port of operations/eval/list-eval-runs.ts)."""
2
+
3
+ from agentcore.lib.errors.types import to_error
4
+ from agentcore.lib.result import Err, Ok
5
+ from agentcore.operations.eval.storage import list_eval_runs
6
+
7
+
8
+ def handle_list_eval_runs(agent: str | None = None, limit: int | None = None) -> Ok | Err:
9
+ """Ok({"runs": [...]})."""
10
+ try:
11
+ runs = list_eval_runs()
12
+ if agent:
13
+ runs = [r for r in runs if r.get("agent") == agent]
14
+ if limit:
15
+ runs = runs[:limit]
16
+ return Ok({"runs": runs})
17
+ except Exception as exc: # noqa: BLE001
18
+ return Err(to_error(exc))
@@ -0,0 +1,119 @@
1
+ """Stream or search online eval logs (port of operations/eval/logs-eval.ts)."""
2
+
3
+ import json
4
+ import threading
5
+ import time
6
+ from typing import Any
7
+
8
+ import typer
9
+
10
+ from agentcore.aws import agentcore_control as control
11
+ from agentcore.aws import cloudwatch
12
+ from agentcore.aws._aws_errors import aws_error_name
13
+ from agentcore.lib import ResourceNotFoundError, ValidationError
14
+ from agentcore.lib.result import Err, Ok
15
+ from agentcore.lib.schemas.io.config_io import to_jsonable
16
+ from agentcore.lib.utils.time_parser import parse_time_string
17
+ from agentcore.operations import resolve_agent as _resolve_agent
18
+ from agentcore.operations.jobs.shared.format import iso_from_ms, parse_int
19
+
20
+
21
+ def format_log_line(event: dict[str, Any], as_json: bool) -> str:
22
+ ts = iso_from_ms(event["timestamp"])
23
+ if as_json:
24
+ return json.dumps({"timestamp": ts, "message": event["message"]}, separators=(",", ":"), ensure_ascii=False)
25
+ return f"{ts} {event['message']}"
26
+
27
+
28
+ def resolve_eval_log_groups(context: Any, target_name: str, region: str) -> list[dict[str, Any]]:
29
+ project = to_jsonable(context.project)
30
+ deployed = to_jsonable(context.deployed_state)
31
+ resources = ((deployed.get("targets") or {}).get(target_name) or {}).get("resources") or {}
32
+ results = []
33
+ for config in project.get("onlineEvalConfigs") or []:
34
+ state = (resources.get("onlineEvalConfigs") or {}).get(config["name"])
35
+ if not state or not state.get("onlineEvaluationConfigId"):
36
+ continue
37
+ config_id = state["onlineEvaluationConfigId"]
38
+ fallback = f"/aws/bedrock-agentcore/evaluations/results/{config_id}"
39
+ try:
40
+ api_config = control.get_online_evaluation_config(region=region, config_id=config_id)
41
+ results.append(
42
+ {
43
+ "logGroupName": api_config.get("outputLogGroupName") or fallback,
44
+ "configName": config["name"],
45
+ "failureReason": api_config.get("failureReason"),
46
+ }
47
+ )
48
+ except Exception: # noqa: BLE001 - fall back to the convention-based name
49
+ results.append({"logGroupName": fallback, "configName": config["name"]})
50
+ return results
51
+
52
+
53
+ def handle_logs_eval(
54
+ *,
55
+ agent: str | None = None,
56
+ since: str | None = None,
57
+ until: str | None = None,
58
+ limit: str | None = None,
59
+ as_json: bool = False,
60
+ follow: bool | None = None,
61
+ abort: threading.Event | None = None,
62
+ ) -> Ok | Err:
63
+ context = _resolve_agent.load_deployed_project_config()
64
+ resolved = _resolve_agent.resolve_agent(context, agent)
65
+ if not resolved.success:
66
+ return Err(ResourceNotFoundError(resolved.error or ""))
67
+ target = resolved.agent
68
+ assert target is not None
69
+ log_groups = resolve_eval_log_groups(context, target.target_name, target.region)
70
+ if not log_groups:
71
+ return Err(
72
+ ValidationError(
73
+ "No deployed online eval configs found. Add one with 'agentcore add online-eval' and deploy."
74
+ )
75
+ )
76
+ for lg in log_groups:
77
+ if lg.get("failureReason"):
78
+ typer.echo(
79
+ f"Warning: Online eval config '{lg['configName']}' has a failure: {lg['failureReason']}", err=True
80
+ )
81
+
82
+ is_follow = follow if follow is not None else (not since and not until)
83
+ abort = abort or threading.Event()
84
+ try:
85
+ for lg in log_groups:
86
+ name = lg["logGroupName"]
87
+ if not is_follow:
88
+ now_ms = int(time.time() * 1000)
89
+ start = parse_time_string(since) if since else now_ms - 3_600_000
90
+ end = parse_time_string(until) if until else now_ms
91
+ try:
92
+ for event in cloudwatch.search_logs(
93
+ log_group_name=name,
94
+ region=target.region,
95
+ start_time_ms=start,
96
+ end_time_ms=end,
97
+ limit=parse_int(limit) if limit else None,
98
+ ):
99
+ typer.echo(format_log_line(event, as_json))
100
+ except Exception as exc:
101
+ if aws_error_name(exc) == "ResourceNotFoundException":
102
+ continue
103
+ raise
104
+ else:
105
+ typer.echo(f"Streaming eval logs for {target.agent_name} from {name}... (Ctrl+C to stop)", err=True)
106
+ try:
107
+ for event in cloudwatch.stream_logs(
108
+ log_group_name=name, region=target.region, account_id=target.account_id, abort_signal=abort
109
+ ):
110
+ typer.echo(format_log_line(event, as_json))
111
+ except Exception as exc:
112
+ if aws_error_name(exc) == "ResourceNotFoundException":
113
+ typer.echo(f"Log group {name} not found yet — waiting for online eval results...", err=True)
114
+ continue
115
+ raise
116
+ return Ok(None)
117
+ except KeyboardInterrupt:
118
+ abort.set()
119
+ return Ok(None)
@@ -0,0 +1,90 @@
1
+ """Pause/resume a deployed online eval config (port of operations/eval/pause-resume.ts)."""
2
+
3
+ import re
4
+ from typing import Any
5
+
6
+ from agentcore.aws import agentcore_control as control
7
+ from agentcore.lib import ResourceNotFoundError
8
+ from agentcore.lib.errors.types import to_error
9
+ from agentcore.lib.result import Err, Ok
10
+ from agentcore.lib.schemas.io.config_io import to_jsonable
11
+ from agentcore.operations import resolve_agent as _resolve_agent
12
+
13
+ Resolution = dict[str, Any]
14
+
15
+
16
+ def _resolve_by_name(config_name: str) -> Resolution:
17
+ context = _resolve_agent.load_deployed_project_config()
18
+ deployed = to_jsonable(context.deployed_state)
19
+ targets = deployed.get("targets") or {}
20
+ if not targets:
21
+ return {"success": False, "error": "No deployed targets found. Run `agentcore deploy` first."}
22
+ target_name = next(iter(targets))
23
+ resources = (targets[target_name] or {}).get("resources") or {}
24
+ deployed_config = (resources.get("onlineEvalConfigs") or {}).get(config_name)
25
+ if not deployed_config:
26
+ return {
27
+ "success": False,
28
+ "error": f'Online eval config "{config_name}" not found in deployed state. Has it been deployed?',
29
+ }
30
+ target_config = next((t for t in context.aws_targets if t.name == target_name), None)
31
+ if target_config is None:
32
+ return {"success": False, "error": f'Target config "{target_name}" not found in aws-targets.'}
33
+ return {"success": True, "configId": deployed_config["onlineEvaluationConfigId"], "region": target_config.region}
34
+
35
+
36
+ def parse_online_eval_config_arn(arn: str, region_override: str | None = None) -> Resolution:
37
+ parts = arn.split(":")
38
+ if len(parts) < 6 or not arn.startswith("arn:"):
39
+ return {"success": False, "error": f"Invalid online eval config ARN: {arn}"}
40
+ region = region_override if region_override is not None else parts[3]
41
+ if not region:
42
+ return {"success": False, "error": "Could not determine region from ARN. Use --region to specify."}
43
+ match = re.search(r"online-evaluation-config/(.+)$", ":".join(parts[5:]))
44
+ if not match:
45
+ return {"success": False, "error": f"Could not extract config ID from ARN: {arn}"}
46
+ return {"success": True, "configId": match.group(1), "region": region}
47
+
48
+
49
+ def _resolve_config(name: str, arn: str | None, region: str | None) -> Resolution:
50
+ if arn and name:
51
+ by_arn = parse_online_eval_config_arn(arn, region)
52
+ if not by_arn["success"]:
53
+ return by_arn
54
+ by_name = _resolve_by_name(name)
55
+ if not by_name["success"]:
56
+ return by_name
57
+ if by_name["configId"] != by_arn["configId"]:
58
+ return {
59
+ "success": False,
60
+ "error": f'--arn and config name "{name}" refer to different configs '
61
+ f'(name resolves to "{by_name["configId"]}", ARN resolves to "{by_arn["configId"]}"). '
62
+ "Pass only one, or pass matching values.",
63
+ }
64
+ if by_name["region"] != by_arn["region"]:
65
+ return {
66
+ "success": False,
67
+ "error": f'--arn and config name "{name}" resolve to different regions '
68
+ f'(name resolves to "{by_name["region"]}", ARN resolves to "{by_arn["region"]}"). '
69
+ "Pass only one, or use --region to override.",
70
+ }
71
+ return by_arn
72
+ if arn:
73
+ return parse_online_eval_config_arn(arn, region)
74
+ return _resolve_by_name(name)
75
+
76
+
77
+ def handle_pause_resume(*, name: str, action: str, arn: str | None = None, region: str | None = None) -> Ok | Err:
78
+ """Ok({"configId", "executionStatus"})."""
79
+ resolution = _resolve_config(name, arn, region)
80
+ if not resolution["success"]:
81
+ return Err(ResourceNotFoundError(resolution["error"]))
82
+ try:
83
+ result = control.update_online_eval_execution_status(
84
+ region=resolution["region"],
85
+ online_evaluation_config_id=resolution["configId"],
86
+ execution_status="DISABLED" if action == "pause" else "ENABLED",
87
+ )
88
+ return Ok({"configId": result["configId"], "executionStatus": result["executionStatus"]})
89
+ except Exception as exc: # noqa: BLE001
90
+ return Err(to_error(exc))