@migor/agentia 0.0.2 → 0.2.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/README.md +62 -6
- package/dist/core/json.d.ts +2 -0
- package/dist/core/json.js +12 -0
- package/dist/core/json.js.map +1 -0
- package/dist/core/schema.d.ts +2 -1
- package/dist/core/schema.js +11 -9
- package/dist/core/schema.js.map +1 -1
- package/dist/core/tool.d.ts +19 -1
- package/dist/engine/loop.d.ts +11 -3
- package/dist/engine/loop.js +69 -15
- package/dist/engine/loop.js.map +1 -1
- package/dist/engine/replay.d.ts +31 -0
- package/dist/engine/replay.js +107 -0
- package/dist/engine/replay.js.map +1 -0
- package/dist/engine/types.d.ts +18 -4
- package/dist/index.d.ts +18 -2
- package/dist/index.js +12 -1
- package/dist/index.js.map +1 -1
- package/dist/run/async.d.ts +12 -17
- package/dist/run/async.js +66 -16
- package/dist/run/async.js.map +1 -1
- package/dist/run/http.d.ts +47 -0
- package/dist/run/http.js +119 -0
- package/dist/run/http.js.map +1 -0
- package/dist/run/memory.d.ts +18 -0
- package/dist/run/memory.js +18 -0
- package/dist/run/memory.js.map +1 -0
- package/dist/run/openai.d.ts +24 -0
- package/dist/run/openai.js +181 -0
- package/dist/run/openai.js.map +1 -0
- package/dist/run/otlp.d.ts +26 -0
- package/dist/run/otlp.js +105 -0
- package/dist/run/otlp.js.map +1 -0
- package/dist/run/redisStore.d.ts +54 -0
- package/dist/run/redisStore.js +72 -0
- package/dist/run/redisStore.js.map +1 -0
- package/dist/run/run.d.ts +10 -0
- package/dist/run/run.js +31 -0
- package/dist/run/run.js.map +1 -1
- package/dist/run/spec.d.ts +2 -1
- package/dist/run/spec.js.map +1 -1
- package/dist/run/sqliteStore.d.ts +24 -0
- package/dist/run/sqliteStore.js +60 -0
- package/dist/run/sqliteStore.js.map +1 -0
- package/dist/run/store.d.ts +12 -5
- package/dist/run/store.js.map +1 -1
- package/dist/toolkit/collect.d.ts +23 -0
- package/dist/toolkit/collect.js +45 -0
- package/dist/toolkit/collect.js.map +1 -0
- package/dist/toolkit/discover.js +7 -1
- package/dist/toolkit/discover.js.map +1 -1
- package/dist/toolkit/middleware.d.ts +27 -0
- package/dist/toolkit/middleware.js +15 -0
- package/dist/toolkit/middleware.js.map +1 -0
- package/dist/toolkit/module.d.ts +18 -0
- package/dist/toolkit/module.js +34 -1
- package/dist/toolkit/module.js.map +1 -1
- package/dist/toolkit/prompt.js +6 -20
- package/dist/toolkit/prompt.js.map +1 -1
- package/dist/toolkit/skill.js +8 -29
- package/dist/toolkit/skill.js.map +1 -1
- package/dist/toolkit/subagent.d.ts +6 -0
- package/dist/toolkit/subagent.js +16 -28
- package/dist/toolkit/subagent.js.map +1 -1
- package/dist/toolkit/tool.js +3 -25
- package/dist/toolkit/tool.js.map +1 -1
- package/dist/toolkit/zod.d.ts +26 -0
- package/dist/toolkit/zod.js +45 -0
- package/dist/toolkit/zod.js.map +1 -0
- package/package.json +27 -17
package/README.md
CHANGED
|
@@ -141,21 +141,78 @@ const app = createApp({
|
|
|
141
141
|
});
|
|
142
142
|
```
|
|
143
143
|
|
|
144
|
+
## 中间件
|
|
145
|
+
|
|
146
|
+
挂在每一次单元调用前后的洋葱链——鉴权、限流、缓存、审计都走这里:
|
|
147
|
+
|
|
148
|
+
```ts
|
|
149
|
+
const app = createApp({
|
|
150
|
+
// ...
|
|
151
|
+
middleware: [
|
|
152
|
+
async (call, next) => {
|
|
153
|
+
if (call.unit.name === 'danger_op' && !RunContext.current()?.get('isAdmin')) {
|
|
154
|
+
return 'forbidden'; // 短路,不调 next 即拦截
|
|
155
|
+
}
|
|
156
|
+
return next(); // next(newInput) 还可改写入参
|
|
157
|
+
},
|
|
158
|
+
],
|
|
159
|
+
});
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
## 结构化结果
|
|
163
|
+
|
|
164
|
+
```ts
|
|
165
|
+
const { result } = await app.run(messages, {
|
|
166
|
+
resultSchema: {
|
|
167
|
+
type: 'object',
|
|
168
|
+
properties: { pass: { type: 'boolean' }, reason: { type: 'string' } },
|
|
169
|
+
required: ['pass', 'reason'],
|
|
170
|
+
additionalProperties: false,
|
|
171
|
+
},
|
|
172
|
+
});
|
|
173
|
+
console.log(result.typed); // 校验过的结构化结果,不再从文本里猜 JSON
|
|
174
|
+
// schema 也可来自 zod(peer 可选):fromZod(z.toJSONSchema(S), S)
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## 宿主、多模型与记忆
|
|
178
|
+
|
|
179
|
+
```ts
|
|
180
|
+
// HTTP 宿主:POST /run(同步) POST /tasks(异步) GET /tasks/:id(轮询)
|
|
181
|
+
createServer(createHttpHandler(app, { runner })).listen(8080);
|
|
182
|
+
|
|
183
|
+
// OpenAI 兼容端点(DeepSeek 等)+ 跨 run 记忆
|
|
184
|
+
const { result } = await app.run(messages, {
|
|
185
|
+
client: createOpenAIClient({ baseURL: 'https://api.deepseek.com' }),
|
|
186
|
+
model: 'deepseek-chat',
|
|
187
|
+
memory: { store: new InMemoryMemoryStore(), keys: ['profile'] },
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
// trace 导出到 OTLP 收集器
|
|
191
|
+
await createOtlpExporter({ endpoint: 'http://localhost:4318' }).export(result.trace);
|
|
192
|
+
```
|
|
193
|
+
|
|
144
194
|
## 常用 API
|
|
145
195
|
|
|
146
196
|
| 导出 | 用途 |
|
|
147
197
|
|---|---|
|
|
148
198
|
| `createApp` / `discoverProviders` | 装配应用 / 扫描单元目录 |
|
|
199
|
+
| `defineModule` | 能力包(providers + middleware 打包分发) |
|
|
149
200
|
| `Tool` / `Skill` / `SubAgent` / `Prompt` | 四类单元装饰器 |
|
|
201
|
+
| `UnitMiddleware`(`middleware` 选项) | 单元调用拦截器链 |
|
|
150
202
|
| `asset` | 读单元文件夹内的文本资产 |
|
|
151
203
|
| `SystemPrompt` | 拼装系统提示(自动打缓存 breakpoint) |
|
|
152
204
|
| `RunContext.current()` | 取本次 run 的 blackboard / runId |
|
|
153
|
-
| `AsyncRunner` / `Scheduler` / `runSync` |
|
|
154
|
-
| `FileTaskStore` / `InMemoryTaskStore` |
|
|
205
|
+
| `AsyncRunner` / `Scheduler` / `runSync` / `createHttpHandler` | 异步 / 定时 / 同步 / HTTP 触发 |
|
|
206
|
+
| `FileTaskStore` / `SqliteTaskStore` / `RedisTaskStore` / `InMemoryTaskStore` | 任务记录存储 |
|
|
155
207
|
| `createBudgetPolicy` | 长上下文预算护栏 |
|
|
208
|
+
| `createOpenAIClient` | OpenAI 兼容端点适配(多模型) |
|
|
209
|
+
| `InMemoryMemoryStore`(`memory` 选项) | 跨 run 记忆水合/回写 |
|
|
210
|
+
| `createOtlpExporter` | trace 导出 OTLP |
|
|
211
|
+
| `traceToMessages` | trace 重放基底:把完成的 run 还原成消息喂回模型调试 |
|
|
212
|
+
| `fromZod` | zod schema 接入(peer 可选) |
|
|
156
213
|
| `runAgent` / `executeRun` | 裸引擎入口(不走装配) |
|
|
157
214
|
|
|
158
|
-
完整导出见 [`src/index.ts`](src/index.ts),设计规格见 [`docs/spec.md`](docs/spec.md)
|
|
215
|
+
完整导出见 [`src/index.ts`](src/index.ts),设计规格见 [`docs/spec.md`](docs/spec.md),roadmap 见 [`docs/roadmap.md`](docs/roadmap.md),官网见 [agentia-web.pages.dev](https://agentia-web.pages.dev)(含[在线 Playground](https://agentia-web.pages.dev/playground.html) 与[文档](https://agentia-web.pages.dev/docs.html))。
|
|
159
216
|
|
|
160
217
|
## 本仓库脚本
|
|
161
218
|
|
|
@@ -163,9 +220,8 @@ const app = createApp({
|
|
|
163
220
|
npm install
|
|
164
221
|
npm run build # 编译框架(dist/)
|
|
165
222
|
npm run typecheck # 类型检查
|
|
166
|
-
npm
|
|
167
|
-
npm run
|
|
168
|
-
npm run live:skill # 真机:@Skill ctx.llm()(需 API key)
|
|
223
|
+
npm test # 单元测试(node:test)
|
|
224
|
+
npm run e2e # 端到端:CLI 脚手架 → 目录发现/注册表装配 → mock run
|
|
169
225
|
```
|
|
170
226
|
|
|
171
227
|
> 注:`npm run dev`(tsx)前需先 `npm approve-scripts` 批准 esbuild/tsx 的 postinstall。
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/** 任意值 → 字符串:string 原样,其余 JSON.stringify,循环引用等异常回落 String()。 */
|
|
2
|
+
export function stringifySafe(x) {
|
|
3
|
+
if (typeof x === 'string')
|
|
4
|
+
return x;
|
|
5
|
+
try {
|
|
6
|
+
return JSON.stringify(x) ?? String(x);
|
|
7
|
+
}
|
|
8
|
+
catch {
|
|
9
|
+
return String(x);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["../../src/core/json.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,MAAM,UAAU,aAAa,CAAC,CAAU;IACtC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC;IACpC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;AACH,CAAC"}
|
package/dist/core/schema.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { JsonSchema } from './tool.js';
|
|
2
2
|
/**
|
|
3
|
-
* Agentia —— 最小 JSON Schema 校验子集(
|
|
3
|
+
* Agentia —— 最小 JSON Schema 校验子集(v1 裸 JSON Schema;zod 为可选外挂,
|
|
4
|
+
* 见 toolkit/zod.ts —— schema 上挂 __zodValidate 时先走它,core 本身不依赖 zod)。
|
|
4
5
|
*
|
|
5
6
|
* 用途:engine 在执行 tool.run 前校验模型给出的结构化 input;校验失败直接回
|
|
6
7
|
* is_error 的 tool_result(错误信息含路径,模型可自我修正),不进方法体。
|
package/dist/core/schema.js
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
import { stringifySafe } from './json.js';
|
|
1
2
|
/**
|
|
2
|
-
* Agentia —— 最小 JSON Schema 校验子集(
|
|
3
|
+
* Agentia —— 最小 JSON Schema 校验子集(v1 裸 JSON Schema;zod 为可选外挂,
|
|
4
|
+
* 见 toolkit/zod.ts —— schema 上挂 __zodValidate 时先走它,core 本身不依赖 zod)。
|
|
3
5
|
*
|
|
4
6
|
* 用途:engine 在执行 tool.run 前校验模型给出的结构化 input;校验失败直接回
|
|
5
7
|
* is_error 的 tool_result(错误信息含路径,模型可自我修正),不进方法体。
|
|
@@ -11,6 +13,14 @@
|
|
|
11
13
|
* @returns 人类可读的错误描述(含路径);合法返回 null。
|
|
12
14
|
*/
|
|
13
15
|
export function validateJsonSchema(schema, input) {
|
|
16
|
+
// zod 可选接入(toolkit/zod.ts 的 fromZod 挂的隐藏字段):存在则先走 zod 校验,
|
|
17
|
+
// 失败即回「$.: <首条错误>」(含 zod 路径);通过后再叠加 JSON Schema 子集校验。
|
|
18
|
+
const zv = schema.__zodValidate;
|
|
19
|
+
if (typeof zv === 'function') {
|
|
20
|
+
const err = zv(input);
|
|
21
|
+
if (err)
|
|
22
|
+
return `$.: ${err}`;
|
|
23
|
+
}
|
|
14
24
|
return check(schema, input, '$');
|
|
15
25
|
}
|
|
16
26
|
function check(schema, value, path) {
|
|
@@ -90,14 +100,6 @@ function preview(value) {
|
|
|
90
100
|
const s = stringifySafe(value);
|
|
91
101
|
return s.length > 80 ? `${s.slice(0, 80)}…` : s;
|
|
92
102
|
}
|
|
93
|
-
function stringifySafe(x) {
|
|
94
|
-
try {
|
|
95
|
-
return JSON.stringify(x) ?? String(x);
|
|
96
|
-
}
|
|
97
|
-
catch {
|
|
98
|
-
return String(x);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
103
|
function deepEqual(a, b) {
|
|
102
104
|
if (a === b)
|
|
103
105
|
return true;
|
package/dist/core/schema.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/core/schema.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/core/schema.ts"],"names":[],"mappings":"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"}
|
package/dist/core/tool.d.ts
CHANGED
|
@@ -32,6 +32,24 @@ export interface RecorderBackend {
|
|
|
32
32
|
setAttribute(id: SpanId, key: string, value: string | number | boolean): void;
|
|
33
33
|
snapshot(status: SpanStatus): Trace;
|
|
34
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* engine 对模型端的最小结构面(R4 多模型):Anthropic SDK 天然满足,
|
|
37
|
+
* 其他 provider(OpenAI 兼容端点等)只需适配出同一形态。
|
|
38
|
+
*/
|
|
39
|
+
export interface ModelClient {
|
|
40
|
+
messages: {
|
|
41
|
+
stream(params: {
|
|
42
|
+
model: string;
|
|
43
|
+
max_tokens: number;
|
|
44
|
+
system?: string | Anthropic.TextBlockParam[];
|
|
45
|
+
tools?: Anthropic.Tool[];
|
|
46
|
+
messages: Anthropic.MessageParam[];
|
|
47
|
+
}): {
|
|
48
|
+
on(event: 'text', cb: (delta: string) => void): void;
|
|
49
|
+
finalMessage(): Promise<Anthropic.Message>;
|
|
50
|
+
};
|
|
51
|
+
};
|
|
52
|
+
}
|
|
35
53
|
/**
|
|
36
54
|
* engine 在调用每个工具时注入的执行上下文(spec §9.2:当前 span 句柄随调用传播,
|
|
37
55
|
* 不用全局单例,保证并行工具调用父子关系准确)。
|
|
@@ -40,7 +58,7 @@ export interface RecorderBackend {
|
|
|
40
58
|
* - client:与主循环同一注入(子 agent 独立循环复用它)。
|
|
41
59
|
*/
|
|
42
60
|
export interface ToolRunContext {
|
|
43
|
-
client:
|
|
61
|
+
client: ModelClient;
|
|
44
62
|
recorder: RecorderBackend;
|
|
45
63
|
parentSpanId: SpanId;
|
|
46
64
|
}
|
package/dist/engine/loop.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import Anthropic from '@anthropic-ai/sdk';
|
|
2
|
-
import type { AgentTool, RecorderBackend } from '../core/tool.js';
|
|
2
|
+
import type { AgentTool, JsonSchema, ModelClient, RecorderBackend } from '../core/tool.js';
|
|
3
3
|
import type { SpanError, SpanId } from '../core/trace.js';
|
|
4
4
|
import type { AgentRunResult, AgentStopReason, ContextPolicy, RunAgentOptions, SystemParam } from './types.js';
|
|
5
5
|
/**
|
|
@@ -14,12 +14,18 @@ export interface AgentLoopResult {
|
|
|
14
14
|
error?: SpanError;
|
|
15
15
|
/** 本轮循环自己发起的模型往返次数 */
|
|
16
16
|
iterations: number;
|
|
17
|
+
/** submit_result 校验通过的结构化结果;未提交则为 undefined */
|
|
18
|
+
typed?: unknown;
|
|
17
19
|
}
|
|
18
20
|
/** 主入口:开 run 根 span,循环跑在其下。返回完整 trace(traceId 即 runId)。 */
|
|
19
21
|
export declare function runAgent(options: RunAgentOptions): Promise<AgentRunResult>;
|
|
20
|
-
/**
|
|
22
|
+
/**
|
|
23
|
+
* 嵌套单元(子 agent)入口:不自开 run 根,llm.turn 挂在给定 parentSpanId 下的同一条 trace。
|
|
24
|
+
* resultSchema 语义与 runAgent 一致(隐藏 submit_result → AgentLoopResult.typed),
|
|
25
|
+
* 供子 agent 产出结构化结果(见 toolkit/subagent.ts 的交回逻辑)。
|
|
26
|
+
*/
|
|
21
27
|
export declare function runAgentScoped(opts: {
|
|
22
|
-
client?:
|
|
28
|
+
client?: ModelClient;
|
|
23
29
|
system?: SystemParam;
|
|
24
30
|
messages: Anthropic.MessageParam[];
|
|
25
31
|
tools?: AgentTool[];
|
|
@@ -30,4 +36,6 @@ export declare function runAgentScoped(opts: {
|
|
|
30
36
|
parentSpanId: SpanId;
|
|
31
37
|
onText?: (delta: string) => void;
|
|
32
38
|
contextPolicy?: ContextPolicy;
|
|
39
|
+
/** 结构化结果 schema:存在时追加隐藏 submit_result 工具(同 RunAgentOptions.resultSchema) */
|
|
40
|
+
resultSchema?: JsonSchema;
|
|
33
41
|
}): Promise<AgentLoopResult>;
|
package/dist/engine/loop.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import Anthropic from '@anthropic-ai/sdk';
|
|
2
2
|
import { validateJsonSchema } from '../core/schema.js';
|
|
3
|
+
import { stringifySafe } from '../core/json.js';
|
|
3
4
|
import { classifyError } from './errors.js';
|
|
4
5
|
import { TraceRecorder } from './tracer.js';
|
|
5
6
|
import { costEstimate, usageFromAnthropic } from './usage.js';
|
|
@@ -13,16 +14,51 @@ export function resolveDefaultModel(over) {
|
|
|
13
14
|
return over;
|
|
14
15
|
return process.env.AGENTIA_MODEL?.trim() || 'claude-opus-5';
|
|
15
16
|
}
|
|
17
|
+
/** 隐藏提交工具名:resultSchema 模式下由 engine 内部追加,不属开发者工具菜单 */
|
|
18
|
+
const SUBMIT_RESULT = 'submit_result';
|
|
19
|
+
/** resultSchema 模式下追加到 system 末尾的指令 */
|
|
20
|
+
const RESULT_INSTRUCTION = '本任务要求结构化结果:完成必要的信息收集与工具调用后,必须调用 submit_result 工具提交最终结果' +
|
|
21
|
+
'(input 严格符合该工具的 input_schema);不要仅以普通文本结束作答。';
|
|
22
|
+
/**
|
|
23
|
+
* 把结果提交指令追加到 system 末尾:string 时以空行拼接;SystemTextBlock[] 时
|
|
24
|
+
* 在数组末尾 push 一个无 cache_control 的 text block —— 不污染稳定前缀的缓存 breakpoint。
|
|
25
|
+
*/
|
|
26
|
+
function appendResultInstruction(system) {
|
|
27
|
+
if (!system)
|
|
28
|
+
return RESULT_INSTRUCTION;
|
|
29
|
+
if (typeof system === 'string')
|
|
30
|
+
return `${system}\n\n${RESULT_INSTRUCTION}`;
|
|
31
|
+
return [...system, { type: 'text', text: RESULT_INSTRUCTION }];
|
|
32
|
+
}
|
|
16
33
|
/** 循环体核心:带父 span 跑一轮 manual loop。请求失败按 error 收掉 turn 后抛出,由外层收尾。 */
|
|
17
34
|
async function agentLoop(args) {
|
|
18
35
|
const { client, model, recorder, parentSpanId } = args;
|
|
19
36
|
const messages = [...args.messages];
|
|
20
|
-
|
|
37
|
+
// resultSchema 模式:追加隐藏 submit_result 工具 + system 末尾指令。
|
|
38
|
+
// 该工具由 engine 内部注入,不属开发者菜单;菜单已有同名工具视为装配冲突。
|
|
39
|
+
let apiTools = args.tools.map(toApiTool);
|
|
40
|
+
let system = args.system;
|
|
41
|
+
if (args.resultSchema) {
|
|
42
|
+
if (args.tools.some((t) => t.name === SUBMIT_RESULT)) {
|
|
43
|
+
throw new Error(`装配冲突:工具菜单已含 "${SUBMIT_RESULT}",与 resultSchema 的隐藏提交工具同名`);
|
|
44
|
+
}
|
|
45
|
+
apiTools = [
|
|
46
|
+
...apiTools,
|
|
47
|
+
{
|
|
48
|
+
name: SUBMIT_RESULT,
|
|
49
|
+
description: '任务完成时调用它提交最终结构化结果(input 必须符合本工具的 input_schema)',
|
|
50
|
+
input_schema: args.resultSchema,
|
|
51
|
+
},
|
|
52
|
+
];
|
|
53
|
+
system = appendResultInstruction(args.system);
|
|
54
|
+
}
|
|
21
55
|
let stopReason = 'end_turn';
|
|
22
56
|
let error;
|
|
23
57
|
let finalText = '';
|
|
24
58
|
let finished = false;
|
|
25
59
|
let iterations = 0;
|
|
60
|
+
let typed;
|
|
61
|
+
let submitted = false;
|
|
26
62
|
for (let iteration = 0; iteration < args.maxIterations; iteration++) {
|
|
27
63
|
// 发送前给上下文策略一个机会(编辑/压缩预算超限的历史)
|
|
28
64
|
if (args.contextPolicy) {
|
|
@@ -44,7 +80,7 @@ async function agentLoop(args) {
|
|
|
44
80
|
const stream = client.messages.stream({
|
|
45
81
|
model,
|
|
46
82
|
max_tokens: args.maxTokens,
|
|
47
|
-
...(
|
|
83
|
+
...(system ? { system } : {}),
|
|
48
84
|
...(apiTools.length ? { tools: apiTools } : {}),
|
|
49
85
|
messages,
|
|
50
86
|
});
|
|
@@ -104,7 +140,21 @@ async function agentLoop(args) {
|
|
|
104
140
|
const ctx = { client, recorder, parentSpanId: turnId };
|
|
105
141
|
let ok = true;
|
|
106
142
|
let content = '';
|
|
107
|
-
if (
|
|
143
|
+
if (args.resultSchema && use.name === SUBMIT_RESULT) {
|
|
144
|
+
// 隐藏提交工具:校验通过即携结果收尾(循环在下方 break);
|
|
145
|
+
// 校验失败回 is_error(含路径,模型可自我修正),同回合其他工具照常执行。
|
|
146
|
+
const invalid = validateJsonSchema(args.resultSchema, use.input);
|
|
147
|
+
if (invalid) {
|
|
148
|
+
ok = false;
|
|
149
|
+
content = `invalid input: ${invalid}`;
|
|
150
|
+
}
|
|
151
|
+
else {
|
|
152
|
+
content = 'submitted';
|
|
153
|
+
typed = use.input;
|
|
154
|
+
submitted = true;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
else if (!tool) {
|
|
108
158
|
ok = false;
|
|
109
159
|
content = `unknown tool: ${use.name}`;
|
|
110
160
|
}
|
|
@@ -136,12 +186,19 @@ async function agentLoop(args) {
|
|
|
136
186
|
};
|
|
137
187
|
}));
|
|
138
188
|
messages.push({ role: 'user', content: toolResults });
|
|
189
|
+
if (submitted) {
|
|
190
|
+
// submit_result 校验通过:结构化结果落定,循环正常收尾(finalText 取该回合文本,可空)
|
|
191
|
+
stopReason = 'end_turn';
|
|
192
|
+
finalText = textOf(message);
|
|
193
|
+
finished = true;
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
139
196
|
}
|
|
140
197
|
if (!finished && stopReason === 'end_turn') {
|
|
141
198
|
// 循环因 maxIterations 上限退出而非正常终止
|
|
142
199
|
stopReason = 'max_iterations';
|
|
143
200
|
}
|
|
144
|
-
return { stopReason, finalText, error, iterations };
|
|
201
|
+
return { stopReason, finalText, error, iterations, typed };
|
|
145
202
|
}
|
|
146
203
|
/** 主入口:开 run 根 span,循环跑在其下。返回完整 trace(traceId 即 runId)。 */
|
|
147
204
|
export async function runAgent(options) {
|
|
@@ -162,6 +219,7 @@ export async function runAgent(options) {
|
|
|
162
219
|
parentSpanId: rootId,
|
|
163
220
|
onText: options.onText,
|
|
164
221
|
contextPolicy: options.contextPolicy,
|
|
222
|
+
resultSchema: options.resultSchema,
|
|
165
223
|
});
|
|
166
224
|
}
|
|
167
225
|
catch (e) {
|
|
@@ -177,9 +235,14 @@ export async function runAgent(options) {
|
|
|
177
235
|
finalText: result.finalText,
|
|
178
236
|
iterations: result.iterations,
|
|
179
237
|
error: result.error,
|
|
238
|
+
typed: result.typed,
|
|
180
239
|
};
|
|
181
240
|
}
|
|
182
|
-
/**
|
|
241
|
+
/**
|
|
242
|
+
* 嵌套单元(子 agent)入口:不自开 run 根,llm.turn 挂在给定 parentSpanId 下的同一条 trace。
|
|
243
|
+
* resultSchema 语义与 runAgent 一致(隐藏 submit_result → AgentLoopResult.typed),
|
|
244
|
+
* 供子 agent 产出结构化结果(见 toolkit/subagent.ts 的交回逻辑)。
|
|
245
|
+
*/
|
|
183
246
|
export async function runAgentScoped(opts) {
|
|
184
247
|
return agentLoop({
|
|
185
248
|
client: opts.client ?? new Anthropic(),
|
|
@@ -193,6 +256,7 @@ export async function runAgentScoped(opts) {
|
|
|
193
256
|
parentSpanId: opts.parentSpanId,
|
|
194
257
|
onText: opts.onText,
|
|
195
258
|
contextPolicy: opts.contextPolicy,
|
|
259
|
+
resultSchema: opts.resultSchema,
|
|
196
260
|
});
|
|
197
261
|
}
|
|
198
262
|
function toApiTool(t) {
|
|
@@ -209,16 +273,6 @@ function textOf(message) {
|
|
|
209
273
|
.map((b) => b.text)
|
|
210
274
|
.join('\n');
|
|
211
275
|
}
|
|
212
|
-
function stringifySafe(x) {
|
|
213
|
-
if (typeof x === 'string')
|
|
214
|
-
return x;
|
|
215
|
-
try {
|
|
216
|
-
return JSON.stringify(x) ?? String(x);
|
|
217
|
-
}
|
|
218
|
-
catch {
|
|
219
|
-
return String(x);
|
|
220
|
-
}
|
|
221
|
-
}
|
|
222
276
|
/** 截断到上限字符,超长加省略标记 */
|
|
223
277
|
function limit(x, n) {
|
|
224
278
|
const s = stringifySafe(x);
|
package/dist/engine/loop.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/engine/loop.ts"],"names":[],"mappings":"AAAA,OAAO,SAAS,MAAM,mBAAmB,CAAC;AAE1C,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"loop.js","sourceRoot":"","sources":["../../src/engine/loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type Anthropic from '@anthropic-ai/sdk';
|
|
2
|
+
import type { Trace } from '../core/trace.js';
|
|
3
|
+
/**
|
|
4
|
+
* Agentia —— trace 重放基底(spec §9.4 开放问题落地,roadmap R6)。
|
|
5
|
+
*
|
|
6
|
+
* 把一条完成的 trace 还原成可喂回模型的对话(MessageParam[]),用途:
|
|
7
|
+
* 把完成的 run 喂回模型做调试 / 复盘(「这次 run 发生了什么、哪里可以改进」)。
|
|
8
|
+
* 纯函数:不发起请求、不改 trace。
|
|
9
|
+
*
|
|
10
|
+
* 还原规则:
|
|
11
|
+
* - 全部 llm.turn 按 startedAt 时序线性展开(稳定排序,同刻保插入序)——
|
|
12
|
+
* 子 agent 的嵌套回合与主 agent 回合交错进同一序列,每回合以 text 块标注
|
|
13
|
+
* 来源(model / 所属 unit span 名 / spanId);
|
|
14
|
+
* - 每回合 → 一条 assistant 消息:标注文本 + 各 tool.input 事件还原的 tool_use 块
|
|
15
|
+
* (id 由重放合成 `replay_tu_<n>`,trace 不记原始 id);
|
|
16
|
+
* - tool.output 事件 → 紧随其后一条 user 消息里的 tool_result 块,与 tool_use
|
|
17
|
+
* 按「同名优先、兜底取最早未配对」配对(并行工具完成序 ≠ 发起序);
|
|
18
|
+
* 缺失输出的 tool_use 补一条 is_error 占位 —— 保证 role 交替与配对合法;
|
|
19
|
+
* - 事件负载(工具入参/出参)已是 engine 截断后的字符串;入参尝试 JSON.parse
|
|
20
|
+
* 还原为对象,失败按字符串保留;所有串按 maxEventChars 再截断(缺省 2000)。
|
|
21
|
+
*
|
|
22
|
+
* 注意:trace 不记录 assistant 文本(llm.turn 只记 usage/事件),还原的
|
|
23
|
+
* assistant 消息以标注文本占位,非逐字原文。
|
|
24
|
+
*/
|
|
25
|
+
export interface ReplayOptions {
|
|
26
|
+
/** 是否还原 tool_use/tool_result 对(缺省 true);false 时只留每回合的标注文本 */
|
|
27
|
+
includeToolIO?: boolean;
|
|
28
|
+
/** 单段事件负载(工具入参/出参)的最大字符数,超长截断(缺省 2000) */
|
|
29
|
+
maxEventChars?: number;
|
|
30
|
+
}
|
|
31
|
+
export declare function traceToMessages(trace: Trace, opts?: ReplayOptions): Anthropic.MessageParam[];
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
const DEFAULT_MAX_EVENT_CHARS = 2000;
|
|
2
|
+
export function traceToMessages(trace, opts = {}) {
|
|
3
|
+
const includeToolIO = opts.includeToolIO ?? true;
|
|
4
|
+
const maxChars = opts.maxEventChars ?? DEFAULT_MAX_EVENT_CHARS;
|
|
5
|
+
const byId = new Map(trace.spans.map((s) => [s.spanId, s]));
|
|
6
|
+
const turns = trace.spans
|
|
7
|
+
.filter((s) => s.kind === 'llm.turn')
|
|
8
|
+
.sort((a, b) => a.startedAt - b.startedAt); // 稳定排序:同刻保 spans 数组插入序
|
|
9
|
+
const messages = [];
|
|
10
|
+
let seq = 0;
|
|
11
|
+
turns.forEach((turn, i) => {
|
|
12
|
+
const unit = nearestUnitName(turn, byId);
|
|
13
|
+
const note = `[replay turn ${i + 1}/${turns.length}] model=${turn.name} ` +
|
|
14
|
+
`unit=${unit ?? '(主 agent run)'} span=${turn.spanId}`;
|
|
15
|
+
const content = [{ type: 'text', text: note }];
|
|
16
|
+
const pairs = [];
|
|
17
|
+
if (includeToolIO) {
|
|
18
|
+
const inputs = eventsOf(turn, 'tool.input');
|
|
19
|
+
const outputs = eventsOf(turn, 'tool.output');
|
|
20
|
+
const used = new Set();
|
|
21
|
+
for (const input of inputs) {
|
|
22
|
+
// 同名优先(并行工具完成序 ≠ 发起序),兜底取最早未配对的输出
|
|
23
|
+
let idx = outputs.findIndex((o, j) => !used.has(j) && o.tool === input.tool);
|
|
24
|
+
if (idx < 0)
|
|
25
|
+
idx = outputs.findIndex((_, j) => !used.has(j));
|
|
26
|
+
const output = idx >= 0 ? outputs[idx] : undefined;
|
|
27
|
+
if (idx >= 0)
|
|
28
|
+
used.add(idx);
|
|
29
|
+
const id = `replay_tu_${++seq}`;
|
|
30
|
+
pairs.push({ id, output });
|
|
31
|
+
content.push({
|
|
32
|
+
type: 'tool_use',
|
|
33
|
+
id,
|
|
34
|
+
name: input.tool,
|
|
35
|
+
input: parseInput(input.input, maxChars),
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
messages.push({ role: 'assistant', content });
|
|
40
|
+
if (pairs.length > 0) {
|
|
41
|
+
// tool_use 后必须紧跟含对应 tool_result 的 user 消息(role 交替合法)
|
|
42
|
+
messages.push({
|
|
43
|
+
role: 'user',
|
|
44
|
+
content: pairs.map(({ id, output }) => ({
|
|
45
|
+
type: 'tool_result',
|
|
46
|
+
tool_use_id: id,
|
|
47
|
+
content: output
|
|
48
|
+
? truncate(output.content ?? '', maxChars)
|
|
49
|
+
: '[replay] trace 中缺失对应 tool.output 事件',
|
|
50
|
+
is_error: output ? output.ok === false : true,
|
|
51
|
+
})),
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
return messages;
|
|
56
|
+
}
|
|
57
|
+
/** 向上找最近的 unit span 名(子 agent 嵌套回合的来源标注);直属 run 根则 null */
|
|
58
|
+
function nearestUnitName(span, byId) {
|
|
59
|
+
let cur = span.parentSpanId ? byId.get(span.parentSpanId) : undefined;
|
|
60
|
+
while (cur) {
|
|
61
|
+
if (cur.kind === 'unit')
|
|
62
|
+
return cur.name;
|
|
63
|
+
cur = cur.parentSpanId ? byId.get(cur.parentSpanId) : undefined;
|
|
64
|
+
}
|
|
65
|
+
return null;
|
|
66
|
+
}
|
|
67
|
+
/** 取某回合的指定事件并规整为 ToolEventIO(body 是 unknown,宽容读取) */
|
|
68
|
+
function eventsOf(turn, name) {
|
|
69
|
+
return turn.events
|
|
70
|
+
.filter((e) => e.name === name)
|
|
71
|
+
.map((e) => {
|
|
72
|
+
const b = (e.body ?? {});
|
|
73
|
+
return {
|
|
74
|
+
tool: typeof b.tool === 'string' ? b.tool : 'unknown',
|
|
75
|
+
input: asString(b.input),
|
|
76
|
+
ok: typeof b.ok === 'boolean' ? b.ok : undefined,
|
|
77
|
+
content: asString(b.content),
|
|
78
|
+
};
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
function asString(x) {
|
|
82
|
+
if (x === undefined)
|
|
83
|
+
return undefined;
|
|
84
|
+
if (typeof x === 'string')
|
|
85
|
+
return x;
|
|
86
|
+
try {
|
|
87
|
+
return JSON.stringify(x) ?? String(x);
|
|
88
|
+
}
|
|
89
|
+
catch {
|
|
90
|
+
return String(x);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/** 入参还原:截断后尝试 JSON.parse 回对象,失败按字符串保留(截断可能截断 JSON) */
|
|
94
|
+
function parseInput(raw, maxChars) {
|
|
95
|
+
const s = truncate(raw ?? '', maxChars);
|
|
96
|
+
try {
|
|
97
|
+
return JSON.parse(s);
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return s;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/** 截断到上限字符,超长加省略标记(与 engine/loop.ts 的 limit 同款格式) */
|
|
104
|
+
function truncate(s, n) {
|
|
105
|
+
return s.length > n ? `${s.slice(0, n)}…(+${s.length - n})` : s;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=replay.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"replay.js","sourceRoot":"","sources":["../../src/engine/replay.ts"],"names":[],"mappings":"AAiCA,MAAM,uBAAuB,GAAG,IAAI,CAAC;AAUrC,MAAM,UAAU,eAAe,CAAC,KAAY,EAAE,IAAI,GAAkB,EAAE;IACpE,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC;IACjD,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,IAAI,uBAAuB,CAAC;IAE/D,MAAM,IAAI,GAAG,IAAI,GAAG,CAAe,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC1E,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK;SACtB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,CAAC;SACpC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,uBAAuB;IAErE,MAAM,QAAQ,GAA6B,EAAE,CAAC;IAC9C,IAAI,GAAG,GAAG,CAAC,CAAC;IAEZ,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;QACxB,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACzC,MAAM,IAAI,GACR,gBAAgB,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,WAAW,IAAI,CAAC,IAAI,GAAG;YAC5D,QAAQ,IAAI,IAAI,eAAe,SAAS,IAAI,CAAC,MAAM,EAAE,CAAC;QAExD,MAAM,OAAO,GAAkC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9E,MAAM,KAAK,GAAgD,EAAE,CAAC;QAE9D,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;YAC5C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,CAAC;YAC9C,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;YAC/B,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;gBAC3B,kCAAkC;gBAClC,IAAI,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,CAAC;gBAC7E,IAAI,GAAG,GAAG,CAAC;oBAAE,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAC7D,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBACnD,IAAI,GAAG,IAAI,CAAC;oBAAE,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBAE5B,MAAM,EAAE,GAAG,aAAa,EAAE,GAAG,EAAE,CAAC;gBAChC,KAAK,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;gBAC3B,OAAO,CAAC,IAAI,CAAC;oBACX,IAAI,EAAE,UAAU;oBAChB,EAAE;oBACF,IAAI,EAAE,KAAK,CAAC,IAAI;oBAChB,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC;iBACzC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;QAE9C,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrB,qDAAqD;YACrD,QAAQ,CAAC,IAAI,CAAC;gBACZ,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;oBACtC,IAAI,EAAE,aAAsB;oBAC5B,WAAW,EAAE,EAAE;oBACf,OAAO,EAAE,MAAM;wBACb,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,EAAE,QAAQ,CAAC;wBAC1C,CAAC,CAAC,qCAAqC;oBACzC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI;iBAC9C,CAAC,CAAC;aACJ,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,2DAA2D;AAC3D,SAAS,eAAe,CAAC,IAAU,EAAE,IAAuB;IAC1D,IAAI,GAAG,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACtE,OAAO,GAAG,EAAE,CAAC;QACX,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,GAAG,CAAC,IAAI,CAAC;QACzC,GAAG,GAAG,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAClE,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,qDAAqD;AACrD,SAAS,QAAQ,CAAC,IAAU,EAAE,IAAY;IACxC,OAAO,IAAI,CAAC,MAAM;SACf,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC;SAC9B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAA4B,CAAC;QACpD,OAAO;YACL,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS;YACrD,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;YACxB,EAAE,EAAE,OAAO,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;YAChD,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC;SAC7B,CAAC;IACJ,CAAC,CAAC,CAAC;AACP,CAAC;AAED,SAAS,QAAQ,CAAC,CAAU;IAC1B,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IACtC,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC;IACpC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;AACH,CAAC;AAED,sDAAsD;AACtD,SAAS,UAAU,CAAC,GAAuB,EAAE,QAAgB;IAC3D,MAAM,CAAC,GAAG,QAAQ,CAAC,GAAG,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;IACxC,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAY,CAAC;IAClC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;AACH,CAAC;AAED,qDAAqD;AACrD,SAAS,QAAQ,CAAC,CAAS,EAAE,CAAS;IACpC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC"}
|