@zmzai/agent-framework 0.9.0 → 0.14.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/dist/adapters/openai-provider.d.ts +6 -3
- package/dist/adapters/openai-provider.d.ts.map +1 -1
- package/dist/adapters/openai-provider.js +1 -1
- package/dist/adapters/openai-provider.js.map +1 -1
- package/dist/core/events/manifest.d.ts +2 -2
- package/dist/core/runtime/active-run-registry.d.ts +34 -0
- package/dist/core/runtime/active-run-registry.d.ts.map +1 -0
- package/dist/core/runtime/active-run-registry.js +44 -0
- package/dist/core/runtime/active-run-registry.js.map +1 -0
- package/dist/core/runtime/attempt-executor.d.ts +67 -0
- package/dist/core/runtime/attempt-executor.d.ts.map +1 -0
- package/dist/core/runtime/attempt-executor.js +683 -0
- package/dist/core/runtime/attempt-executor.js.map +1 -0
- package/dist/core/runtime/command-service.d.ts +48 -0
- package/dist/core/runtime/command-service.d.ts.map +1 -0
- package/dist/core/runtime/command-service.js +148 -0
- package/dist/core/runtime/command-service.js.map +1 -0
- package/dist/core/runtime/compaction.d.ts +30 -6
- package/dist/core/runtime/compaction.d.ts.map +1 -1
- package/dist/core/runtime/compaction.js +5 -4
- package/dist/core/runtime/compaction.js.map +1 -1
- package/dist/core/runtime/context-builder.d.ts +66 -0
- package/dist/core/runtime/context-builder.d.ts.map +1 -0
- package/dist/core/runtime/context-builder.js +187 -0
- package/dist/core/runtime/context-builder.js.map +1 -0
- package/dist/core/runtime/run-scheduler.d.ts +44 -0
- package/dist/core/runtime/run-scheduler.d.ts.map +1 -0
- package/dist/core/runtime/run-scheduler.js +136 -0
- package/dist/core/runtime/run-scheduler.js.map +1 -0
- package/dist/core/runtime/runner.d.ts +29 -178
- package/dist/core/runtime/runner.d.ts.map +1 -1
- package/dist/core/runtime/runner.js +111 -1457
- package/dist/core/runtime/runner.js.map +1 -1
- package/dist/core/runtime/task-lifecycle.d.ts +165 -0
- package/dist/core/runtime/task-lifecycle.d.ts.map +1 -0
- package/dist/core/runtime/task-lifecycle.js +424 -0
- package/dist/core/runtime/task-lifecycle.js.map +1 -0
- package/dist/core/session/sqlite-store.d.ts.map +1 -1
- package/dist/core/session/sqlite-store.js +130 -1
- package/dist/core/session/sqlite-store.js.map +1 -1
- package/dist/core/session/store.d.ts +9 -1
- package/dist/core/session/store.d.ts.map +1 -1
- package/dist/core/session/types.d.ts +16 -0
- package/dist/core/session/types.d.ts.map +1 -1
- package/dist/core/session/workflow.d.ts +49 -2
- package/dist/core/session/workflow.d.ts.map +1 -1
- package/dist/core/session/workflow.js.map +1 -1
- package/dist/core/subagents/coordinator.d.ts +210 -0
- package/dist/core/subagents/coordinator.d.ts.map +1 -0
- package/dist/core/subagents/coordinator.js +534 -0
- package/dist/core/subagents/coordinator.js.map +1 -0
- package/dist/core/subagents/parked.d.ts +55 -0
- package/dist/core/subagents/parked.d.ts.map +1 -0
- package/dist/core/subagents/parked.js +84 -0
- package/dist/core/subagents/parked.js.map +1 -0
- package/dist/core/subagents/tools.d.ts +29 -0
- package/dist/core/subagents/tools.d.ts.map +1 -0
- package/dist/core/subagents/tools.js +164 -0
- package/dist/core/subagents/tools.js.map +1 -0
- package/dist/core/subagents/types.d.ts +114 -0
- package/dist/core/subagents/types.d.ts.map +1 -0
- package/dist/core/subagents/types.js +44 -0
- package/dist/core/subagents/types.js.map +1 -0
- package/dist/core/task/completion.d.ts +3 -0
- package/dist/core/task/completion.d.ts.map +1 -1
- package/dist/core/task/completion.js +4 -0
- package/dist/core/task/completion.js.map +1 -1
- package/dist/core/task/types.d.ts +5 -0
- package/dist/core/task/types.d.ts.map +1 -1
- package/dist/core/task/types.js.map +1 -1
- package/dist/core/tools/adapter.d.ts.map +1 -1
- package/dist/core/tools/adapter.js +87 -61
- package/dist/core/tools/adapter.js.map +1 -1
- package/dist/core/tools/builtins.d.ts.map +1 -1
- package/dist/core/tools/builtins.js +7 -0
- package/dist/core/tools/builtins.js.map +1 -1
- package/dist/core/tools/context.d.ts +1 -0
- package/dist/core/tools/context.d.ts.map +1 -1
- package/dist/core/tools/def.d.ts +25 -0
- package/dist/core/tools/def.d.ts.map +1 -1
- package/dist/core/tools/def.js.map +1 -1
- package/dist/core/tools/git.d.ts.map +1 -1
- package/dist/core/tools/git.js +4 -0
- package/dist/core/tools/git.js.map +1 -1
- package/dist/core/tools/patch.d.ts.map +1 -1
- package/dist/core/tools/patch.js +1 -0
- package/dist/core/tools/patch.js.map +1 -1
- package/dist/core/tools/qa-check.d.ts +2 -2
- package/dist/core/tools/qa-check.d.ts.map +1 -1
- package/dist/core/tools/qa-check.js +1 -0
- package/dist/core/tools/qa-check.js.map +1 -1
- package/dist/core/tools/repomap.d.ts.map +1 -1
- package/dist/core/tools/repomap.js +1 -0
- package/dist/core/tools/repomap.js.map +1 -1
- package/dist/core/tools/task-block.d.ts.map +1 -1
- package/dist/core/tools/task-block.js +1 -0
- package/dist/core/tools/task-block.js.map +1 -1
- package/dist/core/tools/task-deliver.d.ts +1 -1
- package/dist/core/tools/task-deliver.d.ts.map +1 -1
- package/dist/core/tools/task-deliver.js +1 -0
- package/dist/core/tools/task-deliver.js.map +1 -1
- package/dist/core/tools/task.d.ts.map +1 -1
- package/dist/core/tools/task.js +3 -0
- package/dist/core/tools/task.js.map +1 -1
- package/dist/core/tools/terminal.d.ts.map +1 -1
- package/dist/core/tools/terminal.js +5 -0
- package/dist/core/tools/terminal.js.map +1 -1
- package/dist/core/tools/webfetch.d.ts.map +1 -1
- package/dist/core/tools/webfetch.js +1 -0
- package/dist/core/tools/webfetch.js.map +1 -1
- package/dist/core/tools/websearch.d.ts.map +1 -1
- package/dist/core/tools/websearch.js +1 -0
- package/dist/core/tools/websearch.js.map +1 -1
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/server/create-agent-runtime.d.ts +3 -1
- package/dist/server/create-agent-runtime.d.ts.map +1 -1
- package/dist/server/create-agent-runtime.js +8 -1
- package/dist/server/create-agent-runtime.js.map +1 -1
- package/dist/server/create-server.d.ts +6 -0
- package/dist/server/create-server.d.ts.map +1 -1
- package/dist/server/create-server.js +9 -0
- package/dist/server/create-server.js.map +1 -1
- package/package.json +12 -11
|
@@ -0,0 +1,534 @@
|
|
|
1
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
2
|
+
import { AgentRegistry } from "../agent/registry.js";
|
|
3
|
+
import { createFrameworkSession } from "../runtime/runner.js";
|
|
4
|
+
import { writePathGuardRules } from "../permission/write-path.js";
|
|
5
|
+
import { isSubagentTerminal, newSubagentRecord } from "./types.js";
|
|
6
|
+
export const DEFAULT_LIMITS = { perRoot: 3, global: 6 };
|
|
7
|
+
/** spawn payload 指纹:同 spawnRequestId 重试时校验 payload 一致性。
|
|
8
|
+
* SpawnInput(subagentType)与 ChildSessionFactory 输入(agentType)是同一
|
|
9
|
+
* 字段的两种形态,归一后取 hash——协调器与工厂两侧必须得到相同指纹。 */
|
|
10
|
+
function spawnPayloadHashOf(input) {
|
|
11
|
+
return createHash("sha256")
|
|
12
|
+
.update(JSON.stringify({ description: input.description, prompt: input.prompt, subagentType: input.subagentType ?? input.agentType, mode: input.mode ?? "read_only" }))
|
|
13
|
+
.digest("hex");
|
|
14
|
+
}
|
|
15
|
+
/** 确定性子会话 id:同 spawnRequestId 的创建中断重试落到同一 id(PC04 崩溃窗口)。 */
|
|
16
|
+
export function childSessionIdFor(spawnRequestId) {
|
|
17
|
+
return `ses_sub_${createHash("sha256").update(spawnRequestId).digest("hex").slice(0, 20)}`;
|
|
18
|
+
}
|
|
19
|
+
/** 框架默认 ChildSessionFactory:真实 registry + 父 Session 派生创建。
|
|
20
|
+
* - 权限上限:read_only 继承父权限(空集圈禁写路径);workspace_write 追加
|
|
21
|
+
* preset writePaths 圈禁(白名单 allow + 全局 deny 兜底)。
|
|
22
|
+
* - 模型/身份继承:preset model ?? 父会话模型;userId/workspaceId 继承父
|
|
23
|
+
* (凭据引用随父用户,不复制凭据内容)。
|
|
24
|
+
* - 幂等:子 id 与 creationRequestId 均从 spawnRequestId 派生——创建中断后
|
|
25
|
+
* 重试命中 store 的既有会话(同键同 hash no-op),不产生第二个 childSession。 */
|
|
26
|
+
export function createDefaultChildSessionFactory(deps) {
|
|
27
|
+
return async (input) => {
|
|
28
|
+
const registry = await deps.registryFor(input.parent);
|
|
29
|
+
const subagent = registry.get(input.agentType);
|
|
30
|
+
if (!subagent || (subagent.mode !== "subagent" && subagent.mode !== "all")) {
|
|
31
|
+
throw new Error(`未知或非子代理类型:${input.agentType}`);
|
|
32
|
+
}
|
|
33
|
+
const guard = input.mode === "read_only" ? [] : writePathGuardRules(subagent.writePaths ?? []);
|
|
34
|
+
return createFrameworkSession({
|
|
35
|
+
store: deps.store,
|
|
36
|
+
userId: input.parent.userId,
|
|
37
|
+
workspaceId: input.parent.workspaceId,
|
|
38
|
+
id: childSessionIdFor(input.spawnRequestId),
|
|
39
|
+
agent: input.agentType,
|
|
40
|
+
model: subagent.model ?? input.parent.model,
|
|
41
|
+
prompt: input.prompt,
|
|
42
|
+
parentId: input.parent.id,
|
|
43
|
+
title: input.description,
|
|
44
|
+
permission: [...input.parent.permission, ...guard],
|
|
45
|
+
...(input.mode !== "read_only" && subagent.writePaths?.length ? { writePaths: subagent.writePaths } : {}),
|
|
46
|
+
creationRequestId: input.spawnRequestId,
|
|
47
|
+
creationPayloadHash: spawnPayloadHashOf(input),
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/** 进程内 AdmissionController 参考实现(Host 直接复用或替换为持久实现)。 */
|
|
52
|
+
export function createSubagentAdmission(limits) {
|
|
53
|
+
let global = 0;
|
|
54
|
+
const perRoot = new Map();
|
|
55
|
+
const listeners = new Set();
|
|
56
|
+
return {
|
|
57
|
+
tryAcquire(rootKey) {
|
|
58
|
+
if (global >= limits.global)
|
|
59
|
+
return false;
|
|
60
|
+
if ((perRoot.get(rootKey) ?? 0) >= limits.perRoot)
|
|
61
|
+
return false;
|
|
62
|
+
global += 1;
|
|
63
|
+
perRoot.set(rootKey, (perRoot.get(rootKey) ?? 0) + 1);
|
|
64
|
+
return true;
|
|
65
|
+
},
|
|
66
|
+
release(rootKey) {
|
|
67
|
+
if ((perRoot.get(rootKey) ?? 0) <= 0)
|
|
68
|
+
return;
|
|
69
|
+
perRoot.set(rootKey, perRoot.get(rootKey) - 1);
|
|
70
|
+
global = Math.max(0, global - 1);
|
|
71
|
+
for (const listener of listeners)
|
|
72
|
+
listener();
|
|
73
|
+
},
|
|
74
|
+
onRelease(listener) {
|
|
75
|
+
listeners.add(listener);
|
|
76
|
+
},
|
|
77
|
+
counts() {
|
|
78
|
+
return { global, perRoot: Object.fromEntries(perRoot) };
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/** runChild 结构化 outcome → 协调记录状态投影(T03,PC02)。
|
|
83
|
+
* failed/cancelled/blocked/waiting_* 与 completed 一样进入记录——子失败不得
|
|
84
|
+
* 伪装完成;waiting_* 是非终态(出口互不替代,spec §8.2),终态才写 result。 */
|
|
85
|
+
function projectChildRunOutcome(outcome) {
|
|
86
|
+
const evidence = outcome.evidenceRefs?.length ? { evidenceRefs: outcome.evidenceRefs } : {};
|
|
87
|
+
switch (outcome.state) {
|
|
88
|
+
case "completed":
|
|
89
|
+
return { status: "completed", result: { outcome: "completed", summary: outcome.summary ?? "(无文本结果)", ...evidence } };
|
|
90
|
+
case "failed":
|
|
91
|
+
return {
|
|
92
|
+
status: "failed",
|
|
93
|
+
blockerReason: outcome.errorMessage ?? "子运行失败",
|
|
94
|
+
result: { outcome: "failed", summary: outcome.summary ?? (outcome.errorMessage ? `失败:${outcome.errorMessage}` : "子运行失败"), ...evidence },
|
|
95
|
+
};
|
|
96
|
+
case "cancelled":
|
|
97
|
+
return { status: "cancelled", result: { outcome: "cancelled", summary: outcome.summary ?? "(已取消)", ...evidence } };
|
|
98
|
+
case "blocked":
|
|
99
|
+
return { status: "blocked", blockerReason: outcome.errorMessage ?? (outcome.unknownSideEffect ? "副作用结果未知,需恢复核对" : "子运行阻塞") };
|
|
100
|
+
default:
|
|
101
|
+
// waiting_input / waiting_permission / waiting_external:非终态
|
|
102
|
+
return { status: outcome.state };
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
export class SubagentCoordinator {
|
|
106
|
+
deps;
|
|
107
|
+
limits;
|
|
108
|
+
queue = [];
|
|
109
|
+
/** 活跃子 run 的取消句柄(childId → abort)。 */
|
|
110
|
+
active = new Map();
|
|
111
|
+
/** wait 的轮询唤醒(子终态时 resolve)。 */
|
|
112
|
+
waiters = new Set();
|
|
113
|
+
/** createServer 绑定的运行期服务(会话级 registry + 深度)。 */
|
|
114
|
+
bound = null;
|
|
115
|
+
createChildSession;
|
|
116
|
+
constructor(deps) {
|
|
117
|
+
this.deps = deps;
|
|
118
|
+
this.limits = deps.limits ?? DEFAULT_LIMITS;
|
|
119
|
+
this.createChildSession = deps.createChildSession
|
|
120
|
+
?? createDefaultChildSessionFactory({ store: deps.store, registryFor: (session) => this.resolveRegistry(session) });
|
|
121
|
+
// 共享许可的释放要能唤醒本协调器的队列泵(另一项目的协调器释放槽位后,
|
|
122
|
+
// 本项目排队者才能启动,PC03)。
|
|
123
|
+
deps.admission?.onRelease(() => this.pump());
|
|
124
|
+
// T04(spec §4.2)启动对账:内存队列只是缓存,凭 store 恢复
|
|
125
|
+
// (见 recover——宿主须保证同一 store 每进程只建一个协调器)。
|
|
126
|
+
this.recover();
|
|
127
|
+
}
|
|
128
|
+
get store() {
|
|
129
|
+
if (!this.deps.store.subagents)
|
|
130
|
+
throw new Error("SUBAGENTS_UNSUPPORTED(store 未提供 subagents 面)");
|
|
131
|
+
return this.deps.store.subagents;
|
|
132
|
+
}
|
|
133
|
+
get subagentDepth() {
|
|
134
|
+
return this.bound?.subagentDepth ?? this.deps.subagentDepth ?? 1;
|
|
135
|
+
}
|
|
136
|
+
/** 会话级 registry 解析:绑定(createServer,含 workspace Agent)> 宿主注入 >
|
|
137
|
+
* 静态基线 > 空注册表。 */
|
|
138
|
+
async resolveRegistry(session) {
|
|
139
|
+
if (this.bound)
|
|
140
|
+
return this.bound.registryFor(session);
|
|
141
|
+
if (this.deps.registryFor)
|
|
142
|
+
return this.deps.registryFor(session);
|
|
143
|
+
if (this.deps.registry)
|
|
144
|
+
return this.deps.registry;
|
|
145
|
+
return new AgentRegistry();
|
|
146
|
+
}
|
|
147
|
+
/** createServer 装配时绑定 runner 同源的运行期服务。重复绑定拒绝——
|
|
148
|
+
* 多 runner 场景共享一个协调器时换源必须显式,不能悄悄生效。 */
|
|
149
|
+
bindRuntimeServices(services) {
|
|
150
|
+
if (this.bound)
|
|
151
|
+
throw new Error("SUBAGENT_SERVICES_ALREADY_BOUND:协调器运行期服务已绑定");
|
|
152
|
+
this.bound = { registryFor: services.registryFor, subagentDepth: services.subagentDepth };
|
|
153
|
+
}
|
|
154
|
+
/** 父身份解析(spec §4.1:禁止只有 id 的伪 Session 抵达创建工厂)。
|
|
155
|
+
* 工具层只带 { id }(ToolContext 没有 SessionInfo 全量);缺失身份时从
|
|
156
|
+
* store 解析完整父会话——userId 为 undefined 的伪 Session 会让 SQLite
|
|
157
|
+
* 参数绑定直接崩(实测 "Provided value cannot be bound to SQLite parameter")。 */
|
|
158
|
+
async resolveParent(parentRef) {
|
|
159
|
+
const ref = parentRef;
|
|
160
|
+
if (ref.userId != null && ref.workspaceId != null)
|
|
161
|
+
return parentRef;
|
|
162
|
+
const stored = await this.deps.store.getSession(parentRef.id);
|
|
163
|
+
if (!stored)
|
|
164
|
+
throw new Error(`父会话不存在或不可解析:${parentRef.id}`);
|
|
165
|
+
return stored;
|
|
166
|
+
}
|
|
167
|
+
/** 父链深度:服务端从 store 解析(不信任调用方声明,spec §4.1)。 */
|
|
168
|
+
async parentDepth(session) {
|
|
169
|
+
let depth = 0;
|
|
170
|
+
let current = session;
|
|
171
|
+
while (current?.parentId) {
|
|
172
|
+
depth += 1;
|
|
173
|
+
current = await this.deps.store.getSession(current.parentId);
|
|
174
|
+
}
|
|
175
|
+
return depth;
|
|
176
|
+
}
|
|
177
|
+
/** agent_spawn:父身份解析 → 幂等校验 → 深度/类型检查 → 唯一工厂创建 →
|
|
178
|
+
* 登记(幂等)→ 入队 → 立即返回 childId(不等待执行)。 */
|
|
179
|
+
async spawn(parentRef, parentTaskId, rootTaskId, input) {
|
|
180
|
+
const parent = await this.resolveParent(parentRef);
|
|
181
|
+
const spawnRequestId = input.spawnRequestId ?? `spawn:${randomUUID()}`;
|
|
182
|
+
const spawnPayloadHash = spawnPayloadHashOf(input);
|
|
183
|
+
const prior = await this.store.findSubagentBySpawnRequest(parent.id, spawnRequestId);
|
|
184
|
+
if (prior) {
|
|
185
|
+
if (prior.spawnPayloadHash && prior.spawnPayloadHash !== spawnPayloadHash) {
|
|
186
|
+
throw new Error(`SPAWN_PAYLOAD_MISMATCH:spawnRequestId=${spawnRequestId} 已用于不同 payload 的派生,拒绝重放`);
|
|
187
|
+
}
|
|
188
|
+
return prior; // A14:重试返回同一 child
|
|
189
|
+
}
|
|
190
|
+
const depth = await this.parentDepth(parent);
|
|
191
|
+
if (depth >= this.subagentDepth)
|
|
192
|
+
throw new Error(`子代理嵌套深度超过限制(${this.subagentDepth})`);
|
|
193
|
+
// 类型守卫(对所有工厂生效):agentType 必须是 registry 声明的子代理类型,
|
|
194
|
+
// 模型编造的类型在这里拒绝(spec §4.1 不能信任模型给任意 childId/类型)。
|
|
195
|
+
const registry = await this.resolveRegistry(parent);
|
|
196
|
+
const subagent = registry.get(input.subagentType);
|
|
197
|
+
if (!subagent || (subagent.mode !== "subagent" && subagent.mode !== "all")) {
|
|
198
|
+
throw new Error(`未知或非子代理类型:${input.subagentType}`);
|
|
199
|
+
}
|
|
200
|
+
const child = await this.createChildSession({
|
|
201
|
+
parent,
|
|
202
|
+
agentType: input.subagentType,
|
|
203
|
+
prompt: input.prompt,
|
|
204
|
+
description: input.description,
|
|
205
|
+
mode: input.mode ?? "read_only",
|
|
206
|
+
spawnRequestId,
|
|
207
|
+
});
|
|
208
|
+
const record = {
|
|
209
|
+
...newSubagentRecord({
|
|
210
|
+
childSessionId: child.id,
|
|
211
|
+
parentSessionId: parent.id,
|
|
212
|
+
rootTaskId,
|
|
213
|
+
parentTaskId,
|
|
214
|
+
spawnRequestId,
|
|
215
|
+
agentType: input.subagentType,
|
|
216
|
+
goal: input.description,
|
|
217
|
+
mode: input.mode ?? "read_only",
|
|
218
|
+
workspaceId: child.workspaceId,
|
|
219
|
+
traceId: randomUUID(),
|
|
220
|
+
}),
|
|
221
|
+
spawnPayloadHash,
|
|
222
|
+
// T04(spec §4.2 持久队列):执行输入落记录——宿主重启后凭此恢复
|
|
223
|
+
// queued 子代理,不依赖进程内存。
|
|
224
|
+
prompt: input.prompt,
|
|
225
|
+
};
|
|
226
|
+
const created = await this.createSubagentIdempotent(record);
|
|
227
|
+
this.queue.push({ childId: created.childId, rootTaskId, prompt: input.prompt });
|
|
228
|
+
this.pump();
|
|
229
|
+
return created;
|
|
230
|
+
}
|
|
231
|
+
/** 登记幂等:并发同键 spawn 撞唯一索引(parent_session_id, spawn_request_id)
|
|
232
|
+
* 时回落到既有记录,不重复入队。 */
|
|
233
|
+
async createSubagentIdempotent(record) {
|
|
234
|
+
try {
|
|
235
|
+
return await this.store.createSubagent(record);
|
|
236
|
+
}
|
|
237
|
+
catch (error) {
|
|
238
|
+
const prior = await this.store.findSubagentBySpawnRequest(record.parentSessionId, record.spawnRequestId).catch(() => null);
|
|
239
|
+
if (prior)
|
|
240
|
+
return prior;
|
|
241
|
+
throw error;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/** 启动对账(T04,spec §4.2):内存队列/活跃表只是缓存,进程重启后凭 store
|
|
245
|
+
* 重建——queued(从未开始)凭记录里的 prompt 重新入队执行;running/cancelling
|
|
246
|
+
* 是上个进程的在途执行、结果未知 → 落 blocked 进恢复审查(cancelling 补收
|
|
247
|
+
* cancelled),不自动重放副作用;waiting_* 无活跃 run、重启安全,保持原状
|
|
248
|
+
* (waiting_permission 的重启审计随 T06 恢复场景收口)。 */
|
|
249
|
+
recover() {
|
|
250
|
+
void (async () => {
|
|
251
|
+
const stale = await this.store.listSubagents({}).catch(() => []);
|
|
252
|
+
let requeued = 0;
|
|
253
|
+
for (const rec of stale) {
|
|
254
|
+
if (rec.status === "queued") {
|
|
255
|
+
this.queue.push({ childId: rec.childId, rootTaskId: rec.rootTaskId, prompt: rec.prompt ?? rec.goal });
|
|
256
|
+
requeued += 1;
|
|
257
|
+
}
|
|
258
|
+
else if (rec.status === "running" || rec.status === "cancelling") {
|
|
259
|
+
await this.store.updateSubagent(rec.childId, rec.revision, rec.status === "cancelling"
|
|
260
|
+
? { status: "cancelled", times: { ...rec.times, endedAt: new Date().toISOString() } }
|
|
261
|
+
: { status: "blocked", blockerReason: "宿主重启:子运行中断,结果未知,需恢复核对(不自动重放副作用)", times: { ...rec.times, endedAt: new Date().toISOString() } })
|
|
262
|
+
.catch(() => undefined);
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
if (requeued > 0)
|
|
266
|
+
this.pump();
|
|
267
|
+
})().catch(() => undefined);
|
|
268
|
+
}
|
|
269
|
+
/** agent_list:当前树内子代理 + 最近进度。 */
|
|
270
|
+
async list(rootTaskId) {
|
|
271
|
+
const all = await this.store.listSubagents({ rootTaskId });
|
|
272
|
+
return all.map((r) => ({ ...r }));
|
|
273
|
+
}
|
|
274
|
+
/** agent_send:幂等投递;按子代理状态真正进入子上下文(T04,PC07)——
|
|
275
|
+
* queued:launch 时随原始 prompt 注入(见 launch 的消息组装);
|
|
276
|
+
* 活跃 run:经 deliverToChild 投递(宿主接 runner.prompt——活动会话的
|
|
277
|
+
* FIFO queued prompt 即安全边界,requestId=messageId 幂等);
|
|
278
|
+
* waiting_input(无活跃 run):重新入队,runChild 携带新消息续跑;
|
|
279
|
+
* waiting_permission/waiting_external/blocked:只落邮箱——普通消息不得
|
|
280
|
+
* 替代审批或解除安全阻塞(spec §8.2 出口互不替代)。
|
|
281
|
+
* 终态拒绝(CHILD_TERMINAL);scope(T03):树外 childId 拒绝。 */
|
|
282
|
+
async send(childId, payload, kind = "constraint", messageId = randomUUID(), scope) {
|
|
283
|
+
const rec = await this.store.getSubagent(childId);
|
|
284
|
+
if (!rec)
|
|
285
|
+
return { delivered: false, reason: "CHILD_NOT_FOUND" };
|
|
286
|
+
if (scope && rec.rootTaskId !== scope.rootTaskId)
|
|
287
|
+
return { delivered: false, reason: "CHILD_OUT_OF_SCOPE" };
|
|
288
|
+
if (isSubagentTerminal(rec.status))
|
|
289
|
+
return { delivered: false, reason: "CHILD_TERMINAL" }; // 不复活旧子代理(spec §8.2)
|
|
290
|
+
await this.store.appendMessage({ messageId, childId, direction: "to_child", kind, payload, createdAt: new Date().toISOString() });
|
|
291
|
+
if (rec.status === "queued")
|
|
292
|
+
return { delivered: true };
|
|
293
|
+
if (this.active.has(childId)) {
|
|
294
|
+
await this.deps.deliverToChild?.(rec.childSessionId, payload, messageId);
|
|
295
|
+
return { delivered: true };
|
|
296
|
+
}
|
|
297
|
+
if (rec.status === "waiting_input" && !this.queue.some((q) => q.childId === childId)) {
|
|
298
|
+
this.queue.push({ childId, rootTaskId: rec.rootTaskId, prompt: rec.prompt ?? rec.goal });
|
|
299
|
+
this.pump();
|
|
300
|
+
}
|
|
301
|
+
return { delivered: true };
|
|
302
|
+
}
|
|
303
|
+
/** agent_wait:最多 timeoutMs;等首个终态或需处理状态;无变化返回仍在运行。
|
|
304
|
+
* 非 async 挂死——用活跃 run 的 done promise + 轮询兜底。
|
|
305
|
+
* scope(T03):树外 childId 直接拒绝,不把其它树的状态泄露给调用方。 */
|
|
306
|
+
async wait(childIds, timeoutMs = 30_000, scope) {
|
|
307
|
+
if (scope) {
|
|
308
|
+
const out = [];
|
|
309
|
+
for (const id of childIds) {
|
|
310
|
+
const rec = await this.store.getSubagent(id);
|
|
311
|
+
if (rec && rec.rootTaskId !== scope.rootTaskId)
|
|
312
|
+
out.push(id);
|
|
313
|
+
}
|
|
314
|
+
if (out.length > 0)
|
|
315
|
+
throw new Error(`SCOPE_VIOLATION:childId 不在当前任务树内:${out.join(", ")}`);
|
|
316
|
+
}
|
|
317
|
+
const deadline = Date.now() + timeoutMs;
|
|
318
|
+
const read = async () => {
|
|
319
|
+
const out = [];
|
|
320
|
+
for (const id of childIds) {
|
|
321
|
+
const r = await this.store.getSubagent(id);
|
|
322
|
+
if (r)
|
|
323
|
+
out.push(r);
|
|
324
|
+
}
|
|
325
|
+
return out;
|
|
326
|
+
};
|
|
327
|
+
const isSettled = (records) => records.some((r) => isSubagentTerminal(r.status) || r.status === "waiting_permission" || r.status === "waiting_input" || r.status === "waiting_external" || r.status === "blocked");
|
|
328
|
+
for (;;) {
|
|
329
|
+
const records = await read();
|
|
330
|
+
if (isSettled(records))
|
|
331
|
+
return { changed: records, anyTerminal: records.some((r) => isSubagentTerminal(r.status)) };
|
|
332
|
+
if (Date.now() >= deadline)
|
|
333
|
+
return { changed: records, anyTerminal: false };
|
|
334
|
+
{
|
|
335
|
+
let wake = () => { };
|
|
336
|
+
const notified = new Promise((resolve) => { wake = resolve; this.waiters.add(wake); });
|
|
337
|
+
const poll = new Promise((resolve) => setTimeout(resolve, 500)); // 轮询兜底
|
|
338
|
+
await Promise.race([notified, poll]).finally(() => this.waiters.delete(wake));
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
/** agent_cancel:幂等标记 cancelling → 停止 admission → 取消 run 与后代 →
|
|
343
|
+
* 终态确认由状态回调落 cancelled。返回已登记。
|
|
344
|
+
* scope(T03):树外 childId 拒绝——一个会话不能取消另一个根的后代。 */
|
|
345
|
+
async cancel(childId, scope) {
|
|
346
|
+
for (;;) {
|
|
347
|
+
const rec = await this.store.getSubagent(childId);
|
|
348
|
+
if (!rec)
|
|
349
|
+
return { cancelling: false, reason: "CHILD_NOT_FOUND" };
|
|
350
|
+
if (scope && rec.rootTaskId !== scope.rootTaskId)
|
|
351
|
+
return { cancelling: false, reason: "CHILD_OUT_OF_SCOPE" };
|
|
352
|
+
if (isSubagentTerminal(rec.status))
|
|
353
|
+
return { cancelling: false, reason: `CHILD_TERMINAL:${rec.status}` };
|
|
354
|
+
if (rec.status === "cancelling")
|
|
355
|
+
return { cancelling: true };
|
|
356
|
+
try {
|
|
357
|
+
await this.store.updateSubagent(childId, rec.revision, { status: "cancelling" });
|
|
358
|
+
break;
|
|
359
|
+
}
|
|
360
|
+
catch (error) {
|
|
361
|
+
if (/SUBAGENT_REVISION_CONFLICT/.test(String(error)))
|
|
362
|
+
continue; // CAS 重试
|
|
363
|
+
throw error;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
// 出队未启动的
|
|
367
|
+
const qi = this.queue.findIndex((q) => q.childId === childId);
|
|
368
|
+
if (qi >= 0) {
|
|
369
|
+
this.queue.splice(qi, 1);
|
|
370
|
+
const rec = await this.store.getSubagent(childId);
|
|
371
|
+
if (rec)
|
|
372
|
+
await this.store.updateSubagent(childId, rec.revision, { status: "cancelled" }).catch(() => undefined);
|
|
373
|
+
this.notifyWaiters();
|
|
374
|
+
return { cancelling: true };
|
|
375
|
+
}
|
|
376
|
+
// 活跃的:abort 子 run(终态回调会落 cancelled)
|
|
377
|
+
const entry = this.active.get(childId);
|
|
378
|
+
if (entry) {
|
|
379
|
+
await this.deps.abortChild(childId);
|
|
380
|
+
await entry.done.catch(() => undefined);
|
|
381
|
+
return { cancelling: true };
|
|
382
|
+
}
|
|
383
|
+
// waiting_*(无活跃 run):直接落终态
|
|
384
|
+
const rec = await this.store.getSubagent(childId);
|
|
385
|
+
if (rec && !isSubagentTerminal(rec.status)) {
|
|
386
|
+
await this.store.updateSubagent(childId, rec.revision, { status: "cancelled" }).catch(() => undefined);
|
|
387
|
+
}
|
|
388
|
+
this.notifyWaiters();
|
|
389
|
+
return { cancelling: true };
|
|
390
|
+
}
|
|
391
|
+
/** 根 Task 取消(§8.4 父取消→全部后代):递归取消树。 */
|
|
392
|
+
async cancelTree(rootTaskId) {
|
|
393
|
+
const children = await this.store.listSubagents({ rootTaskId });
|
|
394
|
+
for (const child of children) {
|
|
395
|
+
if (!isSubagentTerminal(child.status) && child.status !== "cancelling") {
|
|
396
|
+
await this.cancel(child.childId).catch(() => undefined);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
// ---- 调度 ----
|
|
401
|
+
/** 队列泵:按根轮转取额度可用的 child 启动。
|
|
402
|
+
* T03:admission(跨协调器共享)原子授予运行槽——本 store 的运行计数只是
|
|
403
|
+
* 本协调器内的廉价预过滤,全局/根上限以 admission 为准;授予失败即退出
|
|
404
|
+
* 本次泵程,等释放通知(onRelease → pump)重试。 */
|
|
405
|
+
pump() {
|
|
406
|
+
void (async () => {
|
|
407
|
+
for (;;) {
|
|
408
|
+
const running = await this.store.listSubagents({ statuses: ["running", "waiting_permission", "waiting_input", "waiting_external"] });
|
|
409
|
+
if (running.length >= this.limits.global)
|
|
410
|
+
return;
|
|
411
|
+
const next = this.pickNext(running);
|
|
412
|
+
if (!next)
|
|
413
|
+
return;
|
|
414
|
+
const admission = this.deps.admission;
|
|
415
|
+
if (admission && !admission.tryAcquire(next.rootTaskId))
|
|
416
|
+
return;
|
|
417
|
+
this.queue.splice(this.queue.indexOf(next), 1);
|
|
418
|
+
void this.launch(next); // launch 持有许可,finally 按执行状态释放
|
|
419
|
+
}
|
|
420
|
+
})().catch(() => undefined);
|
|
421
|
+
}
|
|
422
|
+
/** 根间轮转 + 根内 FIFO:优先选「当前运行数最少」的根的队头。 */
|
|
423
|
+
pickNext(running) {
|
|
424
|
+
const perRoot = new Map();
|
|
425
|
+
for (const r of running)
|
|
426
|
+
perRoot.set(r.rootTaskId, (perRoot.get(r.rootTaskId) ?? 0) + 1);
|
|
427
|
+
let candidates = this.queue.filter((q) => (perRoot.get(q.rootTaskId) ?? 0) < this.limits.perRoot);
|
|
428
|
+
if (candidates.length === 0)
|
|
429
|
+
return undefined;
|
|
430
|
+
// 根间轮转:按根分组取各组队头,再选运行数最少的根
|
|
431
|
+
const heads = new Map();
|
|
432
|
+
for (const q of candidates)
|
|
433
|
+
if (!heads.has(q.rootTaskId))
|
|
434
|
+
heads.set(q.rootTaskId, q);
|
|
435
|
+
const ordered = [...heads.values()].sort((a, b) => (perRoot.get(a.rootTaskId) ?? 0) - (perRoot.get(b.rootTaskId) ?? 0));
|
|
436
|
+
return ordered[0];
|
|
437
|
+
}
|
|
438
|
+
async launch(item) {
|
|
439
|
+
const admission = this.deps.admission;
|
|
440
|
+
let settle = null;
|
|
441
|
+
let done = null;
|
|
442
|
+
try {
|
|
443
|
+
let rec = await this.store.getSubagent(item.childId);
|
|
444
|
+
if (!rec || isSubagentTerminal(rec.status) || rec.status === "cancelling")
|
|
445
|
+
return;
|
|
446
|
+
rec = await this.store.updateSubagent(item.childId, rec.revision, { status: "running", times: { ...rec.times, startedAt: new Date().toISOString() } });
|
|
447
|
+
let resolveDone;
|
|
448
|
+
done = new Promise((resolve) => { resolveDone = resolve; });
|
|
449
|
+
settle = resolveDone;
|
|
450
|
+
this.active.set(item.childId, { abort: () => undefined, done });
|
|
451
|
+
// T04(PC07):子上下文组装——原始 prompt + 全部 to_child 消息(agent_send
|
|
452
|
+
// 落邮箱的补充约束/用户输入)。重跑(waiting_input 续跑/恢复)时重复注入
|
|
453
|
+
// 旧约束幂等无害;新消息按时间序追加。
|
|
454
|
+
const supplements = (await this.store.listMessages(item.childId).catch(() => []))
|
|
455
|
+
.filter((m) => m.direction === "to_child");
|
|
456
|
+
const prompt = supplements.length > 0
|
|
457
|
+
? `${item.prompt}\n\n[父代理追加输入(按时间序,最新在后)]\n${supplements.map((m) => `- (${m.kind}) ${m.payload}`).join("\n")}`
|
|
458
|
+
: item.prompt;
|
|
459
|
+
// T03(PC02):runChild 返回结构化 outcome——失败/取消/阻塞与完成一样是
|
|
460
|
+
// 显式声明,禁止按 Promise 正常返回推断成功(F02 修复的框架侧契约)。
|
|
461
|
+
const outcome = await this.deps.runChild(item.childId, prompt);
|
|
462
|
+
const latest = await this.store.getSubagent(item.childId);
|
|
463
|
+
if (!latest)
|
|
464
|
+
return;
|
|
465
|
+
if (latest.status === "cancelling") {
|
|
466
|
+
await this.settleTerminal(latest, { status: "cancelled" });
|
|
467
|
+
}
|
|
468
|
+
else {
|
|
469
|
+
const settled = projectChildRunOutcome(outcome);
|
|
470
|
+
if (isSubagentTerminal(settled.status)) {
|
|
471
|
+
// T04(spec §4.2):子终态 + to_parent 结果邮件同事务,成功后触发
|
|
472
|
+
// 父唤醒意图钩子(宿主接 requestInternalResume——PC05 的接线点)。
|
|
473
|
+
await this.settleTerminal(latest, {
|
|
474
|
+
status: settled.status,
|
|
475
|
+
...(settled.result ? { result: settled.result } : {}),
|
|
476
|
+
...(settled.blockerReason ? { blockerReason: settled.blockerReason } : {}),
|
|
477
|
+
});
|
|
478
|
+
}
|
|
479
|
+
else {
|
|
480
|
+
// waiting_*:非终态,无结果邮件(出口互不替代,spec §8.2)
|
|
481
|
+
await this.store.updateSubagent(item.childId, latest.revision, {
|
|
482
|
+
status: settled.status,
|
|
483
|
+
...(settled.blockerReason ? { blockerReason: settled.blockerReason } : {}),
|
|
484
|
+
});
|
|
485
|
+
}
|
|
486
|
+
}
|
|
487
|
+
}
|
|
488
|
+
catch (error) {
|
|
489
|
+
const latest = await this.store.getSubagent(item.childId);
|
|
490
|
+
if (latest && !isSubagentTerminal(latest.status)) {
|
|
491
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
492
|
+
await this.settleTerminal(latest, { status: "failed", blockerReason: message, result: { outcome: "failed", summary: `失败:${message}` } }).catch(() => undefined);
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
finally {
|
|
496
|
+
// 许可按执行状态释放:runChild 真正结束(成功/失败/取消/异常)后,而非
|
|
497
|
+
// Promise 语义猜测;waiting_* 不占模型并发槽的细化在 T04 调度层处理。
|
|
498
|
+
admission?.release(item.rootTaskId);
|
|
499
|
+
this.active.delete(item.childId);
|
|
500
|
+
settle?.();
|
|
501
|
+
this.notifyWaiters();
|
|
502
|
+
this.pump(); // 腾出的额度给下一个排队者
|
|
503
|
+
}
|
|
504
|
+
}
|
|
505
|
+
notifyWaiters() {
|
|
506
|
+
for (const w of this.waiters)
|
|
507
|
+
w();
|
|
508
|
+
this.waiters.clear();
|
|
509
|
+
}
|
|
510
|
+
/** 终态结算(T04,spec §4.2):状态 + to_parent 结果邮件**同事务**落库
|
|
511
|
+
* (settleSubagent),成功后触发唤醒钩子。messageId 由 childId + 结算后
|
|
512
|
+
* revision 派生——同 child 重放结算天然幂等(INSERT OR IGNORE)。 */
|
|
513
|
+
async settleTerminal(latest, patch) {
|
|
514
|
+
const settled = await this.store.settleSubagent(latest.childId, latest.revision, {
|
|
515
|
+
...patch,
|
|
516
|
+
times: { ...latest.times, endedAt: new Date().toISOString() },
|
|
517
|
+
}, {
|
|
518
|
+
messageId: `result_${latest.childId}_${latest.revision + 1}`,
|
|
519
|
+
childId: latest.childId,
|
|
520
|
+
direction: "to_parent",
|
|
521
|
+
kind: "result",
|
|
522
|
+
payload: JSON.stringify({ outcome: patch.result?.outcome ?? patch.status, summary: patch.result?.summary ?? "", childId: latest.childId }),
|
|
523
|
+
createdAt: new Date().toISOString(),
|
|
524
|
+
});
|
|
525
|
+
try {
|
|
526
|
+
this.deps.onChildTerminal?.(settled, settled.parentSessionId);
|
|
527
|
+
}
|
|
528
|
+
catch {
|
|
529
|
+
// 唤醒钩子失败不影响终态结算(邮箱里已有结果,父侧可经其它路径续跑)
|
|
530
|
+
}
|
|
531
|
+
this.notifyWaiters();
|
|
532
|
+
}
|
|
533
|
+
}
|
|
534
|
+
//# sourceMappingURL=coordinator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"coordinator.js","sourceRoot":"","sources":["../../../src/core/subagents/coordinator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { SubagentStore, SubagentRecord } from "./types.js";
|
|
2
|
+
/** parked/mailbox/父唤醒(spec §8.2 调度状态,M3-S19)。
|
|
3
|
+
*
|
|
4
|
+
* 【为什么是独立模块而不是塞进 TaskLifecycle】parked 是**调度语义**(释放
|
|
5
|
+
* 父模型并发槽、由 RunScheduler 认领续跑),TaskLifecycle 只需在 Attempt
|
|
6
|
+
* 循环的 continue 分支问一句「该不该 park」;唤醒合并的幂等水位在
|
|
7
|
+
* mailbox 表上——本模块把两侧粘起来,TaskLifecycle/RunScheduler 经
|
|
8
|
+
* collaborators 注入,不反向依赖。
|
|
9
|
+
*
|
|
10
|
+
* 【核心不变量】子结果入邮箱与父唤醒意图**同事务**(spec §8.2);
|
|
11
|
+
* 多个子同时完成最多产生一个待执行父唤醒(水位幂等合并)。 */
|
|
12
|
+
export type ParkControllerDeps = {
|
|
13
|
+
subagents: SubagentStore;
|
|
14
|
+
/** TaskStore CAS 面(TaskRecord patch)。 */
|
|
15
|
+
casTask(taskId: string, expectedRevision: number, patch: Record<string, unknown>): Promise<unknown>;
|
|
16
|
+
getTask(taskId: string): Promise<{
|
|
17
|
+
id: string;
|
|
18
|
+
revision: number;
|
|
19
|
+
status: string;
|
|
20
|
+
rootRequestId?: string;
|
|
21
|
+
sessionId?: string;
|
|
22
|
+
} | null>;
|
|
23
|
+
/** 唤醒登记(RunScheduler.requestResume 或等价内部续跑入口)。 */
|
|
24
|
+
requestInternalResume(sessionId: string): void;
|
|
25
|
+
/** 根 Task 的 sessionId 查询(子 → 父会话映射;B0 子代理同 session 树)。 */
|
|
26
|
+
sessionOfTask?(taskId: string): Promise<string | undefined>;
|
|
27
|
+
};
|
|
28
|
+
/** 判定:父轮次结束时是否应 park(必要子代理尚未全部终态)。
|
|
29
|
+
* TaskLifecycle 的 continue 分支在再次 Attempt 前调用;park=true 时
|
|
30
|
+
* TaskLifecycle 不再发起下一轮 Attempt,而是落 parked 并释放并发槽。 */
|
|
31
|
+
export declare function shouldPark(deps: ParkControllerDeps, rootTaskId: string, requiredChildIds?: string[]): Promise<boolean>;
|
|
32
|
+
/** 落 parked:TaskRecord 保持 running(调度状态不是第二套生命周期),
|
|
33
|
+
* 经 marker 字段标记;发布由 caller(TaskLifecycle)负责。 */
|
|
34
|
+
export declare function parkParent(deps: ParkControllerDeps, taskId: string): Promise<void>;
|
|
35
|
+
/** 子终态回调:结果入邮箱(to_parent)+ 唤醒意图——合并语义靠
|
|
36
|
+
* requestInternalResume 的幂等(RunScheduler.resumeRequests 是 Set,
|
|
37
|
+
* 重复 add 天然合并为一个)。 */
|
|
38
|
+
export declare function onChildTerminal(deps: ParkControllerDeps, child: SubagentRecord, parentSessionId: string): Promise<void>;
|
|
39
|
+
/** 父唤醒时的未消费结果读取(T04 两段式,PC06):**投递水位在实际 Attempt
|
|
40
|
+
* 上下文持久登记后才能推进**(spec §4.2)——读取阶段不动水位;消费方把
|
|
41
|
+
* results 注入父上下文并持久化后调用 commit() 推进水位。读取与 commit 之间
|
|
42
|
+
* 崩溃只会导致重读(幂等),不会丢结果;重复 commit 也是幂等 no-op。 */
|
|
43
|
+
export declare function drainParentMailbox(deps: ParkControllerDeps, rootTaskId: string): Promise<{
|
|
44
|
+
results: {
|
|
45
|
+
childId: string;
|
|
46
|
+
outcome: string;
|
|
47
|
+
summary: string;
|
|
48
|
+
}[];
|
|
49
|
+
/** 水位推进:results 已持久进父上下文后调用。 */
|
|
50
|
+
commit: () => Promise<void>;
|
|
51
|
+
clearedPark: boolean;
|
|
52
|
+
}>;
|
|
53
|
+
/** 终态根 Task 拒绝自动唤醒(A29:取消/失败/已交付的父不复活)。 */
|
|
54
|
+
export declare function canAutoResume(taskStatus: string): boolean;
|
|
55
|
+
//# sourceMappingURL=parked.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parked.d.ts","sourceRoot":"","sources":["../../../src/core/subagents/parked.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAGhE;;;;;;;;;mCASmC;AACnC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAE,aAAa,CAAC;IACzB,yCAAyC;IACzC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpG,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;IACtI,kDAAkD;IAClD,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/C,0DAA0D;IAC1D,aAAa,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;CAC7D,CAAC;AAEF;;uDAEuD;AACvD,wBAAsB,UAAU,CAAC,IAAI,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,EAAE,gBAAgB,CAAC,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC,CAM5H;AAED;iDACiD;AACjD,wBAAsB,UAAU,CAAC,IAAI,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAWxF;AAED;;uBAEuB;AACvB,wBAAsB,eAAe,CAAC,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAa7H;AAED;;;+CAG+C;AAC/C,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9F,OAAO,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACjE,gCAAgC;IAChC,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5B,WAAW,EAAE,OAAO,CAAC;CACtB,CAAC,CA0BD;AAED,2CAA2C;AAC3C,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAEzD"}
|