alibabacloud-agentcore-sdk 0.1.4 → 0.1.5

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 (66) hide show
  1. package/README.md +14 -0
  2. package/dist/auth/index.d.cts +2 -2
  3. package/dist/auth/index.d.ts +2 -2
  4. package/dist/{bound-credentials-DqT64Q2s.d.ts → bound-credentials-CpEUcH6w.d.ts} +1 -1
  5. package/dist/{bound-credentials-C1fM0thh.d.cts → bound-credentials-rHDKhpQy.d.cts} +1 -1
  6. package/dist/{chunk-UMTUXOKE.cjs → chunk-C35QBAIS.cjs} +23 -10
  7. package/dist/chunk-C35QBAIS.cjs.map +1 -0
  8. package/dist/{chunk-JK6KPDVW.cjs → chunk-EYDYQCSJ.cjs} +45 -8
  9. package/dist/chunk-EYDYQCSJ.cjs.map +1 -0
  10. package/dist/{chunk-7UBN3SJI.js → chunk-I2SSXKT7.js} +42 -5
  11. package/dist/chunk-I2SSXKT7.js.map +1 -0
  12. package/dist/{chunk-D45QSOR4.js → chunk-MXPHQGBQ.js} +23 -10
  13. package/dist/chunk-MXPHQGBQ.js.map +1 -0
  14. package/dist/{client-pDzS7EZR.d.ts → client-D4f63nzj.d.ts} +1 -1
  15. package/dist/{client-DDU4-ygJ.d.cts → client-K_TFV6Ea.d.cts} +1 -1
  16. package/dist/collaboration/index.d.cts +4 -4
  17. package/dist/collaboration/index.d.ts +4 -4
  18. package/dist/controlplane/index.cjs +2 -2
  19. package/dist/controlplane/index.d.cts +3 -65
  20. package/dist/controlplane/index.d.ts +3 -65
  21. package/dist/controlplane/index.js +1 -1
  22. package/dist/{errors-BGfCbCgs.d.cts → errors-BA8gNCmW.d.cts} +1 -1
  23. package/dist/{errors-D_809AqR.d.ts → errors-DAxP-nfs.d.ts} +1 -1
  24. package/dist/index-CkDNn3fW.d.ts +71 -0
  25. package/dist/index-Dsu71P1g.d.cts +71 -0
  26. package/dist/index.cjs +159 -22
  27. package/dist/index.cjs.map +1 -1
  28. package/dist/index.d.cts +40 -8
  29. package/dist/index.d.ts +40 -8
  30. package/dist/index.js +141 -4
  31. package/dist/index.js.map +1 -1
  32. package/dist/integrations/ai-sdk.d.cts +2 -2
  33. package/dist/integrations/ai-sdk.d.ts +2 -2
  34. package/dist/integrations/google-adk.cjs +1 -1
  35. package/dist/integrations/google-adk.d.cts +3 -3
  36. package/dist/integrations/google-adk.d.ts +3 -3
  37. package/dist/integrations/google-adk.js +1 -1
  38. package/dist/integrations/langchain.cjs +1 -1
  39. package/dist/integrations/langchain.d.cts +4 -4
  40. package/dist/integrations/langchain.d.ts +4 -4
  41. package/dist/integrations/langchain.js +1 -1
  42. package/dist/integrations/langgraph.cjs +1 -1
  43. package/dist/integrations/langgraph.d.cts +4 -4
  44. package/dist/integrations/langgraph.d.ts +4 -4
  45. package/dist/integrations/langgraph.js +1 -1
  46. package/dist/integrations/mastra.cjs +1 -1
  47. package/dist/integrations/mastra.d.cts +3 -3
  48. package/dist/integrations/mastra.d.ts +3 -3
  49. package/dist/integrations/mastra.js +1 -1
  50. package/dist/{langchain-adapter-DtxU7oAi.d.cts → langchain-adapter-3o4RGnV2.d.cts} +2 -2
  51. package/dist/{langchain-adapter-CaTCXaeo.d.ts → langchain-adapter-sBJrE0Jd.d.ts} +2 -2
  52. package/dist/{loader-DrIQ37nm.d.ts → loader-BV55JAVK.d.ts} +1 -1
  53. package/dist/{loader-eWuJ2GSL.d.cts → loader-kC1qeJWI.d.cts} +1 -1
  54. package/dist/mcp/index.d.cts +2 -2
  55. package/dist/mcp/index.d.ts +2 -2
  56. package/dist/model/index.d.cts +3 -3
  57. package/dist/model/index.d.ts +3 -3
  58. package/dist/skill/index.cjs +2 -2
  59. package/dist/skill/index.d.cts +3 -3
  60. package/dist/skill/index.d.ts +3 -3
  61. package/dist/skill/index.js +1 -1
  62. package/package.json +1 -1
  63. package/dist/chunk-7UBN3SJI.js.map +0 -1
  64. package/dist/chunk-D45QSOR4.js.map +0 -1
  65. package/dist/chunk-JK6KPDVW.cjs.map +0 -1
  66. package/dist/chunk-UMTUXOKE.cjs.map +0 -1
