alibabacloud-agentcore-sdk 0.1.4 → 0.1.6
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.
- package/README.md +14 -0
- package/dist/auth/index.d.cts +2 -2
- package/dist/auth/index.d.ts +2 -2
- package/dist/{bound-credentials-DqT64Q2s.d.ts → bound-credentials-CpEUcH6w.d.ts} +1 -1
- package/dist/{bound-credentials-C1fM0thh.d.cts → bound-credentials-rHDKhpQy.d.cts} +1 -1
- package/dist/{chunk-UMTUXOKE.cjs → chunk-C35QBAIS.cjs} +23 -10
- package/dist/chunk-C35QBAIS.cjs.map +1 -0
- package/dist/{chunk-JK6KPDVW.cjs → chunk-EYDYQCSJ.cjs} +45 -8
- package/dist/chunk-EYDYQCSJ.cjs.map +1 -0
- package/dist/{chunk-7UBN3SJI.js → chunk-I2SSXKT7.js} +42 -5
- package/dist/chunk-I2SSXKT7.js.map +1 -0
- package/dist/{chunk-R7NVBTPK.cjs → chunk-JT33ZCFJ.cjs} +5 -3
- package/dist/chunk-JT33ZCFJ.cjs.map +1 -0
- package/dist/{chunk-D45QSOR4.js → chunk-MXPHQGBQ.js} +23 -10
- package/dist/chunk-MXPHQGBQ.js.map +1 -0
- package/dist/{chunk-6NNPSP3O.js → chunk-XW6YGVZO.js} +5 -3
- package/dist/chunk-XW6YGVZO.js.map +1 -0
- package/dist/{client-pDzS7EZR.d.ts → client-D4f63nzj.d.ts} +1 -1
- package/dist/{client-DDU4-ygJ.d.cts → client-K_TFV6Ea.d.cts} +1 -1
- package/dist/collaboration/index.d.cts +4 -4
- package/dist/collaboration/index.d.ts +4 -4
- package/dist/{context-M9rOTifU.d.cts → context-CVUx3RZg.d.cts} +2 -1
- package/dist/{context-M9rOTifU.d.ts → context-CVUx3RZg.d.ts} +2 -1
- package/dist/controlplane/index.cjs +2 -2
- package/dist/controlplane/index.d.cts +3 -65
- package/dist/controlplane/index.d.ts +3 -65
- package/dist/controlplane/index.js +1 -1
- package/dist/{errors-BGfCbCgs.d.cts → errors-BA8gNCmW.d.cts} +1 -1
- package/dist/{errors-D_809AqR.d.ts → errors-DAxP-nfs.d.ts} +1 -1
- package/dist/index-CkDNn3fW.d.ts +71 -0
- package/dist/index-Dsu71P1g.d.cts +71 -0
- package/dist/index.cjs +160 -23
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +41 -9
- package/dist/index.d.ts +41 -9
- package/dist/index.js +142 -5
- package/dist/index.js.map +1 -1
- package/dist/integrations/ai-sdk.d.cts +2 -2
- package/dist/integrations/ai-sdk.d.ts +2 -2
- package/dist/integrations/google-adk.cjs +1 -1
- package/dist/integrations/google-adk.d.cts +3 -3
- package/dist/integrations/google-adk.d.ts +3 -3
- package/dist/integrations/google-adk.js +1 -1
- package/dist/integrations/langchain.cjs +1 -1
- package/dist/integrations/langchain.d.cts +4 -4
- package/dist/integrations/langchain.d.ts +4 -4
- package/dist/integrations/langchain.js +1 -1
- package/dist/integrations/langgraph.cjs +1 -1
- package/dist/integrations/langgraph.d.cts +4 -4
- package/dist/integrations/langgraph.d.ts +4 -4
- package/dist/integrations/langgraph.js +1 -1
- package/dist/integrations/mastra.cjs +1 -1
- package/dist/integrations/mastra.d.cts +3 -3
- package/dist/integrations/mastra.d.ts +3 -3
- package/dist/integrations/mastra.js +1 -1
- package/dist/{langchain-adapter-DtxU7oAi.d.cts → langchain-adapter-3o4RGnV2.d.cts} +2 -2
- package/dist/{langchain-adapter-CaTCXaeo.d.ts → langchain-adapter-sBJrE0Jd.d.ts} +2 -2
- package/dist/{loader-DrIQ37nm.d.ts → loader-BV55JAVK.d.ts} +1 -1
- package/dist/{loader-eWuJ2GSL.d.cts → loader-kC1qeJWI.d.cts} +1 -1
- package/dist/mcp/index.d.cts +2 -2
- package/dist/mcp/index.d.ts +2 -2
- package/dist/model/index.d.cts +3 -3
- package/dist/model/index.d.ts +3 -3
- package/dist/runtime/index.cjs +2 -2
- package/dist/runtime/index.d.cts +1 -1
- package/dist/runtime/index.d.ts +1 -1
- package/dist/runtime/index.js +1 -1
- package/dist/server/index.cjs +3 -3
- package/dist/server/index.cjs.map +1 -1
- package/dist/server/index.d.cts +1 -1
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.js +2 -2
- package/dist/server/index.js.map +1 -1
- package/dist/skill/index.cjs +2 -2
- package/dist/skill/index.d.cts +3 -3
- package/dist/skill/index.d.ts +3 -3
- package/dist/skill/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-6NNPSP3O.js.map +0 -1
- package/dist/chunk-7UBN3SJI.js.map +0 -1
- package/dist/chunk-D45QSOR4.js.map +0 -1
- package/dist/chunk-JK6KPDVW.cjs.map +0 -1
- package/dist/chunk-R7NVBTPK.cjs.map +0 -1
- 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 并授予应用访问权限。
|
package/dist/auth/index.d.cts
CHANGED
|
@@ -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-
|
|
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 '../
|
|
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";
|
package/dist/auth/index.d.ts
CHANGED
|
@@ -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-
|
|
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 '../
|
|
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 './
|
|
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 './
|
|
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
|
|
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
|
|
95
|
-
if (!archive.length || archive.length >
|
|
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 >
|
|
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 >
|
|
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
|
-
|
|
218
|
-
|
|
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,
|
|
257
|
-
if (!archive.length) throw new (0, _chunkV4A6MJ42cjs.ConfigError)(
|
|
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',
|
|
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 ?
|
|
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',
|
|
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',
|
|
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-
|
|
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,
|
|
257
|
-
if (!archive.length) throw new ConfigError(
|
|
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 ?
|
|
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-
|
|
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":[]}
|
|
@@ -6,10 +6,12 @@ var _chunkV4A6MJ42cjs = require('./chunk-V4A6MJ42.cjs');
|
|
|
6
6
|
var _async_hooks = require('async_hooks');
|
|
7
7
|
var _util = require('util');
|
|
8
8
|
var RequestContext = class {
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
constructor(headers, signal) {
|
|
10
|
+
this.signal = signal;
|
|
11
11
|
this.headers = Object.freeze(Object.fromEntries(Object.entries(headers).map(([k, v]) => [k.toLowerCase(), v])));
|
|
12
12
|
}
|
|
13
|
+
|
|
14
|
+
|
|
13
15
|
[_util.inspect.custom]() {
|
|
14
16
|
return "RequestContext(headers=<redacted>)";
|
|
15
17
|
}
|
|
@@ -32,4 +34,4 @@ function useContext(value, callback) {
|
|
|
32
34
|
|
|
33
35
|
|
|
34
36
|
exports.RequestContext = RequestContext; exports.currentContext = currentContext; exports.useContext = useContext;
|
|
35
|
-
//# sourceMappingURL=chunk-
|
|
37
|
+
//# sourceMappingURL=chunk-JT33ZCFJ.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/agentcore-sdk-nodejs/agentcore-sdk-nodejs/dist/chunk-JT33ZCFJ.cjs","../src/runtime/context.ts"],"names":[],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACA;ACJA,0CAAkC;AAClC,4BAAwB;AAGjB,IAAM,eAAA,EAAN,MAAqB;AAAA,EAE1B,WAAA,CAAY,OAAA,EAAoD,MAAA,EAAsB;AAAtB,IAAA,IAAA,CAAA,OAAA,EAAA,MAAA;AAC9D,IAAA,IAAA,CAAK,QAAA,EAAU,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,WAAA,CAAY,MAAA,CAAO,OAAA,CAAQ,OAAO,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,EAAA,GAAM,CAAC,CAAA,CAAE,WAAA,CAAY,CAAA,EAAG,CAAC,CAAC,CAAC,CAAC,CAAA;AAAA,EAChH;AAAA,EAFgE;AAAA,EADvD;AAAA,EAIT,CAAC,aAAA,CAAQ,MAAM,CAAA,CAAA,EAAY;AAAE,IAAA,OAAO,oCAAA;AAAA,EAAsC;AAAA,EAC1E,MAAA,CAAA,EAAiB;AAAE,IAAA,OAAO,IAAA,CAAK,aAAA,CAAQ,MAAM,CAAA,CAAE,CAAA;AAAA,EAAG;AACpD,CAAA;AACA,IAAM,QAAA,EAAU,IAAI,mCAAA,CAAkC,CAAA;AAC/C,SAAS,cAAA,CAAe,SAAA,EAAW,IAAA,EAAkC;AAC1E,EAAA,MAAM,MAAA,EAAQ,OAAA,CAAQ,QAAA,CAAS,CAAA;AAC/B,EAAA,GAAA,CAAI,CAAC,MAAA,GAAS,QAAA,EAAU,MAAM,IAAI,mCAAA,CAAa,wCAAwC,CAAA;AACvF,EAAA,OAAO,KAAA;AACT;AACO,SAAS,UAAA,CAAc,KAAA,EAAuB,QAAA,EAAsB;AACzE,EAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,KAAA,EAAO,QAAQ,CAAA;AACpC;ADUA;AACA;AACE;AACA;AACA;AACF,kHAAC","file":"/home/runner/work/agentcore-sdk-nodejs/agentcore-sdk-nodejs/dist/chunk-JT33ZCFJ.cjs","sourcesContent":[null,"import { AsyncLocalStorage } from 'node:async_hooks';\nimport { inspect } from 'node:util';\nimport { ContextError } from '../errors';\n\nexport class RequestContext {\n readonly headers: Readonly<Record<string, string>>;\n constructor(headers: Readonly<Record<string, string>>, readonly signal?: AbortSignal) {\n this.headers = Object.freeze(Object.fromEntries(Object.entries(headers).map(([k, v]) => [k.toLowerCase(), v])));\n }\n [inspect.custom](): string { return 'RequestContext(headers=<redacted>)'; }\n toJSON(): string { return this[inspect.custom](); }\n}\nconst context = new AsyncLocalStorage<RequestContext>();\nexport function currentContext(required = true): RequestContext | undefined {\n const value = context.getStore();\n if (!value && required) throw new ContextError('no AgentCore request context is active');\n return value;\n}\nexport function useContext<T>(value: RequestContext, callback: () => T): T {\n return context.run(value, callback);\n}\n"]}
|
|
@@ -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
|
|
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
|
|
95
|
-
if (!archive.length || archive.length >
|
|
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 >
|
|
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 >
|
|
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-
|
|
231
|
+
//# sourceMappingURL=chunk-MXPHQGBQ.js.map
|