@qlingzzy/qling 1.0.0 → 1.1.1
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/CHANGELOG.md +158 -0
- package/README.en.md +83 -18
- package/README.md +19 -9
- package/dist/agent/main-loop.d.ts +120 -0
- package/dist/agent/main-loop.d.ts.map +1 -0
- package/dist/agent/main-loop.js +279 -0
- package/dist/agent/subtask-parallel.d.ts +29 -0
- package/dist/agent/subtask-parallel.d.ts.map +1 -0
- package/dist/agent/subtask-parallel.js +107 -0
- package/dist/agent/subtask.d.ts +13 -0
- package/dist/agent/subtask.d.ts.map +1 -1
- package/dist/agent/subtask.js +79 -24
- package/dist/agent/system-prompt.d.ts +39 -0
- package/dist/agent/system-prompt.d.ts.map +1 -0
- package/dist/agent/system-prompt.js +89 -0
- package/dist/agent/tool-orchestrator.d.ts +66 -0
- package/dist/agent/tool-orchestrator.d.ts.map +1 -0
- package/dist/agent/tool-orchestrator.js +355 -0
- package/dist/agent-loop.d.ts +29 -16
- package/dist/agent-loop.d.ts.map +1 -1
- package/dist/agent-loop.js +262 -807
- package/dist/agents/roles.d.ts +57 -0
- package/dist/agents/roles.d.ts.map +1 -0
- package/dist/agents/roles.js +198 -0
- package/dist/commands/agents.d.ts.map +1 -1
- package/dist/commands/agents.js +17 -3
- package/dist/commands/claude-style.d.ts.map +1 -1
- package/dist/commands/claude-style.js +19 -10
- package/dist/commands/help.d.ts.map +1 -1
- package/dist/commands/help.js +3 -2
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +6 -0
- package/dist/commands/mode.d.ts +16 -0
- package/dist/commands/mode.d.ts.map +1 -0
- package/dist/commands/mode.js +67 -0
- package/dist/commands/recover.d.ts +3 -0
- package/dist/commands/recover.d.ts.map +1 -0
- package/dist/commands/recover.js +69 -0
- package/dist/commands/runtime.d.ts +2 -0
- package/dist/commands/runtime.d.ts.map +1 -1
- package/dist/commands/runtime.js +2 -0
- package/dist/commands/trace.d.ts +3 -0
- package/dist/commands/trace.d.ts.map +1 -0
- package/dist/commands/trace.js +45 -0
- package/dist/commands/verify.js +2 -2
- package/dist/config-report.d.ts +0 -1
- package/dist/config-report.d.ts.map +1 -1
- package/dist/config-report.js +1 -2
- package/dist/config.d.ts +0 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +0 -1
- package/dist/context-report.d.ts +13 -7
- package/dist/context-report.d.ts.map +1 -1
- package/dist/context-report.js +64 -61
- package/dist/context-tool-hygiene.d.ts +36 -0
- package/dist/context-tool-hygiene.d.ts.map +1 -0
- package/dist/context-tool-hygiene.js +125 -0
- package/dist/dashboard/client.d.ts +2 -0
- package/dist/dashboard/client.d.ts.map +1 -0
- package/dist/dashboard/client.js +305 -0
- package/dist/dashboard/model.d.ts +13 -0
- package/dist/dashboard/model.d.ts.map +1 -0
- package/dist/dashboard/model.js +112 -0
- package/dist/dashboard/page.d.ts +3 -0
- package/dist/dashboard/page.d.ts.map +1 -0
- package/dist/dashboard/page.js +204 -0
- package/dist/dashboard/types.d.ts +63 -0
- package/dist/dashboard/types.d.ts.map +1 -0
- package/dist/dashboard/types.js +1 -0
- package/dist/dashboard-server.d.ts +24 -4
- package/dist/dashboard-server.d.ts.map +1 -1
- package/dist/dashboard-server.js +397 -302
- package/dist/discovery-registry.d.ts +17 -3
- package/dist/discovery-registry.d.ts.map +1 -1
- package/dist/discovery-registry.js +78 -3
- package/dist/doctor.d.ts +8 -0
- package/dist/doctor.d.ts.map +1 -1
- package/dist/doctor.js +116 -0
- package/dist/eval/llm-tasks.d.ts +5 -0
- package/dist/eval/llm-tasks.d.ts.map +1 -0
- package/dist/eval/llm-tasks.js +125 -0
- package/dist/eval/repo-tasks.d.ts +12 -0
- package/dist/eval/repo-tasks.d.ts.map +1 -0
- package/dist/eval/repo-tasks.js +220 -0
- package/dist/eval/runner.d.ts +3 -1
- package/dist/eval/runner.d.ts.map +1 -1
- package/dist/eval/runner.js +23 -4
- package/dist/eval/tasks.d.ts.map +1 -1
- package/dist/eval/tasks.js +186 -0
- package/dist/eval/types.d.ts +8 -5
- package/dist/eval/types.d.ts.map +1 -1
- package/dist/execution/event-bus.d.ts +44 -0
- package/dist/execution/event-bus.d.ts.map +1 -0
- package/dist/execution/event-bus.js +76 -0
- package/dist/execution/failure-classifier.d.ts +11 -0
- package/dist/execution/failure-classifier.d.ts.map +1 -0
- package/dist/execution/failure-classifier.js +66 -0
- package/dist/execution/progress-detector.d.ts +3 -0
- package/dist/execution/progress-detector.d.ts.map +1 -0
- package/dist/execution/progress-detector.js +23 -0
- package/dist/execution/recovery-controller.d.ts +24 -0
- package/dist/execution/recovery-controller.d.ts.map +1 -0
- package/dist/execution/recovery-controller.js +114 -0
- package/dist/execution/recovery-messages.d.ts +24 -0
- package/dist/execution/recovery-messages.d.ts.map +1 -0
- package/dist/execution/recovery-messages.js +48 -0
- package/dist/execution/recovery-metrics.d.ts +16 -0
- package/dist/execution/recovery-metrics.d.ts.map +1 -0
- package/dist/execution/recovery-metrics.js +73 -0
- package/dist/execution/recovery-strategy-planner.d.ts +6 -0
- package/dist/execution/recovery-strategy-planner.d.ts.map +1 -0
- package/dist/execution/recovery-strategy-planner.js +24 -0
- package/dist/execution/run-trace-store.d.ts +29 -0
- package/dist/execution/run-trace-store.d.ts.map +1 -0
- package/dist/execution/run-trace-store.js +140 -0
- package/dist/execution/staged-verifier.d.ts +33 -0
- package/dist/execution/staged-verifier.d.ts.map +1 -0
- package/dist/execution/staged-verifier.js +39 -0
- package/dist/execution/types.d.ts +58 -0
- package/dist/execution/types.d.ts.map +1 -0
- package/dist/execution/types.js +1 -0
- package/dist/execution/verification-loop.d.ts +58 -0
- package/dist/execution/verification-loop.d.ts.map +1 -0
- package/dist/execution/verification-loop.js +195 -0
- package/dist/execution/verification-stages.d.ts +17 -0
- package/dist/execution/verification-stages.d.ts.map +1 -0
- package/dist/execution/verification-stages.js +102 -0
- package/dist/help-topics.d.ts.map +1 -1
- package/dist/help-topics.js +11 -0
- package/dist/index.js +0 -8
- package/dist/lsp/ts-service.d.ts +36 -0
- package/dist/lsp/ts-service.d.ts.map +1 -0
- package/dist/lsp/ts-service.js +291 -0
- package/dist/memory/lifecycle.d.ts +19 -0
- package/dist/memory/lifecycle.d.ts.map +1 -0
- package/dist/memory/lifecycle.js +53 -0
- package/dist/memory.d.ts +0 -16
- package/dist/memory.d.ts.map +1 -1
- package/dist/memory.js +0 -36
- package/dist/metrics/collector.d.ts +7 -0
- package/dist/metrics/collector.d.ts.map +1 -1
- package/dist/metrics/collector.js +60 -0
- package/dist/mission/manager.d.ts +1 -0
- package/dist/mission/manager.d.ts.map +1 -1
- package/dist/mission/manager.js +9 -0
- package/dist/mission/progress-notify.d.ts +39 -0
- package/dist/mission/progress-notify.d.ts.map +1 -0
- package/dist/mission/progress-notify.js +386 -0
- package/dist/pipeline/hooks.d.ts +1 -1
- package/dist/pipeline/hooks.d.ts.map +1 -1
- package/dist/pipeline/hooks.js +1 -0
- package/dist/pipeline/sections.d.ts +8 -4
- package/dist/pipeline/sections.d.ts.map +1 -1
- package/dist/pipeline/sections.js +70 -27
- package/dist/pipeline/verification.d.ts +1 -0
- package/dist/pipeline/verification.d.ts.map +1 -1
- package/dist/pipeline/verification.js +10 -7
- package/dist/providers/llm-client.d.ts +38 -0
- package/dist/providers/llm-client.d.ts.map +1 -0
- package/dist/providers/llm-client.js +105 -0
- package/dist/sdk.d.ts +1 -0
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js +1 -0
- package/dist/session/durable-session-supervisor.d.ts.map +1 -1
- package/dist/session/durable-session-supervisor.js +13 -6
- package/dist/session/session-persistence.d.ts +29 -0
- package/dist/session/session-persistence.d.ts.map +1 -0
- package/dist/session/session-persistence.js +45 -0
- package/dist/session/session-scheduler.d.ts +8 -1
- package/dist/session/session-scheduler.d.ts.map +1 -1
- package/dist/session/session-scheduler.js +33 -4
- package/dist/session-task-report.d.ts +1 -0
- package/dist/session-task-report.d.ts.map +1 -1
- package/dist/session-task-report.js +2 -1
- package/dist/shortcuts.d.ts.map +1 -1
- package/dist/shortcuts.js +1 -0
- package/dist/skills/registry.d.ts.map +1 -1
- package/dist/skills/registry.js +10 -0
- package/dist/skills/security-scan.d.ts +15 -0
- package/dist/skills/security-scan.d.ts.map +1 -0
- package/dist/skills/security-scan.js +95 -0
- package/dist/skills/types.d.ts +2 -0
- package/dist/skills/types.d.ts.map +1 -1
- package/dist/statusline.d.ts +3 -3
- package/dist/statusline.d.ts.map +1 -1
- package/dist/statusline.js +9 -17
- package/dist/token-usage.d.ts +27 -0
- package/dist/token-usage.d.ts.map +1 -0
- package/dist/token-usage.js +107 -0
- package/dist/tools/bash.d.ts.map +1 -1
- package/dist/tools/bash.js +5 -3
- package/dist/tools/browser-act-session.d.ts +48 -0
- package/dist/tools/browser-act-session.d.ts.map +1 -0
- package/dist/tools/browser-act-session.js +168 -0
- package/dist/tools/browser-act.d.ts +14 -0
- package/dist/tools/browser-act.d.ts.map +1 -0
- package/dist/tools/browser-act.js +297 -0
- package/dist/tools/code-symbols.d.ts +35 -0
- package/dist/tools/code-symbols.d.ts.map +1 -0
- package/dist/tools/code-symbols.js +257 -0
- package/dist/tools/index.d.ts +4 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +22 -2
- package/dist/tools/lsp.d.ts +13 -0
- package/dist/tools/lsp.d.ts.map +1 -0
- package/dist/tools/lsp.js +136 -0
- package/dist/tools/patch.d.ts +5 -0
- package/dist/tools/patch.d.ts.map +1 -1
- package/dist/tools/patch.js +25 -4
- package/dist/tools/search.d.ts +7 -0
- package/dist/tools/search.d.ts.map +1 -1
- package/dist/tools/search.js +20 -3
- package/dist/tools/skill.d.ts +2 -0
- package/dist/tools/skill.d.ts.map +1 -1
- package/dist/tools/skill.js +47 -14
- package/dist/tools/subtask.d.ts +3 -1
- package/dist/tools/subtask.d.ts.map +1 -1
- package/dist/tools/subtask.js +151 -56
- package/dist/tui/shell.d.ts +12 -0
- package/dist/tui/shell.d.ts.map +1 -1
- package/dist/tui/shell.js +36 -3
- package/dist/tui/streaming-repl.d.ts +1 -0
- package/dist/tui/streaming-repl.d.ts.map +1 -1
- package/dist/tui/streaming-repl.js +27 -4
- package/dist/tui/streaming-tui.d.ts +10 -0
- package/dist/tui/streaming-tui.d.ts.map +1 -1
- package/dist/tui/streaming-tui.js +70 -12
- package/dist/types.d.ts +0 -8
- package/dist/types.d.ts.map +1 -1
- package/dist/workflow-runtime.d.ts.map +1 -1
- package/dist/workflow-runtime.js +10 -2
- package/dist/workflow-types.d.ts +2 -0
- package/dist/workflow-types.d.ts.map +1 -1
- package/docs/install.md +46 -12
- package/docs/skills.md +56 -7
- package/docs/web-routing.md +83 -0
- package/package.json +18 -4
- package/scripts/dep-layers.mjs +275 -0
- package/scripts/eval-llm.mjs +27 -0
- package/scripts/eval-recovery.mjs +101 -0
- package/scripts/eval-tasks.mjs +20 -0
- package/scripts/validate-packaging.mjs +57 -0
- package/skills/examples/README.md +23 -0
- package/skills/examples/add-function/SKILL.md +31 -0
- package/skills/examples/fix-failing-test/SKILL.md +32 -0
- package/skills/examples/pr-summary/SKILL.md +34 -0
- package/skills/lifecycle-build/SKILL.md +22 -0
- package/skills/lifecycle-plan/SKILL.md +32 -0
- package/skills/lifecycle-review/SKILL.md +25 -0
- package/skills/lifecycle-ship/SKILL.md +22 -0
- package/skills/lifecycle-spec/SKILL.md +24 -0
- package/skills/lifecycle-test/SKILL.md +21 -0
- package/skills/opencli/SKILL.md +222 -0
- package/skills/qling.md +14 -3
package/dist/tools/subtask.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// ============================================================
|
|
2
|
-
// 轻灵 - Subtask
|
|
2
|
+
// 轻灵 - Subtask 工具定义(Phase 3.2 角色化 + 并行 explore)
|
|
3
3
|
// ============================================================
|
|
4
4
|
import { SubtaskRunner } from "../agent/subtask.js";
|
|
5
5
|
import { toolError, toolSuccess } from "./error-utils.js";
|
|
@@ -11,44 +11,120 @@ import { skillTool } from "./skill.js";
|
|
|
11
11
|
import { searchTool } from "./search.js";
|
|
12
12
|
import { plannerTool } from "./planner.js";
|
|
13
13
|
import { urlFetchTool } from "./url-fetch.js";
|
|
14
|
+
import { patchTool } from "./patch.js";
|
|
15
|
+
import { codeSymbolsTool } from "./code-symbols.js";
|
|
16
|
+
import { lspTool } from "./lsp.js";
|
|
14
17
|
import { getRuntimeRootsFromEnv } from "../runtime-paths.js";
|
|
18
|
+
import { filterToolsForRole, isKnownSubAgentRole, normalizeSubAgentRole, } from "../agents/roles.js";
|
|
19
|
+
import { formatParallelExploreReport, gateParallelExplore, isSubtaskParallelEnabled, parseParallelTasks, } from "../agent/subtask-parallel.js";
|
|
20
|
+
const SUBTASK_TOOL_POOL = [
|
|
21
|
+
bashTool,
|
|
22
|
+
readTool,
|
|
23
|
+
writeTool,
|
|
24
|
+
patchTool,
|
|
25
|
+
todoTool,
|
|
26
|
+
skillTool,
|
|
27
|
+
searchTool,
|
|
28
|
+
codeSymbolsTool,
|
|
29
|
+
lspTool,
|
|
30
|
+
plannerTool,
|
|
31
|
+
urlFetchTool,
|
|
32
|
+
];
|
|
15
33
|
export const subtaskTool = {
|
|
16
34
|
name: "subtask",
|
|
17
|
-
description: "Spawn
|
|
35
|
+
description: "Spawn isolated sub-agent(s). role=explore|implement|review. Optional tasks[] runs parallel read-only explores when QLING_SUBTASK_PARALLEL=1.",
|
|
36
|
+
longDescription: `派生子代理执行独立子任务。
|
|
37
|
+
|
|
38
|
+
**角色 role**:
|
|
39
|
+
- explore — 只读探索
|
|
40
|
+
- implement — 实现(可写)
|
|
41
|
+
- review — 只读审查
|
|
42
|
+
|
|
43
|
+
**并行**(默认关):
|
|
44
|
+
- 设 QLING_SUBTASK_PARALLEL=1
|
|
45
|
+
- 传 tasks=["任务A","任务B"](2–3 个,仅 explore/review)
|
|
46
|
+
- 写操作禁止并行
|
|
47
|
+
|
|
48
|
+
**回传**: 【子代理回传契约】;并行时为【并行探索回传】汇总。
|
|
49
|
+
**禁止嵌套**: 子代理不可再 subtask。`,
|
|
18
50
|
parameters: {
|
|
19
51
|
type: "object",
|
|
20
52
|
properties: {
|
|
21
53
|
task: {
|
|
22
54
|
type: "string",
|
|
23
|
-
description: "
|
|
55
|
+
description: "Single subtask (required unless tasks[] is set)",
|
|
56
|
+
},
|
|
57
|
+
tasks: {
|
|
58
|
+
type: "array",
|
|
59
|
+
description: "Parallel explore/review task list (requires QLING_SUBTASK_PARALLEL=1). Max 3 by default.",
|
|
60
|
+
items: { type: "string" },
|
|
24
61
|
},
|
|
25
62
|
context: {
|
|
26
63
|
type: "string",
|
|
27
64
|
description: "Additional context to pass to the sub-agent",
|
|
28
65
|
},
|
|
66
|
+
role: {
|
|
67
|
+
type: "string",
|
|
68
|
+
description: "explore | implement | review (default implement; parallel defaults explore)",
|
|
69
|
+
},
|
|
29
70
|
max_iterations: {
|
|
30
71
|
type: "number",
|
|
31
72
|
description: "Max iterations (default 10)",
|
|
32
73
|
},
|
|
33
74
|
},
|
|
34
|
-
required: [
|
|
75
|
+
required: [],
|
|
35
76
|
},
|
|
36
77
|
readOnly: false,
|
|
37
78
|
destructive: false,
|
|
38
79
|
scenes: ["planning"],
|
|
39
80
|
effortHint: "high",
|
|
40
81
|
};
|
|
41
|
-
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
return toolError("SUBTASK_MISSING_TASK", "task is required");
|
|
45
|
-
}
|
|
82
|
+
function buildRunnerConfig(role, maxIterations, timeoutMs) {
|
|
83
|
+
const roots = getRuntimeRootsFromEnv();
|
|
84
|
+
const tools = filterToolsForRole(SUBTASK_TOOL_POOL, role);
|
|
46
85
|
const apiKey = process.env.QLING_LLM_API_KEY ??
|
|
47
86
|
process.env.DEEPSEEK_API_KEY ??
|
|
48
87
|
process.env.OPENAI_API_KEY ??
|
|
49
88
|
"";
|
|
50
|
-
|
|
51
|
-
|
|
89
|
+
return {
|
|
90
|
+
apiKey,
|
|
91
|
+
tools,
|
|
92
|
+
parent: {
|
|
93
|
+
apiKey,
|
|
94
|
+
provider: process.env.QLING_LLM_PROVIDER ?? "deepseek",
|
|
95
|
+
endpoint: process.env.QLING_LLM_ENDPOINT ??
|
|
96
|
+
process.env.OPENAI_BASE_URL ??
|
|
97
|
+
process.env.DEEPSEEK_BASE_URL ??
|
|
98
|
+
"https://api.deepseek.com",
|
|
99
|
+
model: process.env.QLING_LLM_MODEL ?? "deepseek-chat",
|
|
100
|
+
tools,
|
|
101
|
+
runtime: {
|
|
102
|
+
workspaceDir: roots.workspaceDir,
|
|
103
|
+
fileCacheDir: roots.fileCacheDir,
|
|
104
|
+
fileStateDir: roots.fileStateDir,
|
|
105
|
+
maxSteps: maxIterations,
|
|
106
|
+
parseRetries: 2,
|
|
107
|
+
toolRepeatLimit: 6,
|
|
108
|
+
timeoutMs,
|
|
109
|
+
},
|
|
110
|
+
logging: {
|
|
111
|
+
level: "info",
|
|
112
|
+
format: "text",
|
|
113
|
+
inspectPrompt: false,
|
|
114
|
+
inspectRequest: false,
|
|
115
|
+
inspectDumpDir: roots.fileStateDir,
|
|
116
|
+
},
|
|
117
|
+
},
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
export async function runSubtask(args) {
|
|
121
|
+
const parallelTasks = parseParallelTasks(args.tasks);
|
|
122
|
+
const singleTask = String(args.task ?? "").trim();
|
|
123
|
+
if (parallelTasks.length === 0 && !singleTask) {
|
|
124
|
+
return toolError("SUBTASK_MISSING_TASK", "task is required (or tasks[] for parallel explore)");
|
|
125
|
+
}
|
|
126
|
+
if (args.role !== undefined && args.role !== "" && !isKnownSubAgentRole(args.role)) {
|
|
127
|
+
return toolError("SUBTASK_INVALID_ROLE", `unknown role "${args.role}"; use explore | implement | review`);
|
|
52
128
|
}
|
|
53
129
|
const maxIterationsRaw = Number(args.max_iterations ?? 10);
|
|
54
130
|
const maxIterations = Number.isFinite(maxIterationsRaw) && maxIterationsRaw > 0
|
|
@@ -56,60 +132,79 @@ export async function runSubtask(args) {
|
|
|
56
132
|
: 10;
|
|
57
133
|
const timeoutRaw = Number(args.timeout_ms ?? 120_000);
|
|
58
134
|
const timeoutMs = Number.isFinite(timeoutRaw) && timeoutRaw > 0 ? Math.min(600_000, timeoutRaw) : 120_000;
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
135
|
+
// --- 并行路径 ---
|
|
136
|
+
if (parallelTasks.length > 0) {
|
|
137
|
+
// 若同时给了 task,并入列表
|
|
138
|
+
const tasks = singleTask && !parallelTasks.includes(singleTask)
|
|
139
|
+
? [singleTask, ...parallelTasks]
|
|
140
|
+
: parallelTasks.length > 0
|
|
141
|
+
? parallelTasks
|
|
142
|
+
: [singleTask];
|
|
143
|
+
const roleHint = args.role !== undefined && args.role !== "" ? args.role : "explore";
|
|
144
|
+
const gate = gateParallelExplore({
|
|
145
|
+
tasks,
|
|
146
|
+
role: roleHint,
|
|
147
|
+
enabled: isSubtaskParallelEnabled(),
|
|
148
|
+
});
|
|
149
|
+
if (!gate.ok) {
|
|
150
|
+
return toolError(gate.errorCode ?? "SUBTASK_PARALLEL_DENIED", gate.errorMessage ?? "denied");
|
|
151
|
+
}
|
|
152
|
+
const { apiKey, tools, parent } = buildRunnerConfig(gate.role, maxIterations, timeoutMs);
|
|
153
|
+
if (!apiKey) {
|
|
154
|
+
return toolError("SUBTASK_MISSING_API_KEY", "missing API key for subtask agent");
|
|
155
|
+
}
|
|
156
|
+
try {
|
|
157
|
+
const settled = await Promise.all(gate.tasks.map(async (task) => {
|
|
158
|
+
const runner = new SubtaskRunner(parent);
|
|
159
|
+
const result = await runner.run({
|
|
160
|
+
task,
|
|
161
|
+
parentContext: args.context,
|
|
162
|
+
maxIterations,
|
|
163
|
+
depth: 1,
|
|
164
|
+
timeoutMs,
|
|
165
|
+
role: gate.role,
|
|
166
|
+
tools,
|
|
167
|
+
});
|
|
168
|
+
return { task, result };
|
|
169
|
+
}));
|
|
170
|
+
const report = formatParallelExploreReport(settled);
|
|
171
|
+
const anyFail = settled.some((s) => !s.result.success);
|
|
172
|
+
if (anyFail) {
|
|
173
|
+
return toolError("SUBTASK_PARALLEL_PARTIAL", report, {
|
|
174
|
+
retriable: false,
|
|
175
|
+
category: "runtime",
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
return toolSuccess(report);
|
|
179
|
+
}
|
|
180
|
+
catch (err) {
|
|
181
|
+
return toolError("SUBTASK_PARALLEL_FAILED", err instanceof Error ? err.message : String(err), { retriable: false, category: "runtime" });
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
// --- 单任务路径 ---
|
|
185
|
+
const role = normalizeSubAgentRole(args.role);
|
|
186
|
+
const { apiKey, tools, parent } = buildRunnerConfig(role, maxIterations, timeoutMs);
|
|
187
|
+
if (!apiKey) {
|
|
188
|
+
return toolError("SUBTASK_MISSING_API_KEY", "missing API key for subtask agent");
|
|
189
|
+
}
|
|
190
|
+
const runner = new SubtaskRunner(parent);
|
|
96
191
|
try {
|
|
97
192
|
const result = await runner.run({
|
|
98
|
-
task,
|
|
193
|
+
task: singleTask,
|
|
99
194
|
parentContext: args.context,
|
|
100
195
|
maxIterations,
|
|
101
196
|
depth: 1,
|
|
102
197
|
timeoutMs,
|
|
198
|
+
role,
|
|
199
|
+
tools,
|
|
103
200
|
});
|
|
104
201
|
if (!result.success) {
|
|
105
|
-
return toolError("SUBTASK_FAILED", result.output, {
|
|
202
|
+
return toolError("SUBTASK_FAILED", result.contractText || result.output, {
|
|
203
|
+
retriable: false,
|
|
204
|
+
category: "runtime",
|
|
205
|
+
});
|
|
106
206
|
}
|
|
107
|
-
return toolSuccess(
|
|
108
|
-
`subtask completed in ${result.durationMs}ms`,
|
|
109
|
-
`iterations=${result.iterations}`,
|
|
110
|
-
"",
|
|
111
|
-
result.output,
|
|
112
|
-
].join("\n"));
|
|
207
|
+
return toolSuccess(result.contractText || result.output);
|
|
113
208
|
}
|
|
114
209
|
catch (err) {
|
|
115
210
|
return toolError("SUBTASK_RUN_FAILED", err instanceof Error ? err.message : String(err), {
|
package/dist/tui/shell.d.ts
CHANGED
|
@@ -34,6 +34,18 @@ export declare function formatToolTimelineRow(event: ToolTimelineEvent): string;
|
|
|
34
34
|
export declare function formatResultBox(lines: string[], width: number, options?: {
|
|
35
35
|
compactLong?: boolean;
|
|
36
36
|
}): string[];
|
|
37
|
+
export interface ResultHighlightOptions {
|
|
38
|
+
/** 框标题,默认「结果」 */
|
|
39
|
+
header?: string;
|
|
40
|
+
/** 正文行(可含 ANSI);超宽时截断以保证右侧边框对齐 */
|
|
41
|
+
lines: string[];
|
|
42
|
+
width?: number;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* 任务最终结果高亮框(纯函数,便于单测)。
|
|
46
|
+
* 顶/底/左右边框完整闭合,各行可见宽度一致。
|
|
47
|
+
*/
|
|
48
|
+
export declare function formatResultHighlight(options: ResultHighlightOptions): string[];
|
|
37
49
|
export declare function formatInputFrame(options: InputFrameOptions): string[];
|
|
38
50
|
export declare function formatBottomHints(): string;
|
|
39
51
|
export interface ToolOutputCardOptions {
|
package/dist/tui/shell.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/tui/shell.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"shell.d.ts","sourceRoot":"","sources":["../../src/tui/shell.ts"],"names":[],"mappings":"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"}
|
package/dist/tui/shell.js
CHANGED
|
@@ -184,6 +184,39 @@ export function formatResultBox(lines, width, options) {
|
|
|
184
184
|
const bottom = "└" + "─".repeat(contentWidth + 2) + "┘";
|
|
185
185
|
return [top, ...body, bottom];
|
|
186
186
|
}
|
|
187
|
+
/**
|
|
188
|
+
* 将可见宽度限制在 maxWidth 内。
|
|
189
|
+
* 含 ANSI 且超宽时去掉颜色再截断,保证右框能稳定闭合对齐。
|
|
190
|
+
*/
|
|
191
|
+
function fitVisible(value, maxWidth) {
|
|
192
|
+
if (maxWidth <= 0)
|
|
193
|
+
return "";
|
|
194
|
+
if (visibleWidth(value) <= maxWidth)
|
|
195
|
+
return value;
|
|
196
|
+
return truncateVisible(stripAnsi(value), maxWidth);
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* 任务最终结果高亮框(纯函数,便于单测)。
|
|
200
|
+
* 顶/底/左右边框完整闭合,各行可见宽度一致。
|
|
201
|
+
*/
|
|
202
|
+
export function formatResultHighlight(options) {
|
|
203
|
+
const safeWidth = normalizeWidth(options.width);
|
|
204
|
+
const contentWidth = Math.max(20, safeWidth - 4);
|
|
205
|
+
const frameInner = contentWidth + 2; // 左右各 1 空格 + 正文区
|
|
206
|
+
const header = normalizeLabel(options.header, "结果");
|
|
207
|
+
const title = ` ${header} `;
|
|
208
|
+
const titleW = visibleWidth(title);
|
|
209
|
+
// ┌─ + title + dashes + ┐ 总可见宽 = contentWidth + 4
|
|
210
|
+
const dashAfter = Math.max(1, frameInner - 1 - titleW);
|
|
211
|
+
const top = `┌─${title}${"─".repeat(dashAfter)}┐`;
|
|
212
|
+
const bodyLines = options.lines.length > 0 ? options.lines : [""];
|
|
213
|
+
const body = bodyLines.map((line) => {
|
|
214
|
+
const text = fitVisible(line, contentWidth);
|
|
215
|
+
return `│ ${padVisible(text, contentWidth)} │`;
|
|
216
|
+
});
|
|
217
|
+
const bottom = "└" + "─".repeat(frameInner) + "┘";
|
|
218
|
+
return [top, ...body, bottom];
|
|
219
|
+
}
|
|
187
220
|
export function formatInputFrame(options) {
|
|
188
221
|
const t = getLocalizedText();
|
|
189
222
|
const safeWidth = normalizeWidth(options.width);
|
|
@@ -201,7 +234,7 @@ export function formatInputFrame(options) {
|
|
|
201
234
|
export function formatBottomHints() {
|
|
202
235
|
const t = getLocalizedText();
|
|
203
236
|
return (t.tui?.hints?.bottom ||
|
|
204
|
-
"Enter 发送 · / 命令 · Ctrl+N 换行 · Ctrl+O
|
|
237
|
+
"Enter 发送 · / 命令 · Ctrl+N 换行 · Ctrl+O 展开/收起工具输出 · Shift+Tab 模式 · Ctrl+C 清空/中断 · /mode · /expand");
|
|
205
238
|
}
|
|
206
239
|
/**
|
|
207
240
|
* 工具输出折叠卡片(纯函数,便于单测)。
|
|
@@ -221,7 +254,7 @@ export function formatToolOutputCard(output, options = {}) {
|
|
|
221
254
|
hidden: 0,
|
|
222
255
|
collapsed: false,
|
|
223
256
|
footer: expand && totalLines > longThreshold
|
|
224
|
-
? `... ${totalLines} lines total (Ctrl+O
|
|
257
|
+
? `... ${totalLines} lines total (Ctrl+O 收起 / collapse)`
|
|
225
258
|
: null,
|
|
226
259
|
};
|
|
227
260
|
}
|
|
@@ -247,7 +280,7 @@ export function formatToolOutputCard(output, options = {}) {
|
|
|
247
280
|
totalLines,
|
|
248
281
|
hidden,
|
|
249
282
|
collapsed: true,
|
|
250
|
-
footer: `... ${totalLines} lines total (Ctrl+O
|
|
283
|
+
footer: `... ${totalLines} lines total (Ctrl+O 展开 / expand)`,
|
|
251
284
|
};
|
|
252
285
|
}
|
|
253
286
|
export function formatWelcomeGuide(width = 80, snapshot) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streaming-repl.d.ts","sourceRoot":"","sources":["../../src/tui/streaming-repl.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAa7C,qBAAa,aAAa;IACxB,OAAO,CAAC,EAAE,CAAW;IACrB,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,cAAc,CAAyB;IAC/C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAS;IAC9C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAU;IAC1C,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,iBAAiB,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAmB;IAC9C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAA6B;
|
|
1
|
+
{"version":3,"file":"streaming-repl.d.ts","sourceRoot":"","sources":["../../src/tui/streaming-repl.ts"],"names":[],"mappings":"AAWA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAa7C,qBAAa,aAAa;IACxB,OAAO,CAAC,EAAE,CAAW;IACrB,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,cAAc,CAAyB;IAC/C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAS;IAC9C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAU;IAC1C,OAAO,CAAC,eAAe,CAAuB;IAC9C,OAAO,CAAC,iBAAiB,CAAQ;IACjC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAmB;IAC9C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,mBAAmB,CAAM;gBAG/B,KAAK,CAAC,EAAE,SAAS,EACjB,OAAO,GAAE;QACP,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,eAAe,CAAC,EAAE,OAAO,CAAC;KACtB;IAyBF,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAmBtB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAIb,KAAK;IAkBnB,OAAO,CAAC,eAAe;IA8DvB,OAAO,CAAC,aAAa;IAgCrB,OAAO,CAAC,kBAAkB;YAqDZ,gBAAgB;YAKhB,iBAAiB;YAoBjB,qBAAqB;YAQrB,uBAAuB;YAQvB,aAAa;YAsEb,eAAe;YASf,2BAA2B;IA4BzC,OAAO,CAAC,0BAA0B;YAkCpB,qBAAqB;IAgCnC,OAAO,CAAC,kBAAkB;YAWZ,6BAA6B;YAU7B,yBAAyB;YA2BzB,aAAa;CAsB5B"}
|
|
@@ -31,6 +31,7 @@ export class StreamingREPL {
|
|
|
31
31
|
inputQueue;
|
|
32
32
|
closed = false;
|
|
33
33
|
onClose = null;
|
|
34
|
+
lastExecutionStatus = "";
|
|
34
35
|
constructor(agent, options = {}) {
|
|
35
36
|
this.agent = agent ?? new AgentLoop();
|
|
36
37
|
const model = this.agent.getModel();
|
|
@@ -94,6 +95,19 @@ export class StreamingREPL {
|
|
|
94
95
|
}
|
|
95
96
|
// ── 事件连接 ────────────────────────────────────────
|
|
96
97
|
wireAgentEvents() {
|
|
98
|
+
const subscribe = this.agent.subscribeExecutionEvents;
|
|
99
|
+
if (typeof subscribe === "function") {
|
|
100
|
+
subscribe.call(this.agent, (event) => {
|
|
101
|
+
const strategy = event.recoveryAction ? ` · ${event.recoveryAction}` : "";
|
|
102
|
+
const status = `${event.stage ?? "run"}:${event.status ?? event.type}${strategy}`;
|
|
103
|
+
if (status === this.lastExecutionStatus)
|
|
104
|
+
return;
|
|
105
|
+
this.lastExecutionStatus = status;
|
|
106
|
+
const tool = event.tool ? ` · ${event.tool}` : "";
|
|
107
|
+
const category = event.category ? ` · ${event.category}` : "";
|
|
108
|
+
this.ui.appendValidation(event.status === "failed" || event.status === "paused" ? "warn" : "pass", `执行阶段: ${event.stage ?? "run"} · ${event.status ?? event.type}${tool}${category}${strategy}`);
|
|
109
|
+
});
|
|
110
|
+
}
|
|
97
111
|
this.agent.on("tool_start", (name, args) => {
|
|
98
112
|
const cmd = this.argsToCommand(name, args);
|
|
99
113
|
this.ui.appendToolStart(name, cmd);
|
|
@@ -126,6 +140,13 @@ export class StreamingREPL {
|
|
|
126
140
|
const status = verdict === "PASS" ? "pass" : verdict === "FAIL" ? "fail" : "warn";
|
|
127
141
|
this.ui.appendValidation(status, details);
|
|
128
142
|
});
|
|
143
|
+
this.agent.on("repair", (reason, action, retryCount) => {
|
|
144
|
+
this.ui.appendRepair(reason, action, retryCount);
|
|
145
|
+
});
|
|
146
|
+
this.agent.on("recovery_paused", (state) => {
|
|
147
|
+
this.ui.stopProgress();
|
|
148
|
+
this.ui.setRecoveryState(state);
|
|
149
|
+
});
|
|
129
150
|
}
|
|
130
151
|
// 将工具参数转换为可读命令字符串
|
|
131
152
|
argsToCommand(tool, args) {
|
|
@@ -199,6 +220,8 @@ export class StreamingREPL {
|
|
|
199
220
|
setImmediatePrompt: (prompt) => {
|
|
200
221
|
this.immediatePrompt = prompt;
|
|
201
222
|
},
|
|
223
|
+
setInputDraft: (draft) => this.ui.setInputDraft(draft),
|
|
224
|
+
onRecoveryStateChanged: (state) => this.ui.setRecoveryState(state),
|
|
202
225
|
onModelChanged: async (model) => {
|
|
203
226
|
this.ui.setModel?.(model);
|
|
204
227
|
await this.refreshStatusLine();
|
|
@@ -268,6 +291,10 @@ export class StreamingREPL {
|
|
|
268
291
|
await this.agent.checkpointSession();
|
|
269
292
|
const totalMs = Date.now() - startTime;
|
|
270
293
|
this.ui.appendDone(totalMs);
|
|
294
|
+
if (this.agent.getRecoveryState()?.status === "paused") {
|
|
295
|
+
currentPrompt = null;
|
|
296
|
+
break;
|
|
297
|
+
}
|
|
271
298
|
}
|
|
272
299
|
catch (err) {
|
|
273
300
|
this.ui.stopProgress();
|
|
@@ -386,10 +413,6 @@ export class StreamingREPL {
|
|
|
386
413
|
}
|
|
387
414
|
else {
|
|
388
415
|
await this.scheduler.runDueTasksOnce();
|
|
389
|
-
// 真实 TUI 有 showPrompt;单测 mock 可能没有
|
|
390
|
-
if (typeof this.ui.showPrompt === "function") {
|
|
391
|
-
this.ui.showPrompt();
|
|
392
|
-
}
|
|
393
416
|
}
|
|
394
417
|
return;
|
|
395
418
|
}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import type { RecoveryState } from "../execution/types.js";
|
|
1
2
|
export type AgentEvent = {
|
|
2
3
|
type: "tool_start";
|
|
3
4
|
tool: string;
|
|
@@ -69,6 +70,7 @@ export declare class StreamUI {
|
|
|
69
70
|
private slashCompletionSelectedIndex;
|
|
70
71
|
private inputCursorAnchor;
|
|
71
72
|
private inputStartRow;
|
|
73
|
+
private recoveryState;
|
|
72
74
|
private readonly now;
|
|
73
75
|
private readonly doubleCtrlCExitWindowMs;
|
|
74
76
|
constructor(model?: string, tools?: number, options?: {
|
|
@@ -89,6 +91,9 @@ export declare class StreamUI {
|
|
|
89
91
|
memoryStatus?: string;
|
|
90
92
|
}): void;
|
|
91
93
|
setModel(model: string): void;
|
|
94
|
+
setRecoveryState(state: RecoveryState | null): void;
|
|
95
|
+
setInputDraft(draft: string): void;
|
|
96
|
+
private appendRecoveryCard;
|
|
92
97
|
isExpandLongToolOutput(): boolean;
|
|
93
98
|
setExpandLongToolOutput(expanded: boolean): void;
|
|
94
99
|
toggleExpandLongToolOutput(): boolean;
|
|
@@ -96,6 +101,10 @@ export declare class StreamUI {
|
|
|
96
101
|
startProgress(label?: string, intervalMs?: number): void;
|
|
97
102
|
stopProgress(): void;
|
|
98
103
|
private printHeader;
|
|
104
|
+
/**
|
|
105
|
+
* 输入框上方不再堆叠 statusline / 快捷键黑灰提示(去噪)。
|
|
106
|
+
* 详情仍可通过 /statusline、/shortcuts 与顶栏查看。
|
|
107
|
+
*/
|
|
99
108
|
private printPromptHint;
|
|
100
109
|
private printInputBar;
|
|
101
110
|
private backToPrompt;
|
|
@@ -129,6 +138,7 @@ export declare class StreamUI {
|
|
|
129
138
|
private setupInput;
|
|
130
139
|
private handleEnter;
|
|
131
140
|
private handleTab;
|
|
141
|
+
private handleShiftTab;
|
|
132
142
|
private handleCtrlC;
|
|
133
143
|
private handleCtrlZ;
|
|
134
144
|
private handleBackspace;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"streaming-tui.d.ts","sourceRoot":"","sources":["../../src/tui/streaming-tui.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"streaming-tui.d.ts","sourceRoot":"","sources":["../../src/tui/streaming-tui.ts"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAgE3D,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,IAAI,EAAE,cAAc,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC3F;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACxF;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACzC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACtE;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GACtE;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/B;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,EAAE,MAAM,CAAA;CAAE,GAC3C;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAIzC,qBAAa,QAAQ;IACnB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,YAAY,CAQb;IACP,OAAO,CAAC,KAAK,CAAqB;IAClC,OAAO,CAAC,OAAO,CAAkB;IACjC,OAAO,CAAC,aAAa,CAAiD;IACtE,OAAO,CAAC,kBAAkB,CAAkB;IAC5C,OAAO,CAAC,WAAW,CAA0C;IAC7D,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,UAAU,CAAuB;IACzC,OAAO,CAAC,iBAAiB,CAAQ;IACjC,OAAO,CAAC,aAAa,CAA+B;IACpD,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,aAAa,CAAW;IAChC,OAAO,CAAC,gBAAgB,CAAK;IAC7B,OAAO,CAAC,gBAAgB,CAAuB;IAC/C,OAAO,CAAC,6BAA6B,CAAmC;IACxE,OAAO,CAAC,kBAAkB,CAAmC;IAC7D,OAAO,CAAC,oBAAoB,CAAS;IACrC,OAAO,CAAC,yBAAyB,CAAK;IACtC,OAAO,CAAC,wBAAwB,CAAK;IACrC,OAAO,CAAC,sBAAsB,CAAK;IACnC,OAAO,CAAC,4BAA4B,CAAK;IACzC,OAAO,CAAC,iBAAiB,CAAmC;IAC5D,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;IACnC,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAS;gBAG/C,KAAK,GAAE,MAAwB,EAC/B,KAAK,GAAE,MAAU,EACjB,OAAO,GAAE;QAAE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;KAAO;IAOtC,KAAK,IAAI,IAAI;IAOb,IAAI,IAAI,IAAI;IAkBZ,OAAO,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI;IAIjD,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI;IAIxC,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI5C,eAAe,CAAC,MAAM,EAAE;QACtB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,GAAG,IAAI;IAIR,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAK7B,gBAAgB,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI,GAAG,IAAI;IAKnD,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;IAOlC,OAAO,CAAC,kBAAkB;IAa1B,sBAAsB,IAAI,OAAO;IAIjC,uBAAuB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI;IAIhD,0BAA0B,IAAI,OAAO;IAKrC,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI;IAInC,aAAa,CAAC,KAAK,GAAE,MAAgB,EAAE,UAAU,GAAE,MAAe,GAAG,IAAI;IAYzE,YAAY,IAAI,IAAI;IAQpB,OAAO,CAAC,WAAW;IAiCnB;;;OAGG;IACH,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,aAAa;IAMrB,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,uBAAuB;IAO/B,OAAO,CAAC,oBAAoB;IA+C5B,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,qBAAqB;IAI7B,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,8BAA8B;IAMtC,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,sBAAsB;IAe9B,OAAO,CAAC,UAAU;IA4BlB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,gBAAgB;IAIxB,OAAO,CAAC,mBAAmB;IAQ3B,OAAO,CAAC,uBAAuB;IAW/B,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,eAAe;IA4EvB,OAAO,CAAC,iCAAiC;IAazC,OAAO,CAAC,uBAAuB;IAK/B,OAAO,CAAC,uBAAuB;IAI/B,OAAO,CAAC,qBAAqB;IAc7B,OAAO,CAAC,4BAA4B;IAUpC,UAAU,IAAI,IAAI;IASlB,iCAAiC;IACjC,uBAAuB,IAAI,OAAO;IAMlC,OAAO,CAAC,UAAU;IAyLlB,OAAO,CAAC,WAAW;IAcnB,OAAO,CAAC,SAAS;IAiBjB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,WAAW;IA6BnB,OAAO,CAAC,WAAW;IAwBnB,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,WAAW;IAOnB,OAAO,CAAC,WAAW;IAMnB,OAAO,CAAC,WAAW;IAWnB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,iBAAiB;IAOzB,OAAO,CAAC,mBAAmB;IAU3B,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,eAAe;IAKvB,OAAO,CAAC,YAAY;IAKpB,OAAO,CAAC,cAAc;IAKtB,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,SAAS;IAKjB,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,eAAe;IAqBvB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAMpD,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAW1F,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAYvF,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAUlC,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIzC,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI;IAMtE,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAOhC,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAQnC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI;IAOtE,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAwB/B,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAI/B,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI;IAI3C,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;CAIrC"}
|