@cicctencent/agent-core 1.0.25 → 1.0.27
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/dist/cjs/a2a/index.d.ts +2 -2
- package/dist/cjs/a2a/index.d.ts.map +1 -1
- package/dist/cjs/a2a/index.js +3 -1
- package/dist/cjs/a2a/index.js.map +1 -1
- package/dist/cjs/a2a/server.d.ts +113 -1
- package/dist/cjs/a2a/server.d.ts.map +1 -1
- package/dist/cjs/a2a/server.js +299 -77
- package/dist/cjs/a2a/server.js.map +1 -1
- package/dist/cjs/agent/workflow.d.ts +12 -0
- package/dist/cjs/agent/workflow.d.ts.map +1 -1
- package/dist/cjs/agent/workflow.js +35 -0
- package/dist/cjs/agent/workflow.js.map +1 -1
- package/dist/cjs/index.d.ts +5 -3
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +30 -21
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/mcp/client.d.ts +1 -2
- package/dist/cjs/mcp/client.d.ts.map +1 -1
- package/dist/cjs/mcp/client.js.map +1 -1
- package/dist/cjs/run-capability/index.d.ts +4 -0
- package/dist/cjs/run-capability/index.d.ts.map +1 -0
- package/dist/cjs/run-capability/index.js +10 -0
- package/dist/cjs/run-capability/index.js.map +1 -0
- package/dist/cjs/run-capability/script-package-runner.d.ts +21 -0
- package/dist/cjs/run-capability/script-package-runner.d.ts.map +1 -0
- package/dist/cjs/run-capability/script-package-runner.js +171 -0
- package/dist/cjs/run-capability/script-package-runner.js.map +1 -0
- package/dist/cjs/run-capability/skill-script-runner.d.ts +19 -0
- package/dist/cjs/run-capability/skill-script-runner.d.ts.map +1 -0
- package/dist/cjs/run-capability/skill-script-runner.js +165 -0
- package/dist/cjs/run-capability/skill-script-runner.js.map +1 -0
- package/dist/cjs/run-capability/types.d.ts +50 -0
- package/dist/cjs/run-capability/types.d.ts.map +1 -0
- package/dist/cjs/run-capability/types.js +16 -0
- package/dist/cjs/run-capability/types.js.map +1 -0
- package/dist/esm/a2a/index.d.ts +2 -2
- package/dist/esm/a2a/index.d.ts.map +1 -1
- package/dist/esm/a2a/index.js +1 -1
- package/dist/esm/a2a/index.js.map +1 -1
- package/dist/esm/a2a/server.d.ts +113 -1
- package/dist/esm/a2a/server.d.ts.map +1 -1
- package/dist/esm/a2a/server.js +297 -76
- package/dist/esm/a2a/server.js.map +1 -1
- package/dist/esm/agent/workflow.d.ts +12 -0
- package/dist/esm/agent/workflow.d.ts.map +1 -1
- package/dist/esm/agent/workflow.js +34 -0
- package/dist/esm/agent/workflow.js.map +1 -1
- package/dist/esm/index.d.ts +5 -3
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +5 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/mcp/client.d.ts +1 -2
- package/dist/esm/mcp/client.d.ts.map +1 -1
- package/dist/esm/mcp/client.js.map +1 -1
- package/dist/esm/run-capability/index.d.ts +4 -0
- package/dist/esm/run-capability/index.d.ts.map +1 -0
- package/dist/esm/run-capability/index.js +4 -0
- package/dist/esm/run-capability/index.js.map +1 -0
- package/dist/esm/run-capability/script-package-runner.d.ts +21 -0
- package/dist/esm/run-capability/script-package-runner.d.ts.map +1 -0
- package/dist/esm/run-capability/script-package-runner.js +134 -0
- package/dist/esm/run-capability/script-package-runner.js.map +1 -0
- package/dist/esm/run-capability/skill-script-runner.d.ts +19 -0
- package/dist/esm/run-capability/skill-script-runner.d.ts.map +1 -0
- package/dist/esm/run-capability/skill-script-runner.js +128 -0
- package/dist/esm/run-capability/skill-script-runner.js.map +1 -0
- package/dist/esm/run-capability/types.d.ts +50 -0
- package/dist/esm/run-capability/types.d.ts.map +1 -0
- package/dist/esm/run-capability/types.js +13 -0
- package/dist/esm/run-capability/types.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// DefaultScriptPackageRunner — 基于 CodeSandbox 的轻量默认实现
|
|
4
|
+
// ============================================================
|
|
5
|
+
// 职责(对应 docs/FLOW_ORCHESTRATION.md §3.2):
|
|
6
|
+
// 1. 读取脚本入口内容(物化脚本包由调用方负责)
|
|
7
|
+
// 2. artifact 挂载:复制产物文件到沙箱工作目录
|
|
8
|
+
// 3. 注入 inputs / artifacts 映射(前置 JSON 注入,语言适配)
|
|
9
|
+
// 4. 经 CodeSandbox.execute 执行
|
|
10
|
+
// 5. 解析 __FLOW_RESULT__ 哨兵,返回结构化结果
|
|
11
|
+
// 依赖注入 CodeSandbox 接口(而非具体实现),实现可替换。
|
|
12
|
+
// ============================================================
|
|
13
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
16
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
17
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
18
|
+
}
|
|
19
|
+
Object.defineProperty(o, k2, desc);
|
|
20
|
+
}) : (function(o, m, k, k2) {
|
|
21
|
+
if (k2 === undefined) k2 = k;
|
|
22
|
+
o[k2] = m[k];
|
|
23
|
+
}));
|
|
24
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
25
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
26
|
+
}) : function(o, v) {
|
|
27
|
+
o["default"] = v;
|
|
28
|
+
});
|
|
29
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
30
|
+
var ownKeys = function(o) {
|
|
31
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
32
|
+
var ar = [];
|
|
33
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
34
|
+
return ar;
|
|
35
|
+
};
|
|
36
|
+
return ownKeys(o);
|
|
37
|
+
};
|
|
38
|
+
return function (mod) {
|
|
39
|
+
if (mod && mod.__esModule) return mod;
|
|
40
|
+
var result = {};
|
|
41
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
42
|
+
__setModuleDefault(result, mod);
|
|
43
|
+
return result;
|
|
44
|
+
};
|
|
45
|
+
})();
|
|
46
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
47
|
+
exports.DefaultScriptPackageRunner = void 0;
|
|
48
|
+
const fs = __importStar(require("fs/promises"));
|
|
49
|
+
const path = __importStar(require("path"));
|
|
50
|
+
const types_ts_1 = require("./types.js");
|
|
51
|
+
class DefaultScriptPackageRunner {
|
|
52
|
+
sandboxProvider;
|
|
53
|
+
constructor(sandboxProvider) {
|
|
54
|
+
this.sandboxProvider = sandboxProvider;
|
|
55
|
+
}
|
|
56
|
+
async resolveSandbox() {
|
|
57
|
+
const p = this.sandboxProvider;
|
|
58
|
+
return typeof p === 'function' ? await p() : p;
|
|
59
|
+
}
|
|
60
|
+
async run(req) {
|
|
61
|
+
const sandbox = await this.resolveSandbox();
|
|
62
|
+
// 1. 取代码
|
|
63
|
+
let code = req.code;
|
|
64
|
+
if (!code) {
|
|
65
|
+
if (!req.entryFile) {
|
|
66
|
+
throw new Error('ScriptRunRequest requires code or entryFile');
|
|
67
|
+
}
|
|
68
|
+
code = await fs.readFile(req.entryFile, 'utf-8');
|
|
69
|
+
}
|
|
70
|
+
// 2. artifact 挂载:复制到沙箱工作目录,构建 名称→文件名 映射
|
|
71
|
+
const artifactMap = await this.mountArtifacts(sandbox, req.artifactMounts || {});
|
|
72
|
+
// 3. shell 模式:将用户代码写入独立文件再 source,避免 prelude 干扰
|
|
73
|
+
let shellUserCodeFile = null;
|
|
74
|
+
if (req.language === 'shell') {
|
|
75
|
+
shellUserCodeFile = path.join(sandbox.rootDir, `__flow_user_${Date.now()}.sh`);
|
|
76
|
+
await fs.writeFile(shellUserCodeFile, code, 'utf-8');
|
|
77
|
+
}
|
|
78
|
+
// 4. 注入 prelude(语言适配)
|
|
79
|
+
const finalCode = this.buildFinalCode(req.language, code, req.inputs || {}, artifactMap, shellUserCodeFile);
|
|
80
|
+
// 5. 执行
|
|
81
|
+
const result = await sandbox.execute(finalCode, req.language, req.timeoutMs);
|
|
82
|
+
// 6. 解析哨兵
|
|
83
|
+
const parsed = this.parseResult(result.stdout);
|
|
84
|
+
return {
|
|
85
|
+
ok: result.exitCode === 0 && !parsed.parseError,
|
|
86
|
+
output: parsed.output,
|
|
87
|
+
stdout: parsed.cleanStdout,
|
|
88
|
+
stderr: result.stderr,
|
|
89
|
+
exitCode: result.exitCode,
|
|
90
|
+
files: result.files,
|
|
91
|
+
duration: result.duration,
|
|
92
|
+
error: result.exitCode !== 0
|
|
93
|
+
? result.stderr || `exit code ${result.exitCode}`
|
|
94
|
+
: parsed.parseError,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
/** 复制产物文件到沙箱工作目录,返回 名称→文件名 映射 */
|
|
98
|
+
async mountArtifacts(sandbox, mounts) {
|
|
99
|
+
const map = {};
|
|
100
|
+
for (const [name, srcPath] of Object.entries(mounts)) {
|
|
101
|
+
const fileName = path.basename(srcPath);
|
|
102
|
+
const dest = path.join(sandbox.rootDir, fileName);
|
|
103
|
+
await fs.copyFile(srcPath, dest);
|
|
104
|
+
map[name] = fileName;
|
|
105
|
+
}
|
|
106
|
+
return map;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* 构建注入 inputs/artifacts 后的最终代码。
|
|
110
|
+
* Node:const __inputs__ = ...; const __artifacts__ = ...; 前缀
|
|
111
|
+
* Python:json.loads 包裹(JSON 字面量非合法 Python)
|
|
112
|
+
*/
|
|
113
|
+
buildFinalCode(language, code, inputs, artifacts, shellUserCodeFile) {
|
|
114
|
+
const inputsJson = JSON.stringify(inputs);
|
|
115
|
+
const artifactsJson = JSON.stringify(artifacts);
|
|
116
|
+
if (language === 'python') {
|
|
117
|
+
return [
|
|
118
|
+
'import json as __flow_json__',
|
|
119
|
+
`__inputs__ = __flow_json__.loads(${JSON.stringify(inputsJson)})`,
|
|
120
|
+
`__artifacts__ = __flow_json__.loads(${JSON.stringify(artifactsJson)})`,
|
|
121
|
+
'',
|
|
122
|
+
code,
|
|
123
|
+
].join('\n');
|
|
124
|
+
}
|
|
125
|
+
if (language === 'nodejs') {
|
|
126
|
+
return [
|
|
127
|
+
`const __inputs__ = ${inputsJson};`,
|
|
128
|
+
`const __artifacts__ = ${artifactsJson};`,
|
|
129
|
+
'',
|
|
130
|
+
code,
|
|
131
|
+
].join('\n');
|
|
132
|
+
}
|
|
133
|
+
// shell:通过环境变量注入,用户代码独立文件 source 执行(防 prelude 干扰)
|
|
134
|
+
const prelude = [
|
|
135
|
+
`export __INPUTS__='${inputsJson.replace(/'/g, `'\\''`)}'`,
|
|
136
|
+
`export __ARTIFACTS__='${artifactsJson.replace(/'/g, `'\\''`)}'`,
|
|
137
|
+
];
|
|
138
|
+
if (shellUserCodeFile) {
|
|
139
|
+
const safePath = shellUserCodeFile.replace(/'/g, `'\\''`);
|
|
140
|
+
prelude.push(`source '${safePath}'`);
|
|
141
|
+
}
|
|
142
|
+
else {
|
|
143
|
+
prelude.push('', code);
|
|
144
|
+
}
|
|
145
|
+
return prelude.join('\n');
|
|
146
|
+
}
|
|
147
|
+
/** 从 stdout 解析 __FLOW_RESULT__ 行,其余行作为日志保留 */
|
|
148
|
+
parseResult(stdout) {
|
|
149
|
+
const lines = stdout.split('\n');
|
|
150
|
+
const kept = [];
|
|
151
|
+
let output;
|
|
152
|
+
let parseError;
|
|
153
|
+
for (const line of lines) {
|
|
154
|
+
const idx = line.indexOf(types_ts_1.FLOW_RESULT_MARKER);
|
|
155
|
+
if (idx < 0) {
|
|
156
|
+
kept.push(line);
|
|
157
|
+
continue;
|
|
158
|
+
}
|
|
159
|
+
const jsonText = line.slice(idx + types_ts_1.FLOW_RESULT_MARKER.length).trim();
|
|
160
|
+
try {
|
|
161
|
+
output = JSON.parse(jsonText);
|
|
162
|
+
}
|
|
163
|
+
catch (e) {
|
|
164
|
+
parseError = `invalid ${types_ts_1.FLOW_RESULT_MARKER} JSON: ${e instanceof Error ? e.message : String(e)}`;
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
return { output, cleanStdout: kept.join('\n'), parseError };
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
exports.DefaultScriptPackageRunner = DefaultScriptPackageRunner;
|
|
171
|
+
//# sourceMappingURL=script-package-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"script-package-runner.js","sourceRoot":"","sources":["../../../src/run-capability/script-package-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { CodeSandbox } from '../sandbox/code-sandbox.js';
|
|
2
|
+
import { type ScriptPackageRunner, type ScriptRunRequest, type ScriptRunResult } from './types.js';
|
|
3
|
+
/** 沙箱供给:同步实例或异步工厂(如按会话惰性创建沙箱) */
|
|
4
|
+
export type SandboxProvider = CodeSandbox | (() => Promise<CodeSandbox>);
|
|
5
|
+
export declare class SkillScriptPackageRunner implements ScriptPackageRunner {
|
|
6
|
+
private readonly skillsRoot;
|
|
7
|
+
private readonly sandboxProvider;
|
|
8
|
+
private readonly fallback;
|
|
9
|
+
/**
|
|
10
|
+
* @param skillsRoot 运行时 skill 物化根目录(绝对路径),如 <cwd>/data/skills
|
|
11
|
+
* @param sandboxProvider 沙箱(data/sandboxes 下)
|
|
12
|
+
* @param fallback 非整包请求时回退的 runner(默认逻辑)
|
|
13
|
+
*/
|
|
14
|
+
constructor(skillsRoot: string, sandboxProvider: SandboxProvider, fallback: ScriptPackageRunner);
|
|
15
|
+
private resolveSandbox;
|
|
16
|
+
run(req: ScriptRunRequest): Promise<ScriptRunResult>;
|
|
17
|
+
private runSkillPackage;
|
|
18
|
+
}
|
|
19
|
+
//# sourceMappingURL=skill-script-runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-script-runner.d.ts","sourceRoot":"","sources":["../../../src/run-capability/skill-script-runner.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,4BAA4B,CAAC;AAE9D,OAAO,EAEH,KAAK,mBAAmB,EACxB,KAAK,gBAAgB,EACrB,KAAK,eAAe,EACvB,MAAM,YAAY,CAAC;AAEpB,iCAAiC;AACjC,MAAM,MAAM,eAAe,GAAG,WAAW,GAAG,CAAC,MAAM,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;AAuBzE,qBAAa,wBAAyB,YAAW,mBAAmB;IAO5D,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAR7B;;;;OAIG;gBAEkB,UAAU,EAAE,MAAM,EAClB,eAAe,EAAE,eAAe,EAChC,QAAQ,EAAE,mBAAmB;YAGpC,cAAc;IAKtB,GAAG,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;YAS5C,eAAe;CAoDhC"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// SkillScriptPackageRunner — skill 整包执行(复用 data/skills + sandboxes)
|
|
4
|
+
// ============================================================
|
|
5
|
+
// 设计动机(见 docs/FLOW_ORCHESTRATION.md §3.2 与对话决策):
|
|
6
|
+
// Flow 的 script 阶段常需运行一个 skill 包里的脚本(如 investment-strategy
|
|
7
|
+
// 的 sync_pools.py),这类脚本依赖整包上下文——顶层 lib.py / config.py 以及
|
|
8
|
+
// 自身 SKILL_DIR 路径推导。DefaultScriptPackageRunner 只把单文件 entryFile
|
|
9
|
+
// 丢进沙箱,丢失了包结构,导致 `ModuleNotFoundError: No module named 'lib'`。
|
|
10
|
+
//
|
|
11
|
+
// 本实现不另造执行环境,直接复用既有约定:
|
|
12
|
+
// - 源:运行时已物化在 <skillsRoot>/<skillPath> 的 skill 包(data/skills)
|
|
13
|
+
// - 沙箱:调用方提供的 CodeSandbox(data/sandboxes 下)
|
|
14
|
+
// 把整个包目录树复制到沙箱 rootDir(保留结构),再以 CLI 范式运行入口脚本。
|
|
15
|
+
//
|
|
16
|
+
// 非整包请求(提供 entryFile/code)自动回退给 DefaultScriptPackageRunner,
|
|
17
|
+
// 保持向后兼容。
|
|
18
|
+
// ============================================================
|
|
19
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
20
|
+
if (k2 === undefined) k2 = k;
|
|
21
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
22
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
23
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
24
|
+
}
|
|
25
|
+
Object.defineProperty(o, k2, desc);
|
|
26
|
+
}) : (function(o, m, k, k2) {
|
|
27
|
+
if (k2 === undefined) k2 = k;
|
|
28
|
+
o[k2] = m[k];
|
|
29
|
+
}));
|
|
30
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
31
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
32
|
+
}) : function(o, v) {
|
|
33
|
+
o["default"] = v;
|
|
34
|
+
});
|
|
35
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
36
|
+
var ownKeys = function(o) {
|
|
37
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
38
|
+
var ar = [];
|
|
39
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
40
|
+
return ar;
|
|
41
|
+
};
|
|
42
|
+
return ownKeys(o);
|
|
43
|
+
};
|
|
44
|
+
return function (mod) {
|
|
45
|
+
if (mod && mod.__esModule) return mod;
|
|
46
|
+
var result = {};
|
|
47
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
48
|
+
__setModuleDefault(result, mod);
|
|
49
|
+
return result;
|
|
50
|
+
};
|
|
51
|
+
})();
|
|
52
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
53
|
+
exports.SkillScriptPackageRunner = void 0;
|
|
54
|
+
const fs = __importStar(require("fs/promises"));
|
|
55
|
+
const path = __importStar(require("path"));
|
|
56
|
+
const types_ts_1 = require("./types.js");
|
|
57
|
+
/** 递归复制目录树(保留相对结构) */
|
|
58
|
+
async function copyDirRecursive(src, dest) {
|
|
59
|
+
await fs.mkdir(dest, { recursive: true });
|
|
60
|
+
const entries = await fs.readdir(src, { withFileTypes: true });
|
|
61
|
+
for (const entry of entries) {
|
|
62
|
+
const srcPath = path.join(src, entry.name);
|
|
63
|
+
const destPath = path.join(dest, entry.name);
|
|
64
|
+
if (entry.isDirectory()) {
|
|
65
|
+
if (entry.name === '__pycache__' || entry.name.startsWith('.')) {
|
|
66
|
+
continue; // 跳过缓存/隐藏目录
|
|
67
|
+
}
|
|
68
|
+
await copyDirRecursive(srcPath, destPath);
|
|
69
|
+
}
|
|
70
|
+
else if (entry.isFile()) {
|
|
71
|
+
await fs.copyFile(srcPath, destPath);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
class SkillScriptPackageRunner {
|
|
76
|
+
skillsRoot;
|
|
77
|
+
sandboxProvider;
|
|
78
|
+
fallback;
|
|
79
|
+
/**
|
|
80
|
+
* @param skillsRoot 运行时 skill 物化根目录(绝对路径),如 <cwd>/data/skills
|
|
81
|
+
* @param sandboxProvider 沙箱(data/sandboxes 下)
|
|
82
|
+
* @param fallback 非整包请求时回退的 runner(默认逻辑)
|
|
83
|
+
*/
|
|
84
|
+
constructor(skillsRoot, sandboxProvider, fallback) {
|
|
85
|
+
this.skillsRoot = skillsRoot;
|
|
86
|
+
this.sandboxProvider = sandboxProvider;
|
|
87
|
+
this.fallback = fallback;
|
|
88
|
+
}
|
|
89
|
+
async resolveSandbox() {
|
|
90
|
+
const p = this.sandboxProvider;
|
|
91
|
+
return typeof p === 'function' ? await p() : p;
|
|
92
|
+
}
|
|
93
|
+
async run(req) {
|
|
94
|
+
// 整包模式:skillPath 存在时走 skill 整包执行
|
|
95
|
+
if (req.skillPath && req.entry) {
|
|
96
|
+
return this.runSkillPackage(req);
|
|
97
|
+
}
|
|
98
|
+
// 否则回退到默认单文件行为(entryFile / code)
|
|
99
|
+
return this.fallback.run(req);
|
|
100
|
+
}
|
|
101
|
+
async runSkillPackage(req) {
|
|
102
|
+
const sandbox = await this.resolveSandbox();
|
|
103
|
+
const rootDir = sandbox.rootDir;
|
|
104
|
+
// 1. 整包物化:把 <skillsRoot>/<skillPath> 整个目录树复制到沙箱 rootDir
|
|
105
|
+
const pkgSrc = path.join(this.skillsRoot, req.skillPath);
|
|
106
|
+
await copyDirRecursive(pkgSrc, rootDir);
|
|
107
|
+
// 2. 构造 launcher:在沙箱内以 CLI 范式运行 <entry> + argv,cwd = rootDir,
|
|
108
|
+
// 并透传子进程 stdout/stderr(含 __FLOW_RESULT__ 哨兵行),便于解析。
|
|
109
|
+
const entryAbs = path.join(rootDir, req.entry);
|
|
110
|
+
const argv = Array.isArray(req.argv) ? req.argv : [];
|
|
111
|
+
const launcher = [
|
|
112
|
+
'import subprocess, sys, json',
|
|
113
|
+
'entry = ' + JSON.stringify(entryAbs),
|
|
114
|
+
'argv = ' + JSON.stringify(argv),
|
|
115
|
+
'proc = subprocess.run([sys.executable, entry, *argv],',
|
|
116
|
+
' cwd=' + JSON.stringify(rootDir) + ',',
|
|
117
|
+
' capture_output=True, text=True)',
|
|
118
|
+
'if proc.stdout:',
|
|
119
|
+
' sys.stdout.write(proc.stdout)',
|
|
120
|
+
'if proc.stderr:',
|
|
121
|
+
' sys.stderr.write(proc.stderr)',
|
|
122
|
+
'sys.exit(proc.returncode)',
|
|
123
|
+
].join('\n');
|
|
124
|
+
// 3. 执行(launcher 本身为 python)
|
|
125
|
+
const result = await sandbox.execute(launcher, (req.language === 'python' ? 'python' : 'python'), req.timeoutMs);
|
|
126
|
+
// 4. 解析哨兵(launcher 已透传子进程 stdout)
|
|
127
|
+
const parsed = parseResultMarker(result.stdout);
|
|
128
|
+
return {
|
|
129
|
+
ok: result.exitCode === 0 && !parsed.parseError,
|
|
130
|
+
output: parsed.output,
|
|
131
|
+
stdout: parsed.cleanStdout,
|
|
132
|
+
stderr: result.stderr,
|
|
133
|
+
exitCode: result.exitCode,
|
|
134
|
+
files: result.files,
|
|
135
|
+
duration: result.duration,
|
|
136
|
+
error: result.exitCode !== 0
|
|
137
|
+
? result.stderr || `exit code ${result.exitCode}`
|
|
138
|
+
: parsed.parseError,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
exports.SkillScriptPackageRunner = SkillScriptPackageRunner;
|
|
143
|
+
/** 从 stdout 解析 __FLOW_RESULT__ 行,其余行作为日志保留 */
|
|
144
|
+
function parseResultMarker(stdout) {
|
|
145
|
+
const lines = stdout.split('\n');
|
|
146
|
+
const kept = [];
|
|
147
|
+
let output;
|
|
148
|
+
let parseError;
|
|
149
|
+
for (const line of lines) {
|
|
150
|
+
const idx = line.indexOf(types_ts_1.FLOW_RESULT_MARKER);
|
|
151
|
+
if (idx < 0) {
|
|
152
|
+
kept.push(line);
|
|
153
|
+
continue;
|
|
154
|
+
}
|
|
155
|
+
const jsonText = line.slice(idx + types_ts_1.FLOW_RESULT_MARKER.length).trim();
|
|
156
|
+
try {
|
|
157
|
+
output = JSON.parse(jsonText);
|
|
158
|
+
}
|
|
159
|
+
catch (e) {
|
|
160
|
+
parseError = `invalid ${types_ts_1.FLOW_RESULT_MARKER} JSON: ${e instanceof Error ? e.message : String(e)}`;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return { output, cleanStdout: kept.join('\n'), parseError };
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=skill-script-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-script-runner.js","sourceRoot":"","sources":["../../../src/run-capability/skill-script-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { ScriptLanguage } from '../sandbox/types.js';
|
|
2
|
+
/** 脚本输出哨兵前缀(stdout 单行协议) */
|
|
3
|
+
export declare const FLOW_RESULT_MARKER = "__FLOW_RESULT__";
|
|
4
|
+
/** 脚本运行请求 */
|
|
5
|
+
export interface ScriptRunRequest {
|
|
6
|
+
/** 方式一:物化后的脚本包入口文件绝对路径(index.js / index.py) */
|
|
7
|
+
entryFile?: string;
|
|
8
|
+
/** 方式二:直接代码内容(优先于 entryFile) */
|
|
9
|
+
code?: string;
|
|
10
|
+
/**
|
|
11
|
+
* 方式三(skill 整包):运行时已物化在 <skillsRoot>/<skillPath> 的 skill 包。
|
|
12
|
+
* Runner 会把整个包目录树复制到沙箱(保留结构,使顶层 lib.py/config.py 等
|
|
13
|
+
* 同包依赖可被 import),并以 <skillPath>/<entry> 作为 CLI 入口执行。
|
|
14
|
+
* 与 entryFile/code 互斥;当 skillPath 存在时优先采用整包模式。
|
|
15
|
+
*/
|
|
16
|
+
skillPath?: string;
|
|
17
|
+
/** 整包模式下的入口脚本相对路径,如 "pool-manager/scripts/sync_pools.py" */
|
|
18
|
+
entry?: string;
|
|
19
|
+
/** 整包模式下传给入口脚本的命令行参数(CLI 范式,如 ["--preflight"]) */
|
|
20
|
+
argv?: string[];
|
|
21
|
+
/** 脚本语言 */
|
|
22
|
+
language: ScriptLanguage;
|
|
23
|
+
/** 注入脚本的输入(前置 JSON 注入) */
|
|
24
|
+
inputs?: Record<string, unknown>;
|
|
25
|
+
/**
|
|
26
|
+
* 挂载进沙箱工作目录的产物文件路径列表(fetch 阶段落盘的 artifact)。
|
|
27
|
+
* Runner 将其复制到沙箱 rootDir,并把 名称→文件名 映射注入脚本。
|
|
28
|
+
*/
|
|
29
|
+
artifactMounts?: Record<string, string>;
|
|
30
|
+
/** 执行超时 (ms) */
|
|
31
|
+
timeoutMs?: number;
|
|
32
|
+
}
|
|
33
|
+
/** 脚本运行结构化结果 */
|
|
34
|
+
export interface ScriptRunResult {
|
|
35
|
+
ok: boolean;
|
|
36
|
+
/** __FLOW_RESULT__ 解析出的结构化输出(脚本未输出则为 undefined) */
|
|
37
|
+
output?: unknown;
|
|
38
|
+
stdout: string;
|
|
39
|
+
stderr: string;
|
|
40
|
+
exitCode: number;
|
|
41
|
+
/** 沙箱工作目录中新产生的文件(相对路径) */
|
|
42
|
+
files: string[];
|
|
43
|
+
duration: number;
|
|
44
|
+
error?: string;
|
|
45
|
+
}
|
|
46
|
+
/** 脚本包运行器(统一契约,实现可替换) */
|
|
47
|
+
export interface ScriptPackageRunner {
|
|
48
|
+
run(req: ScriptRunRequest): Promise<ScriptRunResult>;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/run-capability/types.ts"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1D,4BAA4B;AAC5B,eAAO,MAAM,kBAAkB,oBAAoB,CAAC;AAEpD,aAAa;AACb,MAAM,WAAW,gBAAgB;IAC7B,+CAA+C;IAC/C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,gCAAgC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;OAKG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW;IACX,QAAQ,EAAE,cAAc,CAAC;IACzB,0BAA0B;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC;;;OAGG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,gBAAgB;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,gBAAgB;AAChB,MAAM,WAAW,eAAe;IAC5B,EAAE,EAAE,OAAO,CAAC;IACZ,mDAAmD;IACnD,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,0BAA0B;IAC1B,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,yBAAyB;AACzB,MAAM,WAAW,mBAAmB;IAChC,GAAG,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;CACxD"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ============================================================
|
|
3
|
+
// RunCapability — 语言无关脚本运行契约
|
|
4
|
+
// ============================================================
|
|
5
|
+
// 定位:通用流程编排底座的 script 能力后端(见 docs/FLOW_ORCHESTRATION.md)。
|
|
6
|
+
// 只定义契约与轻量默认实现,不感知任何业务(回测/报表等)。
|
|
7
|
+
//
|
|
8
|
+
// 输出协议(与自动化任务 __NODE_AUTOMATION_RESULT__ 风格一致):
|
|
9
|
+
// 脚本通过 stdout 打印一行:__FLOW_RESULT__ + JSON.stringify(output)
|
|
10
|
+
// Runner 从 stdout 中解析该行作为结构化结果,其余 stdout 作为日志透传。
|
|
11
|
+
// ============================================================
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.FLOW_RESULT_MARKER = void 0;
|
|
14
|
+
/** 脚本输出哨兵前缀(stdout 单行协议) */
|
|
15
|
+
exports.FLOW_RESULT_MARKER = '__FLOW_RESULT__';
|
|
16
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/run-capability/types.ts"],"names":[],"mappings":";AAAA,+DAA+D;AAC/D,6BAA6B;AAC7B,+DAA+D;AAC/D,0DAA0D;AAC1D,gCAAgC;AAChC,EAAE;AACF,gDAAgD;AAChD,8DAA8D;AAC9D,mDAAmD;AACnD,+DAA+D;;;AAI/D,4BAA4B;AACf,QAAA,kBAAkB,GAAG,iBAAiB,CAAC"}
|
package/dist/esm/a2a/index.d.ts
CHANGED
|
@@ -3,8 +3,8 @@ export { A2AClient, buildAuthHeaders } from './client.js';
|
|
|
3
3
|
export type { AuthConfig, A2AClientOptions, AgentDebugTrace, AgentDebugTraceHandler } from './client.js';
|
|
4
4
|
export { createA2ARemoteRunner, extractTextFromMessage } from './runner.js';
|
|
5
5
|
export type { A2ARemoteRunnerConfig } from './runner.js';
|
|
6
|
-
export { A2AServerHandler, InMemoryA2ATaskStore, createA2AAgentCard, createA2AMessage, mapAgentEventToA2AEvent, } from './server.js';
|
|
7
|
-
export type { A2AHandlerResponse, A2AServerAgentConfig, A2AServerHandlerOptions, A2AStreamingJsonRpcResponse, A2ATaskStore, } from './server.js';
|
|
6
|
+
export { A2AServerHandler, InMemoryA2ATaskStore, createA2AAgentCard, createA2AMessage, mapAgentEventToA2AEvent, DEFAULT_A2A_EVENT_MAPPERS, withHeartbeat, } from './server.js';
|
|
7
|
+
export type { A2AHandlerResponse, A2AServerAgentConfig, A2AServerHandlerOptions, A2AStreamingJsonRpcResponse, A2ATaskStore, A2AEventMapper, A2AEventAccumulator, A2ATaskRunner, A2ARunContext, HeartbeatItem, } from './server.js';
|
|
8
8
|
export { RestA2AClient } from './rest-client.js';
|
|
9
9
|
export type { RestCapabilityCard, RestCapabilityResult, RestSSEEvent, RestTaskStatus, RestA2AClientOptions, } from './rest-client.js';
|
|
10
10
|
export { createRestA2ARemoteRunner } from './rest-runner.js';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/a2a/index.ts"],"names":[],"mappings":"AAIA,YAAY,EACV,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,WAAW,EACX,WAAW,EACX,WAAW,EACX,OAAO,EACP,UAAU,EACV,YAAY,EACZ,aAAa,EACb,WAAW,EACX,OAAO,EACP,wBAAwB,EACxB,0BAA0B,EAC1B,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC1D,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAEzG,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC5E,YAAY,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEzD,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,uBAAuB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/a2a/index.ts"],"names":[],"mappings":"AAIA,YAAY,EACV,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,WAAW,EACX,WAAW,EACX,WAAW,EACX,OAAO,EACP,UAAU,EACV,YAAY,EACZ,aAAa,EACb,WAAW,EACX,OAAO,EACP,wBAAwB,EACxB,0BAA0B,EAC1B,YAAY,EACZ,iBAAiB,EACjB,kBAAkB,EAClB,eAAe,EACf,iBAAiB,EACjB,sBAAsB,EACtB,gBAAgB,EAChB,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC1D,YAAY,EAAE,UAAU,EAAE,gBAAgB,EAAE,eAAe,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAEzG,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC5E,YAAY,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEzD,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,uBAAuB,EACvB,yBAAyB,EACzB,aAAa,GACd,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,kBAAkB,EAClB,oBAAoB,EACpB,uBAAuB,EACvB,2BAA2B,EAC3B,YAAY,EACZ,cAAc,EACd,mBAAmB,EACnB,aAAa,EACb,aAAa,EACb,aAAa,GACd,MAAM,aAAa,CAAC;AAGrB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACjD,YAAY,EACV,kBAAkB,EAClB,oBAAoB,EACpB,YAAY,EACZ,cAAc,EACd,oBAAoB,GACrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,YAAY,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/esm/a2a/index.js
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// ============================================================
|
|
4
4
|
export { A2AClient, buildAuthHeaders } from "./client.js";
|
|
5
5
|
export { createA2ARemoteRunner, extractTextFromMessage } from "./runner.js";
|
|
6
|
-
export { A2AServerHandler, InMemoryA2ATaskStore, createA2AAgentCard, createA2AMessage, mapAgentEventToA2AEvent, } from "./server.js";
|
|
6
|
+
export { A2AServerHandler, InMemoryA2ATaskStore, createA2AAgentCard, createA2AMessage, mapAgentEventToA2AEvent, DEFAULT_A2A_EVENT_MAPPERS, withHeartbeat, } from "./server.js";
|
|
7
7
|
// ---- REST 风格 A2A ----
|
|
8
8
|
export { RestA2AClient } from "./rest-client.js";
|
|
9
9
|
export { createRestA2ARemoteRunner } from "./rest-runner.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/a2a/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,aAAa;AACb,+DAA+D;AA4B/D,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG1D,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAG5E,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,uBAAuB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/a2a/index.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,aAAa;AACb,+DAA+D;AA4B/D,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAG1D,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAG5E,OAAO,EACL,gBAAgB,EAChB,oBAAoB,EACpB,kBAAkB,EAClB,gBAAgB,EAChB,uBAAuB,EACvB,yBAAyB,EACzB,aAAa,GACd,MAAM,aAAa,CAAC;AAcrB,wBAAwB;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAQjD,OAAO,EAAE,yBAAyB,EAAE,MAAM,kBAAkB,CAAC"}
|
package/dist/esm/a2a/server.d.ts
CHANGED
|
@@ -16,10 +16,75 @@ export interface A2ATaskStore {
|
|
|
16
16
|
set(task: A2ATask): void | Promise<void>;
|
|
17
17
|
delete?(id: string): void | Promise<void>;
|
|
18
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* 引擎事件 → A2A 事件映射器。
|
|
21
|
+
*
|
|
22
|
+
* 返回 `null` 表示该事件不转发到 A2A 流(静默丢弃)。
|
|
23
|
+
* `acc` 在单次运行内共享,可用于累积最终文本等跨事件状态。
|
|
24
|
+
*/
|
|
25
|
+
export type A2AEventMapper = (event: AgentEvent, task: A2ATask, acc: A2AEventAccumulator) => A2ATaskEvent | null;
|
|
26
|
+
/** 单次运行内共享的累积状态 */
|
|
27
|
+
export interface A2AEventAccumulator {
|
|
28
|
+
/** 累积的最终文本输出 */
|
|
29
|
+
finalText: string;
|
|
30
|
+
/** 供自定义映射器存放任意中间状态 */
|
|
31
|
+
[key: string]: unknown;
|
|
32
|
+
}
|
|
33
|
+
/** 单次 A2A 任务运行的上下文 */
|
|
34
|
+
export interface A2ARunContext {
|
|
35
|
+
task: A2ATask;
|
|
36
|
+
params: A2ASendTaskParams;
|
|
37
|
+
/** 从 params.message 提取的纯文本 prompt */
|
|
38
|
+
message: string;
|
|
39
|
+
/** 取消信号 —— 由 tasks/cancel 或客户端断连触发 */
|
|
40
|
+
abortSignal: AbortSignal;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* 任务执行器:产出引擎事件流。
|
|
44
|
+
*
|
|
45
|
+
* 相较 `getEngine`,本接口不假设事件来自 `AgentEngine`,
|
|
46
|
+
* 从而允许接入方在自有服务层(多租户解析、线程落库、可观测性等)
|
|
47
|
+
* 之上驱动运行,仍复用内核的协议编排、心跳与取消能力。
|
|
48
|
+
*/
|
|
49
|
+
export type A2ATaskRunner = (ctx: A2ARunContext) => AsyncIterable<AgentEvent>;
|
|
19
50
|
export interface A2AServerHandlerOptions {
|
|
20
|
-
|
|
51
|
+
/**
|
|
52
|
+
* 引擎工厂(便捷路径):内核负责调用 `engine.run(...)`。
|
|
53
|
+
* 与 `runTask` 二选一;同时提供时 `runTask` 优先。
|
|
54
|
+
*/
|
|
55
|
+
getEngine?: (params: A2ASendTaskParams) => AgentEngine | Promise<AgentEngine>;
|
|
56
|
+
/**
|
|
57
|
+
* 自定义任务执行器(高级路径):接管事件来源。
|
|
58
|
+
*
|
|
59
|
+
* 适用于事件由应用服务层产生(而非直接操作 AgentEngine)的场景,
|
|
60
|
+
* 内核依旧提供任务状态机、心跳、取消与事件映射。
|
|
61
|
+
*/
|
|
62
|
+
runTask?: A2ATaskRunner;
|
|
21
63
|
buildRunOptions?: (params: A2ASendTaskParams, task: A2ATask) => Partial<RunOptions> | Promise<Partial<RunOptions>>;
|
|
22
64
|
taskStore?: A2ATaskStore;
|
|
65
|
+
/**
|
|
66
|
+
* 自定义事件映射表(按 `AgentEvent.type` 索引),覆盖同名的内置映射。
|
|
67
|
+
*
|
|
68
|
+
* 用于接入方按需改写事件形态,新增事件类型只需加一行映射,
|
|
69
|
+
* 无需修改流式主循环。返回 `null` 的事件不会下发。
|
|
70
|
+
*/
|
|
71
|
+
eventMappers?: Record<string, A2AEventMapper>;
|
|
72
|
+
/**
|
|
73
|
+
* 未被内置或自定义映射覆盖的事件的兜底处理。
|
|
74
|
+
* - `'drop'`(默认):丢弃,保持 A2A 流干净
|
|
75
|
+
* - `'passthrough'`:以 `metadata` 形式透传,便于调试或富客户端消费
|
|
76
|
+
*/
|
|
77
|
+
unknownEventStrategy?: 'drop' | 'passthrough';
|
|
78
|
+
/**
|
|
79
|
+
* SSE 心跳间隔(毫秒)。设为 `0` 或不设则禁用。
|
|
80
|
+
*
|
|
81
|
+
* 引擎长时间无事件输出时(如长工具调用),定期产出心跳事件,
|
|
82
|
+
* 避免中间代理/网关因空闲超时切断连接。
|
|
83
|
+
*/
|
|
84
|
+
heartbeatIntervalMs?: number;
|
|
85
|
+
/** 任务生命周期钩子(落库、指标、会话映射等副作用挂载点) */
|
|
86
|
+
onTaskCreated?: (task: A2ATask, params: A2ASendTaskParams) => void | Promise<void>;
|
|
87
|
+
onTaskUpdated?: (task: A2ATask) => void | Promise<void>;
|
|
23
88
|
}
|
|
24
89
|
export interface A2AStreamingJsonRpcResponse {
|
|
25
90
|
jsonrpc: '2.0';
|
|
@@ -35,14 +100,61 @@ export declare class InMemoryA2ATaskStore implements A2ATaskStore {
|
|
|
35
100
|
}
|
|
36
101
|
export declare function createA2AAgentCard(config: A2AServerAgentConfig): A2AAgentCard;
|
|
37
102
|
export declare function createA2AMessage(text: string, role?: 'user' | 'agent', taskId?: string, contextId?: string): A2AMessage;
|
|
103
|
+
/** withHeartbeat 产出项:引擎事件或保活心跳 */
|
|
104
|
+
export type HeartbeatItem<T> = {
|
|
105
|
+
kind: 'event';
|
|
106
|
+
value: T;
|
|
107
|
+
} | {
|
|
108
|
+
kind: 'heartbeat';
|
|
109
|
+
};
|
|
110
|
+
/**
|
|
111
|
+
* 为任意异步迭代器叠加心跳保活。
|
|
112
|
+
*
|
|
113
|
+
* 当上游在 `intervalMs` 内没有产出事件时,产出一个 `heartbeat` 项,
|
|
114
|
+
* 供调用方下发 keep-alive,避免反向代理因空闲超时切断长连接。
|
|
115
|
+
*
|
|
116
|
+
* 实现要点(手写 race 极易出错之处):
|
|
117
|
+
* 1. `pending` 跨轮复用 —— 心跳胜出时**不能**丢弃已发起的 `next()`,
|
|
118
|
+
* 否则会漏事件或重复消费迭代器;
|
|
119
|
+
* 2. 定时器在每轮 `finally` 中**必定清理** —— 否则长任务会累积大量
|
|
120
|
+
* 游离 timer,持续占用事件循环;
|
|
121
|
+
* 3. 结束时调用上游 `return()` —— 保证下游提前 break 时上游能及时释放。
|
|
122
|
+
*/
|
|
123
|
+
export declare function withHeartbeat<T>(source: AsyncIterable<T>, intervalMs: number, abortSignal?: AbortSignal): AsyncGenerator<HeartbeatItem<T>>;
|
|
124
|
+
/**
|
|
125
|
+
* 内置引擎事件映射表。
|
|
126
|
+
*
|
|
127
|
+
* 以表驱动替代 switch,接入方可通过 `eventMappers` 覆盖任意条目
|
|
128
|
+
* 或新增事件类型,无需改动流式主循环。
|
|
129
|
+
*/
|
|
130
|
+
export declare const DEFAULT_A2A_EVENT_MAPPERS: Record<string, A2AEventMapper>;
|
|
131
|
+
/**
|
|
132
|
+
* 引擎事件 → A2A 事件的默认映射(保留具名导出以兼容既有调用方)。
|
|
133
|
+
*/
|
|
38
134
|
export declare function mapAgentEventToA2AEvent(event: AgentEvent, task: A2ATask): A2ATaskEvent | null;
|
|
39
135
|
export declare class A2AServerHandler {
|
|
40
136
|
private readonly options;
|
|
41
137
|
private store;
|
|
138
|
+
private readonly mappers;
|
|
139
|
+
/** 运行中任务的中止控制器 —— 支撑 tasks/cancel 真正停止引擎 */
|
|
140
|
+
private readonly running;
|
|
42
141
|
constructor(options: A2AServerHandlerOptions);
|
|
142
|
+
/** 持久化任务并触发更新钩子(钩子异常不影响协议主流程) */
|
|
143
|
+
private persist;
|
|
144
|
+
/**
|
|
145
|
+
* 解析本次运行的事件流来源。
|
|
146
|
+
*
|
|
147
|
+
* 优先使用 `runTask`(应用自行驱动),否则回落到 `getEngine` 便捷路径。
|
|
148
|
+
* `abortSignal` 一律置于 overrides 展开之后,确保取消链路不被覆盖。
|
|
149
|
+
*/
|
|
150
|
+
private resolveEventStream;
|
|
151
|
+
/** 应用映射表,未命中时按 unknownEventStrategy 兜底 */
|
|
152
|
+
private mapEvent;
|
|
43
153
|
handleJsonRpc(request: A2AJsonRpcRequest): Promise<A2AHandlerResponse>;
|
|
44
154
|
sendTask(params: A2ASendTaskParams): Promise<A2ATask>;
|
|
45
155
|
sendTaskStreaming(params: A2ASendTaskParams): AsyncGenerator<A2ATaskEvent>;
|
|
156
|
+
/** 创建任务、落库并触发创建钩子 */
|
|
157
|
+
private beginTask;
|
|
46
158
|
getTask(params: A2AGetTaskParams): Promise<A2ATask>;
|
|
47
159
|
cancelTask(params: A2ACancelTaskParams): Promise<A2ATask>;
|
|
48
160
|
private createSubmittedTask;
|