alibabacloud-agentcore-sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +202 -0
- package/README.md +189 -0
- package/dist/access-key-CkoHq3S8.d.cts +30 -0
- package/dist/access-key-CkoHq3S8.d.ts +30 -0
- package/dist/agent-sa-token-DD1Sb8P1.d.cts +14 -0
- package/dist/agent-sa-token-DD1Sb8P1.d.ts +14 -0
- package/dist/auth/index.cjs +36 -0
- package/dist/auth/index.cjs.map +1 -0
- package/dist/auth/index.d.cts +34 -0
- package/dist/auth/index.d.ts +34 -0
- package/dist/auth/index.js +36 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/bound-credentials-C1fM0thh.d.cts +39 -0
- package/dist/bound-credentials-DqT64Q2s.d.ts +39 -0
- package/dist/chunk-2E5EWEDG.cjs +142 -0
- package/dist/chunk-2E5EWEDG.cjs.map +1 -0
- package/dist/chunk-55XZZRKO.js +220 -0
- package/dist/chunk-55XZZRKO.js.map +1 -0
- package/dist/chunk-5JXA7JPS.js +29 -0
- package/dist/chunk-5JXA7JPS.js.map +1 -0
- package/dist/chunk-5RKN46UU.cjs +139 -0
- package/dist/chunk-5RKN46UU.cjs.map +1 -0
- package/dist/chunk-5ZOLHQXO.js +296 -0
- package/dist/chunk-5ZOLHQXO.js.map +1 -0
- package/dist/chunk-7Y263YIW.js +298 -0
- package/dist/chunk-7Y263YIW.js.map +1 -0
- package/dist/chunk-A3PF2SPD.cjs +141 -0
- package/dist/chunk-A3PF2SPD.cjs.map +1 -0
- package/dist/chunk-A3WMLVJC.cjs +141 -0
- package/dist/chunk-A3WMLVJC.cjs.map +1 -0
- package/dist/chunk-BVZ7H2F5.cjs +582 -0
- package/dist/chunk-BVZ7H2F5.cjs.map +1 -0
- package/dist/chunk-EGUKJE3Z.cjs +24 -0
- package/dist/chunk-EGUKJE3Z.cjs.map +1 -0
- package/dist/chunk-EKXZKKJJ.js +24 -0
- package/dist/chunk-EKXZKKJJ.js.map +1 -0
- package/dist/chunk-GYLT23D3.js +110 -0
- package/dist/chunk-GYLT23D3.js.map +1 -0
- package/dist/chunk-IF7LMBXC.js +306 -0
- package/dist/chunk-IF7LMBXC.js.map +1 -0
- package/dist/chunk-IUCLCPVV.js +113 -0
- package/dist/chunk-IUCLCPVV.js.map +1 -0
- package/dist/chunk-JSP7ZROS.cjs +95 -0
- package/dist/chunk-JSP7ZROS.cjs.map +1 -0
- package/dist/chunk-JW62DVIC.js +238 -0
- package/dist/chunk-JW62DVIC.js.map +1 -0
- package/dist/chunk-K3TE7625.js +139 -0
- package/dist/chunk-K3TE7625.js.map +1 -0
- package/dist/chunk-LE5P3SJW.cjs +16 -0
- package/dist/chunk-LE5P3SJW.cjs.map +1 -0
- package/dist/chunk-LXHW6OT4.cjs +77 -0
- package/dist/chunk-LXHW6OT4.cjs.map +1 -0
- package/dist/chunk-MICRSJ6R.js +48 -0
- package/dist/chunk-MICRSJ6R.js.map +1 -0
- package/dist/chunk-MWAHO47B.cjs +220 -0
- package/dist/chunk-MWAHO47B.cjs.map +1 -0
- package/dist/chunk-MZ5UWGXS.js +95 -0
- package/dist/chunk-MZ5UWGXS.js.map +1 -0
- package/dist/chunk-NZL3VPJ2.js +16 -0
- package/dist/chunk-NZL3VPJ2.js.map +1 -0
- package/dist/chunk-PC4FM2RP.cjs +180 -0
- package/dist/chunk-PC4FM2RP.cjs.map +1 -0
- package/dist/chunk-PKYET77D.cjs +296 -0
- package/dist/chunk-PKYET77D.cjs.map +1 -0
- package/dist/chunk-PTJPB27L.js +31 -0
- package/dist/chunk-PTJPB27L.js.map +1 -0
- package/dist/chunk-QIZO3A4Y.cjs +306 -0
- package/dist/chunk-QIZO3A4Y.cjs.map +1 -0
- package/dist/chunk-RBAY4MO2.js +202 -0
- package/dist/chunk-RBAY4MO2.js.map +1 -0
- package/dist/chunk-RHY7Y43E.js +582 -0
- package/dist/chunk-RHY7Y43E.js.map +1 -0
- package/dist/chunk-RQRI6RCG.cjs +238 -0
- package/dist/chunk-RQRI6RCG.cjs.map +1 -0
- package/dist/chunk-RYXL25AI.js +141 -0
- package/dist/chunk-RYXL25AI.js.map +1 -0
- package/dist/chunk-RZNQGEGJ.cjs +113 -0
- package/dist/chunk-RZNQGEGJ.cjs.map +1 -0
- package/dist/chunk-S7PWSJNP.cjs +48 -0
- package/dist/chunk-S7PWSJNP.cjs.map +1 -0
- package/dist/chunk-TWEO5XVM.cjs +298 -0
- package/dist/chunk-TWEO5XVM.cjs.map +1 -0
- package/dist/chunk-UBP5CHU7.js +142 -0
- package/dist/chunk-UBP5CHU7.js.map +1 -0
- package/dist/chunk-ULJTQSLE.cjs +35 -0
- package/dist/chunk-ULJTQSLE.cjs.map +1 -0
- package/dist/chunk-UWPKFJYM.js +77 -0
- package/dist/chunk-UWPKFJYM.js.map +1 -0
- package/dist/chunk-WKZUYPDS.js +180 -0
- package/dist/chunk-WKZUYPDS.js.map +1 -0
- package/dist/chunk-YZP55W7S.cjs +29 -0
- package/dist/chunk-YZP55W7S.cjs.map +1 -0
- package/dist/chunk-ZELRQU4J.cjs +31 -0
- package/dist/chunk-ZELRQU4J.cjs.map +1 -0
- package/dist/chunk-ZLKYXRNM.js +141 -0
- package/dist/chunk-ZLKYXRNM.js.map +1 -0
- package/dist/chunk-ZLQ2IBTC.cjs +110 -0
- package/dist/chunk-ZLQ2IBTC.cjs.map +1 -0
- package/dist/chunk-ZTWLCHCO.cjs +202 -0
- package/dist/chunk-ZTWLCHCO.cjs.map +1 -0
- package/dist/chunk-ZWQBAJ5O.js +35 -0
- package/dist/chunk-ZWQBAJ5O.js.map +1 -0
- package/dist/client-DDU4-ygJ.d.cts +72 -0
- package/dist/client-pDzS7EZR.d.ts +72 -0
- package/dist/collaboration/index.cjs +44 -0
- package/dist/collaboration/index.cjs.map +1 -0
- package/dist/collaboration/index.d.cts +73 -0
- package/dist/collaboration/index.d.ts +73 -0
- package/dist/collaboration/index.js +44 -0
- package/dist/collaboration/index.js.map +1 -0
- package/dist/common-BSXkQfxI.d.cts +25 -0
- package/dist/common-BSXkQfxI.d.ts +25 -0
- package/dist/common-DRdI-75k.d.ts +8 -0
- package/dist/common-_vxreiEW.d.cts +8 -0
- package/dist/config-CMkmMtx1.d.cts +20 -0
- package/dist/config-CMkmMtx1.d.ts +20 -0
- package/dist/context-M9rOTifU.d.cts +12 -0
- package/dist/context-M9rOTifU.d.ts +12 -0
- package/dist/controller-DWs3Sy04.d.cts +9 -0
- package/dist/controller-DmI4L4sP.d.ts +9 -0
- package/dist/controlplane/index.cjs +13 -0
- package/dist/controlplane/index.cjs.map +1 -0
- package/dist/controlplane/index.d.cts +66 -0
- package/dist/controlplane/index.d.ts +66 -0
- package/dist/controlplane/index.js +13 -0
- package/dist/controlplane/index.js.map +1 -0
- package/dist/errors-BjGO6N10.d.ts +93 -0
- package/dist/errors-D9OtcR-o.d.cts +93 -0
- package/dist/event-converters-BIn8odqo.d.ts +38 -0
- package/dist/event-converters-Cn_NeGyQ.d.cts +38 -0
- package/dist/google-adk-model-N47R7GB2.js +208 -0
- package/dist/google-adk-model-N47R7GB2.js.map +1 -0
- package/dist/google-adk-model-PDBKY5YZ.cjs +208 -0
- package/dist/google-adk-model-PDBKY5YZ.cjs.map +1 -0
- package/dist/index.cjs +322 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +78 -0
- package/dist/index.d.ts +78 -0
- package/dist/index.js +322 -0
- package/dist/index.js.map +1 -0
- package/dist/integrations/ai-sdk.cjs +15 -0
- package/dist/integrations/ai-sdk.cjs.map +1 -0
- package/dist/integrations/ai-sdk.d.cts +21 -0
- package/dist/integrations/ai-sdk.d.ts +21 -0
- package/dist/integrations/ai-sdk.js +15 -0
- package/dist/integrations/ai-sdk.js.map +1 -0
- package/dist/integrations/google-adk.cjs +90 -0
- package/dist/integrations/google-adk.cjs.map +1 -0
- package/dist/integrations/google-adk.d.cts +46 -0
- package/dist/integrations/google-adk.d.ts +46 -0
- package/dist/integrations/google-adk.js +90 -0
- package/dist/integrations/google-adk.js.map +1 -0
- package/dist/integrations/langchain.cjs +95 -0
- package/dist/integrations/langchain.cjs.map +1 -0
- package/dist/integrations/langchain.d.cts +52 -0
- package/dist/integrations/langchain.d.ts +52 -0
- package/dist/integrations/langchain.js +95 -0
- package/dist/integrations/langchain.js.map +1 -0
- package/dist/integrations/langgraph.cjs +30 -0
- package/dist/integrations/langgraph.cjs.map +1 -0
- package/dist/integrations/langgraph.d.cts +53 -0
- package/dist/integrations/langgraph.d.ts +53 -0
- package/dist/integrations/langgraph.js +30 -0
- package/dist/integrations/langgraph.js.map +1 -0
- package/dist/integrations/mastra.cjs +108 -0
- package/dist/integrations/mastra.cjs.map +1 -0
- package/dist/integrations/mastra.d.cts +47 -0
- package/dist/integrations/mastra.d.ts +47 -0
- package/dist/integrations/mastra.js +108 -0
- package/dist/integrations/mastra.js.map +1 -0
- package/dist/langchain-adapter-DFJdEX04.d.cts +47 -0
- package/dist/langchain-adapter-DJsyjm5V.d.ts +47 -0
- package/dist/langchain-provider-NF5GIDQV.cjs +227 -0
- package/dist/langchain-provider-NF5GIDQV.cjs.map +1 -0
- package/dist/langchain-provider-PHL4UWNF.js +227 -0
- package/dist/langchain-provider-PHL4UWNF.js.map +1 -0
- package/dist/loader-DrIQ37nm.d.ts +38 -0
- package/dist/loader-eWuJ2GSL.d.cts +38 -0
- package/dist/logging-C8GLLg1f.d.cts +9 -0
- package/dist/logging-C8GLLg1f.d.ts +9 -0
- package/dist/managed-CwLx9h4C.d.cts +32 -0
- package/dist/managed-D9eQK1ut.d.ts +32 -0
- package/dist/mcp/index.cjs +12 -0
- package/dist/mcp/index.cjs.map +1 -0
- package/dist/mcp/index.d.cts +62 -0
- package/dist/mcp/index.d.ts +62 -0
- package/dist/mcp/index.js +12 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/memory/index.cjs +12 -0
- package/dist/memory/index.cjs.map +1 -0
- package/dist/memory/index.d.cts +113 -0
- package/dist/memory/index.d.ts +113 -0
- package/dist/memory/index.js +12 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/model/index.cjs +16 -0
- package/dist/model/index.cjs.map +1 -0
- package/dist/model/index.d.cts +129 -0
- package/dist/model/index.d.ts +129 -0
- package/dist/model/index.js +16 -0
- package/dist/model/index.js.map +1 -0
- package/dist/model-CkYHzHPk.d.cts +50 -0
- package/dist/model-CkYHzHPk.d.ts +50 -0
- package/dist/runtime/index.cjs +49 -0
- package/dist/runtime/index.cjs.map +1 -0
- package/dist/runtime/index.d.cts +73 -0
- package/dist/runtime/index.d.ts +73 -0
- package/dist/runtime/index.js +49 -0
- package/dist/runtime/index.js.map +1 -0
- package/dist/server/index.cjs +604 -0
- package/dist/server/index.cjs.map +1 -0
- package/dist/server/index.d.cts +69 -0
- package/dist/server/index.d.ts +69 -0
- package/dist/server/index.js +604 -0
- package/dist/server/index.js.map +1 -0
- package/dist/skill/index.cjs +14 -0
- package/dist/skill/index.cjs.map +1 -0
- package/dist/skill/index.d.cts +16 -0
- package/dist/skill/index.d.ts +16 -0
- package/dist/skill/index.js +14 -0
- package/dist/skill/index.js.map +1 -0
- package/package.json +292 -0
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } }
|
|
2
|
+
|
|
3
|
+
var _chunkEGUKJE3Zcjs = require('./chunk-EGUKJE3Z.cjs');
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
var _chunkLE5P3SJWcjs = require('./chunk-LE5P3SJW.cjs');
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
var _chunkJSP7ZROScjs = require('./chunk-JSP7ZROS.cjs');
|
|
10
|
+
|
|
11
|
+
// src/skill/tools.ts
|
|
12
|
+
var _child_process = require('child_process');
|
|
13
|
+
var _promises = require('fs/promises');
|
|
14
|
+
var _path = require('path');
|
|
15
|
+
function skillTools(skills, options = {}) {
|
|
16
|
+
const timeout = _nullishCoalesce(options.commandTimeoutSeconds, () => ( 300));
|
|
17
|
+
if (!Number.isInteger(timeout) || timeout <= 0) throw new (0, _chunkJSP7ZROScjs.ConfigError)("command timeout must be a positive integer");
|
|
18
|
+
const selected = new Map(skills.map((skill) => [skill.name, skill]));
|
|
19
|
+
if (selected.size !== skills.length) throw new (0, _chunkJSP7ZROScjs.ConfigError)("selected Skills must have unique names");
|
|
20
|
+
const missing = (name) => JSON.stringify({ error: `Skill '${String(name)}' not found. Available skills: ${[...selected.keys()].join(", ") || "none"}` });
|
|
21
|
+
const tools = [new (0, _chunkEGUKJE3Zcjs.Tool)({
|
|
22
|
+
name: "load_skills",
|
|
23
|
+
description: `Load skill instructions for the agent. Call without arguments to list all available skills, or with a skill name to get detailed instructions.
|
|
24
|
+
|
|
25
|
+
Available skills:
|
|
26
|
+
${skills.map((s) => `- ${s.name}: ${s.description}`).join("\n")}`,
|
|
27
|
+
parameters: { type: "object", properties: { name: { type: "string", description: "The name of the skill to load. If omitted, returns all available skills." } } },
|
|
28
|
+
invoke: async ({ name }) => {
|
|
29
|
+
if (name === void 0 || name === null || name === "") return JSON.stringify({ skills: skills.map(({ name: name2, description }) => ({ name: name2, description })) });
|
|
30
|
+
const skill = typeof name === "string" ? selected.get(name) : void 0;
|
|
31
|
+
if (!skill) return missing(name);
|
|
32
|
+
return JSON.stringify({ name: skill.name, description: skill.description, instruction: skill.instruction, files: await list(skill.root) });
|
|
33
|
+
}
|
|
34
|
+
}), new (0, _chunkEGUKJE3Zcjs.Tool)({
|
|
35
|
+
name: "read_skill_file",
|
|
36
|
+
description: "Read a file from a skill's directory, or list the directory when the relative path points to a directory.",
|
|
37
|
+
parameters: { type: "object", properties: { name: { type: "string" }, relative_path: { type: "string" } }, required: ["name", "relative_path"] },
|
|
38
|
+
invoke: async ({ name, relative_path: resource }) => {
|
|
39
|
+
const skill = typeof name === "string" ? selected.get(name) : void 0;
|
|
40
|
+
if (!skill) return missing(name);
|
|
41
|
+
if (typeof resource !== "string") return JSON.stringify({ error: "relative_path must be a string" });
|
|
42
|
+
try {
|
|
43
|
+
if (_path.isAbsolute.call(void 0, resource) || resource.split(/[\\/]/).includes("..")) throw new Error("Path is outside the skill directory. Access denied.");
|
|
44
|
+
const path = _path.join.call(void 0, skill.root, resource);
|
|
45
|
+
const target = await _promises.realpath.call(void 0, path);
|
|
46
|
+
const root = await _promises.realpath.call(void 0, skill.root);
|
|
47
|
+
const relation = _path.relative.call(void 0, root, target);
|
|
48
|
+
if (relation === ".." || relation.startsWith(`..${_path.sep}`) || _path.isAbsolute.call(void 0, relation) || (await _promises.lstat.call(void 0, path)).isSymbolicLink()) throw new Error("Path is outside the skill directory. Access denied.");
|
|
49
|
+
if ((await _promises.stat.call(void 0, path)).isDirectory()) return JSON.stringify({ files: await list(path) });
|
|
50
|
+
return JSON.stringify({ content: new TextDecoder("utf8", { fatal: true }).decode(await _promises.readFile.call(void 0, path)) });
|
|
51
|
+
} catch (error) {
|
|
52
|
+
return JSON.stringify({ error: error instanceof Error ? error.message : "Failed to read skill file" });
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
})];
|
|
56
|
+
if ((_nullishCoalesce(process.env.ALLOW_EXECUTE_COMMAND, () => ( "true"))).toLowerCase() !== "false") tools.push(new (0, _chunkEGUKJE3Zcjs.Tool)({
|
|
57
|
+
name: "execute_command",
|
|
58
|
+
description: "Execute a shell command in the Agent container for a selected Skill. Before calling this tool, display the exact command and ask the user for confirmation. Returns stdout, stderr, exit_code, and timeout status.",
|
|
59
|
+
parameters: { type: "object", properties: { command: { type: "string" }, cwd: { type: "string", description: "Optional working directory." }, timeout: { type: "integer", description: "Optional timeout in seconds." } }, required: ["command"] },
|
|
60
|
+
invoke: (args) => execute(args, defaultDirectory(skills), timeout, options)
|
|
61
|
+
}));
|
|
62
|
+
return tools;
|
|
63
|
+
}
|
|
64
|
+
async function list(root) {
|
|
65
|
+
return (await _promises.readdir.call(void 0, root, { withFileTypes: true })).filter((e) => !e.name.startsWith(".")).map((e) => e.name + (e.isDirectory() ? "/" : "")).sort();
|
|
66
|
+
}
|
|
67
|
+
function defaultDirectory(skills) {
|
|
68
|
+
if (skills.length === 1) return skills[0].root;
|
|
69
|
+
if (skills.length && skills[0].workspaceId && skills.every((s) => s.source === "agentcore" && s.workspaceId === skills[0].workspaceId)) {
|
|
70
|
+
let common = _path.resolve.call(void 0, skills[0].root);
|
|
71
|
+
for (const skill of skills.slice(1)) while (_path.relative.call(void 0, common, skill.root).startsWith(`..${_path.sep}`) || _path.relative.call(void 0, common, skill.root) === "..") common = _path.dirname.call(void 0, common);
|
|
72
|
+
return common;
|
|
73
|
+
}
|
|
74
|
+
if (skills.length && skills.every((s) => _path.dirname.call(void 0, s.root) === _path.dirname.call(void 0, skills[0].root))) return _path.dirname.call(void 0, skills[0].root);
|
|
75
|
+
return process.cwd();
|
|
76
|
+
}
|
|
77
|
+
async function execute(args, defaultCwd, defaultTimeout, options) {
|
|
78
|
+
const { command, cwd = defaultCwd, timeout = defaultTimeout } = args;
|
|
79
|
+
if (typeof command !== "string" || !command) return JSON.stringify({ error: "command must be a non-empty string" });
|
|
80
|
+
if (typeof timeout !== "number" || !Number.isInteger(timeout) || timeout <= 0) return JSON.stringify({ error: "timeout must be a positive integer" });
|
|
81
|
+
try {
|
|
82
|
+
if (typeof cwd !== "string" || !(await _promises.stat.call(void 0, cwd)).isDirectory()) throw new Error("Working directory does not exist");
|
|
83
|
+
if (options.commandApproval && !await options.commandApproval(command, cwd)) return JSON.stringify({ error: "Command execution rejected by user." });
|
|
84
|
+
const logger = _nullishCoalesce(options.logger, () => ( _chunkLE5P3SJWcjs.nullLogger));
|
|
85
|
+
logger.info("agentcore.skill.command.started", { cwd, timeout_seconds: timeout });
|
|
86
|
+
const result = await runCommand(command, cwd, timeout);
|
|
87
|
+
logger.info("agentcore.skill.command.completed", { cwd, exit_code: result.exit_code, timed_out: result.timed_out });
|
|
88
|
+
return JSON.stringify(result);
|
|
89
|
+
} catch (error) {
|
|
90
|
+
return JSON.stringify({ error: error instanceof Error ? error.message : "Failed to execute command" });
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
function runCommand(command, cwd, timeout) {
|
|
94
|
+
return new Promise((accept, reject) => {
|
|
95
|
+
const child = _child_process.spawn.call(void 0, command, { shell: true, cwd, detached: process.platform !== "win32", stdio: ["ignore", "pipe", "pipe"] });
|
|
96
|
+
const limit = 100 * 1024;
|
|
97
|
+
const output = [Buffer.alloc(0), Buffer.alloc(0)];
|
|
98
|
+
const truncated = [false, false];
|
|
99
|
+
for (const [index, stream] of [child.stdout, child.stderr].entries()) stream.on("data", (chunk) => {
|
|
100
|
+
const remaining = limit - output[index].length;
|
|
101
|
+
if (chunk.length > remaining) truncated[index] = true;
|
|
102
|
+
if (remaining > 0) output[index] = Buffer.concat([output[index], chunk.subarray(0, remaining)]);
|
|
103
|
+
});
|
|
104
|
+
let timedOut = false;
|
|
105
|
+
let killTimer;
|
|
106
|
+
const signal = (value) => {
|
|
107
|
+
if (!child.pid) return;
|
|
108
|
+
try {
|
|
109
|
+
if (process.platform === "win32") child.kill(value);
|
|
110
|
+
else process.kill(-child.pid, value);
|
|
111
|
+
} catch (error) {
|
|
112
|
+
if (error.code !== "ESRCH") child.kill(value);
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
const timer = setTimeout(() => {
|
|
116
|
+
timedOut = true;
|
|
117
|
+
signal("SIGTERM");
|
|
118
|
+
killTimer = setTimeout(() => signal("SIGKILL"), 100);
|
|
119
|
+
}, timeout * 1e3);
|
|
120
|
+
child.on("error", (error) => {
|
|
121
|
+
clearTimeout(timer);
|
|
122
|
+
clearTimeout(killTimer);
|
|
123
|
+
reject(error);
|
|
124
|
+
});
|
|
125
|
+
child.on("close", (code) => {
|
|
126
|
+
clearTimeout(timer);
|
|
127
|
+
if (timedOut) {
|
|
128
|
+
clearTimeout(killTimer);
|
|
129
|
+
signal("SIGKILL");
|
|
130
|
+
}
|
|
131
|
+
const text = (index) => output[index].toString("utf8") + (truncated[index] ? `
|
|
132
|
+
... [output truncated, exceeded ${limit} bytes]` : "");
|
|
133
|
+
accept(timedOut ? { stdout: "", stderr: `Command timed out after ${timeout} seconds.`, exit_code: -1, timed_out: true } : { stdout: text(0), stderr: text(1), exit_code: _nullishCoalesce(code, () => ( -1)), timed_out: false });
|
|
134
|
+
});
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
exports.skillTools = skillTools;
|
|
141
|
+
//# sourceMappingURL=chunk-A3WMLVJC.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["/Users/zhuoguang/Documents/Code/collaborate/hiclaw/agentcore-sdk-nodejs/dist/chunk-A3WMLVJC.cjs","../src/skill/tools.ts"],"names":["name"],"mappings":"AAAA;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACE;AACF,wDAA6B;AAC7B;AACA;ACVA,8CAAsB;AACtB,uCAAyD;AACzD,4BAAkE;AAW3D,SAAS,UAAA,CAAW,MAAA,EAA0B,QAAA,EAA6B,CAAC,CAAA,EAAW;AAC5F,EAAA,MAAM,QAAA,mBAAU,OAAA,CAAQ,qBAAA,UAAyB,KAAA;AACjD,EAAA,GAAA,CAAI,CAAC,MAAA,CAAO,SAAA,CAAU,OAAO,EAAA,GAAK,QAAA,GAAW,CAAA,EAAG,MAAM,IAAI,kCAAA,CAAY,4CAA4C,CAAA;AAClH,EAAA,MAAM,SAAA,EAAW,IAAI,GAAA,CAAI,MAAA,CAAO,GAAA,CAAI,CAAC,KAAA,EAAA,GAAU,CAAC,KAAA,CAAM,IAAA,EAAM,KAAK,CAAC,CAAC,CAAA;AACnE,EAAA,GAAA,CAAI,QAAA,CAAS,KAAA,IAAS,MAAA,CAAO,MAAA,EAAQ,MAAM,IAAI,kCAAA,CAAY,wCAAwC,CAAA;AACnG,EAAA,MAAM,QAAA,EAAU,CAAC,IAAA,EAAA,GAAkB,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,CAAA,OAAA,EAAU,MAAA,CAAO,IAAI,CAAC,CAAA,+BAAA,EAAkC,CAAC,GAAG,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,EAAA,GAAK,MAAM,CAAA,EAAA;AACpI,EAAA;AAChB,IAAA;AAA4B,IAAA;AAAA;AAAA;AAAqO;AACtL,IAAA;AACrD,IAAA;AACuGA,MAAAA;AACnE,MAAA;AAC/B,MAAA;AAC0G,MAAA;AAC3I,IAAA;AACW,EAAA;AACL,IAAA;AAAgC,IAAA;AACyG,IAAA;AAC1F,IAAA;AACW,MAAA;AAC/B,MAAA;AACoE,MAAA;AAC/F,MAAA;AACuI,QAAA;AACnG,QAAA;AAAqC,QAAA;AAAyC,QAAA;AAC9E,QAAA;AACoG,QAAA;AACnD,QAAA;AACiB,QAAA;AAC1F,MAAA;AAAuG,QAAA;AAAG,MAAA;AAC5H,IAAA;AACA,EAAA;AAC+F,EAAA;AACzF,IAAA;AAAgC,IAAA;AACwG,IAAA;AACpE,IAAA;AAC1E,EAAA;AACK,EAAA;AACT;AACqD;AACiG,EAAA;AACtJ;AAC4D;AACf,EAAA;AAC+F,EAAA;AACpG,IAAA;AACsG,IAAA;AACnI,IAAA;AACT,EAAA;AACsH,EAAA;AACnG,EAAA;AACrB;AACqI;AACnE,EAAA;AACkD,EAAA;AACkC,EAAA;AAChJ,EAAA;AACiH,IAAA;AAC+B,IAAA;AACjH,IAAA;AAC+C,IAAA;AAC3B,IAAA;AAC6D,IAAA;AACtF,IAAA;AACd,EAAA;AAAuG,IAAA;AAAG,EAAA;AAC5H;AACuJ;AAC9G,EAAA;AACuF,IAAA;AACxG,IAAA;AAC4B,IAAA;AAAkC,IAAA;AACyB,IAAA;AAChE,MAAA;AACQ,MAAA;AAC8C,MAAA;AAChG,IAAA;AACc,IAAA;AAAW,IAAA;AACgB,IAAA;AACxB,MAAA;AACZ,MAAA;AAAoD,QAAA;AAAsC,QAAA;AAChF,MAAA;AAAyE,QAAA;AAAG,MAAA;AAC5F,IAAA;AAC+B,IAAA;AAAa,MAAA;AAAsB,MAAA;AAAsD,MAAA;AAAoB,IAAA;AAC/G,IAAA;AAAoB,MAAA;AAAyB,MAAA;AAAe,MAAA;AAAI,IAAA;AACjE,IAAA;AACR,MAAA;AAEJ,MAAA;AAAwB,QAAA;AAAmB,QAAA;AAAG,MAAA;AAC0B,MAAA;AAAsD,gCAAA;AAErH,MAAA;AACxB,IAAA;AACF,EAAA;AACH;AD8BsJ;AACA;AACA;AACA","file":"/Users/zhuoguang/Documents/Code/collaborate/hiclaw/agentcore-sdk-nodejs/dist/chunk-A3WMLVJC.cjs","sourcesContent":[null,"import { spawn } from 'node:child_process';\nimport { lstat, readFile, readdir, realpath, stat } from 'node:fs/promises';\nimport { dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';\nimport { ConfigError } from '../errors';\nimport { Tool, type ToolArguments } from '../integrations/common';\nimport { nullLogger, type Logger } from '../logging';\nimport type { Skill } from './loader';\n\nexport interface SkillToolsOptions {\n commandApproval?: (command: string, cwd: string) => boolean | Promise<boolean>;\n commandTimeoutSeconds?: number;\n logger?: Logger;\n}\nexport function skillTools(skills: readonly Skill[], options: SkillToolsOptions = {}): Tool[] {\n const timeout = options.commandTimeoutSeconds ?? 300;\n if (!Number.isInteger(timeout) || timeout <= 0) throw new ConfigError('command timeout must be a positive integer');\n const selected = new Map(skills.map((skill) => [skill.name, skill]));\n if (selected.size !== skills.length) throw new ConfigError('selected Skills must have unique names');\n const missing = (name: unknown) => JSON.stringify({ error: `Skill '${String(name)}' not found. Available skills: ${[...selected.keys()].join(', ') || 'none'}` });\n const tools = [new Tool({\n name: 'load_skills', description: `Load skill instructions for the agent. Call without arguments to list all available skills, or with a skill name to get detailed instructions.\\n\\nAvailable skills:\\n${skills.map((s) => `- ${s.name}: ${s.description}`).join('\\n')}`,\n parameters: { type: 'object', properties: { name: { type: 'string', description: 'The name of the skill to load. If omitted, returns all available skills.' } } },\n invoke: async ({ name }) => {\n if (name === undefined || name === null || name === '') return JSON.stringify({ skills: skills.map(({ name, description }) => ({ name, description })) });\n const skill = typeof name === 'string' ? selected.get(name) : undefined;\n if (!skill) return missing(name);\n return JSON.stringify({ name: skill.name, description: skill.description, instruction: skill.instruction, files: await list(skill.root) });\n },\n }), new Tool({\n name: 'read_skill_file', description: \"Read a file from a skill's directory, or list the directory when the relative path points to a directory.\",\n parameters: { type: 'object', properties: { name: { type: 'string' }, relative_path: { type: 'string' } }, required: ['name', 'relative_path'] },\n invoke: async ({ name, relative_path: resource }) => {\n const skill = typeof name === 'string' ? selected.get(name) : undefined;\n if (!skill) return missing(name);\n if (typeof resource !== 'string') return JSON.stringify({ error: 'relative_path must be a string' });\n try {\n if (isAbsolute(resource) || resource.split(/[\\\\/]/).includes('..')) throw new Error('Path is outside the skill directory. Access denied.');\n const path = join(skill.root, resource); const target = await realpath(path); const root = await realpath(skill.root);\n const relation = relative(root, target);\n if (relation === '..' || relation.startsWith(`..${sep}`) || isAbsolute(relation) || (await lstat(path)).isSymbolicLink()) throw new Error('Path is outside the skill directory. Access denied.');\n if ((await stat(path)).isDirectory()) return JSON.stringify({ files: await list(path) });\n return JSON.stringify({ content: new TextDecoder('utf8', { fatal: true }).decode(await readFile(path)) });\n } catch (error) { return JSON.stringify({ error: error instanceof Error ? error.message : 'Failed to read skill file' }); }\n },\n })];\n if ((process.env.ALLOW_EXECUTE_COMMAND ?? 'true').toLowerCase() !== 'false') tools.push(new Tool({\n name: 'execute_command', description: 'Execute a shell command in the Agent container for a selected Skill. Before calling this tool, display the exact command and ask the user for confirmation. Returns stdout, stderr, exit_code, and timeout status.',\n parameters: { type: 'object', properties: { command: { type: 'string' }, cwd: { type: 'string', description: 'Optional working directory.' }, timeout: { type: 'integer', description: 'Optional timeout in seconds.' } }, required: ['command'] },\n invoke: (args) => execute(args, defaultDirectory(skills), timeout, options),\n }));\n return tools;\n}\nasync function list(root: string): Promise<string[]> {\n return (await readdir(root, { withFileTypes: true })).filter((e) => !e.name.startsWith('.')).map((e) => e.name + (e.isDirectory() ? '/' : '')).sort();\n}\nfunction defaultDirectory(skills: readonly Skill[]): string {\n if (skills.length === 1) return skills[0]!.root;\n if (skills.length && skills[0]!.workspaceId && skills.every((s) => s.source === 'agentcore' && s.workspaceId === skills[0]!.workspaceId)) {\n let common = resolve(skills[0]!.root);\n for (const skill of skills.slice(1)) while (relative(common, skill.root).startsWith(`..${sep}`) || relative(common, skill.root) === '..') common = dirname(common);\n return common;\n }\n if (skills.length && skills.every((s) => dirname(s.root) === dirname(skills[0]!.root))) return dirname(skills[0]!.root);\n return process.cwd();\n}\nasync function execute(args: ToolArguments, defaultCwd: string, defaultTimeout: number, options: SkillToolsOptions): Promise<string> {\n const { command, cwd = defaultCwd, timeout = defaultTimeout } = args;\n if (typeof command !== 'string' || !command) return JSON.stringify({ error: 'command must be a non-empty string' });\n if (typeof timeout !== 'number' || !Number.isInteger(timeout) || timeout <= 0) return JSON.stringify({ error: 'timeout must be a positive integer' });\n try {\n if (typeof cwd !== 'string' || !(await stat(cwd)).isDirectory()) throw new Error('Working directory does not exist');\n if (options.commandApproval && !await options.commandApproval(command, cwd)) return JSON.stringify({ error: 'Command execution rejected by user.' });\n const logger = options.logger ?? nullLogger;\n logger.info('agentcore.skill.command.started', { cwd, timeout_seconds: timeout });\n const result = await runCommand(command, cwd, timeout);\n logger.info('agentcore.skill.command.completed', { cwd, exit_code: result.exit_code, timed_out: result.timed_out });\n return JSON.stringify(result);\n } catch (error) { return JSON.stringify({ error: error instanceof Error ? error.message : 'Failed to execute command' }); }\n}\nfunction runCommand(command: string, cwd: string, timeout: number): Promise<{ stdout: string; stderr: string; exit_code: number; timed_out: boolean }> {\n return new Promise((accept, reject) => {\n const child = spawn(command, { shell: true, cwd, detached: process.platform !== 'win32', stdio: ['ignore', 'pipe', 'pipe'] });\n const limit = 100 * 1024;\n const output = [Buffer.alloc(0), Buffer.alloc(0)]; const truncated = [false, false];\n for (const [index, stream] of [child.stdout, child.stderr].entries()) stream.on('data', (chunk: Buffer) => {\n const remaining = limit - output[index]!.length;\n if (chunk.length > remaining) truncated[index] = true;\n if (remaining > 0) output[index] = Buffer.concat([output[index]!, chunk.subarray(0, remaining)]);\n });\n let timedOut = false; let killTimer: ReturnType<typeof setTimeout> | undefined;\n const signal = (value: NodeJS.Signals) => {\n if (!child.pid) return;\n try { if (process.platform === 'win32') child.kill(value); else process.kill(-child.pid, value); }\n catch (error) { if ((error as NodeJS.ErrnoException).code !== 'ESRCH') child.kill(value); }\n };\n const timer = setTimeout(() => { timedOut = true; signal('SIGTERM'); killTimer = setTimeout(() => signal('SIGKILL'), 100); }, timeout * 1000);\n child.on('error', (error) => { clearTimeout(timer); clearTimeout(killTimer); reject(error); });\n child.on('close', (code) => {\n clearTimeout(timer);\n // Even if the shell exits first, kill any remaining children of a timed-out command.\n if (timedOut) { clearTimeout(killTimer); signal('SIGKILL'); }\n const text = (index: number) => output[index]!.toString('utf8') + (truncated[index] ? `\\n... [output truncated, exceeded ${limit} bytes]` : '');\n accept(timedOut ? { stdout: '', stderr: `Command timed out after ${timeout} seconds.`, exit_code: -1, timed_out: true }\n : { stdout: text(0), stderr: text(1), exit_code: code ?? -1, timed_out: false });\n });\n });\n}\n"]}
|