alibabacloud-agentcore-sdk 0.1.0

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 (221) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +189 -0
  3. package/dist/access-key-CkoHq3S8.d.cts +30 -0
  4. package/dist/access-key-CkoHq3S8.d.ts +30 -0
  5. package/dist/agent-sa-token-DD1Sb8P1.d.cts +14 -0
  6. package/dist/agent-sa-token-DD1Sb8P1.d.ts +14 -0
  7. package/dist/auth/index.cjs +36 -0
  8. package/dist/auth/index.cjs.map +1 -0
  9. package/dist/auth/index.d.cts +34 -0
  10. package/dist/auth/index.d.ts +34 -0
  11. package/dist/auth/index.js +36 -0
  12. package/dist/auth/index.js.map +1 -0
  13. package/dist/bound-credentials-C1fM0thh.d.cts +39 -0
  14. package/dist/bound-credentials-DqT64Q2s.d.ts +39 -0
  15. package/dist/chunk-2E5EWEDG.cjs +142 -0
  16. package/dist/chunk-2E5EWEDG.cjs.map +1 -0
  17. package/dist/chunk-55XZZRKO.js +220 -0
  18. package/dist/chunk-55XZZRKO.js.map +1 -0
  19. package/dist/chunk-5JXA7JPS.js +29 -0
  20. package/dist/chunk-5JXA7JPS.js.map +1 -0
  21. package/dist/chunk-5RKN46UU.cjs +139 -0
  22. package/dist/chunk-5RKN46UU.cjs.map +1 -0
  23. package/dist/chunk-5ZOLHQXO.js +296 -0
  24. package/dist/chunk-5ZOLHQXO.js.map +1 -0
  25. package/dist/chunk-7Y263YIW.js +298 -0
  26. package/dist/chunk-7Y263YIW.js.map +1 -0
  27. package/dist/chunk-A3PF2SPD.cjs +141 -0
  28. package/dist/chunk-A3PF2SPD.cjs.map +1 -0
  29. package/dist/chunk-A3WMLVJC.cjs +141 -0
  30. package/dist/chunk-A3WMLVJC.cjs.map +1 -0
  31. package/dist/chunk-BVZ7H2F5.cjs +582 -0
  32. package/dist/chunk-BVZ7H2F5.cjs.map +1 -0
  33. package/dist/chunk-EGUKJE3Z.cjs +24 -0
  34. package/dist/chunk-EGUKJE3Z.cjs.map +1 -0
  35. package/dist/chunk-EKXZKKJJ.js +24 -0
  36. package/dist/chunk-EKXZKKJJ.js.map +1 -0
  37. package/dist/chunk-GYLT23D3.js +110 -0
  38. package/dist/chunk-GYLT23D3.js.map +1 -0
  39. package/dist/chunk-IF7LMBXC.js +306 -0
  40. package/dist/chunk-IF7LMBXC.js.map +1 -0
  41. package/dist/chunk-IUCLCPVV.js +113 -0
  42. package/dist/chunk-IUCLCPVV.js.map +1 -0
  43. package/dist/chunk-JSP7ZROS.cjs +95 -0
  44. package/dist/chunk-JSP7ZROS.cjs.map +1 -0
  45. package/dist/chunk-JW62DVIC.js +238 -0
  46. package/dist/chunk-JW62DVIC.js.map +1 -0
  47. package/dist/chunk-K3TE7625.js +139 -0
  48. package/dist/chunk-K3TE7625.js.map +1 -0
  49. package/dist/chunk-LE5P3SJW.cjs +16 -0
  50. package/dist/chunk-LE5P3SJW.cjs.map +1 -0
  51. package/dist/chunk-LXHW6OT4.cjs +77 -0
  52. package/dist/chunk-LXHW6OT4.cjs.map +1 -0
  53. package/dist/chunk-MICRSJ6R.js +48 -0
  54. package/dist/chunk-MICRSJ6R.js.map +1 -0
  55. package/dist/chunk-MWAHO47B.cjs +220 -0
  56. package/dist/chunk-MWAHO47B.cjs.map +1 -0
  57. package/dist/chunk-MZ5UWGXS.js +95 -0
  58. package/dist/chunk-MZ5UWGXS.js.map +1 -0
  59. package/dist/chunk-NZL3VPJ2.js +16 -0
  60. package/dist/chunk-NZL3VPJ2.js.map +1 -0
  61. package/dist/chunk-PC4FM2RP.cjs +180 -0
  62. package/dist/chunk-PC4FM2RP.cjs.map +1 -0
  63. package/dist/chunk-PKYET77D.cjs +296 -0
  64. package/dist/chunk-PKYET77D.cjs.map +1 -0
  65. package/dist/chunk-PTJPB27L.js +31 -0
  66. package/dist/chunk-PTJPB27L.js.map +1 -0
  67. package/dist/chunk-QIZO3A4Y.cjs +306 -0
  68. package/dist/chunk-QIZO3A4Y.cjs.map +1 -0
  69. package/dist/chunk-RBAY4MO2.js +202 -0
  70. package/dist/chunk-RBAY4MO2.js.map +1 -0
  71. package/dist/chunk-RHY7Y43E.js +582 -0
  72. package/dist/chunk-RHY7Y43E.js.map +1 -0
  73. package/dist/chunk-RQRI6RCG.cjs +238 -0
  74. package/dist/chunk-RQRI6RCG.cjs.map +1 -0
  75. package/dist/chunk-RYXL25AI.js +141 -0
  76. package/dist/chunk-RYXL25AI.js.map +1 -0
  77. package/dist/chunk-RZNQGEGJ.cjs +113 -0
  78. package/dist/chunk-RZNQGEGJ.cjs.map +1 -0
  79. package/dist/chunk-S7PWSJNP.cjs +48 -0
  80. package/dist/chunk-S7PWSJNP.cjs.map +1 -0
  81. package/dist/chunk-TWEO5XVM.cjs +298 -0
  82. package/dist/chunk-TWEO5XVM.cjs.map +1 -0
  83. package/dist/chunk-UBP5CHU7.js +142 -0
  84. package/dist/chunk-UBP5CHU7.js.map +1 -0
  85. package/dist/chunk-ULJTQSLE.cjs +35 -0
  86. package/dist/chunk-ULJTQSLE.cjs.map +1 -0
  87. package/dist/chunk-UWPKFJYM.js +77 -0
  88. package/dist/chunk-UWPKFJYM.js.map +1 -0
  89. package/dist/chunk-WKZUYPDS.js +180 -0
  90. package/dist/chunk-WKZUYPDS.js.map +1 -0
  91. package/dist/chunk-YZP55W7S.cjs +29 -0
  92. package/dist/chunk-YZP55W7S.cjs.map +1 -0
  93. package/dist/chunk-ZELRQU4J.cjs +31 -0
  94. package/dist/chunk-ZELRQU4J.cjs.map +1 -0
  95. package/dist/chunk-ZLKYXRNM.js +141 -0
  96. package/dist/chunk-ZLKYXRNM.js.map +1 -0
  97. package/dist/chunk-ZLQ2IBTC.cjs +110 -0
  98. package/dist/chunk-ZLQ2IBTC.cjs.map +1 -0
  99. package/dist/chunk-ZTWLCHCO.cjs +202 -0
  100. package/dist/chunk-ZTWLCHCO.cjs.map +1 -0
  101. package/dist/chunk-ZWQBAJ5O.js +35 -0
  102. package/dist/chunk-ZWQBAJ5O.js.map +1 -0
  103. package/dist/client-DDU4-ygJ.d.cts +72 -0
  104. package/dist/client-pDzS7EZR.d.ts +72 -0
  105. package/dist/collaboration/index.cjs +44 -0
  106. package/dist/collaboration/index.cjs.map +1 -0
  107. package/dist/collaboration/index.d.cts +73 -0
  108. package/dist/collaboration/index.d.ts +73 -0
  109. package/dist/collaboration/index.js +44 -0
  110. package/dist/collaboration/index.js.map +1 -0
  111. package/dist/common-BSXkQfxI.d.cts +25 -0
  112. package/dist/common-BSXkQfxI.d.ts +25 -0
  113. package/dist/common-DRdI-75k.d.ts +8 -0
  114. package/dist/common-_vxreiEW.d.cts +8 -0
  115. package/dist/config-CMkmMtx1.d.cts +20 -0
  116. package/dist/config-CMkmMtx1.d.ts +20 -0
  117. package/dist/context-M9rOTifU.d.cts +12 -0
  118. package/dist/context-M9rOTifU.d.ts +12 -0
  119. package/dist/controller-DWs3Sy04.d.cts +9 -0
  120. package/dist/controller-DmI4L4sP.d.ts +9 -0
  121. package/dist/controlplane/index.cjs +13 -0
  122. package/dist/controlplane/index.cjs.map +1 -0
  123. package/dist/controlplane/index.d.cts +66 -0
  124. package/dist/controlplane/index.d.ts +66 -0
  125. package/dist/controlplane/index.js +13 -0
  126. package/dist/controlplane/index.js.map +1 -0
  127. package/dist/errors-BjGO6N10.d.ts +93 -0
  128. package/dist/errors-D9OtcR-o.d.cts +93 -0
  129. package/dist/event-converters-BIn8odqo.d.ts +38 -0
  130. package/dist/event-converters-Cn_NeGyQ.d.cts +38 -0
  131. package/dist/google-adk-model-N47R7GB2.js +208 -0
  132. package/dist/google-adk-model-N47R7GB2.js.map +1 -0
  133. package/dist/google-adk-model-PDBKY5YZ.cjs +208 -0
  134. package/dist/google-adk-model-PDBKY5YZ.cjs.map +1 -0
  135. package/dist/index.cjs +322 -0
  136. package/dist/index.cjs.map +1 -0
  137. package/dist/index.d.cts +78 -0
  138. package/dist/index.d.ts +78 -0
  139. package/dist/index.js +322 -0
  140. package/dist/index.js.map +1 -0
  141. package/dist/integrations/ai-sdk.cjs +15 -0
  142. package/dist/integrations/ai-sdk.cjs.map +1 -0
  143. package/dist/integrations/ai-sdk.d.cts +21 -0
  144. package/dist/integrations/ai-sdk.d.ts +21 -0
  145. package/dist/integrations/ai-sdk.js +15 -0
  146. package/dist/integrations/ai-sdk.js.map +1 -0
  147. package/dist/integrations/google-adk.cjs +90 -0
  148. package/dist/integrations/google-adk.cjs.map +1 -0
  149. package/dist/integrations/google-adk.d.cts +46 -0
  150. package/dist/integrations/google-adk.d.ts +46 -0
  151. package/dist/integrations/google-adk.js +90 -0
  152. package/dist/integrations/google-adk.js.map +1 -0
  153. package/dist/integrations/langchain.cjs +95 -0
  154. package/dist/integrations/langchain.cjs.map +1 -0
  155. package/dist/integrations/langchain.d.cts +52 -0
  156. package/dist/integrations/langchain.d.ts +52 -0
  157. package/dist/integrations/langchain.js +95 -0
  158. package/dist/integrations/langchain.js.map +1 -0
  159. package/dist/integrations/langgraph.cjs +30 -0
  160. package/dist/integrations/langgraph.cjs.map +1 -0
  161. package/dist/integrations/langgraph.d.cts +53 -0
  162. package/dist/integrations/langgraph.d.ts +53 -0
  163. package/dist/integrations/langgraph.js +30 -0
  164. package/dist/integrations/langgraph.js.map +1 -0
  165. package/dist/integrations/mastra.cjs +108 -0
  166. package/dist/integrations/mastra.cjs.map +1 -0
  167. package/dist/integrations/mastra.d.cts +47 -0
  168. package/dist/integrations/mastra.d.ts +47 -0
  169. package/dist/integrations/mastra.js +108 -0
  170. package/dist/integrations/mastra.js.map +1 -0
  171. package/dist/langchain-adapter-DFJdEX04.d.cts +47 -0
  172. package/dist/langchain-adapter-DJsyjm5V.d.ts +47 -0
  173. package/dist/langchain-provider-NF5GIDQV.cjs +227 -0
  174. package/dist/langchain-provider-NF5GIDQV.cjs.map +1 -0
  175. package/dist/langchain-provider-PHL4UWNF.js +227 -0
  176. package/dist/langchain-provider-PHL4UWNF.js.map +1 -0
  177. package/dist/loader-DrIQ37nm.d.ts +38 -0
  178. package/dist/loader-eWuJ2GSL.d.cts +38 -0
  179. package/dist/logging-C8GLLg1f.d.cts +9 -0
  180. package/dist/logging-C8GLLg1f.d.ts +9 -0
  181. package/dist/managed-CwLx9h4C.d.cts +32 -0
  182. package/dist/managed-D9eQK1ut.d.ts +32 -0
  183. package/dist/mcp/index.cjs +12 -0
  184. package/dist/mcp/index.cjs.map +1 -0
  185. package/dist/mcp/index.d.cts +62 -0
  186. package/dist/mcp/index.d.ts +62 -0
  187. package/dist/mcp/index.js +12 -0
  188. package/dist/mcp/index.js.map +1 -0
  189. package/dist/memory/index.cjs +12 -0
  190. package/dist/memory/index.cjs.map +1 -0
  191. package/dist/memory/index.d.cts +113 -0
  192. package/dist/memory/index.d.ts +113 -0
  193. package/dist/memory/index.js +12 -0
  194. package/dist/memory/index.js.map +1 -0
  195. package/dist/model/index.cjs +16 -0
  196. package/dist/model/index.cjs.map +1 -0
  197. package/dist/model/index.d.cts +129 -0
  198. package/dist/model/index.d.ts +129 -0
  199. package/dist/model/index.js +16 -0
  200. package/dist/model/index.js.map +1 -0
  201. package/dist/model-CkYHzHPk.d.cts +50 -0
  202. package/dist/model-CkYHzHPk.d.ts +50 -0
  203. package/dist/runtime/index.cjs +49 -0
  204. package/dist/runtime/index.cjs.map +1 -0
  205. package/dist/runtime/index.d.cts +73 -0
  206. package/dist/runtime/index.d.ts +73 -0
  207. package/dist/runtime/index.js +49 -0
  208. package/dist/runtime/index.js.map +1 -0
  209. package/dist/server/index.cjs +604 -0
  210. package/dist/server/index.cjs.map +1 -0
  211. package/dist/server/index.d.cts +69 -0
  212. package/dist/server/index.d.ts +69 -0
  213. package/dist/server/index.js +604 -0
  214. package/dist/server/index.js.map +1 -0
  215. package/dist/skill/index.cjs +14 -0
  216. package/dist/skill/index.cjs.map +1 -0
  217. package/dist/skill/index.d.cts +16 -0
  218. package/dist/skill/index.d.ts +16 -0
  219. package/dist/skill/index.js +14 -0
  220. package/dist/skill/index.js.map +1 -0
  221. package/package.json +292 -0
