alibabacloud-agentcore-sdk 0.1.2 → 0.1.4
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 +15 -2
- package/dist/auth/index.cjs +6 -7
- package/dist/auth/index.cjs.map +1 -1
- package/dist/auth/index.js +5 -6
- package/dist/{chunk-RZNQGEGJ.cjs → chunk-25KH5XKG.cjs} +6 -6
- package/dist/{chunk-RZNQGEGJ.cjs.map → chunk-25KH5XKG.cjs.map} +1 -1
- package/dist/{chunk-A3WMLVJC.cjs → chunk-2TRT7RSV.cjs} +5 -7
- package/dist/chunk-2TRT7RSV.cjs.map +1 -0
- package/dist/{chunk-K3TE7625.js → chunk-3JXIMUUY.js} +2 -2
- package/dist/{chunk-UWPKFJYM.js → chunk-45S6S5WI.js} +13 -11
- package/dist/chunk-45S6S5WI.js.map +1 -0
- package/dist/{chunk-TWEO5XVM.cjs → chunk-5S55CTNM.cjs} +18 -20
- package/dist/chunk-5S55CTNM.cjs.map +1 -0
- package/dist/{chunk-JW62DVIC.js → chunk-5UQIUMSF.js} +3 -5
- package/dist/{chunk-JW62DVIC.js.map → chunk-5UQIUMSF.js.map} +1 -1
- package/dist/{chunk-ZWQBAJ5O.js → chunk-6NNPSP3O.js} +2 -2
- package/dist/{chunk-IUCLCPVV.js → chunk-76NTQYJB.js} +3 -3
- package/dist/{chunk-7Y263YIW.js → chunk-7AJ2V7RN.js} +5 -7
- package/dist/{chunk-7Y263YIW.js.map → chunk-7AJ2V7RN.js.map} +1 -1
- package/dist/{chunk-5ZOLHQXO.js → chunk-7UBN3SJI.js} +7 -9
- package/dist/{chunk-5ZOLHQXO.js.map → chunk-7UBN3SJI.js.map} +1 -1
- package/dist/{chunk-MZ5UWGXS.js → chunk-AEQ76QIO.js} +33 -5
- package/dist/chunk-AEQ76QIO.js.map +1 -0
- package/dist/{chunk-UBP5CHU7.js → chunk-AX3NM2DK.js} +5 -7
- package/dist/{chunk-UBP5CHU7.js.map → chunk-AX3NM2DK.js.map} +1 -1
- package/dist/{chunk-55XZZRKO.js → chunk-D45QSOR4.js} +4 -6
- package/dist/{chunk-55XZZRKO.js.map → chunk-D45QSOR4.js.map} +1 -1
- package/dist/{chunk-MICRSJ6R.js → chunk-EKLTJ65H.js} +2 -2
- package/dist/{chunk-RBAY4MO2.js → chunk-FG7K3EF7.js} +6 -8
- package/dist/{chunk-RBAY4MO2.js.map → chunk-FG7K3EF7.js.map} +1 -1
- package/dist/{chunk-PKYET77D.cjs → chunk-JK6KPDVW.cjs} +39 -41
- package/dist/chunk-JK6KPDVW.cjs.map +1 -0
- package/dist/{chunk-2E5EWEDG.cjs → chunk-KQTZUIMI.cjs} +10 -12
- package/dist/chunk-KQTZUIMI.cjs.map +1 -0
- package/dist/{chunk-ZLKYXRNM.js → chunk-KTKZCLYB.js} +3 -5
- package/dist/{chunk-ZLKYXRNM.js.map → chunk-KTKZCLYB.js.map} +1 -1
- package/dist/{chunk-RHY7Y43E.js → chunk-L74ASQWF.js} +8 -9
- package/dist/chunk-L74ASQWF.js.map +1 -0
- package/dist/{chunk-S7PWSJNP.cjs → chunk-LQM754U3.cjs} +5 -5
- package/dist/{chunk-S7PWSJNP.cjs.map → chunk-LQM754U3.cjs.map} +1 -1
- package/dist/{chunk-GYLT23D3.js → chunk-NI3U6RZL.js} +5 -5
- package/dist/{chunk-5JXA7JPS.js → chunk-NRYDUATX.js} +2 -2
- package/dist/{chunk-A3PF2SPD.cjs → chunk-NWWTBPYG.cjs} +5 -5
- package/dist/{chunk-A3PF2SPD.cjs.map → chunk-NWWTBPYG.cjs.map} +1 -1
- package/dist/{chunk-5RKN46UU.cjs → chunk-NXMTTQQK.cjs} +15 -15
- package/dist/{chunk-5RKN46UU.cjs.map → chunk-NXMTTQQK.cjs.map} +1 -1
- package/dist/{chunk-IF7LMBXC.js → chunk-PHVKSATD.js} +60 -16
- package/dist/chunk-PHVKSATD.js.map +1 -0
- package/dist/{chunk-RYXL25AI.js → chunk-PS3EAUMK.js} +2 -2
- package/dist/{chunk-ULJTQSLE.cjs → chunk-R7NVBTPK.cjs} +3 -3
- package/dist/{chunk-ULJTQSLE.cjs.map → chunk-R7NVBTPK.cjs.map} +1 -1
- package/dist/{chunk-YZP55W7S.cjs → chunk-RJCDBVZ6.cjs} +3 -3
- package/dist/{chunk-YZP55W7S.cjs.map → chunk-RJCDBVZ6.cjs.map} +1 -1
- package/dist/{chunk-LXHW6OT4.cjs → chunk-T26WN7TD.cjs} +19 -17
- package/dist/chunk-T26WN7TD.cjs.map +1 -0
- package/dist/{chunk-ZTWLCHCO.cjs → chunk-UKRJR66Y.cjs} +24 -26
- package/dist/chunk-UKRJR66Y.cjs.map +1 -0
- package/dist/{chunk-MWAHO47B.cjs → chunk-UMTUXOKE.cjs} +25 -27
- package/dist/chunk-UMTUXOKE.cjs.map +1 -0
- package/dist/{chunk-JSP7ZROS.cjs → chunk-V4A6MJ42.cjs} +36 -8
- package/dist/chunk-V4A6MJ42.cjs.map +1 -0
- package/dist/{chunk-BVZ7H2F5.cjs → chunk-VYOJJECB.cjs} +55 -56
- package/dist/chunk-VYOJJECB.cjs.map +1 -0
- package/dist/{chunk-ZLQ2IBTC.cjs → chunk-WRRIPTJP.cjs} +12 -12
- package/dist/{chunk-ZLQ2IBTC.cjs.map → chunk-WRRIPTJP.cjs.map} +1 -1
- package/dist/{chunk-QIZO3A4Y.cjs → chunk-ZIXZWQSP.cjs} +85 -41
- package/dist/chunk-ZIXZWQSP.cjs.map +1 -0
- package/dist/{chunk-RQRI6RCG.cjs → chunk-ZXPTDLXJ.cjs} +12 -14
- package/dist/chunk-ZXPTDLXJ.cjs.map +1 -0
- package/dist/collaboration/index.cjs +3 -3
- package/dist/collaboration/index.d.cts +2 -2
- package/dist/collaboration/index.d.ts +2 -2
- package/dist/collaboration/index.js +2 -2
- package/dist/controlplane/index.cjs +7 -8
- package/dist/controlplane/index.cjs.map +1 -1
- package/dist/controlplane/index.js +6 -7
- package/dist/{errors-D9OtcR-o.d.cts → errors-BGfCbCgs.d.cts} +4 -1
- package/dist/{errors-BjGO6N10.d.ts → errors-D_809AqR.d.ts} +4 -1
- package/dist/{google-adk-model-N47R7GB2.js → google-adk-model-V7SC6RQD.js} +3 -3
- package/dist/{google-adk-model-PDBKY5YZ.cjs → google-adk-model-WYWEQI4R.cjs} +13 -13
- package/dist/{google-adk-model-PDBKY5YZ.cjs.map → google-adk-model-WYWEQI4R.cjs.map} +1 -1
- package/dist/index.cjs +33 -35
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.js +15 -17
- package/dist/index.js.map +1 -1
- package/dist/integrations/ai-sdk.cjs +3 -3
- package/dist/integrations/ai-sdk.js +2 -2
- package/dist/integrations/google-adk.cjs +14 -15
- package/dist/integrations/google-adk.cjs.map +1 -1
- package/dist/integrations/google-adk.js +10 -11
- package/dist/integrations/google-adk.js.map +1 -1
- package/dist/integrations/langchain.cjs +18 -19
- package/dist/integrations/langchain.cjs.map +1 -1
- package/dist/integrations/langchain.d.cts +3 -2
- package/dist/integrations/langchain.d.ts +3 -2
- package/dist/integrations/langchain.js +11 -12
- package/dist/integrations/langchain.js.map +1 -1
- package/dist/integrations/langgraph.cjs +10 -11
- package/dist/integrations/langgraph.cjs.map +1 -1
- package/dist/integrations/langgraph.d.cts +3 -2
- package/dist/integrations/langgraph.d.ts +3 -2
- package/dist/integrations/langgraph.js +9 -10
- package/dist/integrations/mastra.cjs +14 -15
- package/dist/integrations/mastra.cjs.map +1 -1
- package/dist/integrations/mastra.js +8 -9
- package/dist/integrations/mastra.js.map +1 -1
- package/dist/{langchain-adapter-DJsyjm5V.d.ts → langchain-adapter-CaTCXaeo.d.ts} +4 -2
- package/dist/{langchain-adapter-DFJdEX04.d.cts → langchain-adapter-DtxU7oAi.d.cts} +4 -2
- package/dist/{langchain-provider-PHL4UWNF.js → langchain-provider-JFWLKOGL.js} +26 -2
- package/dist/langchain-provider-JFWLKOGL.js.map +1 -0
- package/dist/{langchain-provider-NF5GIDQV.cjs → langchain-provider-UKO27CQA.cjs} +38 -14
- package/dist/langchain-provider-UKO27CQA.cjs.map +1 -0
- package/dist/mcp/index.cjs +3 -4
- package/dist/mcp/index.cjs.map +1 -1
- package/dist/mcp/index.js +2 -3
- package/dist/memory/index.cjs +6 -7
- package/dist/memory/index.cjs.map +1 -1
- package/dist/memory/index.d.cts +24 -2
- package/dist/memory/index.d.ts +24 -2
- package/dist/memory/index.js +5 -6
- package/dist/model/index.cjs +4 -5
- package/dist/model/index.cjs.map +1 -1
- package/dist/model/index.js +3 -4
- package/dist/runtime/index.cjs +7 -8
- package/dist/runtime/index.cjs.map +1 -1
- package/dist/runtime/index.js +6 -7
- package/dist/server/index.cjs +13 -15
- package/dist/server/index.cjs.map +1 -1
- package/dist/server/index.js +5 -7
- package/dist/server/index.js.map +1 -1
- package/dist/skill/index.cjs +4 -5
- package/dist/skill/index.cjs.map +1 -1
- package/dist/skill/index.js +3 -4
- package/package.json +1 -1
- package/dist/chunk-2E5EWEDG.cjs.map +0 -1
- package/dist/chunk-A3WMLVJC.cjs.map +0 -1
- package/dist/chunk-BVZ7H2F5.cjs.map +0 -1
- package/dist/chunk-IF7LMBXC.js.map +0 -1
- package/dist/chunk-JSP7ZROS.cjs.map +0 -1
- package/dist/chunk-LE5P3SJW.cjs +0 -16
- package/dist/chunk-LE5P3SJW.cjs.map +0 -1
- package/dist/chunk-LXHW6OT4.cjs.map +0 -1
- package/dist/chunk-MWAHO47B.cjs.map +0 -1
- package/dist/chunk-MZ5UWGXS.js.map +0 -1
- package/dist/chunk-NZL3VPJ2.js +0 -16
- package/dist/chunk-NZL3VPJ2.js.map +0 -1
- package/dist/chunk-PKYET77D.cjs.map +0 -1
- package/dist/chunk-QIZO3A4Y.cjs.map +0 -1
- package/dist/chunk-RHY7Y43E.js.map +0 -1
- package/dist/chunk-RQRI6RCG.cjs.map +0 -1
- package/dist/chunk-TWEO5XVM.cjs.map +0 -1
- package/dist/chunk-UWPKFJYM.js.map +0 -1
- package/dist/chunk-ZTWLCHCO.cjs.map +0 -1
- package/dist/langchain-provider-NF5GIDQV.cjs.map +0 -1
- package/dist/langchain-provider-PHL4UWNF.js.map +0 -1
- /package/dist/{chunk-K3TE7625.js.map → chunk-3JXIMUUY.js.map} +0 -0
- /package/dist/{chunk-ZWQBAJ5O.js.map → chunk-6NNPSP3O.js.map} +0 -0
- /package/dist/{chunk-IUCLCPVV.js.map → chunk-76NTQYJB.js.map} +0 -0
- /package/dist/{chunk-MICRSJ6R.js.map → chunk-EKLTJ65H.js.map} +0 -0
- /package/dist/{chunk-GYLT23D3.js.map → chunk-NI3U6RZL.js.map} +0 -0
- /package/dist/{chunk-5JXA7JPS.js.map → chunk-NRYDUATX.js.map} +0 -0
- /package/dist/{chunk-RYXL25AI.js.map → chunk-PS3EAUMK.js.map} +0 -0
- /package/dist/{google-adk-model-N47R7GB2.js.map → google-adk-model-V7SC6RQD.js.map} +0 -0
|
@@ -1,10 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
nullLogger
|
|
3
|
-
} from "./chunk-NZL3VPJ2.js";
|
|
4
1
|
import {
|
|
5
2
|
ConfigError,
|
|
6
|
-
ResourceNotConfiguredError
|
|
7
|
-
|
|
3
|
+
ResourceNotConfiguredError,
|
|
4
|
+
nullLogger
|
|
5
|
+
} from "./chunk-AEQ76QIO.js";
|
|
8
6
|
|
|
9
7
|
// src/skill/loader.ts
|
|
10
8
|
import { createHash } from "crypto";
|
|
@@ -217,4 +215,4 @@ async function loadDirectory(root, sourceFiles) {
|
|
|
217
215
|
export {
|
|
218
216
|
Skills
|
|
219
217
|
};
|
|
220
|
-
//# sourceMappingURL=chunk-
|
|
218
|
+
//# sourceMappingURL=chunk-D45QSOR4.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/skill/loader.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\nimport { lstat, mkdir, mkdtemp, readFile, readdir, rename, rm, writeFile } from 'node:fs/promises';\nimport { basename, dirname, join, posix, resolve } from 'node:path';\nimport { fromBuffer, type Entry, type ZipFile } from 'yauzl';\nimport { parseDocument } from 'yaml';\nimport type { SkillArtifact } from '../controlplane/client';\nimport { ConfigError, ResourceNotConfiguredError } from '../errors';\nimport { nullLogger, type Logger } from '../logging';\n\nconst MAX_BYTES = 10 * 1024 * 1024;\nconst METADATA = '.agentcore-skill.json';\nconst writes = new Map<string, Promise<void>>();\nexport interface Skill {\n readonly name: string;\n readonly description: string;\n readonly version: string;\n readonly instruction: string;\n readonly root: string;\n readonly files: readonly string[];\n readonly source: 'local' | 'agentcore';\n readonly digest?: string;\n readonly workspaceId?: string;\n}\nexport interface SkillProvider { getSkill(name: string, version?: string): Promise<SkillArtifact>; }\nexport interface SkillsOptions {\n workspaceDir?: string;\n runtime?: () => Promise<{ workspaceId: string; provider: SkillProvider }>;\n logger?: Logger;\n}\n\nexport class Skills {\n private readonly pins = new Map<string, Promise<Skill>>();\n private readonly workspace: string;\n private readonly logger: Logger;\n constructor(private readonly options: SkillsOptions = {}) {\n this.workspace = resolve(options.workspaceDir ?? process.env.AGENTCORE_SKILL_WORKSPACE_DIR ?? '.skills/.agentcore-managed');\n this.logger = options.logger ?? nullLogger;\n }\n async local(root: string): Promise<Skill[]> {\n this.logger.info('agentcore.skill.local.load.started', { root });\n try {\n root = resolve(root);\n if (!(await lstat(root)).isDirectory()) throw new ConfigError('local Skill root is not a directory');\n const entries = await readdir(root, { withFileTypes: true });\n const directories = entries.some((entry) => entry.name === 'SKILL.md') ? [root] : entries.sort((a, b) => a.name.localeCompare(b.name)).flatMap((entry) => {\n if (entry.isSymbolicLink()) throw new ConfigError('local Skill root must not contain symbolic-link Skills');\n return entry.isDirectory() ? [join(root, entry.name)] : [];\n });\n const result: Skill[] = [];\n for (const directory of directories) {\n if ((await readdir(directory)).includes('SKILL.md')) result.push(await loadDirectory(directory));\n }\n this.logger.info('agentcore.skill.local.load.succeeded', { root, skill_count: result.length }); return result;\n } catch (error) { this.logger.warn('agentcore.skill.local.load.failed', { root, error_type: error instanceof Error ? error.name : 'Error' }); throw error; }\n }\n async managed(name: string, options: { version?: string } = {}): Promise<Skill> {\n if (!this.options.runtime) throw new ResourceNotConfiguredError('managed Skill runtime is not configured');\n const { workspaceId, provider } = await this.options.runtime();\n component(name, 'name'); component(workspaceId, 'workspace ID');\n if (options.version !== undefined) component(options.version, 'version');\n const key = JSON.stringify([workspaceId, name, options.version]);\n const cached = this.pins.get(key); if (cached) return cached;\n const pending = (async () => {\n this.logger.info('agentcore.skill.managed.load.started', { workspace_id: workspaceId, name, version: options.version ?? 'latest' });\n const artifact = await provider.getSkill(name, options.version); component(artifact.version, 'version');\n const files = await unpack(name, artifact.archive);\n const hash = createHash('sha256');\n for (const [path, data] of [...files.entries()].sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0)) hash.update(path).update('\\0').update(data).update('\\0');\n const digest = hash.digest('hex');\n const target = join(this.workspace, workspaceId, name, artifact.version);\n const metadata = { source: 'agentcore', workspaceId, name, version: artifact.version, digest };\n // Serialize writes to the same named version across Core instances in this process.\n const write = (writes.get(target) ?? Promise.resolve()).catch(() => undefined).then(() => materialize(target, files, metadata));\n writes.set(target, write);\n try { await write; } finally { if (writes.get(target) === write) writes.delete(target); }\n const sourceFiles = ['SKILL.md', ...[...files.keys()].filter((path) => path !== 'SKILL.md').sort()];\n const skill = Object.freeze({ ...await loadDirectory(target, sourceFiles), ...metadata, source: 'agentcore' as const });\n this.logger.info('agentcore.skill.managed.load.succeeded', { workspace_id: workspaceId, name, version: artifact.version, digest });\n return skill;\n })();\n this.pins.set(key, pending);\n try { return await pending; } catch (error) {\n this.pins.delete(key); this.logger.warn('agentcore.skill.managed.load.failed', { workspace_id: workspaceId, name, error_type: error instanceof Error ? error.name : 'Error' }); throw error;\n }\n }\n}\n\nfunction component(value: string, label: string): void {\n if (!value.trim() || /[\\\\/:\\0]/.test(value) || value === '.' || value === '..') throw new ConfigError(`managed Skill ${label} is invalid`);\n}\nfunction safePath(path: string): void {\n if (!path || /[\\\\:\\0]/.test(path) || posix.isAbsolute(path) || path !== posix.normalize(path) || path.split('/').some((part) => part === '.' || part === '..') || path === METADATA) throw new ConfigError('managed Skill contains an unsafe resource path');\n}\nasync function unpack(name: string, archive: Uint8Array): Promise<Map<string, Buffer>> {\n if (!archive.length || archive.length > MAX_BYTES) throw new ConfigError('Skill package exceeds the 10 MiB size limit');\n try {\n const zip = await new Promise<ZipFile>((accept, reject) => fromBuffer(Buffer.from(archive), { lazyEntries: true, strictFileNames: true }, (error, value) => error ? reject(error) : accept(value)));\n const files = new Map<string, Buffer>(); let total = 0;\n await new Promise<void>((accept, reject) => {\n zip.on('error', reject); zip.on('end', accept);\n zip.on('entry', (entry: Entry) => { void (async () => {\n if (entry.fileName.endsWith('/')) return;\n safePath(entry.fileName);\n if (!entry.fileName.startsWith(`${name}/`)) throw new ConfigError('managed Skill package must use the Skill name as its root directory');\n const path = entry.fileName.slice(name.length + 1); safePath(path);\n if (files.has(path)) throw new ConfigError('managed Skill package contains a duplicate path');\n if (((entry.externalFileAttributes >>> 16) & 0xf000) === 0xa000) throw new ConfigError('Skill directories must not contain symbolic links');\n if (entry.uncompressedSize > MAX_BYTES - total) throw new ConfigError('Skill content exceeds the 10 MiB size limit');\n const stream = await new Promise<NodeJS.ReadableStream>((resolve, reject) => zip.openReadStream(entry, (error, stream) => error ? reject(error) : resolve(stream)));\n const chunks: Buffer[] = [];\n for await (const chunk of stream) { const data = Buffer.from(chunk); total += data.length; if (total > MAX_BYTES) throw new ConfigError('Skill content exceeds the 10 MiB size limit'); chunks.push(data); }\n files.set(path, Buffer.concat(chunks));\n })().then(() => zip.readEntry(), (error) => { zip.close(); reject(error); }); });\n zip.readEntry();\n });\n if (!files.has('SKILL.md')) throw new ConfigError(`managed Skill package does not contain ${name}/SKILL.md`);\n for (const path of files.keys()) {\n let parent = posix.dirname(path);\n while (parent !== '.') { if (files.has(parent)) throw new ConfigError('managed Skill contains a colliding resource path'); parent = posix.dirname(parent); }\n }\n return files;\n } catch (error) { if (error instanceof ConfigError) throw error; throw new ConfigError('managed Skill package is not a valid ZIP archive'); }\n}\n\nasync function materialize(target: string, files: Map<string, Buffer>, metadata: Record<string, string>): Promise<void> {\n try {\n const stat = await lstat(target);\n if (stat.isDirectory() && !stat.isSymbolicLink()) {\n const existing: unknown = JSON.parse(await readFile(join(target, METADATA), 'utf8'));\n if (JSON.stringify(existing) === JSON.stringify(metadata)) return;\n }\n } catch (error) { if (!(error instanceof SyntaxError) && (error as NodeJS.ErrnoException).code !== 'ENOENT') throw error; }\n await mkdir(dirname(target), { recursive: true });\n const temporary = await mkdtemp(join(dirname(target), '.skill-'));\n try {\n for (const [path, content] of files) { const destination = join(temporary, path); await mkdir(dirname(destination), { recursive: true }); await writeFile(destination, content); }\n await writeFile(join(temporary, METADATA), JSON.stringify(metadata));\n await loadDirectory(temporary); // Do not replace a working version with invalid SKILL.md.\n await rm(target, { recursive: true, force: true });\n await rename(temporary, target);\n } finally { await rm(temporary, { recursive: true, force: true }); }\n}\n\nasync function loadDirectory(root: string, sourceFiles?: readonly string[]): Promise<Skill> {\n const files: string[] = []; let total = 0;\n async function walk(directory: string, prefix = ''): Promise<void> {\n for (const entry of (await readdir(directory, { withFileTypes: true })).sort((a, b) => a.name.localeCompare(b.name))) {\n if (entry.isSymbolicLink()) throw new ConfigError('Skill directories must not contain symbolic links');\n const name = prefix + entry.name;\n if (entry.isDirectory()) await walk(join(directory, entry.name), `${name}/`);\n else if (entry.isFile() && entry.name !== METADATA) { total += (await lstat(join(directory, entry.name))).size; if (total > MAX_BYTES) throw new ConfigError('Skill content exceeds the 10 MiB size limit'); files.push(name); }\n }\n }\n if (sourceFiles) {\n // Managed packages track source files, not files generated by command execution.\n for (const name of sourceFiles) {\n const entry = await lstat(join(root, name));\n if (entry.isSymbolicLink() || !entry.isFile()) throw new ConfigError('managed Skill workspace is missing a source file');\n files.push(name);\n }\n } else await walk(root);\n const instruction = new TextDecoder('utf8', { fatal: true }).decode(await readFile(join(root, 'SKILL.md')));\n const match = /^---\\s*\\n([\\s\\S]*?)\\n---(?:\\s*\\n|$)/.exec(instruction);\n const metadata: Record<string, string> = {};\n if (match) {\n const document = parseDocument(match[1]!);\n if (document.errors.length) throw new ConfigError('SKILL.md contains invalid YAML frontmatter');\n let value: unknown;\n try { value = document.toJS({ maxAliasCount: 0 }) ?? {}; } catch { throw new ConfigError('SKILL.md contains invalid YAML frontmatter'); }\n if (!value || typeof value !== 'object' || Array.isArray(value)) throw new ConfigError('SKILL.md frontmatter must be an object');\n for (const key of ['name', 'description', 'version']) {\n const item = (value as Record<string, unknown>)[key];\n if (item !== undefined && item !== null) { if (typeof item !== 'string') throw new ConfigError(`SKILL.md frontmatter ${key} must be a string`); metadata[key] = item; }\n }\n }\n return Object.freeze({ name: metadata.name || basename(root), description: metadata.description || '', version: metadata.version || '', instruction, root, files: Object.freeze(files), source: 'local' as const });\n}\n"],"mappings":"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","names":["resolve","reject","stream"]}
|
|
1
|
+
{"version":3,"sources":["../src/skill/loader.ts"],"sourcesContent":["import { createHash } from 'node:crypto';\nimport { lstat, mkdir, mkdtemp, readFile, readdir, rename, rm, writeFile } from 'node:fs/promises';\nimport { basename, dirname, join, posix, resolve } from 'node:path';\nimport { fromBuffer, type Entry, type ZipFile } from 'yauzl';\nimport { parseDocument } from 'yaml';\nimport type { SkillArtifact } from '../controlplane/client';\nimport { ConfigError, ResourceNotConfiguredError } from '../errors';\nimport { nullLogger, type Logger } from '../logging';\n\nconst MAX_BYTES = 10 * 1024 * 1024;\nconst METADATA = '.agentcore-skill.json';\nconst writes = new Map<string, Promise<void>>();\nexport interface Skill {\n readonly name: string;\n readonly description: string;\n readonly version: string;\n readonly instruction: string;\n readonly root: string;\n readonly files: readonly string[];\n readonly source: 'local' | 'agentcore';\n readonly digest?: string;\n readonly workspaceId?: string;\n}\nexport interface SkillProvider { getSkill(name: string, version?: string): Promise<SkillArtifact>; }\nexport interface SkillsOptions {\n workspaceDir?: string;\n runtime?: () => Promise<{ workspaceId: string; provider: SkillProvider }>;\n logger?: Logger;\n}\n\nexport class Skills {\n private readonly pins = new Map<string, Promise<Skill>>();\n private readonly workspace: string;\n private readonly logger: Logger;\n constructor(private readonly options: SkillsOptions = {}) {\n this.workspace = resolve(options.workspaceDir ?? process.env.AGENTCORE_SKILL_WORKSPACE_DIR ?? '.skills/.agentcore-managed');\n this.logger = options.logger ?? nullLogger;\n }\n async local(root: string): Promise<Skill[]> {\n this.logger.info('agentcore.skill.local.load.started', { root });\n try {\n root = resolve(root);\n if (!(await lstat(root)).isDirectory()) throw new ConfigError('local Skill root is not a directory');\n const entries = await readdir(root, { withFileTypes: true });\n const directories = entries.some((entry) => entry.name === 'SKILL.md') ? [root] : entries.sort((a, b) => a.name.localeCompare(b.name)).flatMap((entry) => {\n if (entry.isSymbolicLink()) throw new ConfigError('local Skill root must not contain symbolic-link Skills');\n return entry.isDirectory() ? [join(root, entry.name)] : [];\n });\n const result: Skill[] = [];\n for (const directory of directories) {\n if ((await readdir(directory)).includes('SKILL.md')) result.push(await loadDirectory(directory));\n }\n this.logger.info('agentcore.skill.local.load.succeeded', { root, skill_count: result.length }); return result;\n } catch (error) { this.logger.warn('agentcore.skill.local.load.failed', { root, error_type: error instanceof Error ? error.name : 'Error' }); throw error; }\n }\n async managed(name: string, options: { version?: string } = {}): Promise<Skill> {\n if (!this.options.runtime) throw new ResourceNotConfiguredError('managed Skill runtime is not configured');\n const { workspaceId, provider } = await this.options.runtime();\n component(name, 'name'); component(workspaceId, 'workspace ID');\n if (options.version !== undefined) component(options.version, 'version');\n const key = JSON.stringify([workspaceId, name, options.version]);\n const cached = this.pins.get(key); if (cached) return cached;\n const pending = (async () => {\n this.logger.info('agentcore.skill.managed.load.started', { workspace_id: workspaceId, name, version: options.version ?? 'latest' });\n const artifact = await provider.getSkill(name, options.version); component(artifact.version, 'version');\n const files = await unpack(name, artifact.archive);\n const hash = createHash('sha256');\n for (const [path, data] of [...files.entries()].sort(([a], [b]) => a < b ? -1 : a > b ? 1 : 0)) hash.update(path).update('\\0').update(data).update('\\0');\n const digest = hash.digest('hex');\n const target = join(this.workspace, workspaceId, name, artifact.version);\n const metadata = { source: 'agentcore', workspaceId, name, version: artifact.version, digest };\n // Serialize writes to the same named version across Core instances in this process.\n const write = (writes.get(target) ?? Promise.resolve()).catch(() => undefined).then(() => materialize(target, files, metadata));\n writes.set(target, write);\n try { await write; } finally { if (writes.get(target) === write) writes.delete(target); }\n const sourceFiles = ['SKILL.md', ...[...files.keys()].filter((path) => path !== 'SKILL.md').sort()];\n const skill = Object.freeze({ ...await loadDirectory(target, sourceFiles), ...metadata, source: 'agentcore' as const });\n this.logger.info('agentcore.skill.managed.load.succeeded', { workspace_id: workspaceId, name, version: artifact.version, digest });\n return skill;\n })();\n this.pins.set(key, pending);\n try { return await pending; } catch (error) {\n this.pins.delete(key); this.logger.warn('agentcore.skill.managed.load.failed', { workspace_id: workspaceId, name, error_type: error instanceof Error ? error.name : 'Error' }); throw error;\n }\n }\n}\n\nfunction component(value: string, label: string): void {\n if (!value.trim() || /[\\\\/:\\0]/.test(value) || value === '.' || value === '..') throw new ConfigError(`managed Skill ${label} is invalid`);\n}\nfunction safePath(path: string): void {\n if (!path || /[\\\\:\\0]/.test(path) || posix.isAbsolute(path) || path !== posix.normalize(path) || path.split('/').some((part) => part === '.' || part === '..') || path === METADATA) throw new ConfigError('managed Skill contains an unsafe resource path');\n}\nasync function unpack(name: string, archive: Uint8Array): Promise<Map<string, Buffer>> {\n if (!archive.length || archive.length > MAX_BYTES) throw new ConfigError('Skill package exceeds the 10 MiB size limit');\n try {\n const zip = await new Promise<ZipFile>((accept, reject) => fromBuffer(Buffer.from(archive), { lazyEntries: true, strictFileNames: true }, (error, value) => error ? reject(error) : accept(value)));\n const files = new Map<string, Buffer>(); let total = 0;\n await new Promise<void>((accept, reject) => {\n zip.on('error', reject); zip.on('end', accept);\n zip.on('entry', (entry: Entry) => { void (async () => {\n if (entry.fileName.endsWith('/')) return;\n safePath(entry.fileName);\n if (!entry.fileName.startsWith(`${name}/`)) throw new ConfigError('managed Skill package must use the Skill name as its root directory');\n const path = entry.fileName.slice(name.length + 1); safePath(path);\n if (files.has(path)) throw new ConfigError('managed Skill package contains a duplicate path');\n if (((entry.externalFileAttributes >>> 16) & 0xf000) === 0xa000) throw new ConfigError('Skill directories must not contain symbolic links');\n if (entry.uncompressedSize > MAX_BYTES - total) throw new ConfigError('Skill content exceeds the 10 MiB size limit');\n const stream = await new Promise<NodeJS.ReadableStream>((resolve, reject) => zip.openReadStream(entry, (error, stream) => error ? reject(error) : resolve(stream)));\n const chunks: Buffer[] = [];\n for await (const chunk of stream) { const data = Buffer.from(chunk); total += data.length; if (total > MAX_BYTES) throw new ConfigError('Skill content exceeds the 10 MiB size limit'); chunks.push(data); }\n files.set(path, Buffer.concat(chunks));\n })().then(() => zip.readEntry(), (error) => { zip.close(); reject(error); }); });\n zip.readEntry();\n });\n if (!files.has('SKILL.md')) throw new ConfigError(`managed Skill package does not contain ${name}/SKILL.md`);\n for (const path of files.keys()) {\n let parent = posix.dirname(path);\n while (parent !== '.') { if (files.has(parent)) throw new ConfigError('managed Skill contains a colliding resource path'); parent = posix.dirname(parent); }\n }\n return files;\n } catch (error) { if (error instanceof ConfigError) throw error; throw new ConfigError('managed Skill package is not a valid ZIP archive'); }\n}\n\nasync function materialize(target: string, files: Map<string, Buffer>, metadata: Record<string, string>): Promise<void> {\n try {\n const stat = await lstat(target);\n if (stat.isDirectory() && !stat.isSymbolicLink()) {\n const existing: unknown = JSON.parse(await readFile(join(target, METADATA), 'utf8'));\n if (JSON.stringify(existing) === JSON.stringify(metadata)) return;\n }\n } catch (error) { if (!(error instanceof SyntaxError) && (error as NodeJS.ErrnoException).code !== 'ENOENT') throw error; }\n await mkdir(dirname(target), { recursive: true });\n const temporary = await mkdtemp(join(dirname(target), '.skill-'));\n try {\n for (const [path, content] of files) { const destination = join(temporary, path); await mkdir(dirname(destination), { recursive: true }); await writeFile(destination, content); }\n await writeFile(join(temporary, METADATA), JSON.stringify(metadata));\n await loadDirectory(temporary); // Do not replace a working version with invalid SKILL.md.\n await rm(target, { recursive: true, force: true });\n await rename(temporary, target);\n } finally { await rm(temporary, { recursive: true, force: true }); }\n}\n\nasync function loadDirectory(root: string, sourceFiles?: readonly string[]): Promise<Skill> {\n const files: string[] = []; let total = 0;\n async function walk(directory: string, prefix = ''): Promise<void> {\n for (const entry of (await readdir(directory, { withFileTypes: true })).sort((a, b) => a.name.localeCompare(b.name))) {\n if (entry.isSymbolicLink()) throw new ConfigError('Skill directories must not contain symbolic links');\n const name = prefix + entry.name;\n if (entry.isDirectory()) await walk(join(directory, entry.name), `${name}/`);\n else if (entry.isFile() && entry.name !== METADATA) { total += (await lstat(join(directory, entry.name))).size; if (total > MAX_BYTES) throw new ConfigError('Skill content exceeds the 10 MiB size limit'); files.push(name); }\n }\n }\n if (sourceFiles) {\n // Managed packages track source files, not files generated by command execution.\n for (const name of sourceFiles) {\n const entry = await lstat(join(root, name));\n if (entry.isSymbolicLink() || !entry.isFile()) throw new ConfigError('managed Skill workspace is missing a source file');\n files.push(name);\n }\n } else await walk(root);\n const instruction = new TextDecoder('utf8', { fatal: true }).decode(await readFile(join(root, 'SKILL.md')));\n const match = /^---\\s*\\n([\\s\\S]*?)\\n---(?:\\s*\\n|$)/.exec(instruction);\n const metadata: Record<string, string> = {};\n if (match) {\n const document = parseDocument(match[1]!);\n if (document.errors.length) throw new ConfigError('SKILL.md contains invalid YAML frontmatter');\n let value: unknown;\n try { value = document.toJS({ maxAliasCount: 0 }) ?? {}; } catch { throw new ConfigError('SKILL.md contains invalid YAML frontmatter'); }\n if (!value || typeof value !== 'object' || Array.isArray(value)) throw new ConfigError('SKILL.md frontmatter must be an object');\n for (const key of ['name', 'description', 'version']) {\n const item = (value as Record<string, unknown>)[key];\n if (item !== undefined && item !== null) { if (typeof item !== 'string') throw new ConfigError(`SKILL.md frontmatter ${key} must be a string`); metadata[key] = item; }\n }\n }\n return Object.freeze({ name: metadata.name || basename(root), description: metadata.description || '', version: metadata.version || '', instruction, root, files: Object.freeze(files), source: 'local' as const });\n}\n"],"mappings":"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","names":["resolve","reject","stream"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
ConfigError
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-AEQ76QIO.js";
|
|
4
4
|
|
|
5
5
|
// src/integrations/ai-sdk.ts
|
|
6
6
|
import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
|
|
@@ -45,4 +45,4 @@ export {
|
|
|
45
45
|
languageModel,
|
|
46
46
|
tools
|
|
47
47
|
};
|
|
48
|
-
//# sourceMappingURL=chunk-
|
|
48
|
+
//# sourceMappingURL=chunk-EKLTJ65H.js.map
|
|
@@ -1,19 +1,17 @@
|
|
|
1
1
|
import {
|
|
2
2
|
AGENT_IDENTITY_DATA_PURPOSE
|
|
3
|
-
} from "./chunk-
|
|
3
|
+
} from "./chunk-76NTQYJB.js";
|
|
4
4
|
import {
|
|
5
5
|
ControllerClient
|
|
6
|
-
} from "./chunk-
|
|
7
|
-
import {
|
|
8
|
-
nullLogger
|
|
9
|
-
} from "./chunk-NZL3VPJ2.js";
|
|
6
|
+
} from "./chunk-AX3NM2DK.js";
|
|
10
7
|
import {
|
|
11
8
|
AuthenticationError,
|
|
12
9
|
ConfigError,
|
|
13
10
|
CredentialExchangeError,
|
|
14
11
|
WorkloadAccessTokenRejectedError,
|
|
15
|
-
WorkloadIdentityNotConfiguredError
|
|
16
|
-
|
|
12
|
+
WorkloadIdentityNotConfiguredError,
|
|
13
|
+
nullLogger
|
|
14
|
+
} from "./chunk-AEQ76QIO.js";
|
|
17
15
|
|
|
18
16
|
// src/auth/workload-access-token.ts
|
|
19
17
|
var WorkloadAccessTokenProvider = class {
|
|
@@ -199,4 +197,4 @@ export {
|
|
|
199
197
|
BoundCredential,
|
|
200
198
|
BoundCredentials
|
|
201
199
|
};
|
|
202
|
-
//# sourceMappingURL=chunk-
|
|
200
|
+
//# sourceMappingURL=chunk-FG7K3EF7.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/auth/workload-access-token.ts","../src/auth/bound-credentials.ts"],"sourcesContent":["import { AuthenticationError, WorkloadIdentityNotConfiguredError } from '../errors';\nimport type { AgentSATokenSource } from './agent-sa-token';\nimport { ControllerClient, type ControllerOptions } from './controller';\n\nexport class WorkloadAccessTokenProvider {\n private readonly controller: ControllerClient;\n #token?: string;\n private pending?: Promise<string>;\n\n constructor(endpoint: string, source: AgentSATokenSource, options: ControllerOptions = {}) {\n this.controller = new ControllerClient(endpoint, source, options);\n }\n async get(): Promise<string> {\n if (this.#token !== undefined) return this.#token;\n if (this.pending) return this.pending;\n const request = this.exchange();\n this.pending = request;\n try { this.#token = await request; return this.#token; }\n finally { this.pending = undefined; }\n }\n async invalidate(token?: string): Promise<void> {\n // Serialize invalidation after an exchange, including an initially empty cache.\n if (this.pending) await this.pending.catch(() => undefined);\n if (token === undefined || token === this.#token) this.#token = undefined;\n }\n close(): void { this.controller.close(); this.#token = undefined; }\n\n private async exchange(): Promise<string> {\n const response = await this.controller.post('/api/v1/workload/token');\n if (response.status === 404) throw new WorkloadIdentityNotConfiguredError('the current Agent has no configured Workload Identity');\n if (response.status < 200 || response.status >= 300) throw new AuthenticationError(`Controller workload token request failed with HTTP ${response.status}`);\n const payload = response.payload;\n const token = payload && typeof payload === 'object' && 'workloadAccessToken' in payload ? payload.workloadAccessToken : undefined;\n if (typeof token !== 'string' || !token.trim()) throw new AuthenticationError('Controller returned an empty workload access token');\n return token.trim();\n }\n}\n","import { inspect } from 'node:util';\nimport Client, { GetResourceAPIKeyRequest } from '@alicloud/agentidentitydata20251127';\nimport { $OpenApiUtil } from '@alicloud/openapi-core';\nimport { RuntimeOptions } from '@darabonba/typescript';\nimport { ConfigError, CredentialExchangeError, WorkloadAccessTokenRejectedError } from '../errors';\nimport type { AgentCoreControlPlane, CredentialMetadata } from '../controlplane/client';\nimport { nullLogger, type Logger } from '../logging';\nimport type { AccessKeyCredential, CredentialProvider } from './access-key';\nimport { AGENT_IDENTITY_DATA_PURPOSE } from './resource-sts';\n\nconst GeneratedClient = typeof Client === 'function' ? Client : (Client as unknown as { default: typeof Client }).default;\nconst WAT_ERRORS = new Set(['WORKLOAD_ACCESS_TOKEN_EXPIRED', 'WORKLOAD_ACCESS_TOKEN_INVALID']);\ninterface CredentialRuntime {\n workspaceId: string;\n regionId: string;\n controlPlane: AgentCoreControlPlane;\n resourceSTS?: CredentialProvider;\n workloadAccessToken?: { get(): Promise<string>; invalidate(token: string): Promise<void> };\n}\n\nexport class BoundCredential {\n readonly providerName: string;\n #value: string;\n constructor(providerName: string, value: string, readonly metadata: CredentialMetadata) { this.providerName = providerName; this.#value = value; }\n get value(): string { return this.#value; }\n get credentialType(): string { return this.metadata.credentialType; }\n asHeaders(): Record<string, string> {\n if (this.credentialType !== 'mcpHeader') throw new ConfigError('Credential must have type mcpHeader to read headers');\n let data: unknown;\n try { data = JSON.parse(this.#value); } catch { throw new ConfigError('Invalid MCP Header credential payload'); }\n const entries = fields(data).headers;\n if (!Array.isArray(entries) || !entries.length) throw new ConfigError('MCP Header credential must contain a non-empty headers array');\n const headers: Record<string, string> = {};\n for (const entry of entries) {\n const { name, value } = fields(entry);\n if (typeof name !== 'string' || !/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/.test(name)) throw new ConfigError('Invalid credential header name');\n if (typeof value !== 'string' || /[\\x00-\\x1f\\x7f]/.test(value)) throw new ConfigError('Invalid credential header value');\n const folded = name.toLowerCase();\n if (Object.hasOwn(headers, folded)) throw new ConfigError('Duplicate credential header name');\n Object.defineProperty(headers, folded, { value, enumerable: true, configurable: true, writable: true });\n }\n return headers;\n }\n [inspect.custom](): string { return `BoundCredential(providerName=${JSON.stringify(this.providerName)}, <redacted>)`; }\n toJSON(): string { return this[inspect.custom](); }\n}\n\n/** Resolve metadata by name, then fetch the secret from AgentIdentity. WAT/STS cache independently. */\nexport class BoundCredentials {\n constructor(private readonly runtime: () => Promise<CredentialRuntime>, private readonly logger: Logger = nullLogger) {}\n async get(credentialName: string): Promise<BoundCredential> {\n return this.resolve(credentialName);\n }\n /** @internal Bind only after validating the credential's MCP application scope. */\n async getForMCP(credentialName: string, serverId: string): Promise<BoundCredential> {\n return this.resolve(credentialName, serverId);\n }\n private async resolve(credentialName: string, serverId?: string): Promise<BoundCredential> {\n credentialName = credentialName.trim();\n if (!credentialName) throw new TypeError('credential name must not be empty');\n const { workspaceId, regionId, workloadAccessToken: wat, resourceSTS: sts, controlPlane } = await this.runtime();\n if (!wat || !sts) throw new CredentialExchangeError('AgentCore credential runtime is not configured');\n const metadata = await controlPlane.resolveCredential(credentialName);\n if (serverId !== undefined) {\n if (metadata.credentialType !== 'mcpHeader') throw new ConfigError('MCP credential must have type mcpHeader');\n if (!(metadata.resourceScope === 'ALL' || (metadata.resourceScope === 'SPECIFIED' &&\n metadata.resourceRefs.some((ref) => ref.resourceType === 'mcpServer' && ref.resourceId === serverId)))) {\n throw new ConfigError('MCP credential does not allow the selected MCP server');\n }\n }\n // Matches the control plane's CreateCredential provider naming contract.\n const providerName = `${workspaceId}-${credentialName}`;\n this.logger.info('agentcore.credential.resolve.started', { workspace_id: workspaceId, credential_name: credentialName });\n const credential = await sts.get(AGENT_IDENTITY_DATA_PURPOSE);\n let token = await wat.get(); let value: string;\n try { value = await this.getAPIKey(regionId, credential, providerName, token); }\n catch (error) {\n if (!(error instanceof WorkloadAccessTokenRejectedError)) throw error;\n this.logger.warn('agentcore.credential.resolve.wat_rejected', { workspace_id: workspaceId, credential_name: credentialName, retry: true });\n await wat.invalidate(token); token = await wat.get();\n value = await this.getAPIKey(regionId, credential, providerName, token);\n }\n this.logger.info('agentcore.credential.resolve.succeeded', { workspace_id: workspaceId, credential_name: credentialName });\n return new BoundCredential(providerName, value, metadata);\n }\n private async getAPIKey(regionId: string, credential: AccessKeyCredential, providerName: string, token: string): Promise<string> {\n const endpoint = `agentidentitydata.${regionId}.aliyuncs.com`;\n const client = new GeneratedClient(new $OpenApiUtil.Config({\n accessKeyId: credential.accessKeyId, accessKeySecret: credential.accessKeySecret, securityToken: credential.securityToken,\n regionId, endpoint, protocol: 'https',\n }));\n try {\n const response = await client.getResourceAPIKeyWithOptions(new GetResourceAPIKeyRequest({\n resourceCredentialProviderName: providerName, workloadAccessToken: token,\n }), new RuntimeOptions({ autoretry: false, connectTimeout: 10_000, readTimeout: 30_000 }));\n const value = response.body?.APIKey;\n if (typeof value !== 'string' || !value) throw new CredentialExchangeError('Agent Identity Data returned an empty or invalid API key');\n return value;\n } catch (error) {\n if (watRejection(error)) throw new WorkloadAccessTokenRejectedError('Agent Identity Data rejected the Workload Access Token');\n const details = fields(error); const data = fields(details.data);\n this.logger.warn('agentcore.credential.api.failed', { endpoint: `https://${endpoint}/`, provider_name: providerName,\n error_type: error instanceof Error ? error.name : 'Error', request_id: String(details.requestId ?? data.RequestId ?? data.requestId ?? '') });\n if (error instanceof CredentialExchangeError) throw error;\n // Generated SDK errors may contain a credential-bearing request; do not attach them.\n throw new CredentialExchangeError('Agent Identity Data API key request failed');\n }\n }\n}\nfunction fields(value: unknown): Record<string, unknown> { return value && typeof value === 'object' ? value as Record<string, unknown> : {}; }\nfunction watRejection(error: unknown): boolean {\n let current = fields(error);\n for (let depth = 0; depth < 3; depth++) {\n const data = fields(current.data);\n if ([current.code, data.Code, data.code].some((code) => typeof code === 'string' && WAT_ERRORS.has(code.toUpperCase()))) return true;\n if (!current.innerException) return false;\n current = fields(current.innerException);\n }\n return false;\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/auth/workload-access-token.ts","../src/auth/bound-credentials.ts"],"sourcesContent":["import { AuthenticationError, WorkloadIdentityNotConfiguredError } from '../errors';\nimport type { AgentSATokenSource } from './agent-sa-token';\nimport { ControllerClient, type ControllerOptions } from './controller';\n\nexport class WorkloadAccessTokenProvider {\n private readonly controller: ControllerClient;\n #token?: string;\n private pending?: Promise<string>;\n\n constructor(endpoint: string, source: AgentSATokenSource, options: ControllerOptions = {}) {\n this.controller = new ControllerClient(endpoint, source, options);\n }\n async get(): Promise<string> {\n if (this.#token !== undefined) return this.#token;\n if (this.pending) return this.pending;\n const request = this.exchange();\n this.pending = request;\n try { this.#token = await request; return this.#token; }\n finally { this.pending = undefined; }\n }\n async invalidate(token?: string): Promise<void> {\n // Serialize invalidation after an exchange, including an initially empty cache.\n if (this.pending) await this.pending.catch(() => undefined);\n if (token === undefined || token === this.#token) this.#token = undefined;\n }\n close(): void { this.controller.close(); this.#token = undefined; }\n\n private async exchange(): Promise<string> {\n const response = await this.controller.post('/api/v1/workload/token');\n if (response.status === 404) throw new WorkloadIdentityNotConfiguredError('the current Agent has no configured Workload Identity');\n if (response.status < 200 || response.status >= 300) throw new AuthenticationError(`Controller workload token request failed with HTTP ${response.status}`);\n const payload = response.payload;\n const token = payload && typeof payload === 'object' && 'workloadAccessToken' in payload ? payload.workloadAccessToken : undefined;\n if (typeof token !== 'string' || !token.trim()) throw new AuthenticationError('Controller returned an empty workload access token');\n return token.trim();\n }\n}\n","import { inspect } from 'node:util';\nimport Client, { GetResourceAPIKeyRequest } from '@alicloud/agentidentitydata20251127';\nimport { $OpenApiUtil } from '@alicloud/openapi-core';\nimport { RuntimeOptions } from '@darabonba/typescript';\nimport { ConfigError, CredentialExchangeError, WorkloadAccessTokenRejectedError } from '../errors';\nimport type { AgentCoreControlPlane, CredentialMetadata } from '../controlplane/client';\nimport { nullLogger, type Logger } from '../logging';\nimport type { AccessKeyCredential, CredentialProvider } from './access-key';\nimport { AGENT_IDENTITY_DATA_PURPOSE } from './resource-sts';\n\nconst GeneratedClient = typeof Client === 'function' ? Client : (Client as unknown as { default: typeof Client }).default;\nconst WAT_ERRORS = new Set(['WORKLOAD_ACCESS_TOKEN_EXPIRED', 'WORKLOAD_ACCESS_TOKEN_INVALID']);\ninterface CredentialRuntime {\n workspaceId: string;\n regionId: string;\n controlPlane: AgentCoreControlPlane;\n resourceSTS?: CredentialProvider;\n workloadAccessToken?: { get(): Promise<string>; invalidate(token: string): Promise<void> };\n}\n\nexport class BoundCredential {\n readonly providerName: string;\n #value: string;\n constructor(providerName: string, value: string, readonly metadata: CredentialMetadata) { this.providerName = providerName; this.#value = value; }\n get value(): string { return this.#value; }\n get credentialType(): string { return this.metadata.credentialType; }\n asHeaders(): Record<string, string> {\n if (this.credentialType !== 'mcpHeader') throw new ConfigError('Credential must have type mcpHeader to read headers');\n let data: unknown;\n try { data = JSON.parse(this.#value); } catch { throw new ConfigError('Invalid MCP Header credential payload'); }\n const entries = fields(data).headers;\n if (!Array.isArray(entries) || !entries.length) throw new ConfigError('MCP Header credential must contain a non-empty headers array');\n const headers: Record<string, string> = {};\n for (const entry of entries) {\n const { name, value } = fields(entry);\n if (typeof name !== 'string' || !/^[!#$%&'*+.^_`|~0-9A-Za-z-]+$/.test(name)) throw new ConfigError('Invalid credential header name');\n if (typeof value !== 'string' || /[\\x00-\\x1f\\x7f]/.test(value)) throw new ConfigError('Invalid credential header value');\n const folded = name.toLowerCase();\n if (Object.hasOwn(headers, folded)) throw new ConfigError('Duplicate credential header name');\n Object.defineProperty(headers, folded, { value, enumerable: true, configurable: true, writable: true });\n }\n return headers;\n }\n [inspect.custom](): string { return `BoundCredential(providerName=${JSON.stringify(this.providerName)}, <redacted>)`; }\n toJSON(): string { return this[inspect.custom](); }\n}\n\n/** Resolve metadata by name, then fetch the secret from AgentIdentity. WAT/STS cache independently. */\nexport class BoundCredentials {\n constructor(private readonly runtime: () => Promise<CredentialRuntime>, private readonly logger: Logger = nullLogger) {}\n async get(credentialName: string): Promise<BoundCredential> {\n return this.resolve(credentialName);\n }\n /** @internal Bind only after validating the credential's MCP application scope. */\n async getForMCP(credentialName: string, serverId: string): Promise<BoundCredential> {\n return this.resolve(credentialName, serverId);\n }\n private async resolve(credentialName: string, serverId?: string): Promise<BoundCredential> {\n credentialName = credentialName.trim();\n if (!credentialName) throw new TypeError('credential name must not be empty');\n const { workspaceId, regionId, workloadAccessToken: wat, resourceSTS: sts, controlPlane } = await this.runtime();\n if (!wat || !sts) throw new CredentialExchangeError('AgentCore credential runtime is not configured');\n const metadata = await controlPlane.resolveCredential(credentialName);\n if (serverId !== undefined) {\n if (metadata.credentialType !== 'mcpHeader') throw new ConfigError('MCP credential must have type mcpHeader');\n if (!(metadata.resourceScope === 'ALL' || (metadata.resourceScope === 'SPECIFIED' &&\n metadata.resourceRefs.some((ref) => ref.resourceType === 'mcpServer' && ref.resourceId === serverId)))) {\n throw new ConfigError('MCP credential does not allow the selected MCP server');\n }\n }\n // Matches the control plane's CreateCredential provider naming contract.\n const providerName = `${workspaceId}-${credentialName}`;\n this.logger.info('agentcore.credential.resolve.started', { workspace_id: workspaceId, credential_name: credentialName });\n const credential = await sts.get(AGENT_IDENTITY_DATA_PURPOSE);\n let token = await wat.get(); let value: string;\n try { value = await this.getAPIKey(regionId, credential, providerName, token); }\n catch (error) {\n if (!(error instanceof WorkloadAccessTokenRejectedError)) throw error;\n this.logger.warn('agentcore.credential.resolve.wat_rejected', { workspace_id: workspaceId, credential_name: credentialName, retry: true });\n await wat.invalidate(token); token = await wat.get();\n value = await this.getAPIKey(regionId, credential, providerName, token);\n }\n this.logger.info('agentcore.credential.resolve.succeeded', { workspace_id: workspaceId, credential_name: credentialName });\n return new BoundCredential(providerName, value, metadata);\n }\n private async getAPIKey(regionId: string, credential: AccessKeyCredential, providerName: string, token: string): Promise<string> {\n const endpoint = `agentidentitydata.${regionId}.aliyuncs.com`;\n const client = new GeneratedClient(new $OpenApiUtil.Config({\n accessKeyId: credential.accessKeyId, accessKeySecret: credential.accessKeySecret, securityToken: credential.securityToken,\n regionId, endpoint, protocol: 'https',\n }));\n try {\n const response = await client.getResourceAPIKeyWithOptions(new GetResourceAPIKeyRequest({\n resourceCredentialProviderName: providerName, workloadAccessToken: token,\n }), new RuntimeOptions({ autoretry: false, connectTimeout: 10_000, readTimeout: 30_000 }));\n const value = response.body?.APIKey;\n if (typeof value !== 'string' || !value) throw new CredentialExchangeError('Agent Identity Data returned an empty or invalid API key');\n return value;\n } catch (error) {\n if (watRejection(error)) throw new WorkloadAccessTokenRejectedError('Agent Identity Data rejected the Workload Access Token');\n const details = fields(error); const data = fields(details.data);\n this.logger.warn('agentcore.credential.api.failed', { endpoint: `https://${endpoint}/`, provider_name: providerName,\n error_type: error instanceof Error ? error.name : 'Error', request_id: String(details.requestId ?? data.RequestId ?? data.requestId ?? '') });\n if (error instanceof CredentialExchangeError) throw error;\n // Generated SDK errors may contain a credential-bearing request; do not attach them.\n throw new CredentialExchangeError('Agent Identity Data API key request failed');\n }\n }\n}\nfunction fields(value: unknown): Record<string, unknown> { return value && typeof value === 'object' ? value as Record<string, unknown> : {}; }\nfunction watRejection(error: unknown): boolean {\n let current = fields(error);\n for (let depth = 0; depth < 3; depth++) {\n const data = fields(current.data);\n if ([current.code, data.Code, data.code].some((code) => typeof code === 'string' && WAT_ERRORS.has(code.toUpperCase()))) return true;\n if (!current.innerException) return false;\n current = fields(current.innerException);\n }\n return false;\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1,40 +1,38 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { newObj[key] = obj[key]; } } } newObj.default = obj; return newObj; } } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } async function _asyncNullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return await rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class;
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkRJCDBVZ6cjs = require('./chunk-RJCDBVZ6.cjs');
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var
|
|
6
|
+
var _chunk25KH5XKGcjs = require('./chunk-25KH5XKG.cjs');
|
|
7
7
|
|
|
8
8
|
|
|
9
9
|
|
|
10
|
-
var
|
|
10
|
+
var _chunkNXMTTQQKcjs = require('./chunk-NXMTTQQK.cjs');
|
|
11
11
|
|
|
12
12
|
|
|
13
|
-
var _chunkLE5P3SJWcjs = require('./chunk-LE5P3SJW.cjs');
|
|
14
13
|
|
|
15
14
|
|
|
16
15
|
|
|
17
16
|
|
|
18
17
|
|
|
19
|
-
|
|
20
|
-
var _chunkJSP7ZROScjs = require('./chunk-JSP7ZROS.cjs');
|
|
18
|
+
var _chunkV4A6MJ42cjs = require('./chunk-V4A6MJ42.cjs');
|
|
21
19
|
|
|
22
20
|
// src/controlplane/client.ts
|
|
23
21
|
var _agentcore20260804 = require('@alicloud/agentcore20260804'); var models = _interopRequireWildcard(_agentcore20260804);
|
|
24
22
|
var _openapicore = require('@alicloud/openapi-core');
|
|
25
23
|
var _typescript = require('@darabonba/typescript');
|
|
26
24
|
var GeneratedClient = typeof models.default === "function" ? models.default : models.default.default;
|
|
27
|
-
function exact(items, field, name, label, ErrorType =
|
|
25
|
+
function exact(items, field, name, label, ErrorType = _chunkV4A6MJ42cjs.ResourceNotConfiguredError) {
|
|
28
26
|
const matches = items.filter((item) => item[field] === name);
|
|
29
27
|
if (!matches.length) throw new ErrorType(`${label} ${JSON.stringify(name)} does not exist`);
|
|
30
|
-
if (matches.length !== 1) throw new (0,
|
|
28
|
+
if (matches.length !== 1) throw new (0, _chunkV4A6MJ42cjs.ConfigError)(`${label} ${JSON.stringify(name)} is not unique`);
|
|
31
29
|
return matches[0];
|
|
32
30
|
}
|
|
33
31
|
function errorField(error, key) {
|
|
34
32
|
return error && typeof error === "object" ? error[key] : void 0;
|
|
35
33
|
}
|
|
36
34
|
function responseBody(body) {
|
|
37
|
-
if (body === void 0) throw new (0,
|
|
35
|
+
if (body === void 0) throw new (0, _chunkV4A6MJ42cjs.ConfigError)("AgentCore returned an empty control-plane response");
|
|
38
36
|
return body;
|
|
39
37
|
}
|
|
40
38
|
function endpointFailure(error) {
|
|
@@ -45,17 +43,17 @@ function endpointFailure(error) {
|
|
|
45
43
|
var AgentCoreControlPlane = (_class = class {
|
|
46
44
|
constructor(options) {;_class.prototype.__init.call(this);
|
|
47
45
|
this.options = options;
|
|
48
|
-
this.workspaceId =
|
|
49
|
-
this.regionId =
|
|
50
|
-
if (!options.accessKeyCredential && !options.resourceSTSProvider) throw new (0,
|
|
46
|
+
this.workspaceId = _chunkNXMTTQQKcjs.requiredString.call(void 0, options.workspaceId, "workspaceId");
|
|
47
|
+
this.regionId = _chunkNXMTTQQKcjs.requiredString.call(void 0, options.regionId, "regionId");
|
|
48
|
+
if (!options.accessKeyCredential && !options.resourceSTSProvider) throw new (0, _chunkV4A6MJ42cjs.ConfigError)("AgentCore control plane requires an AccessKey credential source");
|
|
51
49
|
if (options.endpoint !== void 0) {
|
|
52
50
|
const value = options.endpoint.trim();
|
|
53
|
-
const url = new URL(
|
|
54
|
-
if (url.pathname !== "/") throw new (0,
|
|
51
|
+
const url = new URL(_chunkNXMTTQQKcjs.httpUrl.call(void 0, value.includes("://") ? value : `https://${value}`, "AgentCore control endpoint"));
|
|
52
|
+
if (url.pathname !== "/") throw new (0, _chunkV4A6MJ42cjs.ConfigError)("AgentCore control endpoint must not contain a path");
|
|
55
53
|
this.endpoint = url.host;
|
|
56
54
|
this.protocol = url.protocol.slice(0, -1);
|
|
57
55
|
}
|
|
58
|
-
this.logger = _nullishCoalesce(options.logger, () => (
|
|
56
|
+
this.logger = _nullishCoalesce(options.logger, () => ( _chunkV4A6MJ42cjs.nullLogger));
|
|
59
57
|
}
|
|
60
58
|
|
|
61
59
|
|
|
@@ -80,8 +78,8 @@ var AgentCoreControlPlane = (_class = class {
|
|
|
80
78
|
connections.push(..._nullishCoalesce(body.items, () => ( [])));
|
|
81
79
|
nextToken = body.nextToken;
|
|
82
80
|
} while (nextToken);
|
|
83
|
-
const connection = exact(connections, "name", connectionName, "model connection",
|
|
84
|
-
const connectionId =
|
|
81
|
+
const connection = exact(connections, "name", connectionName, "model connection", _chunkV4A6MJ42cjs.ModelConnectionNotFoundError);
|
|
82
|
+
const connectionId = _chunkNXMTTQQKcjs.requiredString.call(void 0, connection.connectionId, "connectionId");
|
|
85
83
|
const available = [];
|
|
86
84
|
do {
|
|
87
85
|
const response = await this.invoke(client, "ListModels", () => client.listModelsWithOptions(
|
|
@@ -97,17 +95,17 @@ var AgentCoreControlPlane = (_class = class {
|
|
|
97
95
|
let model;
|
|
98
96
|
if (modelName !== void 0) model = exact(available, "modelName", modelName, "model");
|
|
99
97
|
else {
|
|
100
|
-
if (available.length !== 1) throw new (0,
|
|
98
|
+
if (available.length !== 1) throw new (0, _chunkV4A6MJ42cjs.ResourceNotConfiguredError)(`model connection ${JSON.stringify(connectionName)} requires an explicit model name`);
|
|
101
99
|
model = available[0];
|
|
102
100
|
}
|
|
103
101
|
const capabilities = Object.fromEntries(Object.entries(_nullishCoalesce(model.capabilities, () => ( {}))).filter((entry) => typeof entry[1] === "boolean"));
|
|
104
102
|
const descriptor = Object.freeze({
|
|
105
103
|
connectionId,
|
|
106
|
-
connectionName:
|
|
104
|
+
connectionName: _chunkNXMTTQQKcjs.requiredString.call(void 0, connection.name, "connection name"),
|
|
107
105
|
protocol: _nullishCoalesce(connection.protocol, () => ( "")),
|
|
108
106
|
providerType: _nullishCoalesce(connection.providerType, () => ( "")),
|
|
109
|
-
modelId:
|
|
110
|
-
modelName:
|
|
107
|
+
modelId: _chunkNXMTTQQKcjs.requiredString.call(void 0, model.modelId, "modelId"),
|
|
108
|
+
modelName: _chunkNXMTTQQKcjs.requiredString.call(void 0, model.modelName, "modelName"),
|
|
111
109
|
contextSize: model.contextSize,
|
|
112
110
|
maxTokens: model.maxTokens,
|
|
113
111
|
capabilities: Object.freeze(capabilities)
|
|
@@ -130,10 +128,10 @@ var AgentCoreControlPlane = (_class = class {
|
|
|
130
128
|
items.push(..._nullishCoalesce(body.items, () => ( [])));
|
|
131
129
|
nextToken = body.nextToken;
|
|
132
130
|
} while (nextToken);
|
|
133
|
-
const item = exact(items, "name", name, "MCP server",
|
|
131
|
+
const item = exact(items, "name", name, "MCP server", _chunkV4A6MJ42cjs.MCPServerNotFoundError);
|
|
134
132
|
const descriptor = Object.freeze({
|
|
135
|
-
mcpServerId:
|
|
136
|
-
name:
|
|
133
|
+
mcpServerId: _chunkNXMTTQQKcjs.requiredString.call(void 0, item.mcpServerId, "mcpServerId"),
|
|
134
|
+
name: _chunkNXMTTQQKcjs.requiredString.call(void 0, item.name, "MCP name"),
|
|
137
135
|
protocol: _nullishCoalesce(item.protocol, () => ( "")),
|
|
138
136
|
type: _nullishCoalesce(item.type, () => ( "")),
|
|
139
137
|
status: _nullishCoalesce(item.status, () => ( ""))
|
|
@@ -157,7 +155,7 @@ var AgentCoreControlPlane = (_class = class {
|
|
|
157
155
|
this.runtimeOptions()
|
|
158
156
|
));
|
|
159
157
|
const downloadURL = responseBody(response.body).data;
|
|
160
|
-
if (typeof downloadURL !== "string") throw new (0,
|
|
158
|
+
if (typeof downloadURL !== "string") throw new (0, _chunkV4A6MJ42cjs.ConfigError)("AgentCore returned an invalid Skill download URL");
|
|
161
159
|
return { version: resolvedVersion, archive: await this.downloadSkill(downloadURL) };
|
|
162
160
|
}
|
|
163
161
|
close() {
|
|
@@ -188,11 +186,11 @@ var AgentCoreControlPlane = (_class = class {
|
|
|
188
186
|
const item = exact(items, "name", name, "credential");
|
|
189
187
|
const refs = _nullishCoalesce(item.resourceRefs, () => ( []));
|
|
190
188
|
return {
|
|
191
|
-
credentialId:
|
|
192
|
-
name:
|
|
193
|
-
credentialType:
|
|
189
|
+
credentialId: _chunkNXMTTQQKcjs.requiredString.call(void 0, item.credentialId, "credentialId"),
|
|
190
|
+
name: _chunkNXMTTQQKcjs.requiredString.call(void 0, item.name, "name"),
|
|
191
|
+
credentialType: _chunkNXMTTQQKcjs.requiredString.call(void 0, item.credentialType, "credentialType"),
|
|
194
192
|
resourceScope: String(_nullishCoalesce(item.resourceScope, () => ( ""))),
|
|
195
|
-
resourceRefs: refs.map((ref) => ({ resourceType:
|
|
193
|
+
resourceRefs: refs.map((ref) => ({ resourceType: _chunkNXMTTQQKcjs.requiredString.call(void 0, ref.resourceType, "resourceType"), resourceId: _chunkNXMTTQQKcjs.requiredString.call(void 0, ref.resourceId, "resourceId") }))
|
|
196
194
|
};
|
|
197
195
|
}
|
|
198
196
|
runtimeOptions() {
|
|
@@ -200,7 +198,7 @@ var AgentCoreControlPlane = (_class = class {
|
|
|
200
198
|
}
|
|
201
199
|
async client() {
|
|
202
200
|
this.lifetime.signal.throwIfAborted();
|
|
203
|
-
const credential = await _asyncNullishCoalesce(this.options.accessKeyCredential, async () => ( await this.options.resourceSTSProvider.get(
|
|
201
|
+
const credential = await _asyncNullishCoalesce(this.options.accessKeyCredential, async () => ( await this.options.resourceSTSProvider.get(_chunk25KH5XKGcjs.HIGH_CODE_SDK_PURPOSE)));
|
|
204
202
|
return new GeneratedClient(new _openapicore.$OpenApiUtil.Config({
|
|
205
203
|
accessKeyId: credential.accessKeyId,
|
|
206
204
|
accessKeySecret: credential.accessKeySecret,
|
|
@@ -225,13 +223,13 @@ var AgentCoreControlPlane = (_class = class {
|
|
|
225
223
|
code: String(_nullishCoalesce(errorField(cause, "code"), () => ( "-"))),
|
|
226
224
|
requestId: String(_nullishCoalesce(_nullishCoalesce(_nullishCoalesce(errorField(cause, "requestId"), () => ( errorField(data, "RequestId"))), () => ( errorField(data, "requestId"))), () => ( "-")))
|
|
227
225
|
});
|
|
228
|
-
throw new (0,
|
|
226
|
+
throw new (0, _chunkV4A6MJ42cjs.InvocationError)("AgentCore control-plane request failed", { cause });
|
|
229
227
|
}
|
|
230
228
|
};
|
|
231
229
|
try {
|
|
232
230
|
return await invoke();
|
|
233
231
|
} catch (error) {
|
|
234
|
-
if (!(error instanceof
|
|
232
|
+
if (!(error instanceof _chunkV4A6MJ42cjs.InvocationError) || this.endpoint || client._endpoint !== `agentcore.${this.regionId}.aliyuncs.com` || !endpointFailure(error.cause)) throw error;
|
|
235
233
|
const host = `agentcore-vpc.${this.regionId}.aliyuncs.com`;
|
|
236
234
|
this.logger.warn("agentcore.control_plane.endpoint.fallback", { operation, fromHost: client._endpoint, toHost: host });
|
|
237
235
|
client._endpoint = host;
|
|
@@ -245,9 +243,9 @@ var AgentCoreControlPlane = (_class = class {
|
|
|
245
243
|
try {
|
|
246
244
|
original = new URL(value);
|
|
247
245
|
} catch (e) {
|
|
248
|
-
throw new (0,
|
|
246
|
+
throw new (0, _chunkV4A6MJ42cjs.ConfigError)("AgentCore returned an invalid Skill download URL");
|
|
249
247
|
}
|
|
250
|
-
if (!["http:", "https:"].includes(original.protocol) || original.username || original.password) throw new (0,
|
|
248
|
+
if (!["http:", "https:"].includes(original.protocol) || original.username || original.password) throw new (0, _chunkV4A6MJ42cjs.ConfigError)("AgentCore returned an invalid Skill download URL");
|
|
251
249
|
let candidate = original;
|
|
252
250
|
for (; ; ) {
|
|
253
251
|
this.lifetime.signal.throwIfAborted();
|
|
@@ -255,30 +253,30 @@ var AgentCoreControlPlane = (_class = class {
|
|
|
255
253
|
try {
|
|
256
254
|
const response = await fetch(candidate, { redirect: "manual", signal: AbortSignal.any([this.lifetime.signal, AbortSignal.timeout(3e4)]) });
|
|
257
255
|
if (response.ok) {
|
|
258
|
-
const archive = await
|
|
259
|
-
if (!archive.length) throw new (0,
|
|
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");
|
|
260
258
|
return archive;
|
|
261
259
|
}
|
|
262
260
|
status = response.status;
|
|
263
261
|
await _optionalChain([response, 'access', _ => _.body, 'optionalAccess', _2 => _2.cancel, 'call', _3 => _3()]);
|
|
264
262
|
} catch (error) {
|
|
265
263
|
this.lifetime.signal.throwIfAborted();
|
|
266
|
-
if (error instanceof
|
|
264
|
+
if (error instanceof _chunkV4A6MJ42cjs.ConfigError) throw error;
|
|
267
265
|
}
|
|
268
266
|
this.logger.warn("agentcore.control_plane.skill.download.failed", { host: candidate.host, path: candidate.pathname, status });
|
|
269
267
|
const fallback = candidate === original && (status === void 0 || status >= 500 && status < 600) ? internalOSSURL(original) : void 0;
|
|
270
|
-
if (!fallback) throw new (0,
|
|
268
|
+
if (!fallback) throw new (0, _chunkV4A6MJ42cjs.InvocationError)(status ? `Skill package download failed with HTTP ${status}` : "Skill package download failed");
|
|
271
269
|
this.logger.warn("agentcore.control_plane.skill.download.fallback", { fromHost: candidate.host, toHost: fallback.host });
|
|
272
270
|
candidate = fallback;
|
|
273
271
|
}
|
|
274
272
|
}
|
|
275
273
|
}, _class);
|
|
276
274
|
function latestVersion(data) {
|
|
277
|
-
if (!data) throw new (0,
|
|
275
|
+
if (!data) throw new (0, _chunkV4A6MJ42cjs.ResourceNotConfiguredError)("AgentCore Skill does not exist");
|
|
278
276
|
for (const [label, value] of Object.entries(_nullishCoalesce(data.labels, () => ( {})))) if (label.toLowerCase() === "latest" && value) return value;
|
|
279
277
|
const online = (_nullishCoalesce(data.versions, () => ( []))).filter((v) => _optionalChain([v, 'access', _4 => _4.status, 'optionalAccess', _5 => _5.toLowerCase, 'call', _6 => _6()]) === "online" && v.version);
|
|
280
278
|
online.sort((a, b) => (_nullishCoalesce(b.updateTime, () => ( -1))) - (_nullishCoalesce(a.updateTime, () => ( -1))) || (_nullishCoalesce(b.version, () => ( ""))).localeCompare(_nullishCoalesce(a.version, () => ( ""))));
|
|
281
|
-
if (!_optionalChain([online, 'access', _7 => _7[0], 'optionalAccess', _8 => _8.version])) throw new (0,
|
|
279
|
+
if (!_optionalChain([online, 'access', _7 => _7[0], 'optionalAccess', _8 => _8.version])) throw new (0, _chunkV4A6MJ42cjs.ResourceNotConfiguredError)("AgentCore Skill has no online version");
|
|
282
280
|
return online[0].version;
|
|
283
281
|
}
|
|
284
282
|
function internalOSSURL(url) {
|
|
@@ -293,4 +291,4 @@ function internalOSSURL(url) {
|
|
|
293
291
|
|
|
294
292
|
|
|
295
293
|
exports.AgentCoreControlPlane = AgentCoreControlPlane;
|
|
296
|
-
//# sourceMappingURL=chunk-
|
|
294
|
+
//# sourceMappingURL=chunk-JK6KPDVW.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/home/runner/work/agentcore-sdk-nodejs/agentcore-sdk-nodejs/dist/chunk-JK6KPDVW.cjs","../src/controlplane/client.ts"],"names":[],"mappings":"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","file":"/home/runner/work/agentcore-sdk-nodejs/agentcore-sdk-nodejs/dist/chunk-JK6KPDVW.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 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 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): 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, 10 * 1024 * 1024, 'Skill archive');\n if (!archive.length) throw new ConfigError('Skill 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 ? `Skill package download failed with HTTP ${status}` : 'Skill 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"]}
|
|
@@ -1,13 +1,11 @@
|
|
|
1
1
|
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; } var _class;
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var _chunkNXMTTQQKcjs = require('./chunk-NXMTTQQK.cjs');
|
|
4
4
|
|
|
5
5
|
|
|
6
|
-
var _chunkLE5P3SJWcjs = require('./chunk-LE5P3SJW.cjs');
|
|
7
6
|
|
|
8
7
|
|
|
9
|
-
|
|
10
|
-
var _chunkJSP7ZROScjs = require('./chunk-JSP7ZROS.cjs');
|
|
8
|
+
var _chunkV4A6MJ42cjs = require('./chunk-V4A6MJ42.cjs');
|
|
11
9
|
|
|
12
10
|
// src/auth/agent-sa-token.ts
|
|
13
11
|
var _promises = require('fs/promises');
|
|
@@ -22,13 +20,13 @@ var AgentSATokenProvider = class {
|
|
|
22
20
|
try {
|
|
23
21
|
token = await _promises.readFile.call(void 0, this.path, "utf8");
|
|
24
22
|
} catch (cause) {
|
|
25
|
-
throw new (0,
|
|
23
|
+
throw new (0, _chunkV4A6MJ42cjs.AuthenticationError)("cannot read the Agent SA token file", { cause });
|
|
26
24
|
}
|
|
27
25
|
return validToken(token);
|
|
28
26
|
}
|
|
29
27
|
};
|
|
30
28
|
function validToken(token) {
|
|
31
|
-
if (typeof token !== "string" || !token.trim()) throw new (0,
|
|
29
|
+
if (typeof token !== "string" || !token.trim()) throw new (0, _chunkV4A6MJ42cjs.AuthenticationError)("the Agent SA token source returned an empty token");
|
|
32
30
|
return token.trim();
|
|
33
31
|
}
|
|
34
32
|
async function getAgentSAToken(source) {
|
|
@@ -43,13 +41,13 @@ var _promises3 = require('timers/promises');
|
|
|
43
41
|
var ControllerClient = (_class = class {
|
|
44
42
|
constructor(endpoint, saTokens, options = {}) {;_class.prototype.__init.call(this);
|
|
45
43
|
this.saTokens = saTokens;
|
|
46
|
-
this.endpoint =
|
|
44
|
+
this.endpoint = _chunkNXMTTQQKcjs.httpUrl.call(void 0, endpoint, "Controller endpoint");
|
|
47
45
|
this.timeoutMs = _nullishCoalesce(options.timeoutMs, () => ( 1e4));
|
|
48
46
|
this.maxAttempts = _nullishCoalesce(options.maxAttempts, () => ( 3));
|
|
49
47
|
if (!Number.isFinite(this.timeoutMs) || this.timeoutMs <= 0 || !Number.isInteger(this.maxAttempts) || this.maxAttempts < 1) {
|
|
50
48
|
throw new TypeError("timeoutMs and maxAttempts must be positive");
|
|
51
49
|
}
|
|
52
|
-
this.logger = _nullishCoalesce(options.logger, () => (
|
|
50
|
+
this.logger = _nullishCoalesce(options.logger, () => ( _chunkV4A6MJ42cjs.nullLogger));
|
|
53
51
|
}
|
|
54
52
|
|
|
55
53
|
|
|
@@ -68,7 +66,7 @@ var ControllerClient = (_class = class {
|
|
|
68
66
|
response = await this.request(path, token, purpose);
|
|
69
67
|
}
|
|
70
68
|
}
|
|
71
|
-
if (response.status === 401) throw new (0,
|
|
69
|
+
if (response.status === 401) throw new (0, _chunkV4A6MJ42cjs.AuthenticationError)("Controller rejected the Agent SA token");
|
|
72
70
|
return response;
|
|
73
71
|
}
|
|
74
72
|
close() {
|
|
@@ -99,7 +97,7 @@ var ControllerClient = (_class = class {
|
|
|
99
97
|
} catch (cause) {
|
|
100
98
|
this.lifetime.signal.throwIfAborted();
|
|
101
99
|
this.logger.warn("agentcore.controller.request.failed", { ...fields, attempt, reason: "transport_error" });
|
|
102
|
-
if (attempt === this.maxAttempts) throw new (0,
|
|
100
|
+
if (attempt === this.maxAttempts) throw new (0, _chunkV4A6MJ42cjs.CredentialExchangeError)("cannot reach the AgentCore Controller", { cause });
|
|
103
101
|
await _promises3.setTimeout.call(void 0, 50 * 2 ** (attempt - 1), void 0, { signal: this.lifetime.signal });
|
|
104
102
|
continue;
|
|
105
103
|
} finally {
|
|
@@ -128,7 +126,7 @@ var ControllerClient = (_class = class {
|
|
|
128
126
|
if (![500, 502, 503, 504].includes(response.status) || attempt === this.maxAttempts) return result;
|
|
129
127
|
await _promises3.setTimeout.call(void 0, 50 * 2 ** (attempt - 1), void 0, { signal: this.lifetime.signal });
|
|
130
128
|
}
|
|
131
|
-
throw new (0,
|
|
129
|
+
throw new (0, _chunkV4A6MJ42cjs.CredentialExchangeError)("Controller request did not complete");
|
|
132
130
|
}
|
|
133
131
|
}, _class);
|
|
134
132
|
|
|
@@ -139,4 +137,4 @@ var ControllerClient = (_class = class {
|
|
|
139
137
|
|
|
140
138
|
|
|
141
139
|
exports.DEFAULT_AGENT_SA_TOKEN_PATH = DEFAULT_AGENT_SA_TOKEN_PATH; exports.AgentSATokenProvider = AgentSATokenProvider; exports.getAgentSAToken = getAgentSAToken; exports.refreshAgentSAToken = refreshAgentSAToken; exports.ControllerClient = ControllerClient;
|
|
142
|
-
//# sourceMappingURL=chunk-
|
|
140
|
+
//# sourceMappingURL=chunk-KQTZUIMI.cjs.map
|