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,477 @@
1
+ """Knowledge base add/remove (port of src/cli/primitives/KnowledgeBasePrimitive.ts).
2
+
3
+ `agentcore add knowledge-base` creates the KB and its data sources. The repeatable ``--source`` flag
4
+ maps to entries in the KB's ``dataSources`` array; re-invoking ``add`` with an existing ``--name``
5
+ appends new data sources (idempotent append). Non-S3 connector configs (``--data-source-type`` +
6
+ ``--connector-config <file>``) are materialized under ``app/<kbName>/`` and referenced by
7
+ project-relative path. Binding a pre-existing KB is done via ``add gateway-target --type connector``.
8
+
9
+ The project spec is handled as its camelCase JSON form (as upstream's plain objects) and validated
10
+ on write by ``ConfigIO``.
11
+ """
12
+
13
+ from __future__ import annotations
14
+
15
+ import copy
16
+ import json
17
+ import os
18
+ import random
19
+ import re
20
+ import shutil
21
+ import string
22
+ import sys
23
+ from dataclasses import dataclass, field
24
+ from typing import Any
25
+
26
+ import typer
27
+ from pydantic import ValidationError as PydanticValidationError
28
+
29
+ from agentcore.cli import interactive
30
+ from agentcore.cli.errors import get_error_message
31
+ from agentcore.cli.run_command import run_cli_command
32
+ from agentcore.lib.constants import APP_DIR
33
+ from agentcore.lib.errors.types import ValidationError
34
+ from agentcore.lib.result import Err, Ok, serialize_result
35
+ from agentcore.lib.schemas.io.config_io import to_jsonable
36
+ from agentcore.lib.schemas.io.path_resolver import find_config_root
37
+ from agentcore.operations.knowledge_base.connector_config import (
38
+ flag_to_wire_type,
39
+ is_connector_config_type,
40
+ read_connector_config,
41
+ )
42
+ from agentcore.primitives.base import BasePrimitive, RemovableResource, RemovalPreview, SchemaChange
43
+ from agentcore.schema import CONNECTOR_ID, KnowledgeBase
44
+
45
+ # Cheap shape check for early errors at the CLI boundary; S3DataSource in the schema is canonical.
46
+ _S3_URI_PATTERN = re.compile(r"^s3://[^/]+(/.*)?$", re.DOTALL)
47
+
48
+
49
+ def _is_s3_uri(uri: str) -> bool:
50
+ return bool(_S3_URI_PATTERN.match(uri))
51
+
52
+
53
+ def _data_source_key(ds: dict[str, Any]) -> str:
54
+ """S3 sources are keyed by URI, connector sources by their config file path."""
55
+ return ds["uri"] if ds.get("type") == "S3" else ds["connectorConfigFile"]
56
+
57
+
58
+ def _posix_rel(path: str, start: str) -> str:
59
+ return os.path.relpath(path, start).replace("\\", "/")
60
+
61
+
62
+ def zod_error_message(exc: PydanticValidationError) -> str:
63
+ """Approximation of zod v4's ``ZodError.message`` (``JSON.stringify(issues, null, 2)``)."""
64
+ issues = [{"code": "custom", "path": list(e.get("loc") or ()), "message": e.get("msg", "")} for e in exc.errors()]
65
+ return json.dumps(issues, indent=2)
66
+
67
+
68
+ @dataclass
69
+ class AddKnowledgeBaseOptions:
70
+ name: str
71
+ description: str | None = None
72
+ source: list[str] = field(default_factory=list)
73
+ """Repeatable ``--source`` values (S3 URIs). Required for S3 data sources."""
74
+ connector_config: list[str] = field(default_factory=list)
75
+ """Repeatable ``--connector-config`` values. Required for non-S3 connectors."""
76
+ data_source_type: str | None = None
77
+ """``--data-source-type`` flag (s3 default, or web-crawler/confluence/...)."""
78
+ json: bool = False
79
+
80
+
81
+ @dataclass
82
+ class _PruneAction:
83
+ gateway_name: str
84
+ target_name: str
85
+ removed_target: bool
86
+
87
+
88
+ class KnowledgeBasePrimitive(BasePrimitive):
89
+ kind = "knowledge-base"
90
+ label = "Knowledge Base"
91
+
92
+ # --- add ----------------------------------------------------------------------------
93
+
94
+ def add(self, options: AddKnowledgeBaseOptions) -> Ok[dict[str, Any]] | Err[Exception]:
95
+ try:
96
+ return Ok(self._add(options))
97
+ except Exception as exc: # noqa: BLE001 - surfaced as a failed Result, as upstream
98
+ return Err(exc)
99
+
100
+ def _add(self, options: AddKnowledgeBaseOptions) -> dict[str, Any]:
101
+ sources = list(options.source or [])
102
+ connector_configs = list(options.connector_config or [])
103
+ wire_type = flag_to_wire_type(options.data_source_type or "s3")
104
+ warnings: list[str] = []
105
+
106
+ # Phase 1: pure validation, no side effects. File copies are deferred so a later validation
107
+ # failure never leaves a stray file behind.
108
+ if is_connector_config_type(wire_type):
109
+ if sources:
110
+ raise ValueError(f"--source is only valid for S3. For {wire_type}, use --connector-config.")
111
+ if not connector_configs:
112
+ raise ValueError(f"--connector-config is required for --data-source-type {options.data_source_type}.")
113
+ seen_sources: set[str] = set()
114
+ basename_to_source: dict[str, str] = {}
115
+ for cfg_path in connector_configs:
116
+ warnings.extend(read_connector_config(cfg_path, wire_type).warnings)
117
+ resolved_src = os.path.abspath(cfg_path)
118
+ if resolved_src in seen_sources:
119
+ continue # exact duplicate: the batch-dedup loop below reports it
120
+ seen_sources.add(resolved_src)
121
+ base = os.path.basename(resolved_src)
122
+ prior = basename_to_source.get(base)
123
+ if prior:
124
+ raise ValueError(
125
+ f"Connector config files '{prior}' and '{cfg_path}' would both be stored as "
126
+ f"'app/{options.name}/{base}'. Rename one so their filenames differ."
127
+ )
128
+ basename_to_source[base] = cfg_path
129
+
130
+ def build_data_sources() -> list[dict[str, Any]]:
131
+ return [
132
+ {"type": wire_type, "connectorConfigFile": self._materialize_connector_config(options.name, p)}
133
+ for p in connector_configs
134
+ ]
135
+
136
+ else:
137
+ if connector_configs:
138
+ raise ValueError("--connector-config is only valid for non-S3 data source types.")
139
+ if not sources:
140
+ raise ValueError("At least one --source is required for S3 data sources.")
141
+ for uri in sources:
142
+ if not _is_s3_uri(uri):
143
+ raise ValueError(f"Invalid S3 URI: {uri}. Expected s3://bucket[/prefix].")
144
+
145
+ def build_data_sources() -> list[dict[str, Any]]:
146
+ return [{"type": "S3", "uri": uri} for uri in sources]
147
+
148
+ # Reject duplicates inside this batch up front with an actionable message.
149
+ if is_connector_config_type(wire_type):
150
+ project_root = os.path.dirname(self.config_io.get_config_root())
151
+ batch_keys = [_posix_rel(os.path.abspath(p), project_root) for p in connector_configs]
152
+ else:
153
+ batch_keys = sources
154
+ seen_in_batch: set[str] = set()
155
+ for key in batch_keys:
156
+ if key in seen_in_batch:
157
+ raise ValueError(f"Duplicate data source in this invocation: {key}")
158
+ seen_in_batch.add(key)
159
+
160
+ project = to_jsonable(self.read_project_spec())
161
+
162
+ # All validation passed: materialize connector configs and build the data sources.
163
+ new_data_sources = build_data_sources()
164
+
165
+ existing = next((kb for kb in project.get("knowledgeBases", []) if kb["name"] == options.name), None)
166
+ if existing is not None:
167
+ return self._append_to_existing(existing, project, new_data_sources, options, warnings)
168
+
169
+ kb_input: dict[str, Any] = {"name": options.name}
170
+ if options.description:
171
+ kb_input["description"] = options.description
172
+ kb_input["dataSources"] = new_data_sources
173
+ try:
174
+ kb = KnowledgeBase.model_validate(kb_input)
175
+ except PydanticValidationError as exc:
176
+ raise ValueError(zod_error_message(exc)) from None
177
+
178
+ project.setdefault("knowledgeBases", []).append(to_jsonable(kb))
179
+ self.write_project_spec(project)
180
+
181
+ if not options.json:
182
+ for w in warnings:
183
+ print(w, file=sys.stderr)
184
+
185
+ return {
186
+ "knowledgeBaseName": kb.name,
187
+ "appended": False,
188
+ "newDataSources": [_data_source_key(ds) for ds in new_data_sources],
189
+ }
190
+
191
+ def _append_to_existing(
192
+ self,
193
+ existing: dict[str, Any],
194
+ project: dict[str, Any],
195
+ new_data_sources: list[dict[str, Any]],
196
+ options: AddKnowledgeBaseOptions,
197
+ warnings: list[str],
198
+ ) -> dict[str, Any]:
199
+ # '' and None both mean "no description provided".
200
+ desc_changed = options.description not in (None, "") and options.description != existing.get("description")
201
+ if desc_changed:
202
+ raise ValueError(
203
+ f'Knowledge base "{options.name}" already exists. Update operations are not supported in Wave 1; '
204
+ "edit agentcore.json directly to change the description."
205
+ )
206
+ existing_keys = {_data_source_key(ds) for ds in existing.get("dataSources", [])}
207
+ for ds in new_data_sources:
208
+ key = _data_source_key(ds)
209
+ if key in existing_keys:
210
+ raise ValueError(f'Data source "{key}" already exists on knowledge-base "{options.name}".')
211
+
212
+ existing.setdefault("dataSources", []).extend(new_data_sources)
213
+ self.write_project_spec(project)
214
+
215
+ if not options.json:
216
+ for w in warnings:
217
+ print(w, file=sys.stderr)
218
+
219
+ return {
220
+ "knowledgeBaseName": existing["name"],
221
+ "appended": True,
222
+ "newDataSources": [_data_source_key(ds) for ds in new_data_sources],
223
+ }
224
+
225
+ def _materialize_connector_config(self, kb_name: str, cfg_path: str) -> str:
226
+ """Ensure the config lives under ``app/<kbName>/``; return its project-relative path."""
227
+ project_root = os.path.dirname(self.config_io.get_config_root())
228
+ src = os.path.abspath(cfg_path)
229
+ if not os.path.exists(src):
230
+ raise ValueError(f"Connector config file not found: {cfg_path}")
231
+ dest_dir = os.path.join(project_root, APP_DIR, kb_name)
232
+ dest = os.path.join(dest_dir, os.path.basename(src))
233
+
234
+ if os.path.abspath(src) == os.path.abspath(dest):
235
+ return _posix_rel(dest, project_root)
236
+ # Never silently overwrite a different file already at the destination.
237
+ if os.path.exists(dest):
238
+ raise ValueError(
239
+ f"Connector config '{cfg_path}' would overwrite the existing file at "
240
+ f"'{_posix_rel(dest, project_root)}'. Rename it so its filename differs."
241
+ )
242
+ os.makedirs(dest_dir, exist_ok=True)
243
+ shutil.copyfile(src, dest)
244
+ print(f"Copied connector config to {_posix_rel(dest, project_root)}", file=sys.stderr)
245
+ return _posix_rel(dest, project_root)
246
+
247
+ # --- remove -------------------------------------------------------------------------
248
+
249
+ def remove(self, name: str) -> Ok[None] | Err[Exception]:
250
+ try:
251
+ project = to_jsonable(self.read_project_spec())
252
+ kbs = project.get("knowledgeBases", [])
253
+ idx = next((i for i, kb in enumerate(kbs) if kb["name"] == name), -1)
254
+ if idx == -1:
255
+ raise ValueError(f'Knowledge base "{name}" not found.')
256
+ kb = kbs.pop(idx)
257
+ if kb.get("gateway"):
258
+ self._remove_connector_target(project, kb["gateway"], kb["name"])
259
+ # Without this the spec would be unwriteable: the cross-spec validator rejects
260
+ # AgenticRetrieveStream entries that reference a KB name no longer in knowledgeBases[].
261
+ self._prune_agentic_retrieve_references(project, name)
262
+ self.write_project_spec(project)
263
+ return Ok(None)
264
+ except Exception as exc: # noqa: BLE001
265
+ return Err(exc)
266
+
267
+ def preview_remove(self, name: str) -> RemovalPreview:
268
+ project = to_jsonable(self.read_project_spec())
269
+ kb = next((k for k in project.get("knowledgeBases", []) if k["name"] == name), None)
270
+ if kb is None:
271
+ raise ValueError(f'Knowledge base "{name}" not found.')
272
+ summary = [
273
+ f"Removing knowledge base: {name}",
274
+ f" Data sources ({len(kb['dataSources'])}):",
275
+ *[f" - {_data_source_key(ds)}" for ds in kb["dataSources"]],
276
+ ]
277
+ if kb.get("gateway"):
278
+ summary.append(f" Gateway target: '{name}' on '{kb['gateway']}' will be removed")
279
+
280
+ after = copy.deepcopy(project)
281
+ after["knowledgeBases"] = [k for k in after["knowledgeBases"] if k["name"] != name]
282
+ if kb.get("gateway"):
283
+ gw = next((g for g in after.get("agentCoreGateways", []) if g["name"] == kb["gateway"]), None)
284
+ if gw is not None:
285
+ gw["targets"] = [t for t in gw.get("targets", []) if t["name"] != name]
286
+ for action in self._prune_agentic_retrieve_references(after, name):
287
+ if action.removed_target:
288
+ summary.append(
289
+ f" Gateway \"{action.gateway_name}\" agentic-retrieve target '{action.target_name}' will be "
290
+ "removed (was the last KB)"
291
+ )
292
+ else:
293
+ summary.append(
294
+ f" Gateway \"{action.gateway_name}\" agentic-retrieve target '{action.target_name}' will lose "
295
+ f"KB '{name}'"
296
+ )
297
+
298
+ return RemovalPreview(
299
+ summary=summary,
300
+ directories_to_delete=[],
301
+ schema_changes=[SchemaChange(file="agentcore/agentcore.json", before=project, after=after)],
302
+ )
303
+
304
+ def _prune_agentic_retrieve_references(self, project: dict[str, Any], kb_reference: str) -> list[_PruneAction]:
305
+ """Drop ``kb_reference`` from every bedrock-knowledge-bases connector target's configurations.
306
+
307
+ Removes the target entirely once no configurations remain.
308
+ """
309
+ actions: list[_PruneAction] = []
310
+ for gw in project.get("agentCoreGateways", []):
311
+ targets = gw.get("targets", [])
312
+ for t_idx in range(len(targets) - 1, -1, -1):
313
+ target = targets[t_idx]
314
+ if (
315
+ target.get("targetType") != "connector"
316
+ or target.get("connectorId") != CONNECTOR_ID["BEDROCK_KNOWLEDGE_BASES"]
317
+ ):
318
+ continue
319
+ configs = target.get("configurations")
320
+ if configs is None:
321
+ configs = []
322
+
323
+ agentic_idx = next((i for i, c in enumerate(configs) if c.get("name") == "AgenticRetrieveStream"), -1)
324
+ if agentic_idx != -1:
325
+ agentic_cfg = configs[agentic_idx]
326
+ pv = agentic_cfg.get("parameterValues")
327
+ retrievers = (pv or {}).get("retrievers") or []
328
+ ids = [r["configuration"]["knowledgeBase"]["knowledgeBaseId"] for r in retrievers]
329
+ if kb_reference in ids:
330
+ remaining = [i for i in ids if i != kb_reference]
331
+ if not remaining:
332
+ configs.pop(agentic_idx)
333
+ else:
334
+ agentic_cfg["parameterValues"]["retrievers"] = [
335
+ {"configuration": {"knowledgeBase": {"knowledgeBaseId": i}}} for i in remaining
336
+ ]
337
+
338
+ retrieve_idx = next(
339
+ (
340
+ i
341
+ for i, c in enumerate(configs)
342
+ if c.get("name") == "Retrieve"
343
+ and (c.get("parameterValues") or {}).get("knowledgeBaseId") == kb_reference
344
+ ),
345
+ -1,
346
+ )
347
+ if retrieve_idx != -1:
348
+ configs.pop(retrieve_idx)
349
+
350
+ if not configs:
351
+ targets.pop(t_idx)
352
+ actions.append(_PruneAction(gw["name"], target["name"], True))
353
+ elif agentic_idx != -1 or retrieve_idx != -1:
354
+ actions.append(_PruneAction(gw["name"], target["name"], False))
355
+ return actions
356
+
357
+ @staticmethod
358
+ def _remove_connector_target(project: dict[str, Any], gateway_name: str, target_name: str) -> None:
359
+ gateway = next((g for g in project.get("agentCoreGateways", []) if g["name"] == gateway_name), None)
360
+ if gateway is not None:
361
+ gateway["targets"] = [t for t in gateway.get("targets", []) if t["name"] != target_name]
362
+
363
+ def get_removable(self) -> list[RemovableResource]:
364
+ try:
365
+ return [RemovableResource(kb.name) for kb in self.read_project_spec().knowledge_bases or []]
366
+ except Exception: # noqa: BLE001
367
+ return []
368
+
369
+ # --- CLI ----------------------------------------------------------------------------
370
+
371
+ def _random_name(self) -> str:
372
+ existing = {kb.name for kb in self.read_project_spec().knowledge_bases or []}
373
+ alphabet = string.digits + string.ascii_lowercase
374
+ while True:
375
+ candidate = "kb-quick-start-" + "".join(random.choice(alphabet) for _ in range(5))
376
+ if candidate not in existing:
377
+ return candidate
378
+
379
+ def register_commands(self, add_app: typer.Typer, remove_app: typer.Typer) -> None:
380
+ @add_app.command(
381
+ self.kind, help="Add a knowledge base (FMKB) to the project, optionally wiring it to a gateway."
382
+ )
383
+ def add_command(
384
+ name: str | None = typer.Option(None, "--name", help="Knowledge base name (default: kb-quick-start-xxxxx)"),
385
+ description: str | None = typer.Option(
386
+ None, "--description", help="Optional description (used for tool discovery)"
387
+ ),
388
+ source: list[str] = typer.Option(
389
+ [],
390
+ "--source",
391
+ help="S3 URI for a data source (s3://bucket[/prefix]). Repeatable for multiple data sources.",
392
+ ),
393
+ data_source_type: str = typer.Option(
394
+ "s3",
395
+ "--data-source-type",
396
+ help="Data source type: s3 (default), web-crawler, confluence, sharepoint, onedrive, google-drive",
397
+ ),
398
+ connector_config: list[str] = typer.Option(
399
+ [],
400
+ "--connector-config",
401
+ help="Path to a JSON connector-config file (required for non-S3 types). Repeatable.",
402
+ ),
403
+ as_json: bool = typer.Option(False, "--json", help="Output as JSON [non-interactive]"),
404
+ ) -> None:
405
+ if not find_config_root():
406
+ typer.echo("No agentcore project found. Run `agentcore create` first.", err=True)
407
+ raise typer.Exit(1)
408
+
409
+ # --data-source-type always has a default, so only user-supplied flags count.
410
+ if not (name or description or source or connector_config or as_json):
411
+ try:
412
+ interactive.require_tty()
413
+ self.add_interactive()
414
+ except typer.Exit:
415
+ raise
416
+ except Exception as exc: # noqa: BLE001
417
+ typer.echo(get_error_message(exc), err=True)
418
+ raise typer.Exit(1) from None
419
+ raise typer.Exit(0)
420
+
421
+ def action() -> None:
422
+ result = self.add(
423
+ AddKnowledgeBaseOptions(
424
+ name=name or self._random_name(),
425
+ description=description,
426
+ source=list(source or []),
427
+ data_source_type=data_source_type,
428
+ connector_config=list(connector_config or []),
429
+ json=as_json,
430
+ )
431
+ )
432
+ if not result.success:
433
+ raise result.error
434
+ value = result.value
435
+ if as_json:
436
+ typer.echo(json.dumps(serialize_result(result), separators=(",", ":")))
437
+ elif value["appended"]:
438
+ for uri in value["newDataSources"]:
439
+ typer.echo(f"Added data source '{uri}' to knowledge-base '{value['knowledgeBaseName']}'")
440
+ else:
441
+ typer.echo(f"Added knowledge base '{value['knowledgeBaseName']}'")
442
+ for uri in value["newDataSources"]:
443
+ typer.echo(f" with data source '{uri}'")
444
+
445
+ run_cli_command(as_json, action)
446
+
447
+ @remove_app.command(self.kind, help="Remove a knowledge base from the project")
448
+ def remove_command(
449
+ name: str | None = typer.Option(None, "--name", help="Knowledge base name"),
450
+ as_json: bool = typer.Option(False, "--json", help="Output as JSON [non-interactive]"),
451
+ ) -> None:
452
+ if not find_config_root():
453
+ typer.echo("No agentcore project found. Run `agentcore create` first.", err=True)
454
+ raise typer.Exit(1)
455
+
456
+ def action() -> None:
457
+ if not name:
458
+ raise ValidationError("A --name is required for `agentcore remove knowledge-base`.")
459
+ result = self.remove(name)
460
+ if not result.success:
461
+ raise result.error
462
+ if as_json:
463
+ typer.echo(json.dumps(serialize_result(result), separators=(",", ":")))
464
+ else:
465
+ typer.echo(f"Removed knowledge base '{name}'")
466
+
467
+ run_cli_command(as_json, action)
468
+
469
+ # --- interactive (port of tui/screens/knowledge-base AddKnowledgeBaseScreen + Flow) ----------
470
+
471
+ def add_interactive(self) -> None:
472
+ from agentcore.primitives._knowledge_base_wizard import run_add_knowledge_base_wizard
473
+
474
+ run_add_knowledge_base_wizard(self)
475
+
476
+
477
+ PRIMITIVE = KnowledgeBasePrimitive()