@aws/agentcore 1.0.0-preview.8 → 1.0.0-rc.1

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 (389) hide show
  1. package/README.md +978 -145
  2. package/dist/assets/agent-inspector/index.css.asset +1 -0
  3. package/dist/assets/agent-inspector/index.js.asset +289 -0
  4. package/dist/assets/cdk/README.md +3 -0
  5. package/dist/assets/cdk/bin/cdk.ts +109 -59
  6. package/dist/assets/cdk/lib/cdk-stack.ts +30 -19
  7. package/dist/assets/cdk/package.json +9 -9
  8. package/dist/assets/cdk/test/cdk.test.ts +94 -2
  9. package/dist/assets/evaluators/autoevals-lambda/README.md +23 -0
  10. package/dist/assets/evaluators/autoevals-lambda/execution-role-policy.json +15 -0
  11. package/dist/assets/evaluators/autoevals-lambda/lambda_function.py +37 -0
  12. package/dist/assets/evaluators/autoevals-lambda/pyproject.toml +23 -0
  13. package/dist/assets/evaluators/deepeval-lambda/README.md +23 -0
  14. package/dist/assets/evaluators/deepeval-lambda/execution-role-policy.json +15 -0
  15. package/dist/assets/evaluators/deepeval-lambda/lambda_function.py +29 -0
  16. package/dist/assets/evaluators/deepeval-lambda/pyproject.toml +22 -0
  17. package/dist/assets/evaluators/python-lambda/README.md +28 -0
  18. package/dist/assets/evaluators/python-lambda/pyproject.toml +1 -1
  19. package/dist/assets/templates/a2a-python-strands/README.md +31 -0
  20. package/dist/assets/templates/a2a-python-strands/main.py +100 -0
  21. package/dist/assets/templates/a2a-python-strands/memory/session.py +35 -0
  22. package/dist/assets/templates/a2a-python-strands/model/load.py +6 -0
  23. package/dist/assets/templates/a2a-python-strands/pyproject.toml +20 -0
  24. package/dist/assets/templates/agent-python-langchain/README.md +55 -0
  25. package/dist/assets/{python/a2a/googleadk/base → templates/agent-python-langchain}/gitignore.template +1 -1
  26. package/dist/assets/templates/agent-python-langchain/main.py +54 -0
  27. package/dist/assets/templates/agent-python-langchain/model/load.py +9 -0
  28. package/dist/assets/templates/agent-python-langchain/pyproject.toml +21 -0
  29. package/dist/assets/templates/agent-python-minimal/README.md +31 -0
  30. package/dist/assets/templates/agent-python-minimal/main.py +13 -0
  31. package/dist/assets/templates/agent-python-minimal/pyproject.toml +18 -0
  32. package/dist/assets/{container/python/Dockerfile → templates/agent-python-strands/Dockerfile.template} +3 -1
  33. package/dist/assets/templates/agent-python-strands/README.md +46 -0
  34. package/dist/assets/{python/a2a/langchain_langgraph/base → templates/agent-python-strands}/gitignore.template +1 -1
  35. package/dist/assets/templates/agent-python-strands/main.py +106 -0
  36. package/dist/assets/templates/agent-python-strands/memory/__init__.py +0 -0
  37. package/dist/assets/templates/agent-python-strands/memory/session.py +35 -0
  38. package/dist/assets/{python/http/strands/base → templates/agent-python-strands}/model/load.py +46 -0
  39. package/dist/assets/templates/agent-python-strands/pyproject.toml +24 -0
  40. package/dist/assets/templates/agent-typescript-strands/README.md +29 -0
  41. package/dist/assets/templates/agent-typescript-strands/gitignore.template +22 -0
  42. package/dist/assets/templates/agent-typescript-strands/main.ts +86 -0
  43. package/dist/assets/templates/agent-typescript-strands/mcp_client/client.ts +11 -0
  44. package/dist/assets/templates/agent-typescript-strands/memory/memory.ts +44 -0
  45. package/dist/assets/templates/agent-typescript-strands/model/load.ts +5 -0
  46. package/dist/assets/templates/agent-typescript-strands/package.json.template +29 -0
  47. package/dist/assets/templates/agent-typescript-strands/tsconfig.json +19 -0
  48. package/dist/assets/templates/agent-typescript-vercel/README.md +22 -0
  49. package/dist/assets/templates/agent-typescript-vercel/gitignore.template +22 -0
  50. package/dist/assets/templates/agent-typescript-vercel/main.ts +35 -0
  51. package/dist/assets/templates/agent-typescript-vercel/package.json.template +24 -0
  52. package/dist/assets/templates/agent-typescript-vercel/tsconfig.json +19 -0
  53. package/dist/assets/templates/agui-python-strands/README.md +39 -0
  54. package/dist/assets/{python/a2a/strands/base → templates/agui-python-strands}/gitignore.template +1 -1
  55. package/dist/assets/{python/agui/strands/base → templates/agui-python-strands}/main.py +11 -14
  56. package/dist/assets/templates/agui-python-strands/memory/__init__.py +0 -0
  57. package/dist/assets/templates/agui-python-strands/memory/session.py +35 -0
  58. package/dist/assets/templates/agui-python-strands/model/load.py +6 -0
  59. package/dist/assets/templates/agui-python-strands/pyproject.toml +22 -0
  60. package/dist/assets/{python/http/strands/base → templates/export-harness-python}/README.md +15 -8
  61. package/dist/assets/templates/export-harness-python/gitignore.template +41 -0
  62. package/dist/assets/templates/export-harness-python/main.py +584 -0
  63. package/dist/assets/templates/export-harness-python/mcp_client/client.py +63 -0
  64. package/dist/assets/templates/export-harness-python/memory/__init__.py +0 -0
  65. package/dist/assets/templates/export-harness-python/memory/session.py +47 -0
  66. package/dist/assets/templates/export-harness-python/model/load.py +249 -0
  67. package/dist/assets/templates/export-harness-python/model/mantle_compat.py +21 -0
  68. package/dist/assets/templates/export-harness-python/pyproject.toml +22 -0
  69. package/dist/assets/templates/export-harness-python/skills/fetcher.py +279 -0
  70. package/dist/assets/templates/mcp-python-fastmcp/README.md +32 -0
  71. package/dist/assets/templates/mcp-python-fastmcp/gitignore.template +41 -0
  72. package/dist/assets/templates/mcp-python-fastmcp/main.py +83 -0
  73. package/dist/assets/{python/mcp/standalone/base → templates/mcp-python-fastmcp}/pyproject.toml +3 -2
  74. package/dist/assets/templates/shared/env.local.template +11 -0
  75. package/dist/assets/templates/shared/gitignore.template +19 -0
  76. package/dist/index.js +4 -27
  77. package/dist/main.js +1190 -0
  78. package/package.json +75 -149
  79. package/LICENSE +0 -175
  80. package/dist/agent-inspector/index.css +0 -1
  81. package/dist/agent-inspector/index.js +0 -279
  82. package/dist/assets/README.md +0 -104
  83. package/dist/assets/__tests__/__snapshots__/assets.snapshot.test.ts.snap +0 -5673
  84. package/dist/assets/__tests__/__snapshots__/dockerfile-render.test.ts.snap +0 -77
  85. package/dist/assets/__tests__/assets.snapshot.test.ts +0 -125
  86. package/dist/assets/__tests__/dockerfile-render.test.ts +0 -24
  87. package/dist/assets/agents/AGENTS.md +0 -141
  88. package/dist/assets/harness/invoke.py.template +0 -74
  89. package/dist/assets/mcp/python/README.md +0 -27
  90. package/dist/assets/mcp/python/pyproject.toml +0 -22
  91. package/dist/assets/mcp/python/server.py +0 -117
  92. package/dist/assets/mcp/python-lambda/README.md +0 -22
  93. package/dist/assets/mcp/python-lambda/handler.py +0 -144
  94. package/dist/assets/mcp/python-lambda/pyproject.toml +0 -15
  95. package/dist/assets/python/a2a/googleadk/base/README.md +0 -22
  96. package/dist/assets/python/a2a/googleadk/base/main.py +0 -110
  97. package/dist/assets/python/a2a/googleadk/base/model/load.py +0 -41
  98. package/dist/assets/python/a2a/googleadk/base/pyproject.toml +0 -20
  99. package/dist/assets/python/a2a/langchain_langgraph/base/README.md +0 -22
  100. package/dist/assets/python/a2a/langchain_langgraph/base/main.py +0 -130
  101. package/dist/assets/python/a2a/langchain_langgraph/base/model/load.py +0 -123
  102. package/dist/assets/python/a2a/langchain_langgraph/base/pyproject.toml +0 -25
  103. package/dist/assets/python/a2a/strands/base/README.md +0 -22
  104. package/dist/assets/python/a2a/strands/base/main.py +0 -107
  105. package/dist/assets/python/a2a/strands/base/model/load.py +0 -123
  106. package/dist/assets/python/a2a/strands/base/pyproject.toml +0 -23
  107. package/dist/assets/python/a2a/strands/capabilities/memory/session.py +0 -43
  108. package/dist/assets/python/agui/googleadk/base/README.md +0 -30
  109. package/dist/assets/python/agui/googleadk/base/gitignore.template +0 -41
  110. package/dist/assets/python/agui/googleadk/base/main.py +0 -31
  111. package/dist/assets/python/agui/googleadk/base/model/load.py +0 -41
  112. package/dist/assets/python/agui/googleadk/base/pyproject.toml +0 -24
  113. package/dist/assets/python/agui/langchain_langgraph/base/README.md +0 -22
  114. package/dist/assets/python/agui/langchain_langgraph/base/gitignore.template +0 -41
  115. package/dist/assets/python/agui/langchain_langgraph/base/main.py +0 -74
  116. package/dist/assets/python/agui/langchain_langgraph/base/model/load.py +0 -123
  117. package/dist/assets/python/agui/langchain_langgraph/base/pyproject.toml +0 -30
  118. package/dist/assets/python/agui/strands/base/README.md +0 -22
  119. package/dist/assets/python/agui/strands/base/gitignore.template +0 -41
  120. package/dist/assets/python/agui/strands/base/model/__init__.py +0 -1
  121. package/dist/assets/python/agui/strands/base/model/load.py +0 -123
  122. package/dist/assets/python/agui/strands/base/pyproject.toml +0 -27
  123. package/dist/assets/python/agui/strands/capabilities/memory/__init__.py +0 -1
  124. package/dist/assets/python/agui/strands/capabilities/memory/session.py +0 -43
  125. package/dist/assets/python/http/autogen/base/README.md +0 -39
  126. package/dist/assets/python/http/autogen/base/gitignore.template +0 -41
  127. package/dist/assets/python/http/autogen/base/main.py +0 -112
  128. package/dist/assets/python/http/autogen/base/mcp_client/__init__.py +0 -1
  129. package/dist/assets/python/http/autogen/base/mcp_client/client.py +0 -28
  130. package/dist/assets/python/http/autogen/base/model/__init__.py +0 -1
  131. package/dist/assets/python/http/autogen/base/model/load.py +0 -136
  132. package/dist/assets/python/http/autogen/base/pyproject.toml +0 -34
  133. package/dist/assets/python/http/googleadk/base/README.md +0 -39
  134. package/dist/assets/python/http/googleadk/base/gitignore.template +0 -41
  135. package/dist/assets/python/http/googleadk/base/main.py +0 -160
  136. package/dist/assets/python/http/googleadk/base/mcp_client/__init__.py +0 -1
  137. package/dist/assets/python/http/googleadk/base/mcp_client/client.py +0 -75
  138. package/dist/assets/python/http/googleadk/base/model/__init__.py +0 -1
  139. package/dist/assets/python/http/googleadk/base/model/load.py +0 -41
  140. package/dist/assets/python/http/googleadk/base/pyproject.toml +0 -22
  141. package/dist/assets/python/http/langchain_langgraph/base/README.md +0 -39
  142. package/dist/assets/python/http/langchain_langgraph/base/gitignore.template +0 -41
  143. package/dist/assets/python/http/langchain_langgraph/base/main.py +0 -176
  144. package/dist/assets/python/http/langchain_langgraph/base/mcp_client/__init__.py +0 -1
  145. package/dist/assets/python/http/langchain_langgraph/base/mcp_client/client.py +0 -77
  146. package/dist/assets/python/http/langchain_langgraph/base/model/__init__.py +0 -1
  147. package/dist/assets/python/http/langchain_langgraph/base/model/load.py +0 -123
  148. package/dist/assets/python/http/langchain_langgraph/base/pyproject.toml +0 -37
  149. package/dist/assets/python/http/openaiagents/base/README.md +0 -39
  150. package/dist/assets/python/http/openaiagents/base/gitignore.template +0 -41
  151. package/dist/assets/python/http/openaiagents/base/main.py +0 -169
  152. package/dist/assets/python/http/openaiagents/base/mcp_client/__init__.py +0 -1
  153. package/dist/assets/python/http/openaiagents/base/mcp_client/client.py +0 -74
  154. package/dist/assets/python/http/openaiagents/base/model/__init__.py +0 -1
  155. package/dist/assets/python/http/openaiagents/base/model/load.py +0 -37
  156. package/dist/assets/python/http/openaiagents/base/pyproject.toml +0 -21
  157. package/dist/assets/python/http/strands/base/main.py +0 -217
  158. package/dist/assets/python/http/strands/base/mcp_client/__init__.py +0 -1
  159. package/dist/assets/python/http/strands/base/mcp_client/client.py +0 -73
  160. package/dist/assets/python/http/strands/base/model/__init__.py +0 -1
  161. package/dist/assets/python/http/strands/base/pyproject.toml +0 -25
  162. package/dist/assets/python/http/strands/capabilities/memory/__init__.py +0 -1
  163. package/dist/assets/python/http/strands/capabilities/memory/session.py +0 -44
  164. package/dist/assets/python/mcp/standalone/base/README.md +0 -36
  165. package/dist/assets/python/mcp/standalone/base/gitignore.template +0 -41
  166. package/dist/assets/python/mcp/standalone/base/main.py +0 -25
  167. package/dist/cli/index.mjs +0 -1718
  168. package/dist/index.d.ts +0 -9
  169. package/dist/index.d.ts.map +0 -1
  170. package/dist/index.js.map +0 -1
  171. package/dist/lib/constants.d.ts +0 -37
  172. package/dist/lib/constants.d.ts.map +0 -1
  173. package/dist/lib/constants.js +0 -69
  174. package/dist/lib/constants.js.map +0 -1
  175. package/dist/lib/errors/config.d.ts +0 -49
  176. package/dist/lib/errors/config.d.ts.map +0 -1
  177. package/dist/lib/errors/config.js +0 -170
  178. package/dist/lib/errors/config.js.map +0 -1
  179. package/dist/lib/errors/index.d.ts +0 -2
  180. package/dist/lib/errors/index.d.ts.map +0 -1
  181. package/dist/lib/errors/index.js +0 -18
  182. package/dist/lib/errors/index.js.map +0 -1
  183. package/dist/lib/index.d.ts +0 -7
  184. package/dist/lib/index.d.ts.map +0 -1
  185. package/dist/lib/index.js +0 -44
  186. package/dist/lib/index.js.map +0 -1
  187. package/dist/lib/packaging/build-args.d.ts +0 -6
  188. package/dist/lib/packaging/build-args.d.ts.map +0 -1
  189. package/dist/lib/packaging/build-args.js +0 -18
  190. package/dist/lib/packaging/build-args.js.map +0 -1
  191. package/dist/lib/packaging/container.d.ts +0 -10
  192. package/dist/lib/packaging/container.d.ts.map +0 -1
  193. package/dist/lib/packaging/container.js +0 -78
  194. package/dist/lib/packaging/container.js.map +0 -1
  195. package/dist/lib/packaging/errors.d.ts +0 -16
  196. package/dist/lib/packaging/errors.d.ts.map +0 -1
  197. package/dist/lib/packaging/errors.js +0 -36
  198. package/dist/lib/packaging/errors.js.map +0 -1
  199. package/dist/lib/packaging/helpers.d.ts +0 -54
  200. package/dist/lib/packaging/helpers.d.ts.map +0 -1
  201. package/dist/lib/packaging/helpers.js +0 -463
  202. package/dist/lib/packaging/helpers.js.map +0 -1
  203. package/dist/lib/packaging/index.d.ts +0 -40
  204. package/dist/lib/packaging/index.d.ts.map +0 -1
  205. package/dist/lib/packaging/index.js +0 -98
  206. package/dist/lib/packaging/index.js.map +0 -1
  207. package/dist/lib/packaging/node.d.ts +0 -22
  208. package/dist/lib/packaging/node.d.ts.map +0 -1
  209. package/dist/lib/packaging/node.js +0 -109
  210. package/dist/lib/packaging/node.js.map +0 -1
  211. package/dist/lib/packaging/python.d.ts +0 -23
  212. package/dist/lib/packaging/python.d.ts.map +0 -1
  213. package/dist/lib/packaging/python.js +0 -165
  214. package/dist/lib/packaging/python.js.map +0 -1
  215. package/dist/lib/packaging/types/index.d.ts +0 -2
  216. package/dist/lib/packaging/types/index.d.ts.map +0 -1
  217. package/dist/lib/packaging/types/index.js +0 -3
  218. package/dist/lib/packaging/types/index.js.map +0 -1
  219. package/dist/lib/packaging/types/packaging.d.ts +0 -57
  220. package/dist/lib/packaging/types/packaging.d.ts.map +0 -1
  221. package/dist/lib/packaging/types/packaging.js +0 -3
  222. package/dist/lib/packaging/types/packaging.js.map +0 -1
  223. package/dist/lib/packaging/uv.d.ts +0 -7
  224. package/dist/lib/packaging/uv.d.ts.map +0 -1
  225. package/dist/lib/packaging/uv.js +0 -40
  226. package/dist/lib/packaging/uv.js.map +0 -1
  227. package/dist/lib/schemas/io/config-io.d.ts +0 -119
  228. package/dist/lib/schemas/io/config-io.d.ts.map +0 -1
  229. package/dist/lib/schemas/io/config-io.js +0 -323
  230. package/dist/lib/schemas/io/config-io.js.map +0 -1
  231. package/dist/lib/schemas/io/global-config.d.ts +0 -33
  232. package/dist/lib/schemas/io/global-config.d.ts.map +0 -1
  233. package/dist/lib/schemas/io/global-config.js +0 -89
  234. package/dist/lib/schemas/io/global-config.js.map +0 -1
  235. package/dist/lib/schemas/io/index.d.ts +0 -3
  236. package/dist/lib/schemas/io/index.d.ts.map +0 -1
  237. package/dist/lib/schemas/io/index.js +0 -18
  238. package/dist/lib/schemas/io/index.js.map +0 -1
  239. package/dist/lib/schemas/io/path-resolver.d.ts +0 -119
  240. package/dist/lib/schemas/io/path-resolver.d.ts.map +0 -1
  241. package/dist/lib/schemas/io/path-resolver.js +0 -207
  242. package/dist/lib/schemas/io/path-resolver.js.map +0 -1
  243. package/dist/lib/utils/aws-account.d.ts +0 -7
  244. package/dist/lib/utils/aws-account.d.ts.map +0 -1
  245. package/dist/lib/utils/aws-account.js +0 -24
  246. package/dist/lib/utils/aws-account.js.map +0 -1
  247. package/dist/lib/utils/credentials.d.ts +0 -86
  248. package/dist/lib/utils/credentials.d.ts.map +0 -1
  249. package/dist/lib/utils/credentials.js +0 -153
  250. package/dist/lib/utils/credentials.js.map +0 -1
  251. package/dist/lib/utils/env.d.ts +0 -22
  252. package/dist/lib/utils/env.d.ts.map +0 -1
  253. package/dist/lib/utils/env.js +0 -65
  254. package/dist/lib/utils/env.js.map +0 -1
  255. package/dist/lib/utils/index.d.ts +0 -9
  256. package/dist/lib/utils/index.d.ts.map +0 -1
  257. package/dist/lib/utils/index.js +0 -27
  258. package/dist/lib/utils/index.js.map +0 -1
  259. package/dist/lib/utils/json-rpc.d.ts +0 -3
  260. package/dist/lib/utils/json-rpc.d.ts.map +0 -1
  261. package/dist/lib/utils/json-rpc.js +0 -27
  262. package/dist/lib/utils/json-rpc.js.map +0 -1
  263. package/dist/lib/utils/platform.d.ts +0 -63
  264. package/dist/lib/utils/platform.d.ts.map +0 -1
  265. package/dist/lib/utils/platform.js +0 -88
  266. package/dist/lib/utils/platform.js.map +0 -1
  267. package/dist/lib/utils/subprocess.d.ts +0 -29
  268. package/dist/lib/utils/subprocess.d.ts.map +0 -1
  269. package/dist/lib/utils/subprocess.js +0 -116
  270. package/dist/lib/utils/subprocess.js.map +0 -1
  271. package/dist/lib/utils/time-parser.d.ts +0 -11
  272. package/dist/lib/utils/time-parser.d.ts.map +0 -1
  273. package/dist/lib/utils/time-parser.js +0 -47
  274. package/dist/lib/utils/time-parser.js.map +0 -1
  275. package/dist/lib/utils/zod.d.ts +0 -14
  276. package/dist/lib/utils/zod.d.ts.map +0 -1
  277. package/dist/lib/utils/zod.js +0 -32
  278. package/dist/lib/utils/zod.js.map +0 -1
  279. package/dist/schema/constants.d.ts +0 -119
  280. package/dist/schema/constants.d.ts.map +0 -1
  281. package/dist/schema/constants.js +0 -170
  282. package/dist/schema/constants.js.map +0 -1
  283. package/dist/schema/index.d.ts +0 -4
  284. package/dist/schema/index.d.ts.map +0 -1
  285. package/dist/schema/index.js +0 -21
  286. package/dist/schema/index.js.map +0 -1
  287. package/dist/schema/schemas/agent-env.d.ts +0 -186
  288. package/dist/schema/schemas/agent-env.d.ts.map +0 -1
  289. package/dist/schema/schemas/agent-env.js +0 -240
  290. package/dist/schema/schemas/agent-env.js.map +0 -1
  291. package/dist/schema/schemas/agentcore-project.d.ts +0 -838
  292. package/dist/schema/schemas/agentcore-project.d.ts.map +0 -1
  293. package/dist/schema/schemas/agentcore-project.js +0 -335
  294. package/dist/schema/schemas/agentcore-project.js.map +0 -1
  295. package/dist/schema/schemas/auth.d.ts +0 -140
  296. package/dist/schema/schemas/auth.d.ts.map +0 -1
  297. package/dist/schema/schemas/auth.js +0 -114
  298. package/dist/schema/schemas/auth.js.map +0 -1
  299. package/dist/schema/schemas/aws-targets.d.ts +0 -71
  300. package/dist/schema/schemas/aws-targets.d.ts.map +0 -1
  301. package/dist/schema/schemas/aws-targets.js +0 -57
  302. package/dist/schema/schemas/aws-targets.js.map +0 -1
  303. package/dist/schema/schemas/deployed-state.d.ts +0 -725
  304. package/dist/schema/schemas/deployed-state.d.ts.map +0 -1
  305. package/dist/schema/schemas/deployed-state.js +0 -218
  306. package/dist/schema/schemas/deployed-state.js.map +0 -1
  307. package/dist/schema/schemas/index.d.ts +0 -9
  308. package/dist/schema/schemas/index.d.ts.map +0 -1
  309. package/dist/schema/schemas/index.js +0 -26
  310. package/dist/schema/schemas/index.js.map +0 -1
  311. package/dist/schema/schemas/mcp-defs.d.ts +0 -52
  312. package/dist/schema/schemas/mcp-defs.d.ts.map +0 -1
  313. package/dist/schema/schemas/mcp-defs.js +0 -50
  314. package/dist/schema/schemas/mcp-defs.js.map +0 -1
  315. package/dist/schema/schemas/mcp.d.ts +0 -820
  316. package/dist/schema/schemas/mcp.d.ts.map +0 -1
  317. package/dist/schema/schemas/mcp.js +0 -564
  318. package/dist/schema/schemas/mcp.js.map +0 -1
  319. package/dist/schema/schemas/primitives/ab-test.d.ts +0 -141
  320. package/dist/schema/schemas/primitives/ab-test.d.ts.map +0 -1
  321. package/dist/schema/schemas/primitives/ab-test.js +0 -97
  322. package/dist/schema/schemas/primitives/ab-test.js.map +0 -1
  323. package/dist/schema/schemas/primitives/config-bundle.d.ts +0 -31
  324. package/dist/schema/schemas/primitives/config-bundle.d.ts.map +0 -1
  325. package/dist/schema/schemas/primitives/config-bundle.js +0 -38
  326. package/dist/schema/schemas/primitives/config-bundle.js.map +0 -1
  327. package/dist/schema/schemas/primitives/evaluator.d.ts +0 -102
  328. package/dist/schema/schemas/primitives/evaluator.d.ts.map +0 -1
  329. package/dist/schema/schemas/primitives/evaluator.js +0 -84
  330. package/dist/schema/schemas/primitives/evaluator.js.map +0 -1
  331. package/dist/schema/schemas/primitives/harness.d.ts +0 -363
  332. package/dist/schema/schemas/primitives/harness.d.ts.map +0 -1
  333. package/dist/schema/schemas/primitives/harness.js +0 -261
  334. package/dist/schema/schemas/primitives/harness.js.map +0 -1
  335. package/dist/schema/schemas/primitives/http-gateway.d.ts +0 -21
  336. package/dist/schema/schemas/primitives/http-gateway.d.ts.map +0 -1
  337. package/dist/schema/schemas/primitives/http-gateway.js +0 -34
  338. package/dist/schema/schemas/primitives/http-gateway.js.map +0 -1
  339. package/dist/schema/schemas/primitives/index.d.ts +0 -15
  340. package/dist/schema/schemas/primitives/index.d.ts.map +0 -1
  341. package/dist/schema/schemas/primitives/index.js +0 -61
  342. package/dist/schema/schemas/primitives/index.js.map +0 -1
  343. package/dist/schema/schemas/primitives/memory.d.ts +0 -51
  344. package/dist/schema/schemas/primitives/memory.d.ts.map +0 -1
  345. package/dist/schema/schemas/primitives/memory.js +0 -73
  346. package/dist/schema/schemas/primitives/memory.js.map +0 -1
  347. package/dist/schema/schemas/primitives/online-eval-config.d.ts +0 -14
  348. package/dist/schema/schemas/primitives/online-eval-config.d.ts.map +0 -1
  349. package/dist/schema/schemas/primitives/online-eval-config.js +0 -30
  350. package/dist/schema/schemas/primitives/online-eval-config.js.map +0 -1
  351. package/dist/schema/schemas/primitives/policy.d.ts +0 -49
  352. package/dist/schema/schemas/primitives/policy.d.ts.map +0 -1
  353. package/dist/schema/schemas/primitives/policy.js +0 -62
  354. package/dist/schema/schemas/primitives/policy.js.map +0 -1
  355. package/dist/schema/schemas/primitives/tags.d.ts +0 -6
  356. package/dist/schema/schemas/primitives/tags.d.ts.map +0 -1
  357. package/dist/schema/schemas/primitives/tags.js +0 -27
  358. package/dist/schema/schemas/primitives/tags.js.map +0 -1
  359. package/dist/schema/schemas/zod-util.d.ts +0 -10
  360. package/dist/schema/schemas/zod-util.d.ts.map +0 -1
  361. package/dist/schema/schemas/zod-util.js +0 -23
  362. package/dist/schema/schemas/zod-util.js.map +0 -1
  363. package/dist/schema/types/index.d.ts +0 -2
  364. package/dist/schema/types/index.d.ts.map +0 -1
  365. package/dist/schema/types/index.js +0 -18
  366. package/dist/schema/types/index.js.map +0 -1
  367. package/dist/schema/types/path.d.ts +0 -27
  368. package/dist/schema/types/path.d.ts.map +0 -1
  369. package/dist/schema/types/path.js +0 -13
  370. package/dist/schema/types/path.js.map +0 -1
  371. package/scripts/bump-version.ts +0 -393
  372. package/scripts/bundle.mjs +0 -219
  373. package/scripts/check-old-cli.lib.mjs +0 -102
  374. package/scripts/check-old-cli.mjs +0 -10
  375. package/scripts/copy-assets.mjs +0 -64
  376. package/scripts/generate-schema.mjs +0 -40
  377. package/scripts/run-e2e-local.sh +0 -112
  378. package/scripts/start-tui-harness.sh +0 -90
  379. /package/dist/{agent-inspector/favicon.svg → assets/agent-inspector/favicon.svg.asset} +0 -0
  380. /package/dist/{agent-inspector/index.html → assets/agent-inspector/index.html.asset} +0 -0
  381. /package/dist/assets/{python/http/strands/base → templates/a2a-python-strands}/gitignore.template +0 -0
  382. /package/dist/assets/{typescript/.gitkeep → templates/a2a-python-strands/memory/__init__.py} +0 -0
  383. /package/dist/assets/{python/a2a/googleadk/base → templates/a2a-python-strands}/model/__init__.py +0 -0
  384. /package/dist/assets/{python/a2a/langchain_langgraph/base → templates/agent-python-langchain}/model/__init__.py +0 -0
  385. /package/dist/assets/{container/python → templates/agent-python-strands}/dockerignore.template +0 -0
  386. /package/dist/assets/{python/a2a/strands/base → templates/agent-python-strands}/model/__init__.py +0 -0
  387. /package/dist/assets/{python/a2a/strands/capabilities/memory → templates/agui-python-strands/model}/__init__.py +0 -0
  388. /package/dist/assets/{python/agui/googleadk/base/model → templates/export-harness-python/mcp_client}/__init__.py +0 -0
  389. /package/dist/assets/{python/agui/langchain_langgraph/base → templates/export-harness-python}/model/__init__.py +0 -0