package/README.md CHANGED
@@ -110,6 +110,20 @@ try {
110
110
 
111
111
  本地 Skill 加载方式及完整配置见 [自定义资源示例](examples/direct-resources.ts)。
112
112
 
113
+ ## 使用 Agent 模版
114
+
115
+ 在当前 Workspace 中准备一个已发布的 Agent 模版,并授予应用相应的模版和 Skill 读取权限:
116
+
117
+ ```typescript
118
+ const template = await core.templates.get('my-agent-template', { version: '1.0.0' });
119
+ const instruction = template.instruction;
120
+ const skills = await template.loadSkills();
121
+ ```
122
+
123
+ `instruction` 是模版主 Agent 的 Prompt 字符串。`loadSkills()` 按需加载随包 Skill 和引用的云端 Skill,返回现有 `Skill` 对象,可直接交给各框架的 `skillTools()`。模型由应用独立配置。
124
+
125
+ 省略模版版本时使用 `latest` 标签;同一个模版对象成功加载 Skill 后会复用结果,不自动跟随引用标签变化。请在 Core 的生命周期内加载和使用 Skill。完整用法见 [Agent 模版示例](examples/agent-template.ts)。
126
+
113
127
  ## 使用 Memory
114
128
 
115
129
  Memory 用于保存和检索长期记忆,也支持查询、更新、删除记忆以及查看会话消息。使用前,在 AgentCore 中创建 MemoryStore 并授予应用访问权限。
@@ -3,10 +3,10 @@ export { A as AccessKeyCredential, a as AccessKeyOptions, C as CredentialProvide
3
3
  import { A as AgentSATokenSource } from '../agent-sa-token-DD1Sb8P1.cjs';
4
4
  export { a as AgentSATokenProvider, D as DEFAULT_AGENT_SA_TOKEN_PATH, g as getAgentSAToken, r as refreshAgentSAToken } from '../agent-sa-token-DD1Sb8P1.cjs';
5
5
  import { C as ControllerOptions } from '../controller-DWs3Sy04.cjs';
6
- export { B as BoundCredential, a as BoundCredentials } from '../bound-credentials-C1fM0thh.cjs';
6
+ export { B as BoundCredential, a as BoundCredentials } from '../bound-credentials-rHDKhpQy.cjs';
7
7
  import 'node:util';
8
8
  import '../logging-C8GLLg1f.cjs';
9
- import '../controlplane/index.cjs';
9
+ import '../index-Dsu71P1g.cjs';
10
10
 
11
11
  declare const HIGH_CODE_SDK_PURPOSE = "highcode_sdk";
12
12
  declare const AGENT_IDENTITY_DATA_PURPOSE = "agentidentitydata";
@@ -3,10 +3,10 @@ export { A as AccessKeyCredential, a as AccessKeyOptions, C as CredentialProvide
3
3
  import { A as AgentSATokenSource } from '../agent-sa-token-DD1Sb8P1.js';
4
4
  export { a as AgentSATokenProvider, D as DEFAULT_AGENT_SA_TOKEN_PATH, g as getAgentSAToken, r as refreshAgentSAToken } from '../agent-sa-token-DD1Sb8P1.js';
5
5
  import { C as ControllerOptions } from '../controller-DmI4L4sP.js';
6
- export { B as BoundCredential, a as BoundCredentials } from '../bound-credentials-DqT64Q2s.js';
6
+ export { B as BoundCredential, a as BoundCredentials } from '../bound-credentials-CpEUcH6w.js';
7
7
  import 'node:util';
8
8
  import '../logging-C8GLLg1f.js';
9
- import '../controlplane/index.js';
9
+ import '../index-CkDNn3fW.js';
10
10
 
11
11
  declare const HIGH_CODE_SDK_PURPOSE = "highcode_sdk";
12
12
  declare const AGENT_IDENTITY_DATA_PURPOSE = "agentidentitydata";
@@ -1,5 +1,5 @@
1
1
  import { inspect } from 'node:util';
2
- import { CredentialMetadata, AgentCoreControlPlane } from './controlplane/index.js';
2
+ import { C as CredentialMetadata, A as AgentCoreControlPlane } from './index-CkDNn3fW.js';
3
3
  import { L as Logger } from './logging-C8GLLg1f.js';
4
4
  import { C as CredentialProvider } from './access-key-CkoHq3S8.js';
5
5
 
@@ -1,5 +1,5 @@
1
1
  import { inspect } from 'node:util';
2
- import { CredentialMetadata, AgentCoreControlPlane } from './controlplane/index.cjs';
2
+ import { C as CredentialMetadata, A as AgentCoreControlPlane } from './index-Dsu71P1g.cjs';
3
3
  import { L as Logger } from './logging-C8GLLg1f.cjs';
4
4
  import { C as CredentialProvider } from './access-key-CkoHq3S8.cjs';
5
5
 
@@ -57,7 +57,7 @@ var Skills = (_class = class {
57
57
  this.logger.info("agentcore.skill.managed.load.started", { workspace_id: workspaceId, name, version: _nullishCoalesce(options.version, () => ( "latest")) });
58
58
  const artifact = await provider.getSkill(name, options.version);
59
59
  component(artifact.version, "version");
60
- const files = await unpack(name, artifact.archive);
60
+ const files = await unpackArchive(artifact.archive, name);
61
61
  const hash = _crypto.createHash.call(void 0, "sha256");
62
62
  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");
63
63
  const digest = hash.digest("hex");
@@ -91,8 +91,8 @@ function component(value, label) {
91
91
  function safePath(path) {
92
92
  if (!path || /[\\:\0]/.test(path) || _path.posix.isAbsolute(path) || path !== _path.posix.normalize(path) || path.split("/").some((part) => part === "." || part === "..") || path === METADATA) throw new (0, _chunkV4A6MJ42cjs.ConfigError)("managed Skill contains an unsafe resource path");
93
93
  }
94
- async function unpack(name, archive) {
95
- if (!archive.length || archive.length > MAX_BYTES) throw new (0, _chunkV4A6MJ42cjs.ConfigError)("Skill package exceeds the 10 MiB size limit");
94
+ async function unpackArchive(archive, name, maxBytes = MAX_BYTES) {
95
+ if (!archive.length || archive.length > maxBytes) throw new (0, _chunkV4A6MJ42cjs.ConfigError)("Resource archive exceeds the size limit");
96
96
  try {
97
97
  const zip = await new Promise((accept, reject) => _yauzl.fromBuffer.call(void 0, Buffer.from(archive), { lazyEntries: true, strictFileNames: true }, (error, value) => error ? reject(error) : accept(value)));
98
98
  const files = /* @__PURE__ */ new Map();
@@ -104,18 +104,18 @@ async function unpack(name, archive) {
104
104
  void (async () => {
105
105
  if (entry.fileName.endsWith("/")) return;
106
106
  safePath(entry.fileName);
107
- if (!entry.fileName.startsWith(`${name}/`)) throw new (0, _chunkV4A6MJ42cjs.ConfigError)("managed Skill package must use the Skill name as its root directory");
108
- const path = entry.fileName.slice(name.length + 1);
107
+ if (name !== void 0 && !entry.fileName.startsWith(`${name}/`)) throw new (0, _chunkV4A6MJ42cjs.ConfigError)("managed Skill package must use the Skill name as its root directory");
108
+ const path = name === void 0 ? entry.fileName : entry.fileName.slice(name.length + 1);
109
109
  safePath(path);
110
110
  if (files.has(path)) throw new (0, _chunkV4A6MJ42cjs.ConfigError)("managed Skill package contains a duplicate path");
111
111
  if ((entry.externalFileAttributes >>> 16 & 61440) === 40960) throw new (0, _chunkV4A6MJ42cjs.ConfigError)("Skill directories must not contain symbolic links");
112
- if (entry.uncompressedSize > MAX_BYTES - total) throw new (0, _chunkV4A6MJ42cjs.ConfigError)("Skill content exceeds the 10 MiB size limit");
112
+ if (entry.uncompressedSize > maxBytes - total) throw new (0, _chunkV4A6MJ42cjs.ConfigError)("Resource content exceeds the size limit");
113
113
  const stream = await new Promise((resolve2, reject2) => zip.openReadStream(entry, (error, stream2) => error ? reject2(error) : resolve2(stream2)));
114
114
  const chunks = [];
115
115
  for await (const chunk of stream) {
116
116
  const data = Buffer.from(chunk);
117
117
  total += data.length;
118
- if (total > MAX_BYTES) throw new (0, _chunkV4A6MJ42cjs.ConfigError)("Skill content exceeds the 10 MiB size limit");
118
+ if (total > maxBytes) throw new (0, _chunkV4A6MJ42cjs.ConfigError)("Resource content exceeds the size limit");
119
119
  chunks.push(data);
120
120
  }
121
121
  files.set(path, Buffer.concat(chunks));
@@ -126,7 +126,7 @@ async function unpack(name, archive) {
126
126
  });
127
127
  zip.readEntry();
128
128
  });
129
- if (!files.has("SKILL.md")) throw new (0, _chunkV4A6MJ42cjs.ConfigError)(`managed Skill package does not contain ${name}/SKILL.md`);
129
+ if (name !== void 0 && !files.has("SKILL.md")) throw new (0, _chunkV4A6MJ42cjs.ConfigError)(`managed Skill package does not contain ${name}/SKILL.md`);
130
130
  for (const path of files.keys()) {
131
131
  let parent = _path.posix.dirname(path);
132
132
  while (parent !== ".") {
@@ -140,6 +140,17 @@ async function unpack(name, archive) {
140
140
  throw new (0, _chunkV4A6MJ42cjs.ConfigError)("managed Skill package is not a valid ZIP archive");
141
141
  }
142
142
  }
143
+ async function materializeTemplateSkill(target, name, files, metadata) {
144
+ if (!files.has("SKILL.md")) throw new (0, _chunkV4A6MJ42cjs.ConfigError)(`Static Skill ${JSON.stringify(name)} has no SKILL.md`);
145
+ const write = (_nullishCoalesce(writes.get(target), () => ( Promise.resolve()))).catch(() => void 0).then(() => materialize(target, files, metadata));
146
+ writes.set(target, write);
147
+ try {
148
+ await write;
149
+ } finally {
150
+ if (writes.get(target) === write) writes.delete(target);
151
+ }
152
+ return Object.freeze({ ...await loadDirectory(target), name, workspaceId: metadata.workspaceId, digest: metadata.digest });
153
+ }
143
154
  async function materialize(target, files, metadata) {
144
155
  try {
145
156
  const stat = await _promises.lstat.call(void 0, target);
@@ -214,5 +225,7 @@ async function loadDirectory(root, sourceFiles) {
214
225
 
215
226
 
216
227
 
217
- exports.Skills = Skills;
218
- //# sourceMappingURL=chunk-UMTUXOKE.cjs.map
228
+
229
+
230
+ exports.Skills = Skills; exports.unpackArchive = unpackArchive; exports.materializeTemplateSkill = materializeTemplateSkill;
231
+ //# sourceMappingURL=chunk-C35QBAIS.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/agentcore-sdk-nodejs/agentcore-sdk-nodejs/dist/chunk-C35QBAIS.cjs","../src/skill/loader.ts"],"names":["reject"],"mappings":"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","file":"/home/runner/work/agentcore-sdk-nodejs/agentcore-sdk-nodejs/dist/chunk-C35QBAIS.cjs","sourcesContent":[null,"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 unpackArchive(artifact.archive, name);\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}\nexport async function unpackArchive(archive: Uint8Array, name?: string, maxBytes = MAX_BYTES): Promise<Map<string, Buffer>> {\n if (!archive.length || archive.length > maxBytes) throw new ConfigError('Resource archive exceeds the 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 (name !== undefined && !entry.fileName.startsWith(`${name}/`)) throw new ConfigError('managed Skill package must use the Skill name as its root directory');\n const path = name === undefined ? entry.fileName : 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 > maxBytes - total) throw new ConfigError('Resource content exceeds the 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 > maxBytes) throw new ConfigError('Resource content exceeds the 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 (name !== undefined && !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\n/** @internal Materialize a static template Skill through the existing atomic writer. */\nexport async function materializeTemplateSkill(target: string, name: string, files: Map<string, Buffer>, metadata: Record<string, string>): Promise<Skill> {\n if (!files.has('SKILL.md')) throw new ConfigError(`Static Skill ${JSON.stringify(name)} has no SKILL.md`);\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 return Object.freeze({ ...await loadDirectory(target), name, workspaceId: metadata.workspaceId, digest: metadata.digest });\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"]}
@@ -158,6 +158,43 @@ var AgentCoreControlPlane = (_class = class {
158
158
  if (typeof downloadURL !== "string") throw new (0, _chunkV4A6MJ42cjs.ConfigError)("AgentCore returned an invalid Skill download URL");
159
159
  return { version: resolvedVersion, archive: await this.downloadSkill(downloadURL) };
160
160
  }
161
+ async resolveSkillVersion(name, selectorType, value) {
162
+ if (selectorType === "VERSION") return value;
163
+ const client = await this.client();
164
+ const response = await this.invoke(client, "GetSkillDetail", () => client.getSkillDetailWithOptions(this.workspaceId, name, new models.GetSkillDetailRequest({}), {}, this.runtimeOptions()));
165
+ const data = responseBody(response.body).data;
166
+ if (value === "HEAD" && _optionalChain([data, 'optionalAccess', _ => _.versions, 'optionalAccess', _2 => _2.some, 'call', _3 => _3((item) => item.version === "HEAD")])) return "HEAD";
167
+ const selected = _optionalChain([data, 'optionalAccess', _4 => _4.labels, 'optionalAccess', _5 => _5[value]]);
168
+ if (!selected) throw new (0, _chunkV4A6MJ42cjs.ResourceNotConfiguredError)(`Skill ${JSON.stringify(name)} has no label ${JSON.stringify(value)}`);
169
+ return selected;
170
+ }
171
+ async getTemplate(name, version) {
172
+ const client = await this.client();
173
+ const path = `/workspaces/${encodeURIComponent(this.workspaceId)}/agent-specs/${encodeURIComponent(name)}`;
174
+ const request = async (action, suffix = "", query = {}) => {
175
+ const params = new _openapicore.$OpenApiUtil.Params({
176
+ action,
177
+ version: "2026-08-04",
178
+ protocol: "HTTPS",
179
+ pathname: path + suffix,
180
+ method: "GET",
181
+ authType: "AK",
182
+ style: "ROA",
183
+ reqBodyType: "json",
184
+ bodyType: "json"
185
+ });
186
+ const response = await this.invoke(client, action, () => client.callApi(params, new _openapicore.$OpenApiUtil.OpenApiRequest({ query }), this.runtimeOptions()));
187
+ return responseBody(response.body).data;
188
+ };
189
+ if (version === void 0) {
190
+ const detail = await request("GetAgentSpec");
191
+ version = _optionalChain([detail, 'optionalAccess', _6 => _6.labels, 'optionalAccess', _7 => _7.latest]);
192
+ if (!version) throw new (0, _chunkV4A6MJ42cjs.ResourceNotConfiguredError)(`Agent template ${JSON.stringify(name)} has no latest version`);
193
+ }
194
+ const url = await request("DownloadAgentSpecViaOss", "/actions/download-via-oss", { agentSpecVersion: version });
195
+ if (typeof url !== "string") throw new (0, _chunkV4A6MJ42cjs.ConfigError)("Invalid Agent template download URL");
196
+ return { version, archive: await this.downloadSkill(url, "Agent template", 50 * 1024 * 1024) };
197
+ }
161
198
  close() {
162
199
  this.lifetime.abort();
163
200
  }
@@ -238,7 +275,7 @@ var AgentCoreControlPlane = (_class = class {
238
275
  return result;
239
276
  }
240
277
  }
241
- async downloadSkill(value) {
278
+ async downloadSkill(value, resource = "Skill", maxBytes = 10 * 1024 * 1024) {
242
279
  let original;
243
280
  try {
244
281
  original = new URL(value);
@@ -253,19 +290,19 @@ var AgentCoreControlPlane = (_class = class {
253
290
  try {
254
291
  const response = await fetch(candidate, { redirect: "manual", signal: AbortSignal.any([this.lifetime.signal, AbortSignal.timeout(3e4)]) });
255
292
  if (response.ok) {
256
- const archive = await _chunkRJCDBVZ6cjs.readBytes.call(void 0, response, 10 * 1024 * 1024, "Skill archive");
257
- if (!archive.length) throw new (0, _chunkV4A6MJ42cjs.ConfigError)("Skill package is empty");
293
+ const archive = await _chunkRJCDBVZ6cjs.readBytes.call(void 0, response, maxBytes, `${resource} archive`);
294
+ if (!archive.length) throw new (0, _chunkV4A6MJ42cjs.ConfigError)(`${resource} package is empty`);
258
295
  return archive;
259
296
  }
260
297
  status = response.status;
261
- await _optionalChain([response, 'access', _ => _.body, 'optionalAccess', _2 => _2.cancel, 'call', _3 => _3()]);
298
+ await _optionalChain([response, 'access', _8 => _8.body, 'optionalAccess', _9 => _9.cancel, 'call', _10 => _10()]);
262
299
  } catch (error) {
263
300
  this.lifetime.signal.throwIfAborted();
264
301
  if (error instanceof _chunkV4A6MJ42cjs.ConfigError) throw error;
265
302
  }
266
303
  this.logger.warn("agentcore.control_plane.skill.download.failed", { host: candidate.host, path: candidate.pathname, status });
267
304
  const fallback = candidate === original && (status === void 0 || status >= 500 && status < 600) ? internalOSSURL(original) : void 0;
268
- if (!fallback) throw new (0, _chunkV4A6MJ42cjs.InvocationError)(status ? `Skill package download failed with HTTP ${status}` : "Skill package download failed");
305
+ if (!fallback) throw new (0, _chunkV4A6MJ42cjs.InvocationError)(status ? `${resource} package download failed with HTTP ${status}` : `${resource} package download failed`);
269
306
  this.logger.warn("agentcore.control_plane.skill.download.fallback", { fromHost: candidate.host, toHost: fallback.host });
270
307
  candidate = fallback;
271
308
  }
@@ -274,9 +311,9 @@ var AgentCoreControlPlane = (_class = class {
274
311
  function latestVersion(data) {
275
312
  if (!data) throw new (0, _chunkV4A6MJ42cjs.ResourceNotConfiguredError)("AgentCore Skill does not exist");
276
313
  for (const [label, value] of Object.entries(_nullishCoalesce(data.labels, () => ( {})))) if (label.toLowerCase() === "latest" && value) return value;
277
- const online = (_nullishCoalesce(data.versions, () => ( []))).filter((v) => _optionalChain([v, 'access', _4 => _4.status, 'optionalAccess', _5 => _5.toLowerCase, 'call', _6 => _6()]) === "online" && v.version);
314
+ const online = (_nullishCoalesce(data.versions, () => ( []))).filter((v) => _optionalChain([v, 'access', _11 => _11.status, 'optionalAccess', _12 => _12.toLowerCase, 'call', _13 => _13()]) === "online" && v.version);
278
315
  online.sort((a, b) => (_nullishCoalesce(b.updateTime, () => ( -1))) - (_nullishCoalesce(a.updateTime, () => ( -1))) || (_nullishCoalesce(b.version, () => ( ""))).localeCompare(_nullishCoalesce(a.version, () => ( ""))));
279
- if (!_optionalChain([online, 'access', _7 => _7[0], 'optionalAccess', _8 => _8.version])) throw new (0, _chunkV4A6MJ42cjs.ResourceNotConfiguredError)("AgentCore Skill has no online version");
316
+ if (!_optionalChain([online, 'access', _14 => _14[0], 'optionalAccess', _15 => _15.version])) throw new (0, _chunkV4A6MJ42cjs.ResourceNotConfiguredError)("AgentCore Skill has no online version");
280
317
  return online[0].version;
281
318
  }
282
319
  function internalOSSURL(url) {
@@ -291,4 +328,4 @@ function internalOSSURL(url) {
291
328
 
292
329
 
293
330
  exports.AgentCoreControlPlane = AgentCoreControlPlane;
294
- //# sourceMappingURL=chunk-JK6KPDVW.cjs.map
331
+ //# sourceMappingURL=chunk-EYDYQCSJ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["/home/runner/work/agentcore-sdk-nodejs/agentcore-sdk-nodejs/dist/chunk-EYDYQCSJ.cjs","../src/controlplane/client.ts"],"names":[],"mappings":"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","file":"/home/runner/work/agentcore-sdk-nodejs/agentcore-sdk-nodejs/dist/chunk-EYDYQCSJ.cjs","sourcesContent":[null,"import Client, * as models from '@alicloud/agentcore20260804';\nimport { $OpenApiUtil } from '@alicloud/openapi-core';\nimport { RuntimeOptions } from '@darabonba/typescript';\nimport { AccessKeyCredential, type CredentialProvider } from '../auth/access-key';\nimport { HIGH_CODE_SDK_PURPOSE } from '../auth/resource-sts';\nimport { ConfigError, InvocationError, MCPServerNotFoundError, ModelConnectionNotFoundError, ResourceNotConfiguredError } from '../errors';\nimport { readBytes } from '../http';\nimport { nullLogger, type Logger } from '../logging';\nimport { httpUrl, requiredString } from '../runtime/config';\n\n// The generated package is CJS: native ESM sees module.exports as the default.\nconst GeneratedClient = typeof Client === 'function' ? Client : (Client as unknown as { default: typeof Client }).default;\n\nexport interface ModelDescriptor {\n readonly connectionId: string;\n readonly connectionName: string;\n readonly protocol: string;\n readonly providerType: string;\n readonly modelId: string;\n readonly modelName: string;\n readonly contextSize?: number;\n readonly maxTokens?: number;\n readonly capabilities: Readonly<Record<string, boolean>>;\n}\nexport interface MCPDescriptor {\n readonly mcpServerId: string;\n readonly name: string;\n readonly protocol: string;\n readonly type: string;\n readonly status: string;\n}\nexport interface SkillArtifact { version: string; archive: Uint8Array; }\nexport interface TemplateArtifact { version: string; archive: Uint8Array; }\nexport interface CredentialMetadata {\n readonly credentialId: string;\n readonly name: string;\n readonly credentialType: string;\n readonly resourceScope: string;\n readonly resourceRefs: ReadonlyArray<{ resourceType: string; resourceId: string }>;\n}\nexport interface ControlPlaneOptions {\n workspaceId: string;\n regionId: string;\n accessKeyCredential?: AccessKeyCredential;\n resourceSTSProvider?: CredentialProvider;\n endpoint?: string;\n logger?: Logger;\n}\n\nfunction exact<T>(items: T[], field: keyof T, name: string, label: string, ErrorType: typeof ResourceNotConfiguredError = ResourceNotConfiguredError): T {\n const matches = items.filter((item) => item[field] === name);\n if (!matches.length) throw new ErrorType(`${label} ${JSON.stringify(name)} does not exist`);\n if (matches.length !== 1) throw new ConfigError(`${label} ${JSON.stringify(name)} is not unique`);\n return matches[0]!;\n}\n\nfunction errorField(error: unknown, key: string): unknown {\n return error && typeof error === 'object' ? (error as Record<string, unknown>)[key] : undefined;\n}\nfunction responseBody<T>(body: T | undefined): T {\n if (body === undefined) throw new ConfigError('AgentCore returned an empty control-plane response');\n return body;\n}\nfunction endpointFailure(error: unknown): boolean {\n const status = errorField(error, 'statusCode');\n const code = errorField(error, 'code');\n return (typeof status === 'number' && status >= 500 && status < 600) ||\n ['ECONNREFUSED', 'ECONNRESET', 'ENOTFOUND', 'EAI_AGAIN', 'ETIMEDOUT', 'ESOCKETTIMEDOUT'].includes(String(code)) ||\n errorField(error, 'name') === 'TimeoutError';\n}\n\nexport class AgentCoreControlPlane {\n readonly workspaceId: string;\n readonly regionId: string;\n private readonly endpoint?: string;\n private readonly protocol?: string;\n private discoveredEndpoint?: string;\n private readonly logger: Logger;\n private readonly lifetime = new AbortController();\n\n constructor(private readonly options: ControlPlaneOptions) {\n this.workspaceId = requiredString(options.workspaceId, 'workspaceId');\n this.regionId = requiredString(options.regionId, 'regionId');\n if (!options.accessKeyCredential && !options.resourceSTSProvider) throw new ConfigError('AgentCore control plane requires an AccessKey credential source');\n if (options.endpoint !== undefined) {\n const value = options.endpoint.trim();\n const url = new URL(httpUrl(value.includes('://') ? value : `https://${value}`, 'AgentCore control endpoint'));\n if (url.pathname !== '/') throw new ConfigError('AgentCore control endpoint must not contain a path');\n this.endpoint = url.host; this.protocol = url.protocol.slice(0, -1);\n }\n this.logger = options.logger ?? nullLogger;\n }\n\n async resolveModel(connectionName: string, modelName?: string): Promise<ModelDescriptor> {\n const client = await this.client();\n const connections: models.ListModelConnectionsResponseBodyItems[] = [];\n let nextToken: string | undefined;\n do {\n const response = await this.invoke(client, 'ListModelConnections', () => client.listModelConnectionsWithOptions(this.workspaceId,\n new models.ListModelConnectionsRequest({ name: connectionName, searchType: 'accurate', maxResults: 100, nextToken }), {}, this.runtimeOptions()));\n const body = responseBody(response.body);\n connections.push(...(body.items ?? [])); nextToken = body.nextToken;\n } while (nextToken);\n const connection = exact(connections, 'name', connectionName, 'model connection', ModelConnectionNotFoundError);\n const connectionId = requiredString(connection.connectionId, 'connectionId');\n const available: models.ListModelsResponseBodyItems[] = [];\n do {\n const response = await this.invoke(client, 'ListModels', () => client.listModelsWithOptions(this.workspaceId,\n new models.ListModelsRequest({ connectionId, modelName, maxResults: 100, nextToken }), {}, this.runtimeOptions()));\n const body = responseBody(response.body);\n available.push(...(body.items ?? [])); nextToken = body.nextToken;\n } while (nextToken);\n let model: models.ListModelsResponseBodyItems;\n if (modelName !== undefined) model = exact(available, 'modelName', modelName, 'model');\n else {\n if (available.length !== 1) throw new ResourceNotConfiguredError(`model connection ${JSON.stringify(connectionName)} requires an explicit model name`);\n model = available[0]!;\n }\n const capabilities = Object.fromEntries(Object.entries(model.capabilities ?? {}).filter((entry): entry is [string, boolean] => typeof entry[1] === 'boolean'));\n const descriptor = Object.freeze({ connectionId, connectionName: requiredString(connection.name, 'connection name'),\n protocol: connection.protocol ?? '', providerType: connection.providerType ?? '',\n modelId: requiredString(model.modelId, 'modelId'), modelName: requiredString(model.modelName, 'modelName'),\n contextSize: model.contextSize, maxTokens: model.maxTokens, capabilities: Object.freeze(capabilities),\n });\n this.logger.info('agentcore.control_plane.model.resolve.succeeded', { connectionName, connectionId, modelName: descriptor.modelName });\n return descriptor;\n }\n\n async resolveMCP(name: string): Promise<MCPDescriptor> {\n const client = await this.client();\n const items: models.ListMcpsResponseBodyItems[] = [];\n let nextToken: string | undefined;\n do {\n const response = await this.invoke(client, 'ListMcps', () => client.listMcpsWithOptions(this.workspaceId,\n new models.ListMcpsRequest({ name, searchType: 'accurate', maxResults: 100, nextToken }), {}, this.runtimeOptions()));\n const body = responseBody(response.body);\n items.push(...(body.items ?? [])); nextToken = body.nextToken;\n } while (nextToken);\n const item = exact(items, 'name', name, 'MCP server', MCPServerNotFoundError);\n const descriptor = Object.freeze({ mcpServerId: requiredString(item.mcpServerId, 'mcpServerId'),\n name: requiredString(item.name, 'MCP name'), protocol: item.protocol ?? '', type: item.type ?? '', status: item.status ?? '',\n });\n this.logger.info('agentcore.control_plane.mcp.resolve.succeeded', { name, mcpServerId: descriptor.mcpServerId, protocol: descriptor.protocol });\n return descriptor;\n }\n\n async getSkill(name: string, version?: string): Promise<SkillArtifact> {\n const client = await this.client();\n if (version === undefined) {\n const detail = await this.invoke(client, 'GetSkillDetail', () => client.getSkillDetailWithOptions(this.workspaceId, name, new models.GetSkillDetailRequest({}), {}, this.runtimeOptions()));\n version = latestVersion(responseBody(detail.body).data);\n }\n const resolvedVersion = version;\n const response = await this.invoke(client, 'DownloadSkillVersionViaOss', () => client.downloadSkillVersionViaOssWithOptions(this.workspaceId, name, resolvedVersion,\n new models.DownloadSkillVersionViaOssRequest({}), {}, this.runtimeOptions()));\n const downloadURL = responseBody(response.body).data;\n if (typeof downloadURL !== 'string') throw new ConfigError('AgentCore returned an invalid Skill download URL');\n return { version: resolvedVersion, archive: await this.downloadSkill(downloadURL) };\n }\n\n async resolveSkillVersion(name: string, selectorType: string, value: string): Promise<string> {\n if (selectorType === 'VERSION') return value;\n const client = await this.client();\n const response = await this.invoke(client, 'GetSkillDetail', () => client.getSkillDetailWithOptions(this.workspaceId, name, new models.GetSkillDetailRequest({}), {}, this.runtimeOptions()));\n const data = responseBody(response.body).data;\n if (value === 'HEAD' && data?.versions?.some((item) => item.version === 'HEAD')) return 'HEAD';\n const selected = data?.labels?.[value];\n if (!selected) throw new ResourceNotConfiguredError(`Skill ${JSON.stringify(name)} has no label ${JSON.stringify(value)}`);\n return selected;\n }\n\n async getTemplate(name: string, version?: string): Promise<TemplateArtifact> {\n const client = await this.client();\n const path = `/workspaces/${encodeURIComponent(this.workspaceId)}/agent-specs/${encodeURIComponent(name)}`;\n const request = async (action: string, suffix = '', query: Record<string, string> = {}): Promise<unknown> => {\n const params = new $OpenApiUtil.Params({ action, version: '2026-08-04', protocol: 'HTTPS', pathname: path + suffix,\n method: 'GET', authType: 'AK', style: 'ROA', reqBodyType: 'json', bodyType: 'json' });\n const response = await this.invoke(client, action, () => client.callApi(params, new $OpenApiUtil.OpenApiRequest({ query }), this.runtimeOptions()));\n return responseBody(response.body).data;\n };\n if (version === undefined) {\n const detail = await request('GetAgentSpec') as { labels?: Record<string, string> } | undefined;\n version = detail?.labels?.latest;\n if (!version) throw new ResourceNotConfiguredError(`Agent template ${JSON.stringify(name)} has no latest version`);\n }\n const url = await request('DownloadAgentSpecViaOss', '/actions/download-via-oss', { agentSpecVersion: version });\n if (typeof url !== 'string') throw new ConfigError('Invalid Agent template download URL');\n return { version, archive: await this.downloadSkill(url, 'Agent template', 50 * 1024 * 1024) };\n }\n\n close(): void { this.lifetime.abort(); }\n\n async resolveCredential(name: string): Promise<CredentialMetadata> {\n const client = await this.client();\n const params = new $OpenApiUtil.Params({ action: 'ListCredentials', version: '2026-08-04', protocol: 'HTTPS',\n pathname: `/workspaces/${encodeURIComponent(this.workspaceId)}/credentials`, method: 'GET', authType: 'AK',\n style: 'ROA', reqBodyType: 'json', bodyType: 'json' });\n const items: Record<string, unknown>[] = [];\n let nextToken: string | undefined;\n do {\n const request = new $OpenApiUtil.OpenApiRequest({ query: { name, maxResults: '100', ...(nextToken ? { nextToken } : {}) } });\n const response = await this.invoke(client, 'ListCredentials', () => client.callApi(params, request, this.runtimeOptions()));\n const body = responseBody(response.body);\n items.push(...(body.items ?? [])); nextToken = body.nextToken;\n } while (nextToken);\n const item = exact(items, 'name', name, 'credential');\n const refs = (item.resourceRefs ?? []) as Array<Record<string, unknown>>;\n return {\n credentialId: requiredString(item.credentialId, 'credentialId'), name: requiredString(item.name, 'name'),\n credentialType: requiredString(item.credentialType, 'credentialType'), resourceScope: String(item.resourceScope ?? ''),\n resourceRefs: refs.map((ref) => ({ resourceType: requiredString(ref.resourceType, 'resourceType'), resourceId: requiredString(ref.resourceId, 'resourceId') })),\n };\n }\n\n private runtimeOptions(): RuntimeOptions { return new RuntimeOptions({ autoretry: false, connectTimeout: 10_000, readTimeout: 30_000 }); }\n private async client(): Promise<Client> {\n this.lifetime.signal.throwIfAborted();\n const credential = this.options.accessKeyCredential ?? await this.options.resourceSTSProvider!.get(HIGH_CODE_SDK_PURPOSE);\n return new GeneratedClient(new $OpenApiUtil.Config({\n accessKeyId: credential.accessKeyId, accessKeySecret: credential.accessKeySecret, securityToken: credential.securityToken,\n regionId: this.regionId, endpoint: this.endpoint ?? this.discoveredEndpoint, protocol: this.protocol,\n }));\n }\n private async invoke<T>(client: Client, operation: string, call: () => Promise<T>): Promise<T> {\n this.lifetime.signal.throwIfAborted();\n const invoke = async () => {\n this.logger.debug('agentcore.control_plane.request.started', { operation, host: client._endpoint });\n try { return await call(); }\n catch (cause) {\n const data = errorField(cause, 'data');\n this.logger.warn('agentcore.control_plane.request.failed', { operation, host: client._endpoint,\n status: String(errorField(cause, 'statusCode') ?? '-'), code: String(errorField(cause, 'code') ?? '-'),\n requestId: String(errorField(cause, 'requestId') ?? errorField(data, 'RequestId') ?? errorField(data, 'requestId') ?? '-'),\n });\n throw new InvocationError('AgentCore control-plane request failed', { cause });\n }\n };\n try { return await invoke(); }\n catch (error) {\n if (!(error instanceof InvocationError) || this.endpoint || client._endpoint !== `agentcore.${this.regionId}.aliyuncs.com` || !endpointFailure(error.cause)) throw error;\n const host = `agentcore-vpc.${this.regionId}.aliyuncs.com`;\n this.logger.warn('agentcore.control_plane.endpoint.fallback', { operation, fromHost: client._endpoint, toHost: host });\n client._endpoint = host;\n const result = await invoke(); this.discoveredEndpoint = host; return result;\n }\n }\n\n private async downloadSkill(value: string, resource = 'Skill', maxBytes = 10 * 1024 * 1024): Promise<Uint8Array> {\n let original: URL;\n try { original = new URL(value); } catch { throw new ConfigError('AgentCore returned an invalid Skill download URL'); }\n if (!['http:', 'https:'].includes(original.protocol) || original.username || original.password) throw new ConfigError('AgentCore returned an invalid Skill download URL');\n let candidate = original;\n for (;;) {\n this.lifetime.signal.throwIfAborted();\n let status: number | undefined;\n try {\n const response = await fetch(candidate, { redirect: 'manual', signal: AbortSignal.any([this.lifetime.signal, AbortSignal.timeout(30_000)]) });\n if (response.ok) {\n const archive = await readBytes(response, maxBytes, `${resource} archive`);\n if (!archive.length) throw new ConfigError(`${resource} package is empty`);\n return archive;\n }\n status = response.status; await response.body?.cancel();\n } catch (error) {\n this.lifetime.signal.throwIfAborted();\n if (error instanceof ConfigError) throw error;\n }\n this.logger.warn('agentcore.control_plane.skill.download.failed', { host: candidate.host, path: candidate.pathname, status });\n const fallback = candidate === original && (status === undefined || status >= 500 && status < 600) ? internalOSSURL(original) : undefined;\n if (!fallback) throw new InvocationError(status ? `${resource} package download failed with HTTP ${status}` : `${resource} package download failed`);\n this.logger.warn('agentcore.control_plane.skill.download.fallback', { fromHost: candidate.host, toHost: fallback.host });\n candidate = fallback;\n }\n }\n}\n\nfunction latestVersion(data?: models.GetSkillDetailResponseBodyData): string {\n if (!data) throw new ResourceNotConfiguredError('AgentCore Skill does not exist');\n for (const [label, value] of Object.entries(data.labels ?? {})) if (label.toLowerCase() === 'latest' && value) return value;\n const online = (data.versions ?? []).filter((v) => v.status?.toLowerCase() === 'online' && v.version);\n online.sort((a, b) => (b.updateTime ?? -1) - (a.updateTime ?? -1) || (b.version ?? '').localeCompare(a.version ?? ''));\n if (!online[0]?.version) throw new ResourceNotConfiguredError('AgentCore Skill has no online version');\n return online[0].version;\n}\n\nexport function internalOSSURL(url: URL): URL | undefined {\n const match = /^([a-z0-9-]+)\\.(oss-[a-z]+-[a-z0-9-]+)\\.aliyuncs\\.com$/.exec(url.hostname);\n if (!match || match[2]!.endsWith('-internal') || match[2]!.startsWith('oss-accelerate') || url.username || url.password) return undefined;\n if (url.searchParams.getAll('x-oss-additional-headers').some((v) => v.split(';').includes('host'))) return undefined;\n const result = new URL(url); result.hostname = `${match[1]}.${match[2]}-internal.aliyuncs.com`; return result;\n}\n"]}
@@ -158,6 +158,43 @@ var AgentCoreControlPlane = class {
158
158
  if (typeof downloadURL !== "string") throw new ConfigError("AgentCore returned an invalid Skill download URL");
159
159
  return { version: resolvedVersion, archive: await this.downloadSkill(downloadURL) };
160
160
  }
161
+ async resolveSkillVersion(name, selectorType, value) {
162
+ if (selectorType === "VERSION") return value;
163
+ const client = await this.client();
164
+ const response = await this.invoke(client, "GetSkillDetail", () => client.getSkillDetailWithOptions(this.workspaceId, name, new models.GetSkillDetailRequest({}), {}, this.runtimeOptions()));
165
+ const data = responseBody(response.body).data;
166
+ if (value === "HEAD" && data?.versions?.some((item) => item.version === "HEAD")) return "HEAD";
167
+ const selected = data?.labels?.[value];
168
+ if (!selected) throw new ResourceNotConfiguredError(`Skill ${JSON.stringify(name)} has no label ${JSON.stringify(value)}`);
169
+ return selected;
170
+ }
171
+ async getTemplate(name, version) {
172
+ const client = await this.client();
173
+ const path = `/workspaces/${encodeURIComponent(this.workspaceId)}/agent-specs/${encodeURIComponent(name)}`;
174
+ const request = async (action, suffix = "", query = {}) => {
175
+ const params = new $OpenApiUtil.Params({
176
+ action,
177
+ version: "2026-08-04",
178
+ protocol: "HTTPS",
179
+ pathname: path + suffix,
180
+ method: "GET",
181
+ authType: "AK",
182
+ style: "ROA",
183
+ reqBodyType: "json",
184
+ bodyType: "json"
185
+ });
186
+ const response = await this.invoke(client, action, () => client.callApi(params, new $OpenApiUtil.OpenApiRequest({ query }), this.runtimeOptions()));
187
+ return responseBody(response.body).data;
188
+ };
189
+ if (version === void 0) {
190
+ const detail = await request("GetAgentSpec");
191
+ version = detail?.labels?.latest;
192
+ if (!version) throw new ResourceNotConfiguredError(`Agent template ${JSON.stringify(name)} has no latest version`);
193
+ }
194
+ const url = await request("DownloadAgentSpecViaOss", "/actions/download-via-oss", { agentSpecVersion: version });
195
+ if (typeof url !== "string") throw new ConfigError("Invalid Agent template download URL");
196
+ return { version, archive: await this.downloadSkill(url, "Agent template", 50 * 1024 * 1024) };
197
+ }
161
198
  close() {
162
199
  this.lifetime.abort();
163
200
  }
@@ -238,7 +275,7 @@ var AgentCoreControlPlane = class {
238
275
  return result;
239
276
  }
240
277
  }
241
- async downloadSkill(value) {
278
+ async downloadSkill(value, resource = "Skill", maxBytes = 10 * 1024 * 1024) {
242
279
  let original;
243
280
  try {
244
281
  original = new URL(value);
@@ -253,8 +290,8 @@ var AgentCoreControlPlane = class {
253
290
  try {
254
291
  const response = await fetch(candidate, { redirect: "manual", signal: AbortSignal.any([this.lifetime.signal, AbortSignal.timeout(3e4)]) });
255
292
  if (response.ok) {
256
- const archive = await readBytes(response, 10 * 1024 * 1024, "Skill archive");
257
- if (!archive.length) throw new ConfigError("Skill package is empty");
293
+ const archive = await readBytes(response, maxBytes, `${resource} archive`);
294
+ if (!archive.length) throw new ConfigError(`${resource} package is empty`);
258
295
  return archive;
259
296
  }
260
297
  status = response.status;
@@ -265,7 +302,7 @@ var AgentCoreControlPlane = class {
265
302
  }
266
303
  this.logger.warn("agentcore.control_plane.skill.download.failed", { host: candidate.host, path: candidate.pathname, status });
267
304
  const fallback = candidate === original && (status === void 0 || status >= 500 && status < 600) ? internalOSSURL(original) : void 0;
268
- if (!fallback) throw new InvocationError(status ? `Skill package download failed with HTTP ${status}` : "Skill package download failed");
305
+ if (!fallback) throw new InvocationError(status ? `${resource} package download failed with HTTP ${status}` : `${resource} package download failed`);
269
306
  this.logger.warn("agentcore.control_plane.skill.download.fallback", { fromHost: candidate.host, toHost: fallback.host });
270
307
  candidate = fallback;
271
308
  }
@@ -291,4 +328,4 @@ function internalOSSURL(url) {
291
328
  export {
292
329
  AgentCoreControlPlane
293
330
  };
294
- //# sourceMappingURL=chunk-7UBN3SJI.js.map
331
+ //# sourceMappingURL=chunk-I2SSXKT7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/controlplane/client.ts"],"sourcesContent":["import Client, * as models from '@alicloud/agentcore20260804';\nimport { $OpenApiUtil } from '@alicloud/openapi-core';\nimport { RuntimeOptions } from '@darabonba/typescript';\nimport { AccessKeyCredential, type CredentialProvider } from '../auth/access-key';\nimport { HIGH_CODE_SDK_PURPOSE } from '../auth/resource-sts';\nimport { ConfigError, InvocationError, MCPServerNotFoundError, ModelConnectionNotFoundError, ResourceNotConfiguredError } from '../errors';\nimport { readBytes } from '../http';\nimport { nullLogger, type Logger } from '../logging';\nimport { httpUrl, requiredString } from '../runtime/config';\n\n// The generated package is CJS: native ESM sees module.exports as the default.\nconst GeneratedClient = typeof Client === 'function' ? Client : (Client as unknown as { default: typeof Client }).default;\n\nexport interface ModelDescriptor {\n readonly connectionId: string;\n readonly connectionName: string;\n readonly protocol: string;\n readonly providerType: string;\n readonly modelId: string;\n readonly modelName: string;\n readonly contextSize?: number;\n readonly maxTokens?: number;\n readonly capabilities: Readonly<Record<string, boolean>>;\n}\nexport interface MCPDescriptor {\n readonly mcpServerId: string;\n readonly name: string;\n readonly protocol: string;\n readonly type: string;\n readonly status: string;\n}\nexport interface SkillArtifact { version: string; archive: Uint8Array; }\nexport interface TemplateArtifact { version: string; archive: Uint8Array; }\nexport interface CredentialMetadata {\n readonly credentialId: string;\n readonly name: string;\n readonly credentialType: string;\n readonly resourceScope: string;\n readonly resourceRefs: ReadonlyArray<{ resourceType: string; resourceId: string }>;\n}\nexport interface ControlPlaneOptions {\n workspaceId: string;\n regionId: string;\n accessKeyCredential?: AccessKeyCredential;\n resourceSTSProvider?: CredentialProvider;\n endpoint?: string;\n logger?: Logger;\n}\n\nfunction exact<T>(items: T[], field: keyof T, name: string, label: string, ErrorType: typeof ResourceNotConfiguredError = ResourceNotConfiguredError): T {\n const matches = items.filter((item) => item[field] === name);\n if (!matches.length) throw new ErrorType(`${label} ${JSON.stringify(name)} does not exist`);\n if (matches.length !== 1) throw new ConfigError(`${label} ${JSON.stringify(name)} is not unique`);\n return matches[0]!;\n}\n\nfunction errorField(error: unknown, key: string): unknown {\n return error && typeof error === 'object' ? (error as Record<string, unknown>)[key] : undefined;\n}\nfunction responseBody<T>(body: T | undefined): T {\n if (body === undefined) throw new ConfigError('AgentCore returned an empty control-plane response');\n return body;\n}\nfunction endpointFailure(error: unknown): boolean {\n const status = errorField(error, 'statusCode');\n const code = errorField(error, 'code');\n return (typeof status === 'number' && status >= 500 && status < 600) ||\n ['ECONNREFUSED', 'ECONNRESET', 'ENOTFOUND', 'EAI_AGAIN', 'ETIMEDOUT', 'ESOCKETTIMEDOUT'].includes(String(code)) ||\n errorField(error, 'name') === 'TimeoutError';\n}\n\nexport class AgentCoreControlPlane {\n readonly workspaceId: string;\n readonly regionId: string;\n private readonly endpoint?: string;\n private readonly protocol?: string;\n private discoveredEndpoint?: string;\n private readonly logger: Logger;\n private readonly lifetime = new AbortController();\n\n constructor(private readonly options: ControlPlaneOptions) {\n this.workspaceId = requiredString(options.workspaceId, 'workspaceId');\n this.regionId = requiredString(options.regionId, 'regionId');\n if (!options.accessKeyCredential && !options.resourceSTSProvider) throw new ConfigError('AgentCore control plane requires an AccessKey credential source');\n if (options.endpoint !== undefined) {\n const value = options.endpoint.trim();\n const url = new URL(httpUrl(value.includes('://') ? value : `https://${value}`, 'AgentCore control endpoint'));\n if (url.pathname !== '/') throw new ConfigError('AgentCore control endpoint must not contain a path');\n this.endpoint = url.host; this.protocol = url.protocol.slice(0, -1);\n }\n this.logger = options.logger ?? nullLogger;\n }\n\n async resolveModel(connectionName: string, modelName?: string): Promise<ModelDescriptor> {\n const client = await this.client();\n const connections: models.ListModelConnectionsResponseBodyItems[] = [];\n let nextToken: string | undefined;\n do {\n const response = await this.invoke(client, 'ListModelConnections', () => client.listModelConnectionsWithOptions(this.workspaceId,\n new models.ListModelConnectionsRequest({ name: connectionName, searchType: 'accurate', maxResults: 100, nextToken }), {}, this.runtimeOptions()));\n const body = responseBody(response.body);\n connections.push(...(body.items ?? [])); nextToken = body.nextToken;\n } while (nextToken);\n const connection = exact(connections, 'name', connectionName, 'model connection', ModelConnectionNotFoundError);\n const connectionId = requiredString(connection.connectionId, 'connectionId');\n const available: models.ListModelsResponseBodyItems[] = [];\n do {\n const response = await this.invoke(client, 'ListModels', () => client.listModelsWithOptions(this.workspaceId,\n new models.ListModelsRequest({ connectionId, modelName, maxResults: 100, nextToken }), {}, this.runtimeOptions()));\n const body = responseBody(response.body);\n available.push(...(body.items ?? [])); nextToken = body.nextToken;\n } while (nextToken);\n let model: models.ListModelsResponseBodyItems;\n if (modelName !== undefined) model = exact(available, 'modelName', modelName, 'model');\n else {\n if (available.length !== 1) throw new ResourceNotConfiguredError(`model connection ${JSON.stringify(connectionName)} requires an explicit model name`);\n model = available[0]!;\n }\n const capabilities = Object.fromEntries(Object.entries(model.capabilities ?? {}).filter((entry): entry is [string, boolean] => typeof entry[1] === 'boolean'));\n const descriptor = Object.freeze({ connectionId, connectionName: requiredString(connection.name, 'connection name'),\n protocol: connection.protocol ?? '', providerType: connection.providerType ?? '',\n modelId: requiredString(model.modelId, 'modelId'), modelName: requiredString(model.modelName, 'modelName'),\n contextSize: model.contextSize, maxTokens: model.maxTokens, capabilities: Object.freeze(capabilities),\n });\n this.logger.info('agentcore.control_plane.model.resolve.succeeded', { connectionName, connectionId, modelName: descriptor.modelName });\n return descriptor;\n }\n\n async resolveMCP(name: string): Promise<MCPDescriptor> {\n const client = await this.client();\n const items: models.ListMcpsResponseBodyItems[] = [];\n let nextToken: string | undefined;\n do {\n const response = await this.invoke(client, 'ListMcps', () => client.listMcpsWithOptions(this.workspaceId,\n new models.ListMcpsRequest({ name, searchType: 'accurate', maxResults: 100, nextToken }), {}, this.runtimeOptions()));\n const body = responseBody(response.body);\n items.push(...(body.items ?? [])); nextToken = body.nextToken;\n } while (nextToken);\n const item = exact(items, 'name', name, 'MCP server', MCPServerNotFoundError);\n const descriptor = Object.freeze({ mcpServerId: requiredString(item.mcpServerId, 'mcpServerId'),\n name: requiredString(item.name, 'MCP name'), protocol: item.protocol ?? '', type: item.type ?? '', status: item.status ?? '',\n });\n this.logger.info('agentcore.control_plane.mcp.resolve.succeeded', { name, mcpServerId: descriptor.mcpServerId, protocol: descriptor.protocol });\n return descriptor;\n }\n\n async getSkill(name: string, version?: string): Promise<SkillArtifact> {\n const client = await this.client();\n if (version === undefined) {\n const detail = await this.invoke(client, 'GetSkillDetail', () => client.getSkillDetailWithOptions(this.workspaceId, name, new models.GetSkillDetailRequest({}), {}, this.runtimeOptions()));\n version = latestVersion(responseBody(detail.body).data);\n }\n const resolvedVersion = version;\n const response = await this.invoke(client, 'DownloadSkillVersionViaOss', () => client.downloadSkillVersionViaOssWithOptions(this.workspaceId, name, resolvedVersion,\n new models.DownloadSkillVersionViaOssRequest({}), {}, this.runtimeOptions()));\n const downloadURL = responseBody(response.body).data;\n if (typeof downloadURL !== 'string') throw new ConfigError('AgentCore returned an invalid Skill download URL');\n return { version: resolvedVersion, archive: await this.downloadSkill(downloadURL) };\n }\n\n async resolveSkillVersion(name: string, selectorType: string, value: string): Promise<string> {\n if (selectorType === 'VERSION') return value;\n const client = await this.client();\n const response = await this.invoke(client, 'GetSkillDetail', () => client.getSkillDetailWithOptions(this.workspaceId, name, new models.GetSkillDetailRequest({}), {}, this.runtimeOptions()));\n const data = responseBody(response.body).data;\n if (value === 'HEAD' && data?.versions?.some((item) => item.version === 'HEAD')) return 'HEAD';\n const selected = data?.labels?.[value];\n if (!selected) throw new ResourceNotConfiguredError(`Skill ${JSON.stringify(name)} has no label ${JSON.stringify(value)}`);\n return selected;\n }\n\n async getTemplate(name: string, version?: string): Promise<TemplateArtifact> {\n const client = await this.client();\n const path = `/workspaces/${encodeURIComponent(this.workspaceId)}/agent-specs/${encodeURIComponent(name)}`;\n const request = async (action: string, suffix = '', query: Record<string, string> = {}): Promise<unknown> => {\n const params = new $OpenApiUtil.Params({ action, version: '2026-08-04', protocol: 'HTTPS', pathname: path + suffix,\n method: 'GET', authType: 'AK', style: 'ROA', reqBodyType: 'json', bodyType: 'json' });\n const response = await this.invoke(client, action, () => client.callApi(params, new $OpenApiUtil.OpenApiRequest({ query }), this.runtimeOptions()));\n return responseBody(response.body).data;\n };\n if (version === undefined) {\n const detail = await request('GetAgentSpec') as { labels?: Record<string, string> } | undefined;\n version = detail?.labels?.latest;\n if (!version) throw new ResourceNotConfiguredError(`Agent template ${JSON.stringify(name)} has no latest version`);\n }\n const url = await request('DownloadAgentSpecViaOss', '/actions/download-via-oss', { agentSpecVersion: version });\n if (typeof url !== 'string') throw new ConfigError('Invalid Agent template download URL');\n return { version, archive: await this.downloadSkill(url, 'Agent template', 50 * 1024 * 1024) };\n }\n\n close(): void { this.lifetime.abort(); }\n\n async resolveCredential(name: string): Promise<CredentialMetadata> {\n const client = await this.client();\n const params = new $OpenApiUtil.Params({ action: 'ListCredentials', version: '2026-08-04', protocol: 'HTTPS',\n pathname: `/workspaces/${encodeURIComponent(this.workspaceId)}/credentials`, method: 'GET', authType: 'AK',\n style: 'ROA', reqBodyType: 'json', bodyType: 'json' });\n const items: Record<string, unknown>[] = [];\n let nextToken: string | undefined;\n do {\n const request = new $OpenApiUtil.OpenApiRequest({ query: { name, maxResults: '100', ...(nextToken ? { nextToken } : {}) } });\n const response = await this.invoke(client, 'ListCredentials', () => client.callApi(params, request, this.runtimeOptions()));\n const body = responseBody(response.body);\n items.push(...(body.items ?? [])); nextToken = body.nextToken;\n } while (nextToken);\n const item = exact(items, 'name', name, 'credential');\n const refs = (item.resourceRefs ?? []) as Array<Record<string, unknown>>;\n return {\n credentialId: requiredString(item.credentialId, 'credentialId'), name: requiredString(item.name, 'name'),\n credentialType: requiredString(item.credentialType, 'credentialType'), resourceScope: String(item.resourceScope ?? ''),\n resourceRefs: refs.map((ref) => ({ resourceType: requiredString(ref.resourceType, 'resourceType'), resourceId: requiredString(ref.resourceId, 'resourceId') })),\n };\n }\n\n private runtimeOptions(): RuntimeOptions { return new RuntimeOptions({ autoretry: false, connectTimeout: 10_000, readTimeout: 30_000 }); }\n private async client(): Promise<Client> {\n this.lifetime.signal.throwIfAborted();\n const credential = this.options.accessKeyCredential ?? await this.options.resourceSTSProvider!.get(HIGH_CODE_SDK_PURPOSE);\n return new GeneratedClient(new $OpenApiUtil.Config({\n accessKeyId: credential.accessKeyId, accessKeySecret: credential.accessKeySecret, securityToken: credential.securityToken,\n regionId: this.regionId, endpoint: this.endpoint ?? this.discoveredEndpoint, protocol: this.protocol,\n }));\n }\n private async invoke<T>(client: Client, operation: string, call: () => Promise<T>): Promise<T> {\n this.lifetime.signal.throwIfAborted();\n const invoke = async () => {\n this.logger.debug('agentcore.control_plane.request.started', { operation, host: client._endpoint });\n try { return await call(); }\n catch (cause) {\n const data = errorField(cause, 'data');\n this.logger.warn('agentcore.control_plane.request.failed', { operation, host: client._endpoint,\n status: String(errorField(cause, 'statusCode') ?? '-'), code: String(errorField(cause, 'code') ?? '-'),\n requestId: String(errorField(cause, 'requestId') ?? errorField(data, 'RequestId') ?? errorField(data, 'requestId') ?? '-'),\n });\n throw new InvocationError('AgentCore control-plane request failed', { cause });\n }\n };\n try { return await invoke(); }\n catch (error) {\n if (!(error instanceof InvocationError) || this.endpoint || client._endpoint !== `agentcore.${this.regionId}.aliyuncs.com` || !endpointFailure(error.cause)) throw error;\n const host = `agentcore-vpc.${this.regionId}.aliyuncs.com`;\n this.logger.warn('agentcore.control_plane.endpoint.fallback', { operation, fromHost: client._endpoint, toHost: host });\n client._endpoint = host;\n const result = await invoke(); this.discoveredEndpoint = host; return result;\n }\n }\n\n private async downloadSkill(value: string, resource = 'Skill', maxBytes = 10 * 1024 * 1024): Promise<Uint8Array> {\n let original: URL;\n try { original = new URL(value); } catch { throw new ConfigError('AgentCore returned an invalid Skill download URL'); }\n if (!['http:', 'https:'].includes(original.protocol) || original.username || original.password) throw new ConfigError('AgentCore returned an invalid Skill download URL');\n let candidate = original;\n for (;;) {\n this.lifetime.signal.throwIfAborted();\n let status: number | undefined;\n try {\n const response = await fetch(candidate, { redirect: 'manual', signal: AbortSignal.any([this.lifetime.signal, AbortSignal.timeout(30_000)]) });\n if (response.ok) {\n const archive = await readBytes(response, maxBytes, `${resource} archive`);\n if (!archive.length) throw new ConfigError(`${resource} package is empty`);\n return archive;\n }\n status = response.status; await response.body?.cancel();\n } catch (error) {\n this.lifetime.signal.throwIfAborted();\n if (error instanceof ConfigError) throw error;\n }\n this.logger.warn('agentcore.control_plane.skill.download.failed', { host: candidate.host, path: candidate.pathname, status });\n const fallback = candidate === original && (status === undefined || status >= 500 && status < 600) ? internalOSSURL(original) : undefined;\n if (!fallback) throw new InvocationError(status ? `${resource} package download failed with HTTP ${status}` : `${resource} package download failed`);\n this.logger.warn('agentcore.control_plane.skill.download.fallback', { fromHost: candidate.host, toHost: fallback.host });\n candidate = fallback;\n }\n }\n}\n\nfunction latestVersion(data?: models.GetSkillDetailResponseBodyData): string {\n if (!data) throw new ResourceNotConfiguredError('AgentCore Skill does not exist');\n for (const [label, value] of Object.entries(data.labels ?? {})) if (label.toLowerCase() === 'latest' && value) return value;\n const online = (data.versions ?? []).filter((v) => v.status?.toLowerCase() === 'online' && v.version);\n online.sort((a, b) => (b.updateTime ?? -1) - (a.updateTime ?? -1) || (b.version ?? '').localeCompare(a.version ?? ''));\n if (!online[0]?.version) throw new ResourceNotConfiguredError('AgentCore Skill has no online version');\n return online[0].version;\n}\n\nexport function internalOSSURL(url: URL): URL | undefined {\n const match = /^([a-z0-9-]+)\\.(oss-[a-z]+-[a-z0-9-]+)\\.aliyuncs\\.com$/.exec(url.hostname);\n if (!match || match[2]!.endsWith('-internal') || match[2]!.startsWith('oss-accelerate') || url.username || url.password) return undefined;\n if (url.searchParams.getAll('x-oss-additional-headers').some((v) => v.split(';').includes('host'))) return undefined;\n const result = new URL(url); result.hostname = `${match[1]}.${match[2]}-internal.aliyuncs.com`; return result;\n}\n"],"mappings":"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","names":[]}
@@ -57,7 +57,7 @@ var Skills = class {
57
57
  this.logger.info("agentcore.skill.managed.load.started", { workspace_id: workspaceId, name, version: options.version ?? "latest" });
58
58
  const artifact = await provider.getSkill(name, options.version);
59
59
  component(artifact.version, "version");
60
- const files = await unpack(name, artifact.archive);
60
+ const files = await unpackArchive(artifact.archive, name);
61
61
  const hash = createHash("sha256");
62
62
  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");
63
63
  const digest = hash.digest("hex");
@@ -91,8 +91,8 @@ function component(value, label) {
91
91
  function safePath(path) {
92
92
  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");
93
93
  }
94
- async function unpack(name, archive) {
95
- if (!archive.length || archive.length > MAX_BYTES) throw new ConfigError("Skill package exceeds the 10 MiB size limit");
94
+ async function unpackArchive(archive, name, maxBytes = MAX_BYTES) {
95
+ if (!archive.length || archive.length > maxBytes) throw new ConfigError("Resource archive exceeds the size limit");
96
96
  try {
97
97
  const zip = await new Promise((accept, reject) => fromBuffer(Buffer.from(archive), { lazyEntries: true, strictFileNames: true }, (error, value) => error ? reject(error) : accept(value)));
98
98
  const files = /* @__PURE__ */ new Map();
@@ -104,18 +104,18 @@ async function unpack(name, archive) {
104
104
  void (async () => {
105
105
  if (entry.fileName.endsWith("/")) return;
106
106
  safePath(entry.fileName);
107
- if (!entry.fileName.startsWith(`${name}/`)) throw new ConfigError("managed Skill package must use the Skill name as its root directory");
108
- const path = entry.fileName.slice(name.length + 1);
107
+ if (name !== void 0 && !entry.fileName.startsWith(`${name}/`)) throw new ConfigError("managed Skill package must use the Skill name as its root directory");
108
+ const path = name === void 0 ? entry.fileName : entry.fileName.slice(name.length + 1);
109
109
  safePath(path);
110
110
  if (files.has(path)) throw new ConfigError("managed Skill package contains a duplicate path");
111
111
  if ((entry.externalFileAttributes >>> 16 & 61440) === 40960) throw new ConfigError("Skill directories must not contain symbolic links");
112
- if (entry.uncompressedSize > MAX_BYTES - total) throw new ConfigError("Skill content exceeds the 10 MiB size limit");
112
+ if (entry.uncompressedSize > maxBytes - total) throw new ConfigError("Resource content exceeds the size limit");
113
113
  const stream = await new Promise((resolve2, reject2) => zip.openReadStream(entry, (error, stream2) => error ? reject2(error) : resolve2(stream2)));
114
114
  const chunks = [];
115
115
  for await (const chunk of stream) {
116
116
  const data = Buffer.from(chunk);
117
117
  total += data.length;
118
- if (total > MAX_BYTES) throw new ConfigError("Skill content exceeds the 10 MiB size limit");
118
+ if (total > maxBytes) throw new ConfigError("Resource content exceeds the size limit");
119
119
  chunks.push(data);
120
120
  }
121
121
  files.set(path, Buffer.concat(chunks));
@@ -126,7 +126,7 @@ async function unpack(name, archive) {
126
126
  });
127
127
  zip.readEntry();
128
128
  });
129
- if (!files.has("SKILL.md")) throw new ConfigError(`managed Skill package does not contain ${name}/SKILL.md`);
129
+ if (name !== void 0 && !files.has("SKILL.md")) throw new ConfigError(`managed Skill package does not contain ${name}/SKILL.md`);
130
130
  for (const path of files.keys()) {
131
131
  let parent = posix.dirname(path);
132
132
  while (parent !== ".") {
@@ -140,6 +140,17 @@ async function unpack(name, archive) {
140
140
  throw new ConfigError("managed Skill package is not a valid ZIP archive");
141
141
  }
142
142
  }
143
+ async function materializeTemplateSkill(target, name, files, metadata) {
144
+ if (!files.has("SKILL.md")) throw new ConfigError(`Static Skill ${JSON.stringify(name)} has no SKILL.md`);
145
+ const write = (writes.get(target) ?? Promise.resolve()).catch(() => void 0).then(() => materialize(target, files, metadata));
146
+ writes.set(target, write);
147
+ try {
148
+ await write;
149
+ } finally {
150
+ if (writes.get(target) === write) writes.delete(target);
151
+ }
152
+ return Object.freeze({ ...await loadDirectory(target), name, workspaceId: metadata.workspaceId, digest: metadata.digest });
153
+ }
143
154
  async function materialize(target, files, metadata) {
144
155
  try {
145
156
  const stat = await lstat(target);
@@ -213,6 +224,8 @@ async function loadDirectory(root, sourceFiles) {
213
224
  }
214
225
 
215
226
  export {
216
- Skills
227
+ Skills,
228
+ unpackArchive,
229
+ materializeTemplateSkill
217
230
  };
218
- //# sourceMappingURL=chunk-D45QSOR4.js.map
231
+ //# sourceMappingURL=chunk-MXPHQGBQ.js.map