@@ -0,0 +1,113 @@
1
+ import {
2
+ ControllerClient
3
+ } from "./chunk-UBP5CHU7.js";
4
+ import {
5
+ CredentialExchangeError
6
+ } from "./chunk-MZ5UWGXS.js";
7
+
8
+ // src/auth/access-key.ts
9
+ import { inspect } from "util";
10
+ var AccessKeyCredential = class {
11
+ #values;
12
+ constructor(values) {
13
+ if (!values.accessKeyId?.trim() || !values.accessKeySecret?.trim() || values.securityToken !== void 0 && !values.securityToken.trim()) {
14
+ throw new TypeError("AccessKey ID, secret and optional security token must not be empty");
15
+ }
16
+ this.#values = { ...values };
17
+ }
18
+ get accessKeyId() {
19
+ return this.#values.accessKeyId;
20
+ }
21
+ get accessKeySecret() {
22
+ return this.#values.accessKeySecret;
23
+ }
24
+ get securityToken() {
25
+ return this.#values.securityToken;
26
+ }
27
+ [inspect.custom]() {
28
+ return `AccessKeyCredential(type=${this.securityToken ? "sts" : "access_key"}, <redacted>)`;
29
+ }
30
+ toJSON() {
31
+ return this[inspect.custom]();
32
+ }
33
+ };
34
+ var ResourceCredential = class extends AccessKeyCredential {
35
+ expiration;
36
+ credentialType = "ram_sts";
37
+ constructor(values) {
38
+ super(values);
39
+ if (!Number.isFinite(values.expiration.getTime())) throw new TypeError("STS expiration must be a valid Date");
40
+ this.expiration = new Date(values.expiration);
41
+ }
42
+ [inspect.custom]() {
43
+ return `ResourceCredential(expiration=${this.expiration.toISOString()}, <redacted>)`;
44
+ }
45
+ };
46
+
47
+ // src/auth/resource-sts.ts
48
+ var HIGH_CODE_SDK_PURPOSE = "highcode_sdk";
49
+ var AGENT_IDENTITY_DATA_PURPOSE = "agentidentitydata";
50
+ var ResourceSTSProvider = class {
51
+ controller;
52
+ cache = /* @__PURE__ */ new Map();
53
+ pending = /* @__PURE__ */ new Map();
54
+ constructor(endpoint, source, options = {}) {
55
+ this.controller = new ControllerClient(endpoint, source, options);
56
+ }
57
+ async get(purpose) {
58
+ if (purpose !== void 0) {
59
+ purpose = purpose.trim();
60
+ if (!purpose) throw new TypeError("purpose must not be empty");
61
+ }
62
+ const cached = this.cache.get(purpose);
63
+ if (cached && cached.expiration.getTime() > Date.now() + 3e5) return cached;
64
+ const current = this.pending.get(purpose);
65
+ if (current) return current;
66
+ const request = this.exchange(purpose);
67
+ this.pending.set(purpose, request);
68
+ try {
69
+ const credential = await request;
70
+ this.cache.set(purpose, credential);
71
+ return credential;
72
+ } finally {
73
+ this.pending.delete(purpose);
74
+ }
75
+ }
76
+ close() {
77
+ this.controller.close();
78
+ this.cache.clear();
79
+ }
80
+ async exchange(purpose) {
81
+ const response = await this.controller.post("/api/v1/credentials/sts", purpose);
82
+ if (response.status < 200 || response.status >= 300) {
83
+ throw new CredentialExchangeError(`Controller STS request failed with HTTP ${response.status}${response.message ? `: ${response.message}` : ""}`);
84
+ }
85
+ try {
86
+ const value = response.payload;
87
+ const read = (key) => {
88
+ const item = value[key];
89
+ if (typeof item !== "string" || !item.trim()) throw new Error("invalid field");
90
+ return item.trim();
91
+ };
92
+ const expiration = new Date(read("expiration"));
93
+ if (!(expiration.getTime() > Date.now())) throw new Error("expired STS");
94
+ return new ResourceCredential({
95
+ accessKeyId: read("access_key_id"),
96
+ accessKeySecret: read("access_key_secret"),
97
+ securityToken: read("security_token"),
98
+ expiration
99
+ });
100
+ } catch {
101
+ throw new CredentialExchangeError("Controller returned an invalid STS response");
102
+ }
103
+ }
104
+ };
105
+
106
+ export {
107
+ AccessKeyCredential,
108
+ ResourceCredential,
109
+ HIGH_CODE_SDK_PURPOSE,
110
+ AGENT_IDENTITY_DATA_PURPOSE,
111
+ ResourceSTSProvider
112
+ };
113
+ //# sourceMappingURL=chunk-IUCLCPVV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/auth/access-key.ts","../src/auth/resource-sts.ts"],"sourcesContent":["import { inspect } from 'node:util';\n\nexport interface AccessKeyOptions {\n accessKeyId: string;\n accessKeySecret: string;\n securityToken?: string;\n}\n\nexport class AccessKeyCredential {\n #values: AccessKeyOptions;\n constructor(values: AccessKeyOptions) {\n if (!values.accessKeyId?.trim() || !values.accessKeySecret?.trim() ||\n (values.securityToken !== undefined && !values.securityToken.trim())) {\n throw new TypeError('AccessKey ID, secret and optional security token must not be empty');\n }\n this.#values = { ...values };\n }\n get accessKeyId(): string { return this.#values.accessKeyId; }\n get accessKeySecret(): string { return this.#values.accessKeySecret; }\n get securityToken(): string | undefined { return this.#values.securityToken; }\n [inspect.custom](): string { return `AccessKeyCredential(type=${this.securityToken ? 'sts' : 'access_key'}, <redacted>)`; }\n toJSON(): string { return this[inspect.custom](); }\n}\n\nexport class ResourceCredential extends AccessKeyCredential {\n readonly expiration: Date;\n readonly credentialType = 'ram_sts';\n constructor(values: AccessKeyOptions & { securityToken: string; expiration: Date }) {\n super(values);\n if (!Number.isFinite(values.expiration.getTime())) throw new TypeError('STS expiration must be a valid Date');\n this.expiration = new Date(values.expiration);\n }\n [inspect.custom](): string { return `ResourceCredential(expiration=${this.expiration.toISOString()}, <redacted>)`; }\n}\n\nexport interface CredentialProvider {\n get(purpose?: string): Promise<AccessKeyCredential> | AccessKeyCredential;\n}\n","import { CredentialExchangeError } from '../errors';\nimport { ResourceCredential } from './access-key';\nimport type { AgentSATokenSource } from './agent-sa-token';\nimport { ControllerClient, type ControllerOptions } from './controller';\n\nexport const HIGH_CODE_SDK_PURPOSE = 'highcode_sdk';\nexport const AGENT_IDENTITY_DATA_PURPOSE = 'agentidentitydata';\n\nexport class ResourceSTSProvider {\n private readonly controller: ControllerClient;\n private readonly cache = new Map<string | undefined, ResourceCredential>();\n private readonly pending = new Map<string | undefined, Promise<ResourceCredential>>();\n\n constructor(endpoint: string, source: AgentSATokenSource, options: ControllerOptions = {}) {\n this.controller = new ControllerClient(endpoint, source, options);\n }\n async get(purpose?: string): Promise<ResourceCredential> {\n if (purpose !== undefined) {\n purpose = purpose.trim();\n if (!purpose) throw new TypeError('purpose must not be empty');\n }\n const cached = this.cache.get(purpose);\n if (cached && cached.expiration.getTime() > Date.now() + 300_000) return cached;\n const current = this.pending.get(purpose);\n if (current) return current;\n const request = this.exchange(purpose);\n this.pending.set(purpose, request);\n try {\n const credential = await request;\n this.cache.set(purpose, credential);\n return credential;\n } finally { this.pending.delete(purpose); }\n }\n close(): void { this.controller.close(); this.cache.clear(); }\n\n private async exchange(purpose?: string): Promise<ResourceCredential> {\n const response = await this.controller.post('/api/v1/credentials/sts', purpose);\n if (response.status < 200 || response.status >= 300) {\n throw new CredentialExchangeError(`Controller STS request failed with HTTP ${response.status}${response.message ? `: ${response.message}` : ''}`);\n }\n try {\n const value = response.payload as Record<string, unknown>;\n const read = (key: string): string => {\n const item = value[key];\n if (typeof item !== 'string' || !item.trim()) throw new Error('invalid field');\n return item.trim();\n };\n const expiration = new Date(read('expiration'));\n if (!(expiration.getTime() > Date.now())) throw new Error('expired STS');\n return new ResourceCredential({\n accessKeyId: read('access_key_id'), accessKeySecret: read('access_key_secret'),\n securityToken: read('security_token'), expiration,\n });\n } catch { throw new CredentialExchangeError('Controller returned an invalid STS response'); }\n }\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,95 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); var _class; var _class2; var _class3; var _class4; var _class5; var _class6; var _class7; var _class8; var _class9; var _class10; var _class11; var _class12; var _class13; var _class14; var _class15; var _class16;// src/errors.ts
2
+ var AgentCoreError = (_class = class extends Error {
3
+ __init() {this.code = "AGENTCORE_ERROR"}
4
+ constructor(message, options) {
5
+ super(message, options);_class.prototype.__init.call(this);;
6
+ this.name = new.target.name;
7
+ }
8
+ }, _class);
9
+ var ConfigError = (_class2 = class extends AgentCoreError {constructor(...args) { super(...args); _class2.prototype.__init2.call(this); }
10
+ __init2() {this.code = "CONFIG_INVALID"}
11
+ }, _class2);
12
+ var ContextError = (_class3 = class extends AgentCoreError {constructor(...args2) { super(...args2); _class3.prototype.__init3.call(this); }
13
+ __init3() {this.code = "CONTEXT_INVALID"}
14
+ }, _class3);
15
+ var AuthenticationError = (_class4 = class extends AgentCoreError {constructor(...args3) { super(...args3); _class4.prototype.__init4.call(this); }
16
+ __init4() {this.code = "AUTHENTICATION_FAILED"}
17
+ }, _class4);
18
+ var CredentialExchangeError = (_class5 = class extends AuthenticationError {constructor(...args4) { super(...args4); _class5.prototype.__init5.call(this); }
19
+ __init5() {this.code = "CREDENTIAL_EXCHANGE_FAILED"}
20
+ }, _class5);
21
+ var WorkloadIdentityNotConfiguredError = (_class6 = class extends AuthenticationError {constructor(...args5) { super(...args5); _class6.prototype.__init6.call(this); }
22
+ __init6() {this.code = "WORKLOAD_IDENTITY_NOT_CONFIGURED"}
23
+ }, _class6);
24
+ var WorkloadAccessTokenRejectedError = (_class7 = class extends CredentialExchangeError {constructor(...args6) { super(...args6); _class7.prototype.__init7.call(this); }
25
+ __init7() {this.code = "WORKLOAD_ACCESS_TOKEN_REJECTED"}
26
+ }, _class7);
27
+ var ResourceNotConfiguredError = (_class8 = class extends AgentCoreError {constructor(...args7) { super(...args7); _class8.prototype.__init8.call(this); }
28
+ __init8() {this.code = "RESOURCE_NOT_CONFIGURED"}
29
+ }, _class8);
30
+ var ModelConnectionNotFoundError = (_class9 = class extends ResourceNotConfiguredError {constructor(...args8) { super(...args8); _class9.prototype.__init9.call(this); }
31
+ __init9() {this.code = "MODEL_CONNECTION_NOT_FOUND"}
32
+ }, _class9);
33
+ var MCPServerNotFoundError = (_class10 = class extends ResourceNotConfiguredError {constructor(...args9) { super(...args9); _class10.prototype.__init10.call(this); }
34
+ __init10() {this.code = "MCP_SERVER_NOT_FOUND"}
35
+ }, _class10);
36
+ var InvocationError = (_class11 = class extends AgentCoreError {constructor(...args10) { super(...args10); _class11.prototype.__init11.call(this); }
37
+ __init11() {this.code = "INVOCATION_FAILED"}
38
+ }, _class11);
39
+ var UnsupportedFeatureError = (_class12 = class extends AgentCoreError {constructor(...args11) { super(...args11); _class12.prototype.__init12.call(this); }
40
+ __init12() {this.code = "UNSUPPORTED_FEATURE"}
41
+ }, _class12);
42
+ var MemoryValidationError = (_class13 = class extends AgentCoreError {constructor(...args12) { super(...args12); _class13.prototype.__init13.call(this); }
43
+ __init13() {this.code = "MEMORY_VALIDATION_FAILED"}
44
+ }, _class13);
45
+ var MemoryAPIError = (_class14 = class extends AgentCoreError {
46
+ constructor(operation, details = {}) {
47
+ super(`AgentCore Memory operation ${operation} failed`);_class14.prototype.__init14.call(this);;
48
+ this.operation = operation;
49
+ this.serviceCode = details.serviceCode;
50
+ this.httpStatusCode = details.httpStatusCode;
51
+ this.requestId = details.requestId;
52
+ }
53
+
54
+ __init14() {this.code = "MEMORY_API_FAILED"}
55
+
56
+
57
+
58
+ }, _class14);
59
+ var MemoryContractError = (_class15 = class extends AgentCoreError {
60
+ constructor(operation, detail) {
61
+ super(`AgentCore Memory ${operation} returned an invalid response: ${detail}`);_class15.prototype.__init15.call(this);;
62
+ this.operation = operation;
63
+ this.detail = detail;
64
+ }
65
+
66
+
67
+ __init15() {this.code = "MEMORY_RESPONSE_INVALID"}
68
+ }, _class15);
69
+ var AddMemoriesOutcomeUnknownError = (_class16 = class extends MemoryAPIError {
70
+ __init16() {this.code = "ADD_MEMORIES_OUTCOME_UNKNOWN"}
71
+ constructor(operation, details = {}) {
72
+ super(operation, details);_class16.prototype.__init16.call(this);;
73
+ this.message = "AgentCore Memory AddMemories outcome is unknown; the write may have succeeded";
74
+ }
75
+ }, _class16);
76
+
77
+
78
+
79
+
80
+
81
+
82
+
83
+
84
+
85
+
86
+
87
+
88
+
89
+
90
+
91
+
92
+
93
+
94
+ exports.AgentCoreError = AgentCoreError; exports.ConfigError = ConfigError; exports.ContextError = ContextError; exports.AuthenticationError = AuthenticationError; exports.CredentialExchangeError = CredentialExchangeError; exports.WorkloadIdentityNotConfiguredError = WorkloadIdentityNotConfiguredError; exports.WorkloadAccessTokenRejectedError = WorkloadAccessTokenRejectedError; exports.ResourceNotConfiguredError = ResourceNotConfiguredError; exports.ModelConnectionNotFoundError = ModelConnectionNotFoundError; exports.MCPServerNotFoundError = MCPServerNotFoundError; exports.InvocationError = InvocationError; exports.UnsupportedFeatureError = UnsupportedFeatureError; exports.MemoryValidationError = MemoryValidationError; exports.MemoryAPIError = MemoryAPIError; exports.MemoryContractError = MemoryContractError; exports.AddMemoriesOutcomeUnknownError = AddMemoriesOutcomeUnknownError;
95
+ //# sourceMappingURL=chunk-JSP7ZROS.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/zhuoguang/Documents/Code/collaborate/hiclaw/agentcore-sdk-nodejs/dist/chunk-JSP7ZROS.cjs","../src/errors.ts"],"names":[],"mappings":"AAAA;ACAO,IAAM,eAAA,YAAN,MAAA,QAA6B,MAAM;AAAA,iBAC/B,KAAA,EAAe,kBAAA;AAAA,EACxB,WAAA,CAAY,OAAA,EAAiB,OAAA,EAAwB;AACnD,IAAA,KAAA,CAAM,OAAA,EAAS,OAAO,qCAAA;AACtB,IAAA,IAAA,CAAK,KAAA,EAAO,GAAA,CAAA,MAAA,CAAW,IAAA;AAAA,EACzB;AACF,UAAA;AAEO,IAAM,YAAA,aAAN,MAAA,QAA0B,eAAe;AAAA,kBAAoB,KAAA,EAAe,iBAAA;AAAkB,WAAA;AAC9F,IAAM,aAAA,aAAN,MAAA,QAA2B,eAAe;AAAA,kBAAoB,KAAA,EAAe,kBAAA;AAAmB,WAAA;AAChG,IAAM,oBAAA,aAAN,MAAA,QAAkC,eAAe;AAAA,kBAAoB,KAAA,EAAe,wBAAA;AAAyB,WAAA;AAC7G,IAAM,wBAAA,aAAN,MAAA,QAAsC,oBAAoB;AAAA,kBAAoB,KAAA,EAAe,6BAAA;AAA8B,WAAA;AAC3H,IAAM,mCAAA,aAAN,MAAA,QAAiD,oBAAoB;AAAA,kBAAoB,KAAA,EAAO,mCAAA;AAAoC,WAAA;AACpI,IAAM,iCAAA,aAAN,MAAA,QAA+C,wBAAwB;AAAA,kBAAoB,KAAA,EAAO,iCAAA;AAAkC,WAAA;AACpI,IAAM,2BAAA,aAAN,MAAA,QAAyC,eAAe;AAAA,kBAAoB,KAAA,EAAe,0BAAA;AAA2B,WAAA;AACtH,IAAM,6BAAA,aAAN,MAAA,QAA2C,2BAA2B;AAAA,kBAAoB,KAAA,EAAO,6BAAA;AAA8B,WAAA;AAC/H,IAAM,uBAAA,cAAN,MAAA,QAAqC,2BAA2B;AAAA,mBAAoB,KAAA,EAAO,uBAAA;AAAwB,YAAA;AACnH,IAAM,gBAAA,cAAN,MAAA,QAA8B,eAAe;AAAA,mBAAoB,KAAA,EAAO,oBAAA;AAAqB,YAAA;AAC7F,IAAM,wBAAA,cAAN,MAAA,QAAsC,eAAe;AAAA,mBAAoB,KAAA,EAAO,sBAAA;AAAuB,YAAA;AAEvG,IAAM,sBAAA,cAAN,MAAA,QAAoC,eAAe;AAAA,mBAAoB,KAAA,EAAO,2BAAA;AAA4B,YAAA;AAE1G,IAAM,eAAA,cAAN,MAAA,QAA6B,eAAe;AAAA,EAKjD,WAAA,CAAqB,SAAA,EAAmB,QAAA,EAA8B,CAAC,CAAA,EAAG;AACxE,IAAA,KAAA,CAAM,CAAA,2BAAA,EAA8B,SAAS,CAAA,OAAA,CAAS,yCAAA;AADnC,IAAA,IAAA,CAAA,UAAA,EAAA,SAAA;AAEnB,IAAA,IAAA,CAAK,YAAA,EAAc,OAAA,CAAQ,WAAA;AAAa,IAAA,IAAA,CAAK,eAAA,EAAiB,OAAA,CAAQ,cAAA;AAAgB,IAAA,IAAA,CAAK,UAAA,EAAY,OAAA,CAAQ,SAAA;AAAA,EACjH;AAAA,EAHqB;AAAA,mBAJH,KAAA,EAAe,oBAAA;AAAA,EACxB;AAAA,EACA;AAAA,EACA;AAKX,YAAA;AACO,IAAM,oBAAA,cAAN,MAAA,QAAkC,eAAe;AAAA,EAEtD,WAAA,CAAqB,SAAA,EAA4B,MAAA,EAAgB;AAAE,IAAA,KAAA,CAAM,CAAA,iBAAA,EAAoB,SAAS,CAAA,+BAAA,EAAkC,MAAM,CAAA,CAAA;AAAzH,IAAA;AAA4B,IAAA;AAAkG,EAAA;AAA9H,EAAA;AAA4B,EAAA;AADxB,mBAAA;AAE3B;AACmE;AACxC,mBAAA;AACwC,EAAA;AACvC,IAAA;AAAkB,IAAA;AAC5C,EAAA;AACF;ADkCgF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA","file":"/Users/zhuoguang/Documents/Code/collaborate/hiclaw/agentcore-sdk-nodejs/dist/chunk-JSP7ZROS.cjs","sourcesContent":[null,"export class AgentCoreError extends Error {\n readonly code: string = 'AGENTCORE_ERROR';\n constructor(message: string, options?: ErrorOptions) {\n super(message, options);\n this.name = new.target.name;\n }\n}\n\nexport class ConfigError extends AgentCoreError { override readonly code: string = 'CONFIG_INVALID'; }\nexport class ContextError extends AgentCoreError { override readonly code: string = 'CONTEXT_INVALID'; }\nexport class AuthenticationError extends AgentCoreError { override readonly code: string = 'AUTHENTICATION_FAILED'; }\nexport class CredentialExchangeError extends AuthenticationError { override readonly code: string = 'CREDENTIAL_EXCHANGE_FAILED'; }\nexport class WorkloadIdentityNotConfiguredError extends AuthenticationError { override readonly code = 'WORKLOAD_IDENTITY_NOT_CONFIGURED'; }\nexport class WorkloadAccessTokenRejectedError extends CredentialExchangeError { override readonly code = 'WORKLOAD_ACCESS_TOKEN_REJECTED'; }\nexport class ResourceNotConfiguredError extends AgentCoreError { override readonly code: string = 'RESOURCE_NOT_CONFIGURED'; }\nexport class ModelConnectionNotFoundError extends ResourceNotConfiguredError { override readonly code = 'MODEL_CONNECTION_NOT_FOUND'; }\nexport class MCPServerNotFoundError extends ResourceNotConfiguredError { override readonly code = 'MCP_SERVER_NOT_FOUND'; }\nexport class InvocationError extends AgentCoreError { override readonly code = 'INVOCATION_FAILED'; }\nexport class UnsupportedFeatureError extends AgentCoreError { override readonly code = 'UNSUPPORTED_FEATURE'; }\n\nexport class MemoryValidationError extends AgentCoreError { override readonly code = 'MEMORY_VALIDATION_FAILED'; }\nexport interface MemoryErrorDetails { serviceCode?: string; httpStatusCode?: number; requestId?: string; }\nexport class MemoryAPIError extends AgentCoreError {\n override readonly code: string = 'MEMORY_API_FAILED';\n readonly serviceCode?: string;\n readonly httpStatusCode?: number;\n readonly requestId?: string;\n constructor(readonly operation: string, details: MemoryErrorDetails = {}) {\n super(`AgentCore Memory operation ${operation} failed`);\n this.serviceCode = details.serviceCode; this.httpStatusCode = details.httpStatusCode; this.requestId = details.requestId;\n }\n}\nexport class MemoryContractError extends AgentCoreError {\n override readonly code = 'MEMORY_RESPONSE_INVALID';\n constructor(readonly operation: string, readonly detail: string) { super(`AgentCore Memory ${operation} returned an invalid response: ${detail}`); }\n}\nexport class AddMemoriesOutcomeUnknownError extends MemoryAPIError {\n override readonly code = 'ADD_MEMORIES_OUTCOME_UNKNOWN';\n constructor(operation: string, details: MemoryErrorDetails = {}) {\n super(operation, details); this.message = 'AgentCore Memory AddMemories outcome is unknown; the write may have succeeded';\n }\n}\n"]}
@@ -0,0 +1,238 @@
1
+ import {
2
+ Tool
3
+ } from "./chunk-EKXZKKJJ.js";
4
+ import {
5
+ nullLogger
6
+ } from "./chunk-NZL3VPJ2.js";
7
+ import {
8
+ ConfigError
9
+ } from "./chunk-MZ5UWGXS.js";
10
+
11
+ // src/mcp/client.ts
12
+ import { Client } from "@modelcontextprotocol/sdk/client/index.js";
13
+ import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
14
+ import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
15
+ import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
16
+ import { CallToolResultSchema, McpError, ErrorCode } from "@modelcontextprotocol/sdk/types.js";
17
+ import { inspect } from "util";
18
+
19
+ // src/mcp/headers.ts
20
+ var transportHeaders = /* @__PURE__ */ new Set([
21
+ "host",
22
+ "content-length",
23
+ "connection",
24
+ "transfer-encoding",
25
+ "upgrade",
26
+ "mcp-session-id",
27
+ "mcp-protocol-version",
28
+ "last-event-id",
29
+ "content-type",
30
+ "accept"
31
+ ]);
32
+ function mergeMCPHeaders(base, custom) {
33
+ const result = { ...base };
34
+ if (custom === void 0) return result;
35
+ if (!custom || typeof custom !== "object" || Array.isArray(custom)) throw new ConfigError("MCP headers must be an object");
36
+ const protectedNames = /* @__PURE__ */ new Set([...Object.keys(base).map((name) => name.toLowerCase()), ...transportHeaders, "authorization"]);
37
+ const seen = /* @__PURE__ */ new Set();
38
+ for (const [name, value] of Object.entries(custom)) {
39
+ if (!/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/.test(name)) throw new ConfigError("Invalid MCP header name");
40
+ if (typeof value !== "string" || /[\x00-\x1f\x7f]/.test(value)) throw new ConfigError("MCP header values must be strings without control characters");
41
+ const folded = name.toLowerCase();
42
+ if (protectedNames.has(folded)) throw new ConfigError(`MCP header is protected: ${folded}`);
43
+ if (seen.has(folded)) throw new ConfigError(`Duplicate MCP header: ${folded}`);
44
+ seen.add(folded);
45
+ Object.defineProperty(result, folded, { value, enumerable: true, configurable: true, writable: true });
46
+ }
47
+ return result;
48
+ }
49
+
50
+ // src/mcp/client.ts
51
+ function mcpServerURL(gatewayURL, id) {
52
+ const gateway = gatewayURL.replace(/\/+$/, "").replace(/\/(?:mcp|mcp-servers)$/, "");
53
+ return `${gateway}/mcp-servers/${encodeURIComponent(id)}`;
54
+ }
55
+ var MCPClient = class _MCPClient {
56
+ constructor(options, descriptor) {
57
+ this.options = options;
58
+ this.descriptor = descriptor;
59
+ this.logger = options.logger ?? nullLogger;
60
+ this.timeouts = { sessionMs: options.sessionMs ?? 3e4, metadataMs: options.metadataMs ?? 6e4, toolMs: options.toolMs ?? 6e5 };
61
+ if (Object.values(this.timeouts).some((timeout) => !Number.isFinite(timeout) || timeout <= 0)) throw new ConfigError("MCP operation timeouts must be positive");
62
+ if (options.transport !== "stdio") {
63
+ let url;
64
+ try {
65
+ url = new URL(options.url);
66
+ } catch {
67
+ throw new ConfigError("Direct MCP URL must be HTTP(S)");
68
+ }
69
+ if (!["http:", "https:"].includes(url.protocol)) throw new ConfigError("Direct MCP URL must be HTTP(S)");
70
+ if (options.transport !== void 0 && !["streamable-http", "sse"].includes(options.transport)) throw new ConfigError("MCP transport must be streamable-http, sse, or stdio");
71
+ }
72
+ this.logger.info("agentcore.mcp.client.created", { mode: descriptor ? "managed" : "direct", transport: options.transport ?? "streamable-http", url: this.safeURL });
73
+ }
74
+ options;
75
+ descriptor;
76
+ logger;
77
+ state;
78
+ opening;
79
+ closed = false;
80
+ closing;
81
+ timeouts;
82
+ static platform(config, descriptor, options = {}) {
83
+ const { headers: custom, credentialHeadersProvider, ...connectionOptions } = options;
84
+ const customHeaders = mergeMCPHeaders({}, custom);
85
+ const headers = mergeMCPHeaders(config.gatewayHeaders, custom);
86
+ return new _MCPClient({ ...connectionOptions, url: mcpServerURL(config.mcpGatewayUrl, descriptor.mcpServerId), transport: "streamable-http", headersProvider: async () => {
87
+ if (!credentialHeadersProvider) return headers;
88
+ const bound = mergeMCPHeaders(config.gatewayHeaders, await credentialHeadersProvider());
89
+ return mergeMCPHeaders(bound, customHeaders);
90
+ } }, descriptor);
91
+ }
92
+ static direct(options) {
93
+ return new _MCPClient(options);
94
+ }
95
+ async listTools(options = {}) {
96
+ return this.withSession("list_tools", async (session) => {
97
+ const definitions = [];
98
+ let cursor;
99
+ const deadline = AbortSignal.timeout(this.timeouts.metadataMs);
100
+ const signal = AbortSignal.any([deadline, ...options.signal ? [options.signal] : []]);
101
+ do {
102
+ const result = await session.client.listTools(cursor ? { cursor } : void 0, { signal, timeout: this.timeouts.metadataMs });
103
+ definitions.push(...result.tools);
104
+ cursor = result.nextCursor;
105
+ } while (cursor);
106
+ return definitions.map((definition) => new Tool({
107
+ name: definition.name,
108
+ description: definition.description ?? "",
109
+ parameters: definition.inputSchema,
110
+ invoke: (arguments_) => this.callTool(definition.name, arguments_)
111
+ }));
112
+ });
113
+ }
114
+ async tools(options = {}) {
115
+ return this.listTools(options);
116
+ }
117
+ async callTool(name, arguments_, options = {}) {
118
+ return this.withSession("call_tool", (session) => session.client.callTool(
119
+ { name, arguments: arguments_ },
120
+ CallToolResultSchema,
121
+ { timeout: this.timeouts.toolMs, signal: options.signal }
122
+ ));
123
+ }
124
+ close() {
125
+ if (this.closing) return this.closing;
126
+ this.closed = true;
127
+ this.closing = (async () => {
128
+ if (this.opening && this.state) this.state.abort.abort();
129
+ await this.opening?.catch(() => void 0);
130
+ if (this.state) await this.retire(this.state);
131
+ })();
132
+ return this.closing;
133
+ }
134
+ [inspect.custom]() {
135
+ return `MCPClient(url=${this.safeURL}, <redacted>)`;
136
+ }
137
+ toJSON() {
138
+ return this[inspect.custom]();
139
+ }
140
+ get safeURL() {
141
+ if (this.options.transport === "stdio") return "stdio";
142
+ const url = new URL(this.options.url);
143
+ return `${url.origin}${url.pathname}`;
144
+ }
145
+ async acquire() {
146
+ for (; ; ) {
147
+ if (this.closed) throw new Error("MCP client is closed");
148
+ if (this.opening) return this.opening;
149
+ if (this.state?.invalid) {
150
+ await this.retire(this.state);
151
+ continue;
152
+ }
153
+ if (this.state) return this.state;
154
+ const request = this.open();
155
+ this.opening = request;
156
+ try {
157
+ return await request;
158
+ } finally {
159
+ this.opening = void 0;
160
+ }
161
+ }
162
+ }
163
+ async open() {
164
+ const client = new Client({ name: "agentcore-sdk", version: "0.1.0" });
165
+ const abort = new AbortController();
166
+ let transport;
167
+ if (this.options.transport === "stdio") transport = new StdioClientTransport(this.options.server);
168
+ else {
169
+ const headers = await this.options.headersProvider?.() ?? {};
170
+ const fetch = (input, init) => globalThis.fetch(input, { ...init, redirect: "manual", signal: AbortSignal.any([abort.signal, ...init?.signal ? [init.signal] : []]) });
171
+ transport = this.options.transport === "sse" ? new SSEClientTransport(new URL(this.options.url), { requestInit: { headers }, fetch }) : new StreamableHTTPClientTransport(new URL(this.options.url), { requestInit: { headers }, fetch });
172
+ }
173
+ const session = { client, transport, abort, invalid: false, active: /* @__PURE__ */ new Set() };
174
+ this.state = session;
175
+ const timer = setTimeout(() => abort.abort(new Error("MCP session open timed out")), this.timeouts.sessionMs);
176
+ client.onclose = () => {
177
+ session.invalid = true;
178
+ };
179
+ client.onerror = (error) => {
180
+ if (this.closed || session.closing) return;
181
+ session.invalid = true;
182
+ this.logger.warn("agentcore.mcp.session.error", { url: this.safeURL, errorType: error.name });
183
+ };
184
+ this.logger.info("agentcore.mcp.session.open.started", { url: this.safeURL, timeoutMs: this.timeouts.sessionMs });
185
+ try {
186
+ await client.connect(transport, { signal: abort.signal, timeout: this.timeouts.sessionMs });
187
+ abort.signal.throwIfAborted();
188
+ if (this.closed) throw new Error("MCP client is closed");
189
+ this.logger.info("agentcore.mcp.session.open.succeeded", { url: this.safeURL });
190
+ return session;
191
+ } catch (error) {
192
+ await this.retire(session);
193
+ throw error;
194
+ } finally {
195
+ clearTimeout(timer);
196
+ }
197
+ }
198
+ async withSession(operation, call) {
199
+ const session = await this.acquire();
200
+ if (this.closed) throw new Error("MCP client is closed");
201
+ const request = call(session);
202
+ session.active.add(request);
203
+ this.logger.info("agentcore.mcp.request.started", { operation, url: this.safeURL });
204
+ try {
205
+ const result = await request;
206
+ this.logger.info("agentcore.mcp.request.succeeded", { operation, url: this.safeURL });
207
+ return result;
208
+ } catch (error) {
209
+ if (!(error instanceof McpError) || [ErrorCode.ConnectionClosed, ErrorCode.RequestTimeout].includes(error.code)) session.invalid = true;
210
+ this.logger.warn("agentcore.mcp.request.failed", { operation, url: this.safeURL, errorType: error instanceof Error ? error.name : "unknown" });
211
+ throw error;
212
+ } finally {
213
+ session.active.delete(request);
214
+ }
215
+ }
216
+ retire(session) {
217
+ if (session.closing) return session.closing;
218
+ session.invalid = true;
219
+ session.closing = (async () => {
220
+ await Promise.allSettled([...session.active]);
221
+ session.abort.abort();
222
+ try {
223
+ await session.client.close();
224
+ } catch (error) {
225
+ this.logger.warn("agentcore.mcp.session.close.failed", { errorType: error instanceof Error ? error.name : "unknown", url: this.safeURL });
226
+ }
227
+ if (this.state === session) this.state = void 0;
228
+ })();
229
+ return session.closing;
230
+ }
231
+ };
232
+
233
+ export {
234
+ mergeMCPHeaders,
235
+ mcpServerURL,
236
+ MCPClient
237
+ };
238
+ //# sourceMappingURL=chunk-JW62DVIC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/mcp/client.ts","../src/mcp/headers.ts"],"sourcesContent":["import { Client } from '@modelcontextprotocol/sdk/client/index.js';\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol/sdk/client/streamableHttp.js';\nimport { SSEClientTransport } from '@modelcontextprotocol/sdk/client/sse.js';\nimport { StdioClientTransport, type StdioServerParameters } from '@modelcontextprotocol/sdk/client/stdio.js';\nimport type { Transport } from '@modelcontextprotocol/sdk/shared/transport.js';\nimport { CallToolResultSchema, McpError, ErrorCode, type CallToolResult } from '@modelcontextprotocol/sdk/types.js';\nimport { inspect } from 'node:util';\nimport { ConfigError } from '../errors';\nimport { nullLogger, type Logger } from '../logging';\nimport type { MCPDescriptor } from '../controlplane/client';\nimport type { AgentConfig } from '../runtime/config';\nimport type { HeadersProvider } from '../model/client';\nimport { Tool, type ToolArguments } from '../integrations/common';\nimport { mergeMCPHeaders } from './headers';\n\nexport interface MCPTimeouts { sessionMs?: number; metadataMs?: number; toolMs?: number; }\nexport interface ManagedMCPOptions extends MCPTimeouts { headers?: Readonly<Record<string, string>>; credentialName?: string; }\nexport type DirectMCPOptions = ({ url: string; transport?: 'streamable-http' | 'sse'; headersProvider?: HeadersProvider } |\n { transport: 'stdio'; server: StdioServerParameters }) & MCPTimeouts & { logger?: Logger };\nexport interface MCPCallOptions { signal?: AbortSignal; }\ninterface Session {\n client: Client;\n transport: Transport;\n abort: AbortController;\n invalid: boolean;\n active: Set<Promise<unknown>>;\n closing?: Promise<void>;\n}\n\nexport function mcpServerURL(gatewayURL: string, id: string): string {\n const gateway = gatewayURL.replace(/\\/+$/, '').replace(/\\/(?:mcp|mcp-servers)$/, '');\n return `${gateway}/mcp-servers/${encodeURIComponent(id)}`;\n}\n\nexport class MCPClient {\n readonly descriptor?: MCPDescriptor;\n private readonly logger: Logger;\n private state?: Session;\n private opening?: Promise<Session>;\n private closed = false;\n private closing?: Promise<void>;\n private readonly timeouts: Required<MCPTimeouts>;\n\n private constructor(private readonly options: DirectMCPOptions, descriptor?: MCPDescriptor) {\n this.descriptor = descriptor;\n this.logger = options.logger ?? nullLogger;\n this.timeouts = { sessionMs: options.sessionMs ?? 30_000, metadataMs: options.metadataMs ?? 60_000, toolMs: options.toolMs ?? 600_000 };\n if (Object.values(this.timeouts).some((timeout) => !Number.isFinite(timeout) || timeout <= 0)) throw new ConfigError('MCP operation timeouts must be positive');\n if (options.transport !== 'stdio') {\n let url: URL;\n try { url = new URL(options.url); } catch { throw new ConfigError('Direct MCP URL must be HTTP(S)'); }\n if (!['http:', 'https:'].includes(url.protocol)) throw new ConfigError('Direct MCP URL must be HTTP(S)');\n if (options.transport !== undefined && !['streamable-http', 'sse'].includes(options.transport)) throw new ConfigError('MCP transport must be streamable-http, sse, or stdio');\n }\n this.logger.info('agentcore.mcp.client.created', { mode: descriptor ? 'managed' : 'direct', transport: options.transport ?? 'streamable-http', url: this.safeURL });\n }\n static platform(config: AgentConfig, descriptor: MCPDescriptor, options: Omit<ManagedMCPOptions, 'credentialName'> & {\n logger?: Logger; credentialHeadersProvider?: () => Promise<Record<string, string>>;\n } = {}): MCPClient {\n const { headers: custom, credentialHeadersProvider, ...connectionOptions } = options;\n const customHeaders = mergeMCPHeaders({}, custom);\n const headers = mergeMCPHeaders(config.gatewayHeaders, custom);\n return new MCPClient({ ...connectionOptions, url: mcpServerURL(config.mcpGatewayUrl, descriptor.mcpServerId), transport: 'streamable-http', headersProvider: async () => {\n if (!credentialHeadersProvider) return headers;\n const bound = mergeMCPHeaders(config.gatewayHeaders, await credentialHeadersProvider());\n return mergeMCPHeaders(bound, customHeaders);\n } }, descriptor);\n }\n static direct(options: DirectMCPOptions): MCPClient { return new MCPClient(options); }\n\n async listTools(options: MCPCallOptions = {}): Promise<Tool[]> {\n return this.withSession('list_tools', async (session) => {\n const definitions: Awaited<ReturnType<Client['listTools']>>['tools'] = [];\n let cursor: string | undefined;\n const deadline = AbortSignal.timeout(this.timeouts.metadataMs);\n const signal = AbortSignal.any([deadline, ...(options.signal ? [options.signal] : [])]);\n do {\n const result = await session.client.listTools(cursor ? { cursor } : undefined, { signal, timeout: this.timeouts.metadataMs });\n definitions.push(...result.tools); cursor = result.nextCursor;\n } while (cursor);\n return definitions.map((definition) => new Tool({ name: definition.name, description: definition.description ?? '', parameters: definition.inputSchema,\n invoke: (arguments_) => this.callTool(definition.name, arguments_),\n }));\n });\n }\n async tools(options: MCPCallOptions = {}): Promise<Tool[]> { return this.listTools(options); }\n async callTool(name: string, arguments_: ToolArguments, options: MCPCallOptions = {}): Promise<CallToolResult> {\n return this.withSession('call_tool', (session) => session.client.callTool({ name, arguments: arguments_ }, CallToolResultSchema,\n { timeout: this.timeouts.toolMs, signal: options.signal }) as Promise<CallToolResult>);\n }\n\n close(): Promise<void> {\n if (this.closing) return this.closing;\n this.closed = true;\n this.closing = (async () => {\n if (this.opening && this.state) this.state.abort.abort();\n await this.opening?.catch(() => undefined);\n if (this.state) await this.retire(this.state);\n })();\n return this.closing;\n }\n [inspect.custom](): string { return `MCPClient(url=${this.safeURL}, <redacted>)`; }\n toJSON(): string { return this[inspect.custom](); }\n\n private get safeURL(): string {\n if (this.options.transport === 'stdio') return 'stdio';\n const url = new URL(this.options.url); return `${url.origin}${url.pathname}`;\n }\n private async acquire(): Promise<Session> {\n for (;;) {\n if (this.closed) throw new Error('MCP client is closed');\n if (this.opening) return this.opening;\n if (this.state?.invalid) { await this.retire(this.state); continue; }\n if (this.state) return this.state;\n const request = this.open(); this.opening = request;\n try { return await request; } finally { this.opening = undefined; }\n }\n }\n private async open(): Promise<Session> {\n const client = new Client({ name: 'agentcore-sdk', version: '0.1.0' });\n const abort = new AbortController();\n let transport: Transport;\n if (this.options.transport === 'stdio') transport = new StdioClientTransport(this.options.server);\n else {\n const headers = await this.options.headersProvider?.() ?? {};\n const fetch: typeof globalThis.fetch = (input, init) => globalThis.fetch(input, { ...init, redirect: 'manual', signal: AbortSignal.any([abort.signal, ...(init?.signal ? [init.signal] : [])]) });\n transport = this.options.transport === 'sse'\n ? new SSEClientTransport(new URL(this.options.url), { requestInit: { headers }, fetch })\n : new StreamableHTTPClientTransport(new URL(this.options.url), { requestInit: { headers }, fetch });\n }\n const session: Session = { client, transport, abort, invalid: false, active: new Set() };\n this.state = session;\n const timer = setTimeout(() => abort.abort(new Error('MCP session open timed out')), this.timeouts.sessionMs);\n client.onclose = () => { session.invalid = true; };\n client.onerror = (error) => {\n if (this.closed || session.closing) return;\n session.invalid = true;\n this.logger.warn('agentcore.mcp.session.error', { url: this.safeURL, errorType: error.name });\n };\n this.logger.info('agentcore.mcp.session.open.started', { url: this.safeURL, timeoutMs: this.timeouts.sessionMs });\n try {\n await client.connect(transport, { signal: abort.signal, timeout: this.timeouts.sessionMs });\n abort.signal.throwIfAborted();\n if (this.closed) throw new Error('MCP client is closed');\n this.logger.info('agentcore.mcp.session.open.succeeded', { url: this.safeURL });\n return session;\n } catch (error) { await this.retire(session); throw error; }\n finally { clearTimeout(timer); }\n }\n\n private async withSession<T>(operation: string, call: (session: Session) => Promise<T>): Promise<T> {\n const session = await this.acquire();\n if (this.closed) throw new Error('MCP client is closed');\n const request = call(session); session.active.add(request);\n this.logger.info('agentcore.mcp.request.started', { operation, url: this.safeURL });\n try { const result = await request; this.logger.info('agentcore.mcp.request.succeeded', { operation, url: this.safeURL }); return result; }\n catch (error) {\n if (!(error instanceof McpError) || [ErrorCode.ConnectionClosed, ErrorCode.RequestTimeout].includes(error.code)) session.invalid = true;\n this.logger.warn('agentcore.mcp.request.failed', { operation, url: this.safeURL, errorType: error instanceof Error ? error.name : 'unknown' });\n throw error;\n } finally { session.active.delete(request); }\n }\n private retire(session: Session): Promise<void> {\n if (session.closing) return session.closing;\n session.invalid = true;\n session.closing = (async () => {\n await Promise.allSettled([...session.active]);\n session.abort.abort();\n try { await session.client.close(); }\n catch (error) { this.logger.warn('agentcore.mcp.session.close.failed', { errorType: error instanceof Error ? error.name : 'unknown', url: this.safeURL }); }\n if (this.state === session) this.state = undefined;\n })();\n return session.closing;\n }\n}\n","import { ConfigError } from '../errors';\n\nconst transportHeaders = new Set([\n 'host', 'content-length', 'connection', 'transfer-encoding', 'upgrade',\n 'mcp-session-id', 'mcp-protocol-version', 'last-event-id', 'content-type', 'accept',\n]);\n\n/** Copy fixed headers, rejecting case-insensitive credential/transport conflicts. */\nexport function mergeMCPHeaders(base: Readonly<Record<string, string>>, custom?: Readonly<Record<string, string>>): Record<string, string> {\n const result = { ...base };\n if (custom === undefined) return result;\n if (!custom || typeof custom !== 'object' || Array.isArray(custom)) throw new ConfigError('MCP headers must be an object');\n const protectedNames = new Set([...Object.keys(base).map((name) => name.toLowerCase()), ...transportHeaders, 'authorization']);\n const seen = new Set<string>();\n for (const [name, value] of Object.entries(custom)) {\n if (!/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/.test(name)) throw new ConfigError('Invalid MCP header name');\n if (typeof value !== 'string' || /[\\x00-\\x1f\\x7f]/.test(value)) throw new ConfigError('MCP header values must be strings without control characters');\n const folded = name.toLowerCase();\n if (protectedNames.has(folded)) throw new ConfigError(`MCP header is protected: ${folded}`);\n if (seen.has(folded)) throw new ConfigError(`Duplicate MCP header: ${folded}`);\n seen.add(folded);\n Object.defineProperty(result, folded, { value, enumerable: true, configurable: true, writable: true });\n }\n return result;\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,139 @@
1
+ import {
2
+ ConfigError
3
+ } from "./chunk-MZ5UWGXS.js";
4
+
5
+ // src/runtime/config.ts
6
+ import { readFile } from "fs/promises";
7
+ import { parseDocument, visit } from "yaml";
8
+ var DEFAULT_CONFIG_PATH = "/var/run/agentcore/agent/agent.yaml";
9
+ function object(value, label) {
10
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
11
+ throw new ConfigError(`${label} must be an object`);
12
+ }
13
+ return value;
14
+ }
15
+ function requiredString(value, label) {
16
+ if (typeof value !== "string" || !value.trim()) {
17
+ throw new ConfigError(`${label} must be a non-empty string`);
18
+ }
19
+ return value.trim();
20
+ }
21
+ function httpUrl(value, label) {
22
+ const text = requiredString(value, label);
23
+ let url;
24
+ try {
25
+ url = new URL(text);
26
+ } catch {
27
+ throw new ConfigError(`${label} must be an absolute HTTP(S) URL`);
28
+ }
29
+ if (!["http:", "https:"].includes(url.protocol) || !url.hostname || url.username || url.password || url.search || url.hash) {
30
+ throw new ConfigError(`${label} must be HTTP(S) without user info, query, or fragment`);
31
+ }
32
+ return text.replace(/\/+$/, "");
33
+ }
34
+ var sensitive = /* @__PURE__ */ new Set([
35
+ "apikey",
36
+ "api_key",
37
+ "authorization",
38
+ "accesskeyid",
39
+ "accesskeysecret",
40
+ "cookie",
41
+ "header",
42
+ "headers",
43
+ "password",
44
+ "secret",
45
+ "securitytoken",
46
+ "token"
47
+ ]);
48
+ function rejectInlineCredentials(value, label) {
49
+ if (Array.isArray(value)) {
50
+ value.forEach((item, i) => rejectInlineCredentials(item, `${label}[${i}]`));
51
+ } else if (value && typeof value === "object") {
52
+ for (const [key, item] of Object.entries(value)) {
53
+ if (sensitive.has(key.toLowerCase())) throw new ConfigError(`${label}.${key} must not contain inline credentials`);
54
+ rejectInlineCredentials(item, `${label}.${key}`);
55
+ }
56
+ }
57
+ }
58
+ function parseAgentConfig(data) {
59
+ if (Buffer.byteLength(data) > 1024 * 1024) throw new ConfigError("agent.yaml exceeds the 1 MiB size limit");
60
+ let value;
61
+ try {
62
+ const text = typeof data === "string" ? data : new TextDecoder("utf-8", { fatal: true }).decode(data);
63
+ const doc = parseDocument(text, { uniqueKeys: true });
64
+ if (doc.errors.length) throw new Error("invalid YAML");
65
+ visit(doc, {
66
+ Alias() {
67
+ throw new Error("YAML alias");
68
+ },
69
+ Node(_key, node) {
70
+ if ("anchor" in node && node.anchor) throw new Error("YAML anchor");
71
+ },
72
+ Pair(_key, pair) {
73
+ if (!pair.key || typeof pair.key !== "object" || !("value" in pair.key) || typeof pair.key.value !== "string") {
74
+ throw new Error("non-string YAML key");
75
+ }
76
+ }
77
+ });
78
+ value = doc.toJS();
79
+ } catch {
80
+ throw new ConfigError("invalid agent.yaml (UTF-8 YAML, unique string keys, no anchors or aliases required)");
81
+ }
82
+ return parseAgentConfigMapping(value);
83
+ }
84
+ function parseAgentConfigMapping(value) {
85
+ const root = object(value, "agent.yaml");
86
+ if (root.apiVersion !== "agentteams.io/v1alpha1" || root.kind !== "AgentConfig") {
87
+ throw new ConfigError("unsupported agent.yaml apiVersion or kind");
88
+ }
89
+ const metadata = object(root.metadata, "metadata");
90
+ const spec = object(root.spec, "spec");
91
+ const model = object(spec.model, "spec.model");
92
+ const mcp = object(spec.mcp, "spec.mcp");
93
+ rejectInlineCredentials(model, "spec.model");
94
+ rejectInlineCredentials(mcp, "spec.mcp");
95
+ const rawHeaders = object(spec.credentials, "spec.credentials").header;
96
+ if (!Array.isArray(rawHeaders) || !rawHeaders.length) throw new ConfigError("spec.credentials.header must be a non-empty list");
97
+ const headers = {};
98
+ for (const raw of rawHeaders) {
99
+ const header = object(raw, "gateway header");
100
+ const key = requiredString(header.key, "header.key").toLowerCase();
101
+ const val = requiredString(header.value, "header.value");
102
+ if (!/^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/.test(key) || /[\r\n]/.test(val)) throw new ConfigError("invalid gateway header");
103
+ if (Object.hasOwn(headers, key)) throw new ConfigError(`duplicate gateway header: ${key}`);
104
+ Object.defineProperty(headers, key, { value: val, enumerable: true });
105
+ }
106
+ if (!/^bearer\s+\S/i.test(headers.authorization ?? "")) throw new ConfigError("spec.credentials.header requires a Bearer Authorization header");
107
+ const runtimeName = requiredString(metadata.runtimeName, "metadata.runtimeName");
108
+ return Object.freeze({
109
+ apiVersion: root.apiVersion,
110
+ kind: root.kind,
111
+ name: metadata.name == null ? runtimeName : requiredString(metadata.name, "metadata.name"),
112
+ runtimeName,
113
+ workspaceId: requiredString(metadata.workspaceId, "metadata.workspaceId"),
114
+ regionId: requiredString(metadata.regionId, "metadata.regionId"),
115
+ modelGatewayUrl: httpUrl(model.gatewayUrl, "spec.model.gatewayUrl"),
116
+ mcpGatewayUrl: httpUrl(mcp.gatewayUrl, "spec.mcp.gatewayUrl"),
117
+ gatewayHeaders: Object.freeze(headers)
118
+ });
119
+ }
120
+ async function loadAgentConfig(path = process.env.AGENTCORE_CONFIG_PATH || DEFAULT_CONFIG_PATH) {
121
+ let data;
122
+ try {
123
+ data = await readFile(path);
124
+ } catch (cause) {
125
+ throw new ConfigError("cannot read agent.yaml", { cause });
126
+ }
127
+ return parseAgentConfig(data);
128
+ }
129
+
130
+ export {
131
+ DEFAULT_CONFIG_PATH,
132
+ object,
133
+ requiredString,
134
+ httpUrl,
135
+ parseAgentConfig,
136
+ parseAgentConfigMapping,
137
+ loadAgentConfig
138
+ };
139
+ //# sourceMappingURL=chunk-K3TE7625.js.map