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,39 @@
1
+ import { inspect } from 'node:util';
2
+ import { CredentialMetadata, AgentCoreControlPlane } from './controlplane/index.cjs';
3
+ import { L as Logger } from './logging-C8GLLg1f.cjs';
4
+ import { C as CredentialProvider } from './access-key-CkoHq3S8.cjs';
5
+
6
+ interface CredentialRuntime {
7
+ workspaceId: string;
8
+ regionId: string;
9
+ controlPlane: AgentCoreControlPlane;
10
+ resourceSTS?: CredentialProvider;
11
+ workloadAccessToken?: {
12
+ get(): Promise<string>;
13
+ invalidate(token: string): Promise<void>;
14
+ };
15
+ }
16
+ declare class BoundCredential {
17
+ #private;
18
+ readonly metadata: CredentialMetadata;
19
+ readonly providerName: string;
20
+ constructor(providerName: string, value: string, metadata: CredentialMetadata);
21
+ get value(): string;
22
+ get credentialType(): string;
23
+ asHeaders(): Record<string, string>;
24
+ [inspect.custom](): string;
25
+ toJSON(): string;
26
+ }
27
+ /** Resolve metadata by name, then fetch the secret from AgentIdentity. WAT/STS cache independently. */
28
+ declare class BoundCredentials {
29
+ private readonly runtime;
30
+ private readonly logger;
31
+ constructor(runtime: () => Promise<CredentialRuntime>, logger?: Logger);
32
+ get(credentialName: string): Promise<BoundCredential>;
33
+ /** @internal Bind only after validating the credential's MCP application scope. */
34
+ getForMCP(credentialName: string, serverId: string): Promise<BoundCredential>;
35
+ private resolve;
36
+ private getAPIKey;
37
+ }
38
+
39
+ export { BoundCredential as B, BoundCredentials as a };
@@ -0,0 +1,39 @@
1
+ import { inspect } from 'node:util';
2
+ import { CredentialMetadata, AgentCoreControlPlane } from './controlplane/index.js';
3
+ import { L as Logger } from './logging-C8GLLg1f.js';
4
+ import { C as CredentialProvider } from './access-key-CkoHq3S8.js';
5
+
6
+ interface CredentialRuntime {
7
+ workspaceId: string;
8
+ regionId: string;
9
+ controlPlane: AgentCoreControlPlane;
10
+ resourceSTS?: CredentialProvider;
11
+ workloadAccessToken?: {
12
+ get(): Promise<string>;
13
+ invalidate(token: string): Promise<void>;
14
+ };
15
+ }
16
+ declare class BoundCredential {
17
+ #private;
18
+ readonly metadata: CredentialMetadata;
19
+ readonly providerName: string;
20
+ constructor(providerName: string, value: string, metadata: CredentialMetadata);
21
+ get value(): string;
22
+ get credentialType(): string;
23
+ asHeaders(): Record<string, string>;
24
+ [inspect.custom](): string;
25
+ toJSON(): string;
26
+ }
27
+ /** Resolve metadata by name, then fetch the secret from AgentIdentity. WAT/STS cache independently. */
28
+ declare class BoundCredentials {
29
+ private readonly runtime;
30
+ private readonly logger;
31
+ constructor(runtime: () => Promise<CredentialRuntime>, logger?: Logger);
32
+ get(credentialName: string): Promise<BoundCredential>;
33
+ /** @internal Bind only after validating the credential's MCP application scope. */
34
+ getForMCP(credentialName: string, serverId: string): Promise<BoundCredential>;
35
+ private resolve;
36
+ private getAPIKey;
37
+ }
38
+
39
+ export { BoundCredential as B, BoundCredentials as a };
@@ -0,0 +1,142 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class;
2
+
3
+ var _chunk5RKN46UUcjs = require('./chunk-5RKN46UU.cjs');
4
+
5
+
6
+ var _chunkLE5P3SJWcjs = require('./chunk-LE5P3SJW.cjs');
7
+
8
+
9
+
10
+ var _chunkJSP7ZROScjs = require('./chunk-JSP7ZROS.cjs');
11
+
12
+ // src/auth/agent-sa-token.ts
13
+ var _promises = require('fs/promises');
14
+ var DEFAULT_AGENT_SA_TOKEN_PATH = "/var/run/agentcore/agent/token";
15
+ var AgentSATokenProvider = class {
16
+ constructor(path = DEFAULT_AGENT_SA_TOKEN_PATH) {
17
+ this.path = path;
18
+ }
19
+
20
+ async get() {
21
+ let token;
22
+ try {
23
+ token = await _promises.readFile.call(void 0, this.path, "utf8");
24
+ } catch (cause) {
25
+ throw new (0, _chunkJSP7ZROScjs.AuthenticationError)("cannot read the Agent SA token file", { cause });
26
+ }
27
+ return validToken(token);
28
+ }
29
+ };
30
+ function validToken(token) {
31
+ if (typeof token !== "string" || !token.trim()) throw new (0, _chunkJSP7ZROScjs.AuthenticationError)("the Agent SA token source returned an empty token");
32
+ return token.trim();
33
+ }
34
+ async function getAgentSAToken(source) {
35
+ return validToken(await source.get());
36
+ }
37
+ async function refreshAgentSAToken(source, current) {
38
+ return validToken(await (source.refresh ? source.refresh(current) : source.get()));
39
+ }
40
+
41
+ // src/auth/controller.ts
42
+ var _promises3 = require('timers/promises');
43
+ var ControllerClient = (_class = class {
44
+ constructor(endpoint, saTokens, options = {}) {;_class.prototype.__init.call(this);
45
+ this.saTokens = saTokens;
46
+ this.endpoint = _chunk5RKN46UUcjs.httpUrl.call(void 0, endpoint, "Controller endpoint");
47
+ this.timeoutMs = _nullishCoalesce(options.timeoutMs, () => ( 1e4));
48
+ this.maxAttempts = _nullishCoalesce(options.maxAttempts, () => ( 3));
49
+ if (!Number.isFinite(this.timeoutMs) || this.timeoutMs <= 0 || !Number.isInteger(this.maxAttempts) || this.maxAttempts < 1) {
50
+ throw new TypeError("timeoutMs and maxAttempts must be positive");
51
+ }
52
+ this.logger = _nullishCoalesce(options.logger, () => ( _chunkLE5P3SJWcjs.nullLogger));
53
+ }
54
+
55
+
56
+
57
+
58
+
59
+ __init() {this.lifetime = new AbortController()}
60
+ async post(path, purpose) {
61
+ let token = await getAgentSAToken(this.saTokens);
62
+ let response = await this.request(path, token, purpose);
63
+ if (response.status === 401) {
64
+ const rotated = await refreshAgentSAToken(this.saTokens, token);
65
+ this.logger.warn("agentcore.controller.sa_rejected", { rotated: rotated !== token });
66
+ if (rotated !== token) {
67
+ token = rotated;
68
+ response = await this.request(path, token, purpose);
69
+ }
70
+ }
71
+ if (response.status === 401) throw new (0, _chunkJSP7ZROScjs.AuthenticationError)("Controller rejected the Agent SA token");
72
+ return response;
73
+ }
74
+ close() {
75
+ this.lifetime.abort();
76
+ }
77
+ async request(path, token, purpose) {
78
+ const url = new URL(`${this.endpoint}${path}`);
79
+ const query = typeof purpose === "string" ? { purpose } : purpose;
80
+ for (const [key, value] of Object.entries(_nullishCoalesce(query, () => ( {})))) url.searchParams.set(key, value);
81
+ const fields = { url: `${url.origin}${url.pathname}`, purpose: _nullishCoalesce(_optionalChain([query, 'optionalAccess', _ => _.purpose]), () => ( "default")) };
82
+ for (let attempt = 1; attempt <= this.maxAttempts; attempt++) {
83
+ this.lifetime.signal.throwIfAborted();
84
+ this.logger.debug("agentcore.controller.request.started", { ...fields, attempt });
85
+ let response;
86
+ let text;
87
+ const timeout = new AbortController();
88
+ const timer = setTimeout(() => timeout.abort(), this.timeoutMs);
89
+ const signal = AbortSignal.any([this.lifetime.signal, timeout.signal]);
90
+ try {
91
+ response = await fetch(url, {
92
+ method: "POST",
93
+ headers: { Authorization: `Bearer ${token}` },
94
+ body: "",
95
+ redirect: "manual",
96
+ signal
97
+ });
98
+ text = await response.text();
99
+ } catch (cause) {
100
+ this.lifetime.signal.throwIfAborted();
101
+ this.logger.warn("agentcore.controller.request.failed", { ...fields, attempt, reason: "transport_error" });
102
+ if (attempt === this.maxAttempts) throw new (0, _chunkJSP7ZROScjs.CredentialExchangeError)("cannot reach the AgentCore Controller", { cause });
103
+ await _promises3.setTimeout.call(void 0, 50 * 2 ** (attempt - 1), void 0, { signal: this.lifetime.signal });
104
+ continue;
105
+ } finally {
106
+ clearTimeout(timer);
107
+ }
108
+ let payload;
109
+ try {
110
+ payload = JSON.parse(text);
111
+ } catch (e) {
112
+ payload = void 0;
113
+ }
114
+ const rawMessage = payload && typeof payload === "object" && "message" in payload ? payload.message : void 0;
115
+ const message = typeof rawMessage === "string" ? rawMessage.split(token).join("<redacted>").replace(/Bearer\s+\S+/gi, "Bearer <redacted>").replace(/\s+/g, " ").slice(0, 1024) : void 0;
116
+ const result = { status: response.status, payload, message };
117
+ if (response.ok) {
118
+ this.logger.debug("agentcore.controller.request.succeeded", { ...fields, status: response.status });
119
+ return result;
120
+ }
121
+ this.logger.warn("agentcore.controller.request.failed", {
122
+ ...fields,
123
+ status: response.status,
124
+ attempt,
125
+ message,
126
+ requestId: _nullishCoalesce(_nullishCoalesce(response.headers.get("x-acs-request-id"), () => ( response.headers.get("x-request-id"))), () => ( void 0))
127
+ });
128
+ if (![500, 502, 503, 504].includes(response.status) || attempt === this.maxAttempts) return result;
129
+ await _promises3.setTimeout.call(void 0, 50 * 2 ** (attempt - 1), void 0, { signal: this.lifetime.signal });
130
+ }
131
+ throw new (0, _chunkJSP7ZROScjs.CredentialExchangeError)("Controller request did not complete");
132
+ }
133
+ }, _class);
134
+
135
+
136
+
137
+
138
+
139
+
140
+
141
+ exports.DEFAULT_AGENT_SA_TOKEN_PATH = DEFAULT_AGENT_SA_TOKEN_PATH; exports.AgentSATokenProvider = AgentSATokenProvider; exports.getAgentSAToken = getAgentSAToken; exports.refreshAgentSAToken = refreshAgentSAToken; exports.ControllerClient = ControllerClient;
142
+ //# sourceMappingURL=chunk-2E5EWEDG.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/Users/zhuoguang/Documents/Code/collaborate/hiclaw/agentcore-sdk-nodejs/dist/chunk-2E5EWEDG.cjs","../src/auth/agent-sa-token.ts","../src/auth/controller.ts"],"names":[],"mappings":"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","file":"/Users/zhuoguang/Documents/Code/collaborate/hiclaw/agentcore-sdk-nodejs/dist/chunk-2E5EWEDG.cjs","sourcesContent":[null,"import { readFile } from 'node:fs/promises';\nimport { AuthenticationError } from '../errors';\n\nexport const DEFAULT_AGENT_SA_TOKEN_PATH = '/var/run/agentcore/agent/token';\nexport interface AgentSATokenSource {\n get(): string | Promise<string>;\n refresh?(current: string): string | Promise<string>;\n}\n\nexport class AgentSATokenProvider implements AgentSATokenSource {\n constructor(readonly path = DEFAULT_AGENT_SA_TOKEN_PATH) {}\n async get(): Promise<string> {\n let token: string;\n try { token = await readFile(this.path, 'utf8'); } catch (cause) {\n throw new AuthenticationError('cannot read the Agent SA token file', { cause });\n }\n return validToken(token);\n }\n}\n\nfunction validToken(token: string): string {\n if (typeof token !== 'string' || !token.trim()) throw new AuthenticationError('the Agent SA token source returned an empty token');\n return token.trim();\n}\nexport async function getAgentSAToken(source: AgentSATokenSource): Promise<string> {\n return validToken(await source.get());\n}\nexport async function refreshAgentSAToken(source: AgentSATokenSource, current: string): Promise<string> {\n return validToken(await (source.refresh ? source.refresh(current) : source.get()));\n}\n","import { setTimeout as sleep } from 'node:timers/promises';\nimport { AuthenticationError, CredentialExchangeError } from '../errors';\nimport { nullLogger, type Logger } from '../logging';\nimport { httpUrl } from '../runtime/config';\nimport { getAgentSAToken, refreshAgentSAToken, type AgentSATokenSource } from './agent-sa-token';\n\nexport interface ControllerOptions {\n timeoutMs?: number;\n maxAttempts?: number;\n logger?: Logger;\n}\ninterface ControllerResponse {\n status: number;\n payload: unknown;\n message?: string;\n}\n\n// Shared transport only for the Controller's idempotent credential exchanges.\nexport class ControllerClient {\n private readonly endpoint: string;\n private readonly timeoutMs: number;\n private readonly maxAttempts: number;\n private readonly logger: Logger;\n private readonly lifetime = new AbortController();\n\n constructor(endpoint: string, private readonly saTokens: AgentSATokenSource, options: ControllerOptions = {}) {\n this.endpoint = httpUrl(endpoint, 'Controller endpoint');\n this.timeoutMs = options.timeoutMs ?? 10_000;\n this.maxAttempts = options.maxAttempts ?? 3;\n if (!Number.isFinite(this.timeoutMs) || this.timeoutMs <= 0 || !Number.isInteger(this.maxAttempts) || this.maxAttempts < 1) {\n throw new TypeError('timeoutMs and maxAttempts must be positive');\n }\n this.logger = options.logger ?? nullLogger;\n }\n\n async post(path: string, purpose?: string | Readonly<Record<string, string>>): Promise<ControllerResponse> {\n let token = await getAgentSAToken(this.saTokens);\n let response = await this.request(path, token, purpose);\n if (response.status === 401) {\n const rotated = await refreshAgentSAToken(this.saTokens, token);\n this.logger.warn('agentcore.controller.sa_rejected', { rotated: rotated !== token });\n if (rotated !== token) {\n token = rotated;\n response = await this.request(path, token, purpose);\n }\n }\n if (response.status === 401) throw new AuthenticationError('Controller rejected the Agent SA token');\n return response;\n }\n\n close(): void { this.lifetime.abort(); }\n\n private async request(path: string, token: string, purpose?: string | Readonly<Record<string, string>>): Promise<ControllerResponse> {\n const url = new URL(`${this.endpoint}${path}`);\n const query = typeof purpose === 'string' ? { purpose } : purpose;\n for (const [key, value] of Object.entries(query ?? {})) url.searchParams.set(key, value);\n const fields = { url: `${url.origin}${url.pathname}`, purpose: query?.purpose ?? 'default' };\n for (let attempt = 1; attempt <= this.maxAttempts; attempt++) {\n this.lifetime.signal.throwIfAborted();\n this.logger.debug('agentcore.controller.request.started', { ...fields, attempt });\n let response: Response;\n let text: string;\n const timeout = new AbortController();\n const timer = setTimeout(() => timeout.abort(), this.timeoutMs);\n const signal = AbortSignal.any([this.lifetime.signal, timeout.signal]);\n try {\n response = await fetch(url, {\n method: 'POST', headers: { Authorization: `Bearer ${token}` }, body: '',\n redirect: 'manual', signal,\n });\n text = await response.text();\n } catch (cause) {\n this.lifetime.signal.throwIfAborted();\n this.logger.warn('agentcore.controller.request.failed', { ...fields, attempt, reason: 'transport_error' });\n if (attempt === this.maxAttempts) throw new CredentialExchangeError('cannot reach the AgentCore Controller', { cause });\n await sleep(50 * 2 ** (attempt - 1), undefined, { signal: this.lifetime.signal });\n continue;\n } finally { clearTimeout(timer); }\n let payload: unknown;\n try { payload = JSON.parse(text); } catch { payload = undefined; }\n // Never log a successful credential response, headers, or arbitrary JSON fields.\n const rawMessage = payload && typeof payload === 'object' && 'message' in payload ? payload.message : undefined;\n const message = typeof rawMessage === 'string'\n ? rawMessage.split(token).join('<redacted>').replace(/Bearer\\s+\\S+/gi, 'Bearer <redacted>').replace(/\\s+/g, ' ').slice(0, 1024)\n : undefined;\n const result = { status: response.status, payload, message };\n if (response.ok) {\n this.logger.debug('agentcore.controller.request.succeeded', { ...fields, status: response.status });\n return result;\n }\n this.logger.warn('agentcore.controller.request.failed', {\n ...fields, status: response.status, attempt, message,\n requestId: response.headers.get('x-acs-request-id') ?? response.headers.get('x-request-id') ?? undefined,\n });\n if (![500, 502, 503, 504].includes(response.status) || attempt === this.maxAttempts) return result;\n await sleep(50 * 2 ** (attempt - 1), undefined, { signal: this.lifetime.signal });\n }\n throw new CredentialExchangeError('Controller request did not complete');\n }\n}\n"]}
@@ -0,0 +1,220 @@
1
+ import {
2
+ nullLogger
3
+ } from "./chunk-NZL3VPJ2.js";
4
+ import {
5
+ ConfigError,
6
+ ResourceNotConfiguredError
7
+ } from "./chunk-MZ5UWGXS.js";
8
+
9
+ // src/skill/loader.ts
10
+ import { createHash } from "crypto";
11
+ import { lstat, mkdir, mkdtemp, readFile, readdir, rename, rm, writeFile } from "fs/promises";
12
+ import { basename, dirname, join, posix, resolve } from "path";
13
+ import { fromBuffer } from "yauzl";
14
+ import { parseDocument } from "yaml";
15
+ var MAX_BYTES = 10 * 1024 * 1024;
16
+ var METADATA = ".agentcore-skill.json";
17
+ var writes = /* @__PURE__ */ new Map();
18
+ var Skills = class {
19
+ constructor(options = {}) {
20
+ this.options = options;
21
+ this.workspace = resolve(options.workspaceDir ?? process.env.AGENTCORE_SKILL_WORKSPACE_DIR ?? ".skills/.agentcore-managed");
22
+ this.logger = options.logger ?? nullLogger;
23
+ }
24
+ options;
25
+ pins = /* @__PURE__ */ new Map();
26
+ workspace;
27
+ logger;
28
+ async local(root) {
29
+ this.logger.info("agentcore.skill.local.load.started", { root });
30
+ try {
31
+ root = resolve(root);
32
+ if (!(await lstat(root)).isDirectory()) throw new ConfigError("local Skill root is not a directory");
33
+ const entries = await readdir(root, { withFileTypes: true });
34
+ const directories = entries.some((entry) => entry.name === "SKILL.md") ? [root] : entries.sort((a, b) => a.name.localeCompare(b.name)).flatMap((entry) => {
35
+ if (entry.isSymbolicLink()) throw new ConfigError("local Skill root must not contain symbolic-link Skills");
36
+ return entry.isDirectory() ? [join(root, entry.name)] : [];
37
+ });
38
+ const result = [];
39
+ for (const directory of directories) {
40
+ if ((await readdir(directory)).includes("SKILL.md")) result.push(await loadDirectory(directory));
41
+ }
42
+ this.logger.info("agentcore.skill.local.load.succeeded", { root, skill_count: result.length });
43
+ return result;
44
+ } catch (error) {
45
+ this.logger.warn("agentcore.skill.local.load.failed", { root, error_type: error instanceof Error ? error.name : "Error" });
46
+ throw error;
47
+ }
48
+ }
49
+ async managed(name, options = {}) {
50
+ if (!this.options.runtime) throw new ResourceNotConfiguredError("managed Skill runtime is not configured");
51
+ const { workspaceId, provider } = await this.options.runtime();
52
+ component(name, "name");
53
+ component(workspaceId, "workspace ID");
54
+ if (options.version !== void 0) component(options.version, "version");
55
+ const key = JSON.stringify([workspaceId, name, options.version]);
56
+ const cached = this.pins.get(key);
57
+ if (cached) return cached;
58
+ const pending = (async () => {
59
+ this.logger.info("agentcore.skill.managed.load.started", { workspace_id: workspaceId, name, version: options.version ?? "latest" });
60
+ const artifact = await provider.getSkill(name, options.version);
61
+ component(artifact.version, "version");
62
+ const files = await unpack(name, artifact.archive);
63
+ const hash = createHash("sha256");
64
+ for (const [path, data] of [...files.entries()].sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0)) hash.update(path).update("\0").update(data).update("\0");
65
+ const digest = hash.digest("hex");
66
+ const target = join(this.workspace, workspaceId, name, artifact.version);
67
+ const metadata = { source: "agentcore", workspaceId, name, version: artifact.version, digest };
68
+ const write = (writes.get(target) ?? Promise.resolve()).catch(() => void 0).then(() => materialize(target, files, metadata));
69
+ writes.set(target, write);
70
+ try {
71
+ await write;
72
+ } finally {
73
+ if (writes.get(target) === write) writes.delete(target);
74
+ }
75
+ const sourceFiles = ["SKILL.md", ...[...files.keys()].filter((path) => path !== "SKILL.md").sort()];
76
+ const skill = Object.freeze({ ...await loadDirectory(target, sourceFiles), ...metadata, source: "agentcore" });
77
+ this.logger.info("agentcore.skill.managed.load.succeeded", { workspace_id: workspaceId, name, version: artifact.version, digest });
78
+ return skill;
79
+ })();
80
+ this.pins.set(key, pending);
81
+ try {
82
+ return await pending;
83
+ } catch (error) {
84
+ this.pins.delete(key);
85
+ this.logger.warn("agentcore.skill.managed.load.failed", { workspace_id: workspaceId, name, error_type: error instanceof Error ? error.name : "Error" });
86
+ throw error;
87
+ }
88
+ }
89
+ };
90
+ function component(value, label) {
91
+ if (!value.trim() || /[\\/:\0]/.test(value) || value === "." || value === "..") throw new ConfigError(`managed Skill ${label} is invalid`);
92
+ }
93
+ function safePath(path) {
94
+ if (!path || /[\\:\0]/.test(path) || posix.isAbsolute(path) || path !== posix.normalize(path) || path.split("/").some((part) => part === "." || part === "..") || path === METADATA) throw new ConfigError("managed Skill contains an unsafe resource path");
95
+ }
96
+ async function unpack(name, archive) {
97
+ if (!archive.length || archive.length > MAX_BYTES) throw new ConfigError("Skill package exceeds the 10 MiB size limit");
98
+ try {
99
+ const zip = await new Promise((accept, reject) => fromBuffer(Buffer.from(archive), { lazyEntries: true, strictFileNames: true }, (error, value) => error ? reject(error) : accept(value)));
100
+ const files = /* @__PURE__ */ new Map();
101
+ let total = 0;
102
+ await new Promise((accept, reject) => {
103
+ zip.on("error", reject);
104
+ zip.on("end", accept);
105
+ zip.on("entry", (entry) => {
106
+ void (async () => {
107
+ if (entry.fileName.endsWith("/")) return;
108
+ safePath(entry.fileName);
109
+ if (!entry.fileName.startsWith(`${name}/`)) throw new ConfigError("managed Skill package must use the Skill name as its root directory");
110
+ const path = entry.fileName.slice(name.length + 1);
111
+ safePath(path);
112
+ if (files.has(path)) throw new ConfigError("managed Skill package contains a duplicate path");
113
+ if ((entry.externalFileAttributes >>> 16 & 61440) === 40960) throw new ConfigError("Skill directories must not contain symbolic links");
114
+ if (entry.uncompressedSize > MAX_BYTES - total) throw new ConfigError("Skill content exceeds the 10 MiB size limit");
115
+ const stream = await new Promise((resolve2, reject2) => zip.openReadStream(entry, (error, stream2) => error ? reject2(error) : resolve2(stream2)));
116
+ const chunks = [];
117
+ for await (const chunk of stream) {
118
+ const data = Buffer.from(chunk);
119
+ total += data.length;
120
+ if (total > MAX_BYTES) throw new ConfigError("Skill content exceeds the 10 MiB size limit");
121
+ chunks.push(data);
122
+ }
123
+ files.set(path, Buffer.concat(chunks));
124
+ })().then(() => zip.readEntry(), (error) => {
125
+ zip.close();
126
+ reject(error);
127
+ });
128
+ });
129
+ zip.readEntry();
130
+ });
131
+ if (!files.has("SKILL.md")) throw new ConfigError(`managed Skill package does not contain ${name}/SKILL.md`);
132
+ for (const path of files.keys()) {
133
+ let parent = posix.dirname(path);
134
+ while (parent !== ".") {
135
+ if (files.has(parent)) throw new ConfigError("managed Skill contains a colliding resource path");
136
+ parent = posix.dirname(parent);
137
+ }
138
+ }
139
+ return files;
140
+ } catch (error) {
141
+ if (error instanceof ConfigError) throw error;
142
+ throw new ConfigError("managed Skill package is not a valid ZIP archive");
143
+ }
144
+ }
145
+ async function materialize(target, files, metadata) {
146
+ try {
147
+ const stat = await lstat(target);
148
+ if (stat.isDirectory() && !stat.isSymbolicLink()) {
149
+ const existing = JSON.parse(await readFile(join(target, METADATA), "utf8"));
150
+ if (JSON.stringify(existing) === JSON.stringify(metadata)) return;
151
+ }
152
+ } catch (error) {
153
+ if (!(error instanceof SyntaxError) && error.code !== "ENOENT") throw error;
154
+ }
155
+ await mkdir(dirname(target), { recursive: true });
156
+ const temporary = await mkdtemp(join(dirname(target), ".skill-"));
157
+ try {
158
+ for (const [path, content] of files) {
159
+ const destination = join(temporary, path);
160
+ await mkdir(dirname(destination), { recursive: true });
161
+ await writeFile(destination, content);
162
+ }
163
+ await writeFile(join(temporary, METADATA), JSON.stringify(metadata));
164
+ await loadDirectory(temporary);
165
+ await rm(target, { recursive: true, force: true });
166
+ await rename(temporary, target);
167
+ } finally {
168
+ await rm(temporary, { recursive: true, force: true });
169
+ }
170
+ }
171
+ async function loadDirectory(root, sourceFiles) {
172
+ const files = [];
173
+ let total = 0;
174
+ async function walk(directory, prefix = "") {
175
+ for (const entry of (await readdir(directory, { withFileTypes: true })).sort((a, b) => a.name.localeCompare(b.name))) {
176
+ if (entry.isSymbolicLink()) throw new ConfigError("Skill directories must not contain symbolic links");
177
+ const name = prefix + entry.name;
178
+ if (entry.isDirectory()) await walk(join(directory, entry.name), `${name}/`);
179
+ else if (entry.isFile() && entry.name !== METADATA) {
180
+ total += (await lstat(join(directory, entry.name))).size;
181
+ if (total > MAX_BYTES) throw new ConfigError("Skill content exceeds the 10 MiB size limit");
182
+ files.push(name);
183
+ }
184
+ }
185
+ }
186
+ if (sourceFiles) {
187
+ for (const name of sourceFiles) {
188
+ const entry = await lstat(join(root, name));
189
+ if (entry.isSymbolicLink() || !entry.isFile()) throw new ConfigError("managed Skill workspace is missing a source file");
190
+ files.push(name);
191
+ }
192
+ } else await walk(root);
193
+ const instruction = new TextDecoder("utf8", { fatal: true }).decode(await readFile(join(root, "SKILL.md")));
194
+ const match = /^---\s*\n([\s\S]*?)\n---(?:\s*\n|$)/.exec(instruction);
195
+ const metadata = {};
196
+ if (match) {
197
+ const document = parseDocument(match[1]);
198
+ if (document.errors.length) throw new ConfigError("SKILL.md contains invalid YAML frontmatter");
199
+ let value;
200
+ try {
201
+ value = document.toJS({ maxAliasCount: 0 }) ?? {};
202
+ } catch {
203
+ throw new ConfigError("SKILL.md contains invalid YAML frontmatter");
204
+ }
205
+ if (!value || typeof value !== "object" || Array.isArray(value)) throw new ConfigError("SKILL.md frontmatter must be an object");
206
+ for (const key of ["name", "description", "version"]) {
207
+ const item = value[key];
208
+ if (item !== void 0 && item !== null) {
209
+ if (typeof item !== "string") throw new ConfigError(`SKILL.md frontmatter ${key} must be a string`);
210
+ metadata[key] = item;
211
+ }
212
+ }
213
+ }
214
+ return Object.freeze({ name: metadata.name || basename(root), description: metadata.description || "", version: metadata.version || "", instruction, root, files: Object.freeze(files), source: "local" });
215
+ }
216
+
217
+ export {
218
+ Skills
219
+ };
220
+ //# sourceMappingURL=chunk-55XZZRKO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/skill/loader.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\nimport { lstat, mkdir, mkdtemp, readFile, readdir, rename, rm, writeFile } from 'node:fs/promises';\nimport { basename, dirname, join, posix, resolve } from 'node:path';\nimport { fromBuffer, type Entry, type ZipFile } from 'yauzl';\nimport { parseDocument } from 'yaml';\nimport type { SkillArtifact } from '../controlplane/client';\nimport { ConfigError, ResourceNotConfiguredError } from '../errors';\nimport { nullLogger, type Logger } from '../logging';\n\nconst MAX_BYTES = 10 * 1024 * 1024;\nconst METADATA = '.agentcore-skill.json';\nconst writes = new Map<string, Promise<void>>();\nexport interface Skill {\n readonly name: string;\n readonly description: string;\n readonly version: string;\n readonly instruction: string;\n readonly root: string;\n readonly files: readonly string[];\n readonly source: 'local' | 'agentcore';\n readonly digest?: string;\n readonly workspaceId?: string;\n}\nexport interface SkillProvider { getSkill(name: string, version?: string): Promise<SkillArtifact>; }\nexport interface SkillsOptions {\n workspaceDir?: string;\n runtime?: () => Promise<{ workspaceId: string; provider: SkillProvider }>;\n logger?: Logger;\n}\n\nexport class Skills {\n private readonly pins = new Map<string, Promise<Skill>>();\n private readonly workspace: string;\n private readonly logger: Logger;\n constructor(private readonly options: SkillsOptions = {}) {\n this.workspace = resolve(options.workspaceDir ?? process.env.AGENTCORE_SKILL_WORKSPACE_DIR ?? '.skills/.agentcore-managed');\n this.logger = options.logger ?? nullLogger;\n }\n async local(root: string): Promise<Skill[]> {\n this.logger.info('agentcore.skill.local.load.started', { root });\n try {\n root = resolve(root);\n if (!(await lstat(root)).isDirectory()) throw new ConfigError('local Skill root is not a directory');\n const entries = await readdir(root, { withFileTypes: true });\n const directories = entries.some((entry) => entry.name === 'SKILL.md') ? [root] : entries.sort((a, b) => a.name.localeCompare(b.name)).flatMap((entry) => {\n if (entry.isSymbolicLink()) throw new ConfigError('local Skill root must not contain symbolic-link Skills');\n return entry.isDirectory() ? [join(root, entry.name)] : [];\n });\n const result: Skill[] = [];\n for (const directory of directories) {\n if ((await readdir(directory)).includes('SKILL.md')) result.push(await loadDirectory(directory));\n }\n this.logger.info('agentcore.skill.local.load.succeeded', { root, skill_count: result.length }); return result;\n } catch (error) { this.logger.warn('agentcore.skill.local.load.failed', { root, error_type: error instanceof Error ? error.name : 'Error' }); throw error; }\n }\n async managed(name: string, options: { version?: string } = {}): Promise<Skill> {\n if (!this.options.runtime) throw new ResourceNotConfiguredError('managed Skill runtime is not configured');\n const { workspaceId, provider } = await this.options.runtime();\n component(name, 'name'); component(workspaceId, 'workspace ID');\n if (options.version !== undefined) component(options.version, 'version');\n const key = JSON.stringify([workspaceId, name, options.version]);\n const cached = this.pins.get(key); if (cached) return cached;\n const pending = (async () => {\n this.logger.info('agentcore.skill.managed.load.started', { workspace_id: workspaceId, name, version: options.version ?? 'latest' });\n const artifact = await provider.getSkill(name, options.version); component(artifact.version, 'version');\n const files = await unpack(name, artifact.archive);\n const hash = createHash('sha256');\n for (const [path, data] of [...files.entries()].sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0)) hash.update(path).update('\\0').update(data).update('\\0');\n const digest = hash.digest('hex');\n const target = join(this.workspace, workspaceId, name, artifact.version);\n const metadata = { source: 'agentcore', workspaceId, name, version: artifact.version, digest };\n // Serialize writes to the same named version across Core instances in this process.\n const write = (writes.get(target) ?? Promise.resolve()).catch(() => undefined).then(() => materialize(target, files, metadata));\n writes.set(target, write);\n try { await write; } finally { if (writes.get(target) === write) writes.delete(target); }\n const sourceFiles = ['SKILL.md', ...[...files.keys()].filter((path) => path !== 'SKILL.md').sort()];\n const skill = Object.freeze({ ...await loadDirectory(target, sourceFiles), ...metadata, source: 'agentcore' as const });\n this.logger.info('agentcore.skill.managed.load.succeeded', { workspace_id: workspaceId, name, version: artifact.version, digest });\n return skill;\n })();\n this.pins.set(key, pending);\n try { return await pending; } catch (error) {\n this.pins.delete(key); this.logger.warn('agentcore.skill.managed.load.failed', { workspace_id: workspaceId, name, error_type: error instanceof Error ? error.name : 'Error' }); throw error;\n }\n }\n}\n\nfunction component(value: string, label: string): void {\n if (!value.trim() || /[\\\\/:\\0]/.test(value) || value === '.' || value === '..') throw new ConfigError(`managed Skill ${label} is invalid`);\n}\nfunction safePath(path: string): void {\n if (!path || /[\\\\:\\0]/.test(path) || posix.isAbsolute(path) || path !== posix.normalize(path) || path.split('/').some((part) => part === '.' || part === '..') || path === METADATA) throw new ConfigError('managed Skill contains an unsafe resource path');\n}\nasync function unpack(name: string, archive: Uint8Array): Promise<Map<string, Buffer>> {\n if (!archive.length || archive.length > MAX_BYTES) throw new ConfigError('Skill package exceeds the 10 MiB size limit');\n try {\n const zip = await new Promise<ZipFile>((accept, reject) => fromBuffer(Buffer.from(archive), { lazyEntries: true, strictFileNames: true }, (error, value) => error ? reject(error) : accept(value)));\n const files = new Map<string, Buffer>(); let total = 0;\n await new Promise<void>((accept, reject) => {\n zip.on('error', reject); zip.on('end', accept);\n zip.on('entry', (entry: Entry) => { void (async () => {\n if (entry.fileName.endsWith('/')) return;\n safePath(entry.fileName);\n if (!entry.fileName.startsWith(`${name}/`)) throw new ConfigError('managed Skill package must use the Skill name as its root directory');\n const path = entry.fileName.slice(name.length + 1); safePath(path);\n if (files.has(path)) throw new ConfigError('managed Skill package contains a duplicate path');\n if (((entry.externalFileAttributes >>> 16) & 0xf000) === 0xa000) throw new ConfigError('Skill directories must not contain symbolic links');\n if (entry.uncompressedSize > MAX_BYTES - total) throw new ConfigError('Skill content exceeds the 10 MiB size limit');\n const stream = await new Promise<NodeJS.ReadableStream>((resolve, reject) => zip.openReadStream(entry, (error, stream) => error ? reject(error) : resolve(stream)));\n const chunks: Buffer[] = [];\n for await (const chunk of stream) { const data = Buffer.from(chunk); total += data.length; if (total > MAX_BYTES) throw new ConfigError('Skill content exceeds the 10 MiB size limit'); chunks.push(data); }\n files.set(path, Buffer.concat(chunks));\n })().then(() => zip.readEntry(), (error) => { zip.close(); reject(error); }); });\n zip.readEntry();\n });\n if (!files.has('SKILL.md')) throw new ConfigError(`managed Skill package does not contain ${name}/SKILL.md`);\n for (const path of files.keys()) {\n let parent = posix.dirname(path);\n while (parent !== '.') { if (files.has(parent)) throw new ConfigError('managed Skill contains a colliding resource path'); parent = posix.dirname(parent); }\n }\n return files;\n } catch (error) { if (error instanceof ConfigError) throw error; throw new ConfigError('managed Skill package is not a valid ZIP archive'); }\n}\n\nasync function materialize(target: string, files: Map<string, Buffer>, metadata: Record<string, string>): Promise<void> {\n try {\n const stat = await lstat(target);\n if (stat.isDirectory() && !stat.isSymbolicLink()) {\n const existing: unknown = JSON.parse(await readFile(join(target, METADATA), 'utf8'));\n if (JSON.stringify(existing) === JSON.stringify(metadata)) return;\n }\n } catch (error) { if (!(error instanceof SyntaxError) && (error as NodeJS.ErrnoException).code !== 'ENOENT') throw error; }\n await mkdir(dirname(target), { recursive: true });\n const temporary = await mkdtemp(join(dirname(target), '.skill-'));\n try {\n for (const [path, content] of files) { const destination = join(temporary, path); await mkdir(dirname(destination), { recursive: true }); await writeFile(destination, content); }\n await writeFile(join(temporary, METADATA), JSON.stringify(metadata));\n await loadDirectory(temporary); // Do not replace a working version with invalid SKILL.md.\n await rm(target, { recursive: true, force: true });\n await rename(temporary, target);\n } finally { await rm(temporary, { recursive: true, force: true }); }\n}\n\nasync function loadDirectory(root: string, sourceFiles?: readonly string[]): Promise<Skill> {\n const files: string[] = []; let total = 0;\n async function walk(directory: string, prefix = ''): Promise<void> {\n for (const entry of (await readdir(directory, { withFileTypes: true })).sort((a, b) => a.name.localeCompare(b.name))) {\n if (entry.isSymbolicLink()) throw new ConfigError('Skill directories must not contain symbolic links');\n const name = prefix + entry.name;\n if (entry.isDirectory()) await walk(join(directory, entry.name), `${name}/`);\n else if (entry.isFile() && entry.name !== METADATA) { total += (await lstat(join(directory, entry.name))).size; if (total > MAX_BYTES) throw new ConfigError('Skill content exceeds the 10 MiB size limit'); files.push(name); }\n }\n }\n if (sourceFiles) {\n // Managed packages track source files, not files generated by command execution.\n for (const name of sourceFiles) {\n const entry = await lstat(join(root, name));\n if (entry.isSymbolicLink() || !entry.isFile()) throw new ConfigError('managed Skill workspace is missing a source file');\n files.push(name);\n }\n } else await walk(root);\n const instruction = new TextDecoder('utf8', { fatal: true }).decode(await readFile(join(root, 'SKILL.md')));\n const match = /^---\\s*\\n([\\s\\S]*?)\\n---(?:\\s*\\n|$)/.exec(instruction);\n const metadata: Record<string, string> = {};\n if (match) {\n const document = parseDocument(match[1]!);\n if (document.errors.length) throw new ConfigError('SKILL.md contains invalid YAML frontmatter');\n let value: unknown;\n try { value = document.toJS({ maxAliasCount: 0 }) ?? {}; } catch { throw new ConfigError('SKILL.md contains invalid YAML frontmatter'); }\n if (!value || typeof value !== 'object' || Array.isArray(value)) throw new ConfigError('SKILL.md frontmatter must be an object');\n for (const key of ['name', 'description', 'version']) {\n const item = (value as Record<string, unknown>)[key];\n if (item !== undefined && item !== null) { if (typeof item !== 'string') throw new ConfigError(`SKILL.md frontmatter ${key} must be a string`); metadata[key] = item; }\n }\n }\n return Object.freeze({ name: metadata.name || basename(root), description: metadata.description || '', version: metadata.version || '', instruction, root, files: Object.freeze(files), source: 'local' as const });\n}\n"],"mappings":"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","names":["resolve","reject","stream"]}
@@ -0,0 +1,29 @@
1
+ import {
2
+ ConfigError
3
+ } from "./chunk-MZ5UWGXS.js";
4
+
5
+ // src/http.ts
6
+ async function readBytes(response, maxBytes, label) {
7
+ if (!response.body) return new Uint8Array();
8
+ const reader = response.body.getReader();
9
+ const chunks = [];
10
+ let size = 0;
11
+ try {
12
+ for (; ; ) {
13
+ const result = await reader.read();
14
+ if (result.done) break;
15
+ size += result.value.length;
16
+ if (size > maxBytes) throw new ConfigError(`${label} exceeds the ${maxBytes} byte size limit`);
17
+ chunks.push(result.value);
18
+ }
19
+ } finally {
20
+ await reader.cancel().catch(() => void 0);
21
+ reader.releaseLock();
22
+ }
23
+ return Buffer.concat(chunks, size);
24
+ }
25
+
26
+ export {
27
+ readBytes
28
+ };
29
+ //# sourceMappingURL=chunk-5JXA7JPS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/http.ts"],"sourcesContent":["import { ConfigError } from './errors';\n\n/** Read a bounded body without retaining a credential-bearing URL in errors. */\nexport async function readBytes(response: Response, maxBytes: number, label: string): Promise<Uint8Array> {\n if (!response.body) return new Uint8Array();\n const reader = response.body.getReader();\n const chunks: Uint8Array[] = [];\n let size = 0;\n try {\n for (;;) {\n const result = await reader.read();\n if (result.done) break;\n size += result.value.length;\n if (size > maxBytes) throw new ConfigError(`${label} exceeds the ${maxBytes} byte size limit`);\n chunks.push(result.value);\n }\n } finally { await reader.cancel().catch(() => undefined); reader.releaseLock(); }\n return Buffer.concat(chunks, size);\n}\n"],"mappings":";;;;;AAGA,eAAsB,UAAU,UAAoB,UAAkB,OAAoC;AACxG,MAAI,CAAC,SAAS,KAAM,QAAO,IAAI,WAAW;AAC1C,QAAM,SAAS,SAAS,KAAK,UAAU;AACvC,QAAM,SAAuB,CAAC;AAC9B,MAAI,OAAO;AACX,MAAI;AACF,eAAS;AACP,YAAM,SAAS,MAAM,OAAO,KAAK;AACjC,UAAI,OAAO,KAAM;AACjB,cAAQ,OAAO,MAAM;AACrB,UAAI,OAAO,SAAU,OAAM,IAAI,YAAY,GAAG,KAAK,gBAAgB,QAAQ,kBAAkB;AAC7F,aAAO,KAAK,OAAO,KAAK;AAAA,IAC1B;AAAA,EACF,UAAE;AAAU,UAAM,OAAO,OAAO,EAAE,MAAM,MAAM,MAAS;AAAG,WAAO,YAAY;AAAA,EAAG;AAChF,SAAO,OAAO,OAAO,QAAQ,IAAI;AACnC;","names":[]}