@@ -0,0 +1,47 @@
1
+ import os
2
+ import uuid
3
+ from typing import Optional
4
+
5
+ from bedrock_agentcore.memory.integrations.strands.config import AgentCoreMemoryConfig{{#if memoryStrategies.length}}, RetrievalConfig{{/if}}
6
+ from bedrock_agentcore.memory.integrations.strands.session_manager import AgentCoreMemorySessionManager
7
+
8
+ MEMORY_ID = os.getenv("{{memoryEnvVarName}}")
9
+ REGION = os.getenv("AWS_REGION")
10
+
11
+
12
+ def get_memory_session_manager(
13
+ session_id: Optional[str], actor_id: str
14
+ ) -> Optional[AgentCoreMemorySessionManager]:
15
+ if not MEMORY_ID:
16
+ return None
17
+
18
+ session_id = session_id or uuid.uuid4().hex
19
+
20
+ {{#if memoryStrategies.length}}
21
+ retrieval_config = {
22
+ {{#if (includes memoryStrategies "SEMANTIC")}}
23
+ f"/users/{actor_id}/facts": RetrievalConfig(top_k={{#if memoryRetrievalTopK}}{{memoryRetrievalTopK}}{{else}}3{{/if}}, relevance_score={{#if memoryRetrievalRelevanceScore}}{{memoryRetrievalRelevanceScore}}{{else}}0.5{{/if}}),
24
+ {{/if}}
25
+ {{#if (includes memoryStrategies "USER_PREFERENCE")}}
26
+ f"/users/{actor_id}/preferences": RetrievalConfig(top_k={{#if memoryRetrievalTopK}}{{memoryRetrievalTopK}}{{else}}3{{/if}}, relevance_score={{#if memoryRetrievalRelevanceScore}}{{memoryRetrievalRelevanceScore}}{{else}}0.5{{/if}}),
27
+ {{/if}}
28
+ {{#if (includes memoryStrategies "EPISODIC")}}
29
+ f"/episodes/{actor_id}/{session_id}": RetrievalConfig(top_k={{#if memoryRetrievalTopK}}{{memoryRetrievalTopK}}{{else}}5{{/if}}, relevance_score={{#if memoryRetrievalRelevanceScore}}{{memoryRetrievalRelevanceScore}}{{else}}0.5{{/if}}),
30
+ {{/if}}
31
+ {{#if (includes memoryStrategies "SUMMARIZATION")}}
32
+ f"/summaries/{actor_id}": RetrievalConfig(top_k={{#if memoryRetrievalTopK}}{{memoryRetrievalTopK}}{{else}}3{{/if}}, relevance_score={{#if memoryRetrievalRelevanceScore}}{{memoryRetrievalRelevanceScore}}{{else}}0.5{{/if}}),
33
+ {{/if}}
34
+ }
35
+ {{/if}}
36
+
37
+ return AgentCoreMemorySessionManager(
38
+ AgentCoreMemoryConfig(
39
+ memory_id=MEMORY_ID,
40
+ session_id=session_id,
41
+ actor_id=actor_id,
42
+ {{#if memoryStrategies.length}}
43
+ retrieval_config=retrieval_config,
44
+ {{/if}}
45
+ ),
46
+ REGION,
47
+ )
@@ -0,0 +1,249 @@
1
+ {{#if (eq modelProvider "Bedrock")}}
2
+ {{#if bedrockMantle}}
3
+ import os
4
+
5
+ from aws_bedrock_token_generator import provide_token
6
+ {{#if (eq mantleApiFormat "chat_completions")}}
7
+ from strands.models.openai import OpenAIModel
8
+ {{else}}
9
+ {{#if mantleProprietary}}
10
+ from strands.models.openai_responses import OpenAIResponsesModel
11
+ {{else}}
12
+ from model.mantle_compat import MantleCompatResponsesModel
13
+ {{/if}}
14
+ {{/if}}
15
+
16
+ MODEL_ID = "{{modelId}}"
17
+
18
+
19
+ def load_model():
20
+ """
21
+ Get a Bedrock Mantle model client. These OpenAI-compatible models (e.g. openai.gpt-5.5,
22
+ openai.gpt-oss-120b) are served via the Bedrock Mantle endpoint, NOT the Converse API — so they
23
+ are invoked through an OpenAI-style client authenticated with a short-lived Bedrock bearer token.
24
+ Region is read from AWS_REGION (set by the AgentCore runtime).
25
+ """
26
+ region = os.environ.get("AWS_REGION", os.environ.get("AWS_DEFAULT_REGION", "us-east-1"))
27
+ token = provide_token(region=region)
28
+ {{#if mantleProprietary}}
29
+ # Proprietary OpenAI models only work on the /openai/v1 Mantle path.
30
+ base_url = f"https://bedrock-mantle.{region}.api.aws/openai/v1"
31
+ {{else}}
32
+ # Open-source OpenAI models (gpt-oss-*) only work on the /v1 Mantle path.
33
+ base_url = f"https://bedrock-mantle.{region}.api.aws/v1"
34
+ {{/if}}
35
+ client_args = {"api_key": token, "base_url": base_url}
36
+
37
+ params = {}
38
+ {{#if modelMaxTokens}}
39
+ {{#if (eq mantleApiFormat "chat_completions")}}
40
+ params["max_completion_tokens"] = {{modelMaxTokens}}
41
+ {{else}}
42
+ params["max_output_tokens"] = {{modelMaxTokens}}
43
+ {{/if}}
44
+ {{/if}}
45
+ {{#if modelTemperature}}
46
+ params["temperature"] = {{modelTemperature}}
47
+ {{/if}}
48
+ {{#if modelTopP}}
49
+ params["top_p"] = {{modelTopP}}
50
+ {{/if}}
51
+ {{#if (eq mantleApiFormat "chat_completions")}}
52
+ return OpenAIModel(client_args=client_args, model_id=MODEL_ID, params=params)
53
+ {{else}}
54
+ # Responses API: Mantle does not persist responses, so disable server-side storage.
55
+ params["store"] = False
56
+ {{#if mantleProprietary}}
57
+ return OpenAIResponsesModel(client_args=client_args, model_id=MODEL_ID, params=params)
58
+ {{else}}
59
+ return MantleCompatResponsesModel(client_args=client_args, model_id=MODEL_ID, params=params)
60
+ {{/if}}
61
+ {{/if}}
62
+ {{else}}
63
+ from strands.models.bedrock import BedrockModel
64
+
65
+
66
+ def load_model() -> BedrockModel:
67
+ """Get Bedrock model client using IAM credentials."""
68
+ return BedrockModel(
69
+ model_id="{{#if modelId}}{{modelId}}{{else}}global.anthropic.claude-sonnet-4-5-20250929-v1:0{{/if}}",
70
+ {{#if modelMaxTokens}}
71
+ max_tokens={{modelMaxTokens}},
72
+ {{/if}}
73
+ {{#if modelTemperature}}
74
+ temperature={{modelTemperature}},
75
+ {{/if}}
76
+ {{#if modelTopP}}
77
+ top_p={{modelTopP}},
78
+ {{/if}}
79
+ )
80
+ {{/if}}
81
+ {{/if}}
82
+ {{#if (eq modelProvider "OpenAI")}}
83
+ import os
84
+
85
+ {{#if (eq modelApiFormat "responses")}}
86
+ from strands.models.openai_responses import OpenAIResponsesModel
87
+ {{else}}
88
+ from strands.models.openai import OpenAIModel
89
+ {{/if}}
90
+ from bedrock_agentcore.identity.auth import requires_api_key
91
+
92
+ IDENTITY_PROVIDER_NAME = "{{identityProviders.[0].name}}"
93
+ IDENTITY_ENV_VAR = "{{identityProviders.[0].envVarName}}"
94
+
95
+
96
+ @requires_api_key(provider_name=IDENTITY_PROVIDER_NAME)
97
+ def _agentcore_identity_api_key_provider(api_key: str) -> str:
98
+ """Fetch API key from AgentCore Identity."""
99
+ return api_key
100
+
101
+
102
+ def _get_api_key() -> str:
103
+ """
104
+ Uses AgentCore Identity for API key management in deployed environments.
105
+ For local development, run via 'agentcore dev' which loads agentcore/.env.
106
+ """
107
+ if os.getenv("LOCAL_DEV") == "1":
108
+ api_key = os.getenv(IDENTITY_ENV_VAR)
109
+ if not api_key:
110
+ raise RuntimeError(
111
+ f"{IDENTITY_ENV_VAR} not found. Add {IDENTITY_ENV_VAR}=your-key to .env.local"
112
+ )
113
+ return api_key
114
+ return _agentcore_identity_api_key_provider()
115
+
116
+
117
+ def load_model():
118
+ """Get authenticated OpenAI model client."""
119
+ params = {}
120
+ {{#if modelMaxTokens}}
121
+ params["{{#if (eq modelApiFormat "responses")}}max_output_tokens{{else}}max_completion_tokens{{/if}}"] = {{modelMaxTokens}}
122
+ {{/if}}
123
+ {{#if modelTemperature}}
124
+ params["temperature"] = {{modelTemperature}}
125
+ {{/if}}
126
+ {{#if modelTopP}}
127
+ params["top_p"] = {{modelTopP}}
128
+ {{/if}}
129
+ return {{#if (eq modelApiFormat "responses")}}OpenAIResponsesModel{{else}}OpenAIModel{{/if}}(
130
+ client_args={"api_key": _get_api_key()},
131
+ model_id="{{#if modelId}}{{modelId}}{{else}}gpt-4.1{{/if}}",
132
+ params=params,
133
+ )
134
+ {{/if}}
135
+ {{#if (eq modelProvider "Gemini")}}
136
+ import os
137
+
138
+ from strands.models.gemini import GeminiModel
139
+ from bedrock_agentcore.identity.auth import requires_api_key
140
+
141
+ IDENTITY_PROVIDER_NAME = "{{identityProviders.[0].name}}"
142
+ IDENTITY_ENV_VAR = "{{identityProviders.[0].envVarName}}"
143
+
144
+
145
+ @requires_api_key(provider_name=IDENTITY_PROVIDER_NAME)
146
+ def _agentcore_identity_api_key_provider(api_key: str) -> str:
147
+ """Fetch API key from AgentCore Identity."""
148
+ return api_key
149
+
150
+
151
+ def _get_api_key() -> str:
152
+ """
153
+ Uses AgentCore Identity for API key management in deployed environments.
154
+ For local development, run via 'agentcore dev' which loads agentcore/.env.
155
+ """
156
+ if os.getenv("LOCAL_DEV") == "1":
157
+ api_key = os.getenv(IDENTITY_ENV_VAR)
158
+ if not api_key:
159
+ raise RuntimeError(
160
+ f"{IDENTITY_ENV_VAR} not found. Add {IDENTITY_ENV_VAR}=your-key to .env.local"
161
+ )
162
+ return api_key
163
+ return _agentcore_identity_api_key_provider()
164
+
165
+
166
+ def load_model() -> GeminiModel:
167
+ """Get authenticated Gemini model client."""
168
+ params = {}
169
+ {{#if modelMaxTokens}}
170
+ params["max_output_tokens"] = {{modelMaxTokens}}
171
+ {{/if}}
172
+ {{#if modelTemperature}}
173
+ params["temperature"] = {{modelTemperature}}
174
+ {{/if}}
175
+ {{#if modelTopP}}
176
+ params["top_p"] = {{modelTopP}}
177
+ {{/if}}
178
+ {{#if modelTopK}}
179
+ params["top_k"] = {{modelTopK}}
180
+ {{/if}}
181
+ return GeminiModel(
182
+ client_args={"api_key": _get_api_key()},
183
+ model_id="{{#if modelId}}{{modelId}}{{else}}gemini-2.5-flash{{/if}}",
184
+ params=params,
185
+ )
186
+ {{/if}}
187
+ {{#if (eq modelProvider "LiteLLM")}}
188
+ import os
189
+ {{#if litellmAdditionalParams}}
190
+ import json
191
+ {{/if}}
192
+
193
+ from strands.models.litellm import LiteLLMModel
194
+ {{#if identityProviders.[0].name}}
195
+ from bedrock_agentcore.identity.auth import requires_api_key
196
+
197
+ IDENTITY_PROVIDER_NAME = "{{identityProviders.[0].name}}"
198
+ IDENTITY_ENV_VAR = "{{identityProviders.[0].envVarName}}"
199
+
200
+
201
+ @requires_api_key(provider_name=IDENTITY_PROVIDER_NAME)
202
+ def _agentcore_identity_api_key_provider(api_key: str) -> str:
203
+ """Fetch API key from AgentCore Identity."""
204
+ return api_key
205
+
206
+
207
+ def _get_api_key() -> str:
208
+ """
209
+ Uses AgentCore Identity for API key management in deployed environments.
210
+ For local development, run via 'agentcore dev' which loads agentcore/.env.
211
+ """
212
+ if os.getenv("LOCAL_DEV") == "1":
213
+ api_key = os.getenv(IDENTITY_ENV_VAR)
214
+ if not api_key:
215
+ raise RuntimeError(
216
+ f"{IDENTITY_ENV_VAR} not found. Add {IDENTITY_ENV_VAR}=your-key to .env.local"
217
+ )
218
+ return api_key
219
+ return _agentcore_identity_api_key_provider()
220
+ {{/if}}
221
+
222
+
223
+
224
+
225
+ def load_model() -> LiteLLMModel:
226
+ """Get a LiteLLM model client (proxies to the provider encoded in model_id)."""
227
+ client_args = {}
228
+ {{#if identityProviders.[0].name}}
229
+ client_args["api_key"] = _get_api_key()
230
+ {{/if}}
231
+ {{#if litellmApiBase}}
232
+ client_args["api_base"] = {{safeJson litellmApiBase}}
233
+ {{/if}}
234
+ params = {{#if litellmAdditionalParams}}json.loads({{pyJsonStr litellmAdditionalParams}}){{else}}{}{{/if}}
235
+ {{#if modelMaxTokens}}
236
+ params["max_tokens"] = {{modelMaxTokens}}
237
+ {{/if}}
238
+ {{#if modelTemperature}}
239
+ params["temperature"] = {{modelTemperature}}
240
+ {{/if}}
241
+ {{#if modelTopP}}
242
+ params["top_p"] = {{modelTopP}}
243
+ {{/if}}
244
+ return LiteLLMModel(
245
+ client_args=client_args,
246
+ model_id="{{#if modelId}}{{modelId}}{{else}}bedrock/us.anthropic.claude-sonnet-4-5-20250514-v1:0{{/if}}",
247
+ params=params,
248
+ )
249
+ {{/if}}
@@ -0,0 +1,21 @@
1
+ from strands.models.openai_responses import OpenAIResponsesModel
2
+
3
+
4
+ class MantleCompatResponsesModel(OpenAIResponsesModel):
5
+ """Workaround for Bedrock Mantle rejecting output_text in EasyInputMessage content arrays.
6
+
7
+ Mantle's Pydantic validation only accepts content as a plain string for assistant messages, while
8
+ real OpenAI accepts both formats. Flatten assistant content arrays to strings so multi-turn works.
9
+ Used for open-source OpenAI models (gpt-oss-*) on the /v1 Mantle path; proprietary models use the
10
+ plain OpenAIResponsesModel on /openai/v1.
11
+ """
12
+
13
+ @classmethod
14
+ def _format_request_messages(cls, messages):
15
+ formatted = super()._format_request_messages(messages)
16
+ for msg in formatted:
17
+ if msg.get("role") == "assistant" and isinstance(msg.get("content"), list):
18
+ msg["content"] = "".join(
19
+ part.get("text", "") for part in msg["content"] if part.get("type") == "output_text"
20
+ )
21
+ return formatted
@@ -0,0 +1,22 @@
1
+ [build-system]
2
+ requires = ["hatchling ~= 1.27.0"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "{{ name }}"
7
+ version = "0.1.0"
8
+ description = "AgentCore Runtime Application using Strands SDK"
9
+ readme = "README.md"
10
+ requires-python = ">=3.10"
11
+ dependencies = [
12
+ "aws-opentelemetry-distro ~= 0.18.0",
13
+ "bedrock-agentcore ~= 1.9.1",
14
+ "botocore[crt] ~= 1.43.0",
15
+ "mcp >= 1.23.0, < 2.0.0",
16
+ {{#if bedrockMantle}}"aws-bedrock-token-generator >= 1.1.0, < 2.0.0",
17
+ {{/if}}"strands-agents{{#if strandsExtras}}[{{strandsExtras}}]{{/if}} ~= 1.54.0",
18
+
19
+ ]
20
+
21
+ [tool.hatch.build.targets.wheel]
22
+ packages = ["."]
@@ -0,0 +1,279 @@
1
+ """Skill fetcher — downloads s3/git skills to local filesystem on first use.
2
+
3
+ Resolved paths are passed to AgentSkills(skills=...) in main.py.
4
+ Cache directory: <tmpdir>/.agents/skills/ — an absolute path under the system temp
5
+ directory (honors $TMPDIR, defaults to /tmp). The runtime working directory (e.g.
6
+ /var/task in a CodeZip runtime) is read-only, so the cache must live somewhere
7
+ guaranteed-writable.
8
+ """
9
+
10
+ import base64
11
+ import hashlib
12
+ import json
13
+ import logging
14
+ import os
15
+ import shutil
16
+ import subprocess
17
+ import tempfile
18
+ from pathlib import Path
19
+ from typing import Optional
20
+
21
+ logger = logging.getLogger(__name__)
22
+
23
+ _SKILLS_BASE = Path(tempfile.gettempdir()) / ".agents" / "skills"
24
+ _GIT_TIMEOUT = 60
25
+ _S3_MAX_SIZE_BYTES = 1 * 1024 * 1024 * 1024 # 1 GB
26
+
27
+
28
+ def _stable_hash(value: str) -> str:
29
+ return hashlib.sha256(value.encode()).hexdigest()[:12]
30
+
31
+
32
+ def _cleanup(path: Path) -> None:
33
+ """Remove a partially-created skill directory so retries don't see stale state."""
34
+ shutil.rmtree(path, ignore_errors=True)
35
+
36
+
37
+ def _read_map(type_dir: Path) -> dict:
38
+ map_file = type_dir / ".map.json"
39
+ return json.loads(map_file.read_text()) if map_file.exists() else {}
40
+
41
+
42
+ def _write_map(type_dir: Path, mapping: dict) -> None:
43
+ type_dir.mkdir(parents=True, exist_ok=True)
44
+ (type_dir / ".map.json").write_text(json.dumps(mapping))
45
+
46
+
47
+ def _resolve_cached(type_dir: Path, source_hash: str) -> Optional[str]:
48
+ """Return the cached skill directory for a source hash, or None if not on disk."""
49
+ mapping = _read_map(type_dir)
50
+ dir_name = mapping.get(source_hash)
51
+ if dir_name and (type_dir / dir_name).exists():
52
+ return str(type_dir / dir_name)
53
+ return None
54
+
55
+
56
+ def _read_skill_name(skill_dir: Path) -> str:
57
+ """Extract the skill name from SKILL.md YAML frontmatter."""
58
+ content = (skill_dir / "SKILL.md").read_text()
59
+ if not content.startswith("---"):
60
+ raise ValueError(f"SKILL.md in {skill_dir} has no YAML frontmatter (must start with ---)")
61
+ parts = content.split("---", 2)
62
+ if len(parts) < 3:
63
+ raise ValueError(f"SKILL.md in {skill_dir} has malformed frontmatter (missing closing ---)")
64
+ for line in parts[1].strip().splitlines():
65
+ if line.startswith("name:"):
66
+ name = line[len("name:"):].strip().strip("\"'")
67
+ if name:
68
+ return name
69
+ raise ValueError(f"SKILL.md in {skill_dir} is missing a 'name' field in frontmatter")
70
+
71
+
72
+ def _pick_dir_name(type_dir: Path, name: str, source_hash: str) -> str:
73
+ """Pick a unique directory name, appending a hash suffix on collision."""
74
+ if not (type_dir / name).exists():
75
+ return name
76
+ return f"{name}-{source_hash[:8]}"
77
+
78
+
79
+ def _rename_and_cache_skill(type_dir: Path, temp_dir: Path, source_hash: str, skill_root: Path,
80
+ source_label: str = "") -> Path:
81
+ """Validate SKILL.md, rename the temp dir to the skill's declared name, and update the map.
82
+
83
+ Raises ValueError if SKILL.md is missing or has invalid frontmatter.
84
+ """
85
+ if not (skill_root / "SKILL.md").exists():
86
+ _cleanup(temp_dir)
87
+ hint = f" (source: {source_label})" if source_label else ""
88
+ raise ValueError(f"No SKILL.md found in fetched skill{hint}")
89
+
90
+ name = _read_skill_name(skill_root)
91
+ dir_name = _pick_dir_name(type_dir, name, source_hash)
92
+ final_dir = type_dir / dir_name
93
+ if final_dir != temp_dir:
94
+ temp_dir.rename(final_dir)
95
+
96
+ mapping = _read_map(type_dir)
97
+ mapping[source_hash] = dir_name
98
+ _write_map(type_dir, mapping)
99
+ return final_dir
100
+
101
+
102
+ def _fetch_s3_skill(source: str, s3_client=None) -> Path:
103
+ """Download an s3:// skill prefix and return the local directory."""
104
+ uri = source if source.endswith("/") else source + "/"
105
+ source_hash = _stable_hash(uri)
106
+ type_dir = _SKILLS_BASE / "s3"
107
+
108
+ cached = _resolve_cached(type_dir, source_hash)
109
+ if cached:
110
+ return Path(cached)
111
+
112
+ import boto3
113
+ client = s3_client or boto3.client("s3")
114
+ bucket, _, prefix = uri[len("s3://"):].partition("/")
115
+ if not bucket:
116
+ raise ValueError(f"Invalid S3 URI (no bucket): {uri}")
117
+
118
+ temp_dir = type_dir / source_hash
119
+ _cleanup(temp_dir)
120
+ temp_dir.mkdir(parents=True, exist_ok=True)
121
+ temp_root = temp_dir.resolve()
122
+
123
+ paginator = client.get_paginator("list_objects_v2")
124
+ total = 0
125
+ for page in paginator.paginate(Bucket=bucket, Prefix=prefix):
126
+ for obj in page.get("Contents", []):
127
+ total += obj["Size"]
128
+ if total > _S3_MAX_SIZE_BYTES:
129
+ _cleanup(temp_dir)
130
+ raise ValueError(f"S3 skill {uri} exceeds 1 GB size limit")
131
+ rel = obj["Key"][len(prefix):].lstrip("/")
132
+ if not rel:
133
+ continue
134
+ dest = (temp_dir / rel).resolve()
135
+ if dest != temp_root and not str(dest).startswith(str(temp_root) + os.sep):
136
+ _cleanup(temp_dir)
137
+ raise ValueError(f"Path traversal detected in S3 key: {obj['Key']}")
138
+ dest.parent.mkdir(parents=True, exist_ok=True)
139
+ client.download_file(bucket, obj["Key"], str(dest))
140
+
141
+ if total == 0:
142
+ _cleanup(temp_dir)
143
+ raise ValueError(f"No files found at S3 URI: {uri}")
144
+
145
+ return _rename_and_cache_skill(type_dir, temp_dir, source_hash, temp_dir, source_label=uri)
146
+
147
+
148
+ def _resolve_credential_arn(credential_arn: str, identity_client) -> str:
149
+ """Resolve a Token Vault API-key credential ARN to its secret value via AgentCore Identity.
150
+
151
+ ARN format: arn:<p>:bedrock-agentcore:<region>:<account>:token-vault/<vault>/apikeycredentialprovider/<name>
152
+ """
153
+ from bedrock_agentcore.runtime.context import BedrockAgentCoreContext # noqa: PLC0415
154
+
155
+ provider_name = credential_arn.rsplit("/", 1)[-1]
156
+ if not provider_name:
157
+ raise ValueError(f"Invalid credential ARN: {credential_arn}")
158
+ workload_token = BedrockAgentCoreContext.get_workload_access_token()
159
+ if not workload_token:
160
+ raise ValueError("Credential ARN resolution requires a workload access token")
161
+ api_key = identity_client.dp_client.get_resource_api_key(
162
+ resourceCredentialProviderName=provider_name,
163
+ workloadIdentityToken=workload_token,
164
+ )["apiKey"]
165
+ if not api_key:
166
+ raise ValueError(f"Identity returned empty API key for provider: {provider_name}")
167
+ return api_key
168
+
169
+
170
+ def _build_git_auth_env(credential_arn: Optional[str], username: Optional[str], identity_client=None) -> dict:
171
+ """Build GIT_CONFIG_* env vars for HTTP Basic auth using a Token Vault credential ARN.
172
+
173
+ Uses env vars instead of -c args to avoid leaking credentials in /proc/*/cmdline,
174
+ and so auth propagates to sub-commands (e.g. sparse-checkout triggering a fetch).
175
+ """
176
+ if not credential_arn or not identity_client:
177
+ return {}
178
+ password = _resolve_credential_arn(credential_arn, identity_client)
179
+ user = username or "oauth2"
180
+ encoded = base64.b64encode(f"{user}:{password}".encode()).decode()
181
+ return {
182
+ "GIT_CONFIG_COUNT": "1",
183
+ "GIT_CONFIG_KEY_0": "http.extraHeader",
184
+ "GIT_CONFIG_VALUE_0": f"Authorization: Basic {encoded}",
185
+ }
186
+
187
+
188
+ def _fetch_git_skill(url: str, skill_path: str = "", credential_arn: Optional[str] = None,
189
+ username: Optional[str] = None, identity_client=None) -> Path:
190
+ """Shallow-clone a git skill repository and return the local skill directory.
191
+
192
+ Returns the directory containing SKILL.md (the subdir itself for sparse checkouts).
193
+ """
194
+ if skill_path and (os.path.isabs(skill_path) or ".." in Path(skill_path).parts):
195
+ raise ValueError(f"Path traversal detected in skill path: {skill_path}")
196
+
197
+ source_hash = _stable_hash(f"{url}:{skill_path}")
198
+ type_dir = _SKILLS_BASE / "git"
199
+
200
+ cached = _resolve_cached(type_dir, source_hash)
201
+ if cached:
202
+ return Path(cached) / skill_path if skill_path else Path(cached)
203
+
204
+ temp_dir = type_dir / source_hash
205
+ _cleanup(temp_dir)
206
+ temp_dir.mkdir(parents=True, exist_ok=True)
207
+
208
+ extra_env = _build_git_auth_env(credential_arn, username, identity_client)
209
+ git_env = {**os.environ, **extra_env} if extra_env else None
210
+
211
+ try:
212
+ if skill_path:
213
+ subprocess.run(
214
+ ["git", "clone", "--depth", "1", "--filter=blob:none", "--sparse", url, str(temp_dir)],
215
+ check=True, timeout=_GIT_TIMEOUT, capture_output=True, env=git_env,
216
+ )
217
+ subprocess.run(
218
+ ["git", "sparse-checkout", "set", skill_path],
219
+ check=True, timeout=_GIT_TIMEOUT, capture_output=True, cwd=str(temp_dir), env=git_env,
220
+ )
221
+ else:
222
+ subprocess.run(
223
+ ["git", "clone", "--depth", "1", url, str(temp_dir)],
224
+ check=True, timeout=_GIT_TIMEOUT, capture_output=True, env=git_env,
225
+ )
226
+ except Exception:
227
+ _cleanup(temp_dir)
228
+ raise
229
+
230
+ if skill_path and not (temp_dir / skill_path).exists():
231
+ _cleanup(temp_dir)
232
+ raise ValueError(f"Skill path '{skill_path}' not found in repository '{url}'")
233
+
234
+ # SKILL.md lives inside the subdir for sparse checkouts.
235
+ skill_root = temp_dir / skill_path if skill_path else temp_dir
236
+ label = f"{url}:{skill_path}" if skill_path else url
237
+ final_dir = _rename_and_cache_skill(type_dir, temp_dir, source_hash, skill_root, source_label=label)
238
+ return final_dir / skill_path if skill_path else final_dir
239
+
240
+
241
+ def resolve_s3_skills(sources: list, s3_client=None) -> list:
242
+ """Resolve s3:// skill URIs to local filesystem paths.
243
+
244
+ Any fetch failure raises and fails the invocation — a partial skill set
245
+ would silently run the agent without capabilities the harness declared.
246
+ """
247
+ paths = []
248
+ for uri in sources:
249
+ try:
250
+ skill_dir = _fetch_s3_skill(uri, s3_client)
251
+ except Exception as e:
252
+ raise ValueError(f"Failed to resolve S3 skill '{uri}': {e}") from e
253
+ paths.append(str(skill_dir.resolve()))
254
+ return paths
255
+
256
+
257
+ def resolve_git_skills(sources: list, identity_client=None) -> list:
258
+ """Resolve git skill dicts to local filesystem paths.
259
+
260
+ Each source is a dict with keys: url (required), path (optional),
261
+ credentialArn (optional), username (optional).
262
+
263
+ Any fetch failure raises and fails the invocation — a partial skill set
264
+ would silently run the agent without capabilities the harness declared.
265
+ """
266
+ paths = []
267
+ for source in sources:
268
+ try:
269
+ skill_dir = _fetch_git_skill(
270
+ url=source["url"],
271
+ skill_path=source.get("path") or "",
272
+ credential_arn=source.get("credentialArn"),
273
+ username=source.get("username"),
274
+ identity_client=identity_client,
275
+ )
276
+ except Exception as e:
277
+ raise ValueError(f"Failed to resolve git skill '{source.get('url', source)}': {e}") from e
278
+ paths.append(str(skill_dir.resolve()))
279
+ return paths
@@ -0,0 +1,32 @@
1
+ # {{ name }}
2
+
3
+ An MCP (Model Context Protocol) server deployed on Amazon Bedrock AgentCore.
4
+
5
+ ## Overview
6
+
7
+ This project implements an MCP server using FastMCP. MCP servers expose tools that can be
8
+ consumed by MCP clients (other agents or applications). The server speaks Streamable HTTP
9
+ transport at `/mcp`, matching the AgentCore Runtime MCP service contract.
10
+
11
+ ## Adding Tools
12
+
13
+ Define tools using the `@mcp.tool()` decorator in `main.py`:
14
+
15
+ ```python
16
+ @mcp.tool()
17
+ def my_tool(param: str) -> str:
18
+ """Description of what the tool does."""
19
+ return f"Result: {param}"
20
+ ```
21
+
22
+ ## Developing locally
23
+
24
+ If installation was successful, a virtual environment is already created with dependencies installed.
25
+
26
+ `agentcore project dev` starts the server locally on `0.0.0.0:8000`. List and call tools by
27
+ sending JSON-RPC to `http://127.0.0.1:8000/mcp`.
28
+
29
+ ## Deployment
30
+
31
+ `agentcore project deploy` deploys the server into Amazon Bedrock AgentCore. Invoke it with
32
+ `agentcore project invoke runtime`, supplying an MCP JSON-RPC payload (e.g. `tools/list`, `tools/call`).
@@ -0,0 +1,41 @@
1
+ # Environment variables
2
+ .env
3
+
4
+ # Python
5
+ __pycache__/
6
+ *.py[cod]
7
+ *$py.class
8
+ *.so
9
+ .Python
10
+ build/
11
+ develop-eggs/
12
+ dist/
13
+ downloads/
14
+ eggs/
15
+ .eggs/
16
+ lib/
17
+ lib64/
18
+ parts/
19
+ sdist/
20
+ var/
21
+ wheels/
22
+ *.egg-info/
23
+ .installed.cfg
24
+ *.egg
25
+
26
+ # Virtual environments
27
+ .venv/
28
+ venv/
29
+ ENV/
30
+ env/
31
+
32
+ # IDE
33
+ .vscode/
34
+ .idea/
35
+ *.swp
36
+ *.swo
37
+ *~
38
+
39
+ # OS
40
+ .DS_Store
41
+ Thumbs.db