@introspection-ai/recipes 0.13.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +191 -0
- package/README.md +184 -0
- package/dist/agent-tool.d.ts +42 -0
- package/dist/agent-tool.d.ts.map +1 -0
- package/dist/agent-tool.js +159 -0
- package/dist/agent-tool.js.map +1 -0
- package/dist/child-agent-completions.d.ts +61 -0
- package/dist/child-agent-completions.d.ts.map +1 -0
- package/dist/child-agent-completions.js +135 -0
- package/dist/child-agent-completions.js.map +1 -0
- package/dist/child-agent-store.d.ts +48 -0
- package/dist/child-agent-store.d.ts.map +1 -0
- package/dist/child-agent-store.js +98 -0
- package/dist/child-agent-store.js.map +1 -0
- package/dist/child-agent.d.ts +43 -0
- package/dist/child-agent.d.ts.map +1 -0
- package/dist/child-agent.js +268 -0
- package/dist/child-agent.js.map +1 -0
- package/dist/direct-cli.d.ts +9 -0
- package/dist/direct-cli.d.ts.map +1 -0
- package/dist/direct-cli.js +22 -0
- package/dist/direct-cli.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/inspect.d.ts +26 -0
- package/dist/inspect.d.ts.map +1 -0
- package/dist/inspect.js +70 -0
- package/dist/inspect.js.map +1 -0
- package/dist/interactions.d.ts +204 -0
- package/dist/interactions.d.ts.map +1 -0
- package/dist/interactions.js +358 -0
- package/dist/interactions.js.map +1 -0
- package/dist/mcp-catalog.d.ts +8 -0
- package/dist/mcp-catalog.d.ts.map +1 -0
- package/dist/mcp-catalog.js +60 -0
- package/dist/mcp-catalog.js.map +1 -0
- package/dist/mcp-cli-core.d.ts +79 -0
- package/dist/mcp-cli-core.d.ts.map +1 -0
- package/dist/mcp-cli-core.js +1717 -0
- package/dist/mcp-cli-core.js.map +1 -0
- package/dist/mcp-cli-help.d.ts +2 -0
- package/dist/mcp-cli-help.d.ts.map +1 -0
- package/dist/mcp-cli-help.js +36 -0
- package/dist/mcp-cli-help.js.map +1 -0
- package/dist/mcp-cli-policy.d.ts +17 -0
- package/dist/mcp-cli-policy.d.ts.map +1 -0
- package/dist/mcp-cli-policy.js +230 -0
- package/dist/mcp-cli-policy.js.map +1 -0
- package/dist/mcp-cli.d.ts +3 -0
- package/dist/mcp-cli.d.ts.map +1 -0
- package/dist/mcp-cli.js +33 -0
- package/dist/mcp-cli.js.map +1 -0
- package/dist/mcp-client.d.ts +3 -0
- package/dist/mcp-client.d.ts.map +1 -0
- package/dist/mcp-client.js +86 -0
- package/dist/mcp-client.js.map +1 -0
- package/dist/mcp-command-context.d.ts +13 -0
- package/dist/mcp-command-context.d.ts.map +1 -0
- package/dist/mcp-command-context.js +29 -0
- package/dist/mcp-command-context.js.map +1 -0
- package/dist/mcp-contract.d.ts +16 -0
- package/dist/mcp-contract.d.ts.map +1 -0
- package/dist/mcp-contract.js +306 -0
- package/dist/mcp-contract.js.map +1 -0
- package/dist/mcp-daemon-client.d.ts +10 -0
- package/dist/mcp-daemon-client.d.ts.map +1 -0
- package/dist/mcp-daemon-client.js +119 -0
- package/dist/mcp-daemon-client.js.map +1 -0
- package/dist/mcp-daemon-protocol.d.ts +64 -0
- package/dist/mcp-daemon-protocol.d.ts.map +1 -0
- package/dist/mcp-daemon-protocol.js +6 -0
- package/dist/mcp-daemon-protocol.js.map +1 -0
- package/dist/mcp-daemon.d.ts +3 -0
- package/dist/mcp-daemon.d.ts.map +1 -0
- package/dist/mcp-daemon.js +76880 -0
- package/dist/mcp-daemon.js.map +1 -0
- package/dist/mcp-run-worker.d.ts +2 -0
- package/dist/mcp-run-worker.d.ts.map +1 -0
- package/dist/mcp-run-worker.js +76579 -0
- package/dist/mcp-run-worker.js.map +1 -0
- package/dist/mcp.d.ts +168 -0
- package/dist/mcp.d.ts.map +1 -0
- package/dist/mcp.js +558 -0
- package/dist/mcp.js.map +1 -0
- package/dist/pi-extension.d.ts +30 -0
- package/dist/pi-extension.d.ts.map +1 -0
- package/dist/pi-extension.js +880 -0
- package/dist/pi-extension.js.map +1 -0
- package/dist/provider-env.d.ts +2 -0
- package/dist/provider-env.d.ts.map +1 -0
- package/dist/provider-env.js +21 -0
- package/dist/provider-env.js.map +1 -0
- package/dist/recipe/resolve.d.ts +30 -0
- package/dist/recipe/resolve.d.ts.map +1 -0
- package/dist/recipe/resolve.js +131 -0
- package/dist/recipe/resolve.js.map +1 -0
- package/dist/recipe-agent.d.ts +71 -0
- package/dist/recipe-agent.d.ts.map +1 -0
- package/dist/recipe-agent.js +555 -0
- package/dist/recipe-agent.js.map +1 -0
- package/dist/recipe-extensions.d.ts +9 -0
- package/dist/recipe-extensions.d.ts.map +1 -0
- package/dist/recipe-extensions.js +81 -0
- package/dist/recipe-extensions.js.map +1 -0
- package/dist/recipe-mcp-config.d.ts +15 -0
- package/dist/recipe-mcp-config.d.ts.map +1 -0
- package/dist/recipe-mcp-config.js +82 -0
- package/dist/recipe-mcp-config.js.map +1 -0
- package/dist/recipe-model.d.ts +49 -0
- package/dist/recipe-model.d.ts.map +1 -0
- package/dist/recipe-model.js +299 -0
- package/dist/recipe-model.js.map +1 -0
- package/dist/recipe-package.d.ts +79 -0
- package/dist/recipe-package.d.ts.map +1 -0
- package/dist/recipe-package.js +479 -0
- package/dist/recipe-package.js.map +1 -0
- package/dist/recipe-skills.d.ts +7 -0
- package/dist/recipe-skills.d.ts.map +1 -0
- package/dist/recipe-skills.js +46 -0
- package/dist/recipe-skills.js.map +1 -0
- package/dist/run-controller.d.ts +32 -0
- package/dist/run-controller.d.ts.map +1 -0
- package/dist/run-controller.js +259 -0
- package/dist/run-controller.js.map +1 -0
- package/dist/run.d.ts +28 -0
- package/dist/run.d.ts.map +1 -0
- package/dist/run.js +84 -0
- package/dist/run.js.map +1 -0
- package/dist/session.d.ts +140 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +363 -0
- package/dist/session.js.map +1 -0
- package/dist/test-utils.d.ts +32 -0
- package/dist/test-utils.d.ts.map +1 -0
- package/dist/test-utils.js +259 -0
- package/dist/test-utils.js.map +1 -0
- package/dist/testing.d.ts +25 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +96 -0
- package/dist/testing.js.map +1 -0
- package/docs/agent-composition.md +196 -0
- package/docs/deployment-configuration.md +65 -0
- package/docs/index.md +49 -0
- package/docs/interactions.md +210 -0
- package/docs/mcp-auth.md +80 -0
- package/docs/mcp-configuration.md +126 -0
- package/docs/migration.md +70 -0
- package/docs/pi-extension.md +97 -0
- package/docs/python-bindings-release.md +47 -0
- package/docs/recipe-evals.md +70 -0
- package/docs/recipe-flow.md +41 -0
- package/docs/recipe-format.md +186 -0
- package/docs/recipe-judges.md +152 -0
- package/docs/runtime-library.md +171 -0
- package/package.json +106 -0
- package/vendor/mcp-client/darwin-arm64/mcp-client +0 -0
- package/vendor/mcp-client/darwin-x64/mcp-client +0 -0
- package/vendor/mcp-client/linux-arm64/mcp-client +0 -0
- package/vendor/mcp-client/linux-x64/mcp-client +0 -0
package/dist/mcp.js
ADDED
|
@@ -0,0 +1,558 @@
|
|
|
1
|
+
import { createHash, randomBytes, randomUUID } from "node:crypto";
|
|
2
|
+
import { constants, existsSync, readFileSync } from "node:fs";
|
|
3
|
+
import { access, chmod, mkdir, rm, writeFile } from "node:fs/promises";
|
|
4
|
+
import { createConnection } from "node:net";
|
|
5
|
+
import { delimiter, dirname, join, resolve } from "node:path";
|
|
6
|
+
import { tmpdir } from "node:os";
|
|
7
|
+
import { fileURLToPath } from "node:url";
|
|
8
|
+
import { MCP_DAEMON_FINGERPRINT_ENV, MCP_DAEMON_PARENT_PID_ENV, MCP_DAEMON_SOCKET_ENV, MCP_DAEMON_TOKEN_ENV, MCP_SESSION_ROOT_ENV, } from "./mcp-daemon-protocol.js";
|
|
9
|
+
import { resolvePiPackageMcpManifestPaths, } from "./recipe-package.js";
|
|
10
|
+
import { generatedBindingEnvVars } from "./recipe-mcp-config.js";
|
|
11
|
+
/**
|
|
12
|
+
* A `required: true` package MCP server has no endpoint binding. Thrown by
|
|
13
|
+
* `materializeMcpSession` before any server is materialized (fail-closed).
|
|
14
|
+
*/
|
|
15
|
+
export class McpBindingError extends Error {
|
|
16
|
+
servers;
|
|
17
|
+
expectedEnvVars;
|
|
18
|
+
name = "McpBindingError";
|
|
19
|
+
constructor(
|
|
20
|
+
/** Missing required server ids, in manifest order. */
|
|
21
|
+
servers,
|
|
22
|
+
/** The `${VAR}` names a generated binding for those servers would use. */
|
|
23
|
+
expectedEnvVars) {
|
|
24
|
+
super(`Required MCP server binding(s) missing: ${servers.join(", ")}` +
|
|
25
|
+
(expectedEnvVars.length > 0
|
|
26
|
+
? ` (bind via .pi/mcp.local.json or env: ${expectedEnvVars.join(", ")})`
|
|
27
|
+
: ""));
|
|
28
|
+
this.servers = servers;
|
|
29
|
+
this.expectedEnvVars = expectedEnvVars;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
const RECIPE_ENV_PREFIX = "PI_RECIPES_";
|
|
33
|
+
const MCP_SESSION_ENV = `${RECIPE_ENV_PREFIX}MCP_SESSION`;
|
|
34
|
+
// mcporter's own config env var — the sandbox `mcp` CLI is mcporter, and the
|
|
35
|
+
// generated config referenced here is the only server catalog it may read.
|
|
36
|
+
const MCPORTER_CONFIG_ENV = "MCPORTER_CONFIG";
|
|
37
|
+
const MCP_LOCAL_CONFIG_ENV = `${RECIPE_ENV_PREFIX}MCP_LOCAL_CONFIG`;
|
|
38
|
+
const MCP_BIN_DIR_ENV = `${RECIPE_ENV_PREFIX}MCP_BIN_DIR`;
|
|
39
|
+
const MCP_RUNTIME_ENV_KEYS = [
|
|
40
|
+
MCP_SESSION_ENV,
|
|
41
|
+
MCPORTER_CONFIG_ENV,
|
|
42
|
+
MCP_LOCAL_CONFIG_ENV,
|
|
43
|
+
MCP_BIN_DIR_ENV,
|
|
44
|
+
MCP_DAEMON_FINGERPRINT_ENV,
|
|
45
|
+
MCP_DAEMON_PARENT_PID_ENV,
|
|
46
|
+
MCP_DAEMON_SOCKET_ENV,
|
|
47
|
+
MCP_DAEMON_TOKEN_ENV,
|
|
48
|
+
MCP_SESSION_ROOT_ENV,
|
|
49
|
+
];
|
|
50
|
+
/** Capture every environment entry Recipes may mutate while materializing MCP. */
|
|
51
|
+
export function snapshotMcpEnvironment(env) {
|
|
52
|
+
const currentPathKey = pathKey(env);
|
|
53
|
+
return {
|
|
54
|
+
pathKey: currentPathKey,
|
|
55
|
+
values: Object.fromEntries([...MCP_RUNTIME_ENV_KEYS, currentPathKey].map((key) => [key, env[key]])),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
/** Restore a previously captured MCP environment exactly. */
|
|
59
|
+
export function restoreMcpEnvironment(env, snapshot) {
|
|
60
|
+
for (const [key, value] of Object.entries(snapshot.values)) {
|
|
61
|
+
if (value === undefined) {
|
|
62
|
+
delete env[key];
|
|
63
|
+
}
|
|
64
|
+
else {
|
|
65
|
+
env[key] = value;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Hide host-owned runtime state before materializing a leased session. The
|
|
71
|
+
* local binding selector remains visible by design; session files, daemon
|
|
72
|
+
* coordinates, and generated CLI state do not.
|
|
73
|
+
*/
|
|
74
|
+
export function isolateMcpEnvironment(env) {
|
|
75
|
+
for (const key of MCP_RUNTIME_ENV_KEYS) {
|
|
76
|
+
if (key !== MCP_LOCAL_CONFIG_ENV)
|
|
77
|
+
delete env[key];
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
export function defaultMcpSessionPath(cwd) {
|
|
81
|
+
return join(cwd, ".pi", "mcp-session.json");
|
|
82
|
+
}
|
|
83
|
+
export function fallbackMcpSessionPath() {
|
|
84
|
+
return join(tmpdir(), "pi-recipes", "mcp-session.json");
|
|
85
|
+
}
|
|
86
|
+
export function defaultMcporterConfigPath(cwd) {
|
|
87
|
+
return join(cwd, ".pi", "mcporter.json");
|
|
88
|
+
}
|
|
89
|
+
export function fallbackMcporterConfigPath() {
|
|
90
|
+
return join(tmpdir(), "pi-recipes", "mcporter.json");
|
|
91
|
+
}
|
|
92
|
+
export function defaultMcpLocalConfigPath(cwd) {
|
|
93
|
+
return join(cwd, ".pi", "mcp.local.json");
|
|
94
|
+
}
|
|
95
|
+
export function resolveMcpLocalConfigPath(opts) {
|
|
96
|
+
const env = opts.env ?? process.env;
|
|
97
|
+
const configured = env[MCP_LOCAL_CONFIG_ENV];
|
|
98
|
+
if (configured)
|
|
99
|
+
return configured;
|
|
100
|
+
const workspaceConfig = defaultMcpLocalConfigPath(opts.cwd);
|
|
101
|
+
if (existsSync(workspaceConfig))
|
|
102
|
+
return workspaceConfig;
|
|
103
|
+
const recipeConfig = defaultMcpLocalConfigPath(opts.recipeDir);
|
|
104
|
+
return existsSync(recipeConfig) ? recipeConfig : undefined;
|
|
105
|
+
}
|
|
106
|
+
export function configureMcpLocalConfigPath(opts) {
|
|
107
|
+
const env = opts.env ?? process.env;
|
|
108
|
+
const path = resolveMcpLocalConfigPath({ ...opts, env });
|
|
109
|
+
if (!path)
|
|
110
|
+
return undefined;
|
|
111
|
+
env[MCP_LOCAL_CONFIG_ENV] = path;
|
|
112
|
+
return path;
|
|
113
|
+
}
|
|
114
|
+
export function defaultMcpBinDir(cwd) {
|
|
115
|
+
return join(cwd, ".pi", "bin");
|
|
116
|
+
}
|
|
117
|
+
export function mcporterCliEntrypointPath() {
|
|
118
|
+
return fileURLToPath(import.meta.resolve("mcporter/cli"));
|
|
119
|
+
}
|
|
120
|
+
function compiledEntrypoint(name) {
|
|
121
|
+
const adjacent = fileURLToPath(new URL(`./${name}`, import.meta.url));
|
|
122
|
+
if (existsSync(adjacent))
|
|
123
|
+
return adjacent;
|
|
124
|
+
return fileURLToPath(new URL(`../dist/${name}`, import.meta.url));
|
|
125
|
+
}
|
|
126
|
+
export function mcpCliEntrypointPath() {
|
|
127
|
+
return compiledEntrypoint("mcp-cli.js");
|
|
128
|
+
}
|
|
129
|
+
export function mcpClientEntrypointPath() {
|
|
130
|
+
return compiledEntrypoint("mcp-client.js");
|
|
131
|
+
}
|
|
132
|
+
export function nativeMcpClientPath(platform = process.platform, arch = process.arch) {
|
|
133
|
+
const executable = platform === "win32" ? "mcp-client.exe" : "mcp-client";
|
|
134
|
+
const packageEntrypoint = fileURLToPath(import.meta.resolve("@introspection-ai/recipes"));
|
|
135
|
+
const candidate = resolve(dirname(packageEntrypoint), "..", "vendor", "mcp-client", `${platform}-${arch}`, executable);
|
|
136
|
+
return existsSync(candidate) ? candidate : undefined;
|
|
137
|
+
}
|
|
138
|
+
function shellQuote(value) {
|
|
139
|
+
return `'${value.replace(/'/g, "'\\''")}'`;
|
|
140
|
+
}
|
|
141
|
+
function doubleQuoteEscape(value) {
|
|
142
|
+
return value.replace(/[\\"$`]/g, "\\$&");
|
|
143
|
+
}
|
|
144
|
+
function pathKey(env) {
|
|
145
|
+
return Object.keys(env).find((key) => key.toLowerCase() === "path") ?? "PATH";
|
|
146
|
+
}
|
|
147
|
+
function prependPath(env, dir) {
|
|
148
|
+
const key = pathKey(env);
|
|
149
|
+
const current = env[key] ?? "";
|
|
150
|
+
const entries = current.split(delimiter).filter(Boolean);
|
|
151
|
+
if (entries.includes(dir))
|
|
152
|
+
return;
|
|
153
|
+
env[key] = [dir, current].filter(Boolean).join(delimiter);
|
|
154
|
+
}
|
|
155
|
+
export async function materializeSessionMcpCli(opts) {
|
|
156
|
+
const env = opts.env ?? process.env;
|
|
157
|
+
env[MCP_SESSION_ROOT_ENV] = opts.cwd;
|
|
158
|
+
const binDir = defaultMcpBinDir(opts.cwd);
|
|
159
|
+
const shimPath = join(binDir, "mcp");
|
|
160
|
+
const nativeClient = nativeMcpClientPath();
|
|
161
|
+
if (process.platform !== "win32" && !nativeClient) {
|
|
162
|
+
throw new Error(`Native MCP client is unavailable for ${process.platform}-${process.arch}.`);
|
|
163
|
+
}
|
|
164
|
+
if (nativeClient && process.platform !== "win32") {
|
|
165
|
+
await access(nativeClient, constants.X_OK).catch(async () => {
|
|
166
|
+
await chmod(nativeClient, 0o755);
|
|
167
|
+
await access(nativeClient, constants.X_OK);
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
// The shim pins MCPORTER_CONFIG to the session-generated config (the
|
|
171
|
+
// session env normally sets it; the default covers shells that lost the
|
|
172
|
+
// env). mcporter must never fall through to its own config resolution —
|
|
173
|
+
// that would import the developer's personal MCP servers (~/.mcporter,
|
|
174
|
+
// Cursor/Claude/VS Code configs) into a recipe session.
|
|
175
|
+
const script = [
|
|
176
|
+
"#!/bin/sh",
|
|
177
|
+
`PI_RECIPES_MCP_SESSION_ROOT=${shellQuote(opts.cwd)}`,
|
|
178
|
+
"export PI_RECIPES_MCP_SESSION_ROOT",
|
|
179
|
+
`: "\${${MCPORTER_CONFIG_ENV}:=${doubleQuoteEscape(defaultMcporterConfigPath(opts.cwd))}}"`,
|
|
180
|
+
`export ${MCPORTER_CONFIG_ENV}`,
|
|
181
|
+
`if [ -n "\${${MCP_DAEMON_SOCKET_ENV}:-}" ]; then`,
|
|
182
|
+
...(nativeClient
|
|
183
|
+
? [
|
|
184
|
+
` ${shellQuote(nativeClient)} "$@"`,
|
|
185
|
+
" native_status=$?",
|
|
186
|
+
" if [ \"$native_status\" -ne 75 ]; then exit \"$native_status\"; fi",
|
|
187
|
+
` ${shellQuote(process.execPath)} ${shellQuote(mcpClientEntrypointPath())} --start-daemon`,
|
|
188
|
+
" supervisor_status=$?",
|
|
189
|
+
" if [ \"$supervisor_status\" -ne 0 ]; then exit \"$supervisor_status\"; fi",
|
|
190
|
+
` exec ${shellQuote(nativeClient)} "$@"`,
|
|
191
|
+
]
|
|
192
|
+
: [
|
|
193
|
+
` exec ${shellQuote(process.execPath)} ${shellQuote(mcpClientEntrypointPath())} "$@"`,
|
|
194
|
+
]),
|
|
195
|
+
"fi",
|
|
196
|
+
`exec ${shellQuote(process.execPath)} ${shellQuote(mcpCliEntrypointPath())} "$@"`,
|
|
197
|
+
"",
|
|
198
|
+
].join("\n");
|
|
199
|
+
await mkdir(binDir, { recursive: true });
|
|
200
|
+
await writeFile(shimPath, script);
|
|
201
|
+
await chmod(shimPath, 0o755);
|
|
202
|
+
env[MCP_BIN_DIR_ENV] = binDir;
|
|
203
|
+
prependPath(env, binDir);
|
|
204
|
+
return { binDir, shimPath };
|
|
205
|
+
}
|
|
206
|
+
function sessionPath(env, cwd = process.cwd()) {
|
|
207
|
+
return env[MCP_SESSION_ENV] || defaultMcpSessionPath(cwd);
|
|
208
|
+
}
|
|
209
|
+
function localMcpConfigPath(env, cwd = process.cwd()) {
|
|
210
|
+
return env[MCP_LOCAL_CONFIG_ENV] || defaultMcpLocalConfigPath(cwd);
|
|
211
|
+
}
|
|
212
|
+
function safeServerId(value) {
|
|
213
|
+
const id = value
|
|
214
|
+
.trim()
|
|
215
|
+
.toLowerCase()
|
|
216
|
+
.replace(/[^a-z0-9_-]+/g, "-")
|
|
217
|
+
.replace(/^-+|-+$/g, "");
|
|
218
|
+
return id || "mcp";
|
|
219
|
+
}
|
|
220
|
+
export function normalizeMcpServerId(value) {
|
|
221
|
+
return safeServerId(value);
|
|
222
|
+
}
|
|
223
|
+
function hostForUrl(value) {
|
|
224
|
+
try {
|
|
225
|
+
return new URL(value).hostname.toLowerCase();
|
|
226
|
+
}
|
|
227
|
+
catch {
|
|
228
|
+
return "";
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
function interpolateEnv(value, env) {
|
|
232
|
+
return value.replace(/\$\{([A-Z0-9_]+)\}/gi, (_match, name) => env[name] ?? "");
|
|
233
|
+
}
|
|
234
|
+
function readJson(path) {
|
|
235
|
+
return JSON.parse(readFileSync(path, "utf8"));
|
|
236
|
+
}
|
|
237
|
+
function readLocalMcpServers(env, cwd, localConfig) {
|
|
238
|
+
if (localConfig) {
|
|
239
|
+
return Array.isArray(localConfig.servers) ? localConfig.servers : [];
|
|
240
|
+
}
|
|
241
|
+
const path = localMcpConfigPath(env, cwd);
|
|
242
|
+
if (!existsSync(path))
|
|
243
|
+
return [];
|
|
244
|
+
try {
|
|
245
|
+
const parsed = readJson(path);
|
|
246
|
+
return Array.isArray(parsed.servers) ? parsed.servers : [];
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
return [];
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
function localBindings(env, cwd, localConfig) {
|
|
253
|
+
return readLocalMcpServers(env, cwd, localConfig).flatMap((server) => {
|
|
254
|
+
if (server.transport && server.transport !== "streamable_http")
|
|
255
|
+
return [];
|
|
256
|
+
const baseUrl = server.url ? interpolateEnv(server.url, env) : "";
|
|
257
|
+
if (!baseUrl)
|
|
258
|
+
return [];
|
|
259
|
+
const label = (server.name ?? server.id ?? hostForUrl(baseUrl)) || "mcp";
|
|
260
|
+
const rawHeaders = server.headers ?? {};
|
|
261
|
+
const localOAuth = server.auth === "oauth"
|
|
262
|
+
? {
|
|
263
|
+
auth: "oauth",
|
|
264
|
+
...(server.tokenCacheDir ? { tokenCacheDir: server.tokenCacheDir } : {}),
|
|
265
|
+
...(server.clientName ? { clientName: server.clientName } : {}),
|
|
266
|
+
...(server.oauthClientId ? { oauthClientId: server.oauthClientId } : {}),
|
|
267
|
+
...(server.oauthClientSecretEnv
|
|
268
|
+
? { oauthClientSecretEnv: server.oauthClientSecretEnv }
|
|
269
|
+
: {}),
|
|
270
|
+
...(server.oauthTokenEndpointAuthMethod
|
|
271
|
+
? { oauthTokenEndpointAuthMethod: server.oauthTokenEndpointAuthMethod }
|
|
272
|
+
: {}),
|
|
273
|
+
...(server.oauthRedirectUrl
|
|
274
|
+
? { oauthRedirectUrl: server.oauthRedirectUrl }
|
|
275
|
+
: {}),
|
|
276
|
+
...(server.oauthScope ? { oauthScope: server.oauthScope } : {}),
|
|
277
|
+
...(server.httpFetch ? { httpFetch: server.httpFetch } : {}),
|
|
278
|
+
}
|
|
279
|
+
: undefined;
|
|
280
|
+
return [{
|
|
281
|
+
id: safeServerId(server.id ?? label),
|
|
282
|
+
name: label,
|
|
283
|
+
baseUrl,
|
|
284
|
+
rawHeaders,
|
|
285
|
+
...(localOAuth ? { localOAuth } : {}),
|
|
286
|
+
}];
|
|
287
|
+
});
|
|
288
|
+
}
|
|
289
|
+
function endpointBindings(env, cwd, localConfig) {
|
|
290
|
+
const candidates = localBindings(env, cwd, localConfig);
|
|
291
|
+
const seen = new Set();
|
|
292
|
+
const bindings = [];
|
|
293
|
+
for (const binding of candidates) {
|
|
294
|
+
const key = `${binding.id}:${binding.baseUrl}`;
|
|
295
|
+
if (seen.has(key))
|
|
296
|
+
continue;
|
|
297
|
+
seen.add(key);
|
|
298
|
+
bindings.push(binding);
|
|
299
|
+
}
|
|
300
|
+
return bindings;
|
|
301
|
+
}
|
|
302
|
+
export function resolveAgentMcpSelections(mcp) {
|
|
303
|
+
return Object.entries(mcp ?? {}).map(([serverId, selection]) => ({
|
|
304
|
+
serverId: safeServerId(serverId),
|
|
305
|
+
tools: selection,
|
|
306
|
+
}));
|
|
307
|
+
}
|
|
308
|
+
export function executableRecipeToolNames(tools) {
|
|
309
|
+
return [...tools];
|
|
310
|
+
}
|
|
311
|
+
export function formatMcpConfigurationDiagnostics(diagnostics, limit = 3) {
|
|
312
|
+
const selected = diagnostics.slice(0, limit);
|
|
313
|
+
const lines = selected.map((diagnostic) => {
|
|
314
|
+
return `${diagnostic.serverId} ${diagnostic.stage} [${diagnostic.code}]: ${diagnostic.message}`;
|
|
315
|
+
});
|
|
316
|
+
const remaining = diagnostics.length - selected.length;
|
|
317
|
+
if (remaining > 0)
|
|
318
|
+
lines.push(`${remaining} more MCP configuration issue(s).`);
|
|
319
|
+
return lines.join("\n");
|
|
320
|
+
}
|
|
321
|
+
function recipeMcpPolicy(mcp) {
|
|
322
|
+
return {
|
|
323
|
+
required: new Set(mcp.servers
|
|
324
|
+
.filter((server) => server.required)
|
|
325
|
+
.map((server) => safeServerId(server.id))),
|
|
326
|
+
tools: new Map(mcp.servers.map((server) => [safeServerId(server.id), server.tools])),
|
|
327
|
+
};
|
|
328
|
+
}
|
|
329
|
+
export function mcpSelectionAllowsTool(selection, toolName) {
|
|
330
|
+
const included = selection.include?.some((selector) => {
|
|
331
|
+
const trimmed = selector.trim();
|
|
332
|
+
return trimmed === "*" || trimmed === toolName;
|
|
333
|
+
}) ?? false;
|
|
334
|
+
if (!included)
|
|
335
|
+
return false;
|
|
336
|
+
return !(selection.exclude ?? []).some((selector) => selector.trim() === toolName);
|
|
337
|
+
}
|
|
338
|
+
export function mcpSessionAllowsTool(server, toolName) {
|
|
339
|
+
return (mcpSelectionAllowsTool(server.package_tools, toolName) &&
|
|
340
|
+
server.agent_tools.some((selection) => mcpSelectionAllowsTool(selection, toolName)));
|
|
341
|
+
}
|
|
342
|
+
function escapeRegExp(value) {
|
|
343
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
344
|
+
}
|
|
345
|
+
export function filterMcpCatalog(server, catalog) {
|
|
346
|
+
const allowed = catalog.filter((tool) => mcpSessionAllowsTool(server, tool.name));
|
|
347
|
+
const hiddenNames = catalog
|
|
348
|
+
.filter((tool) => !mcpSessionAllowsTool(server, tool.name))
|
|
349
|
+
.map((tool) => tool.name)
|
|
350
|
+
.filter(Boolean)
|
|
351
|
+
.sort((left, right) => right.length - left.length);
|
|
352
|
+
if (hiddenNames.length === 0)
|
|
353
|
+
return allowed;
|
|
354
|
+
return allowed.map((tool) => ({
|
|
355
|
+
...tool,
|
|
356
|
+
...(tool.description
|
|
357
|
+
? {
|
|
358
|
+
description: hiddenNames.reduce((description, name) => description.replace(new RegExp(`(^|[^A-Za-z0-9_-])${escapeRegExp(name)}(?=$|[^A-Za-z0-9_-])`, "g"), "$1[unavailable MCP tool]"), tool.description),
|
|
359
|
+
}
|
|
360
|
+
: {}),
|
|
361
|
+
}));
|
|
362
|
+
}
|
|
363
|
+
function readConfiguredManifests(manifest) {
|
|
364
|
+
const servers = [];
|
|
365
|
+
for (const path of resolvePiPackageMcpManifestPaths(manifest)) {
|
|
366
|
+
const parsed = readJson(path);
|
|
367
|
+
servers.push(...(parsed.servers ?? []));
|
|
368
|
+
}
|
|
369
|
+
return servers;
|
|
370
|
+
}
|
|
371
|
+
function explicitAllowedTools(server) {
|
|
372
|
+
const packageIncludes = server.package_tools.include ?? [];
|
|
373
|
+
const agentIncludes = server.agent_tools.flatMap((selection) => selection.include ?? []);
|
|
374
|
+
const candidates = !packageIncludes.includes("*")
|
|
375
|
+
? packageIncludes
|
|
376
|
+
: !agentIncludes.includes("*")
|
|
377
|
+
? agentIncludes
|
|
378
|
+
: undefined;
|
|
379
|
+
if (!candidates)
|
|
380
|
+
return undefined;
|
|
381
|
+
return [...new Set(candidates)].filter((name) => mcpSessionAllowsTool(server, name));
|
|
382
|
+
}
|
|
383
|
+
async function writeWithFallback(path, serialized, defaultPath, fallbackPath) {
|
|
384
|
+
try {
|
|
385
|
+
await mkdir(dirname(path), { recursive: true });
|
|
386
|
+
await writeFile(path, serialized);
|
|
387
|
+
return path;
|
|
388
|
+
}
|
|
389
|
+
catch (err) {
|
|
390
|
+
if (path !== defaultPath)
|
|
391
|
+
throw err;
|
|
392
|
+
await mkdir(dirname(fallbackPath), { recursive: true });
|
|
393
|
+
await writeFile(fallbackPath, serialized);
|
|
394
|
+
return fallbackPath;
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
/**
|
|
398
|
+
* Project the static session policy into the config the `mcp` CLI (mcporter)
|
|
399
|
+
* reads. Header values stay `${VAR}` references — mcporter interpolates them
|
|
400
|
+
* at config load — so neither session tokens nor local dev secrets are
|
|
401
|
+
* persisted. `allowedTools` re-applies the recipe/agent tool filter inside
|
|
402
|
+
* mcporter, and `imports: []` keeps mcporter from discovering host-level
|
|
403
|
+
* configs (Cursor/Claude/VS Code) in a recipe session.
|
|
404
|
+
*/
|
|
405
|
+
export function buildMcporterConfig(session, opts = {}) {
|
|
406
|
+
const env = opts.env ?? process.env;
|
|
407
|
+
const cwd = opts.cwd ?? process.cwd();
|
|
408
|
+
return projectMcporterConfig(session, localBindings(env, cwd));
|
|
409
|
+
}
|
|
410
|
+
function projectMcporterConfig(session, bindings) {
|
|
411
|
+
const mcpServers = {};
|
|
412
|
+
for (const server of session.servers) {
|
|
413
|
+
const binding = bindings.find((candidate) => candidate.id === server.id && candidate.baseUrl === server.base_url);
|
|
414
|
+
const allowedTools = explicitAllowedTools(server);
|
|
415
|
+
mcpServers[server.id] = {
|
|
416
|
+
baseUrl: server.base_url,
|
|
417
|
+
headers: binding?.rawHeaders ?? {},
|
|
418
|
+
...(allowedTools ? { allowedTools } : {}),
|
|
419
|
+
...(binding?.localOAuth ?? {}),
|
|
420
|
+
};
|
|
421
|
+
}
|
|
422
|
+
return { imports: [], mcpServers };
|
|
423
|
+
}
|
|
424
|
+
async function writeMcporterConfig(env, cwd, session, bindings) {
|
|
425
|
+
const config = bindings
|
|
426
|
+
? projectMcporterConfig(session, bindings)
|
|
427
|
+
: buildMcporterConfig(session, { env, cwd });
|
|
428
|
+
const writtenPath = await writeWithFallback(defaultMcporterConfigPath(cwd), `${JSON.stringify(config, null, 2)}\n`, defaultMcporterConfigPath(cwd), fallbackMcporterConfigPath());
|
|
429
|
+
env[MCPORTER_CONFIG_ENV] = writtenPath;
|
|
430
|
+
return writtenPath;
|
|
431
|
+
}
|
|
432
|
+
export async function clearMcpSession(env, cwd) {
|
|
433
|
+
await stopMcpDaemon(env);
|
|
434
|
+
const configuredPath = sessionPath(env, cwd);
|
|
435
|
+
delete env[MCP_SESSION_ENV];
|
|
436
|
+
await rm(configuredPath, { force: true });
|
|
437
|
+
if (configuredPath !== defaultMcpSessionPath(cwd)) {
|
|
438
|
+
await rm(defaultMcpSessionPath(cwd), { force: true });
|
|
439
|
+
}
|
|
440
|
+
// Keep an empty mcporter config (rather than none): a stale `.pi/bin/mcp`
|
|
441
|
+
// shim from an earlier session must resolve to "no servers", never to
|
|
442
|
+
// mcporter's host-level config discovery.
|
|
443
|
+
await writeMcporterConfig(env, cwd, { version: 1, servers: [] });
|
|
444
|
+
}
|
|
445
|
+
export async function materializeMcpSession(opts) {
|
|
446
|
+
const env = opts.env ?? process.env;
|
|
447
|
+
const agentSelections = opts.agentMcp ?? [];
|
|
448
|
+
const endpointBindingList = endpointBindings(env, opts.cwd, opts.localConfig);
|
|
449
|
+
const bindings = new Map(endpointBindingList.map((binding) => [binding.id, binding]));
|
|
450
|
+
const configured = new Map(readConfiguredManifests(opts.manifest).map((server) => [
|
|
451
|
+
safeServerId(server.id),
|
|
452
|
+
server,
|
|
453
|
+
]));
|
|
454
|
+
const policy = recipeMcpPolicy(opts.manifest.mcp);
|
|
455
|
+
const available = new Set([...bindings.keys(), ...configured.keys()]);
|
|
456
|
+
const missingRequired = [...policy.required].filter((serverId) => !available.has(serverId));
|
|
457
|
+
if (missingRequired.length > 0) {
|
|
458
|
+
throw new McpBindingError(missingRequired, missingRequired.flatMap((serverId) => generatedBindingEnvVars(serverId)));
|
|
459
|
+
}
|
|
460
|
+
const diagnostics = [];
|
|
461
|
+
const servers = [];
|
|
462
|
+
for (const packageServer of opts.manifest.mcp.servers) {
|
|
463
|
+
const id = safeServerId(packageServer.id);
|
|
464
|
+
const selected = agentSelections
|
|
465
|
+
.filter((selection) => selection.serverId === id)
|
|
466
|
+
.map((selection) => selection.tools);
|
|
467
|
+
if (selected.length === 0 || selected.every((entry) => entry.include?.length === 0)) {
|
|
468
|
+
continue;
|
|
469
|
+
}
|
|
470
|
+
const binding = bindings.get(id);
|
|
471
|
+
const declared = configured.get(id);
|
|
472
|
+
if (!binding && !declared)
|
|
473
|
+
continue;
|
|
474
|
+
const baseUrl = binding?.baseUrl ?? declared.base_url;
|
|
475
|
+
const catalogPolicy = {
|
|
476
|
+
package_tools: packageServer.tools,
|
|
477
|
+
agent_tools: selected,
|
|
478
|
+
};
|
|
479
|
+
const catalog = filterMcpCatalog(catalogPolicy, declared?.tools ?? []);
|
|
480
|
+
if (declared?.tools && catalog.length === 0) {
|
|
481
|
+
diagnostics.push({
|
|
482
|
+
code: "mcp.tools_filtered",
|
|
483
|
+
serverId: id,
|
|
484
|
+
url: baseUrl,
|
|
485
|
+
stage: "filter",
|
|
486
|
+
message: "The configured catalog contains no tools allowed by both package and agent policy.",
|
|
487
|
+
});
|
|
488
|
+
continue;
|
|
489
|
+
}
|
|
490
|
+
servers.push({
|
|
491
|
+
id,
|
|
492
|
+
name: binding?.name ?? declared?.name ?? id,
|
|
493
|
+
base_url: baseUrl,
|
|
494
|
+
package_tools: packageServer.tools,
|
|
495
|
+
agent_tools: selected,
|
|
496
|
+
...(declared?.tools ? { catalog } : {}),
|
|
497
|
+
});
|
|
498
|
+
}
|
|
499
|
+
const session = {
|
|
500
|
+
version: 1,
|
|
501
|
+
servers,
|
|
502
|
+
};
|
|
503
|
+
const defaultPath = defaultMcpSessionPath(opts.cwd);
|
|
504
|
+
const target = sessionPath(env, opts.cwd);
|
|
505
|
+
const serialized = `${JSON.stringify(session, null, 2)}\n`;
|
|
506
|
+
const fingerprint = createHash("sha256").update(serialized).digest("hex").slice(0, 20);
|
|
507
|
+
const previousFingerprint = env[MCP_DAEMON_FINGERPRINT_ENV];
|
|
508
|
+
const previousToken = env[MCP_DAEMON_TOKEN_ENV];
|
|
509
|
+
if (previousFingerprint &&
|
|
510
|
+
previousFingerprint !== fingerprint) {
|
|
511
|
+
await stopMcpDaemon(env);
|
|
512
|
+
}
|
|
513
|
+
const writtenPath = await writeWithFallback(target, serialized, defaultPath, fallbackMcpSessionPath());
|
|
514
|
+
env[MCP_SESSION_ENV] = writtenPath;
|
|
515
|
+
env[MCP_DAEMON_FINGERPRINT_ENV] = fingerprint;
|
|
516
|
+
env[MCP_DAEMON_PARENT_PID_ENV] = String(process.pid);
|
|
517
|
+
const socketKey = createHash("sha256")
|
|
518
|
+
.update(`${opts.cwd}\0${fingerprint}`)
|
|
519
|
+
.digest("hex")
|
|
520
|
+
.slice(0, 20);
|
|
521
|
+
env[MCP_DAEMON_SOCKET_ENV] =
|
|
522
|
+
process.platform === "win32"
|
|
523
|
+
? `\\\\.\\pipe\\pi-recipes-mcp-${socketKey}`
|
|
524
|
+
: join(tmpdir(), `pi-recipes-mcp-${socketKey}.sock`);
|
|
525
|
+
// Re-materialization with identical policy must not strand a running daemon
|
|
526
|
+
// behind a newly rotated client token. Rotate only when the session changes.
|
|
527
|
+
env[MCP_DAEMON_TOKEN_ENV] =
|
|
528
|
+
previousFingerprint === fingerprint && previousToken
|
|
529
|
+
? previousToken
|
|
530
|
+
: randomBytes(32).toString("hex");
|
|
531
|
+
await writeMcporterConfig(env, opts.cwd, session, endpointBindingList);
|
|
532
|
+
return { ...session, diagnostics };
|
|
533
|
+
}
|
|
534
|
+
export async function stopMcpDaemon(env) {
|
|
535
|
+
const socketPath = env[MCP_DAEMON_SOCKET_ENV];
|
|
536
|
+
const token = env[MCP_DAEMON_TOKEN_ENV];
|
|
537
|
+
if (socketPath && token) {
|
|
538
|
+
await new Promise((resolve) => {
|
|
539
|
+
const socket = createConnection(socketPath);
|
|
540
|
+
const finish = () => {
|
|
541
|
+
socket.destroy();
|
|
542
|
+
resolve();
|
|
543
|
+
};
|
|
544
|
+
socket.setTimeout(500, finish);
|
|
545
|
+
socket.once("connect", () => {
|
|
546
|
+
socket.end(`${JSON.stringify({ type: "stop", id: randomUUID(), token })}\n`);
|
|
547
|
+
});
|
|
548
|
+
socket.once("end", finish);
|
|
549
|
+
socket.once("error", finish);
|
|
550
|
+
});
|
|
551
|
+
}
|
|
552
|
+
delete env[MCP_DAEMON_SOCKET_ENV];
|
|
553
|
+
delete env[MCP_DAEMON_TOKEN_ENV];
|
|
554
|
+
delete env[MCP_DAEMON_FINGERPRINT_ENV];
|
|
555
|
+
delete env[MCP_DAEMON_PARENT_PID_ENV];
|
|
556
|
+
delete env[MCP_SESSION_ROOT_ENV];
|
|
557
|
+
}
|
|
558
|
+
//# sourceMappingURL=mcp.js.map
|
package/dist/mcp.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAClE,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,EACzB,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,gCAAgC,GAIjC,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAgGjE;;;GAGG;AACH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAK7B;IAEA;IANO,IAAI,GAAG,iBAAiB,CAAC;IAE3C;IACE,sDAAsD;IAC7C,OAA0B;IACnC,0EAA0E;IACjE,eAAkC;QAE3C,KAAK,CACH,2CAA2C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;YAC7D,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC;gBACzB,CAAC,CAAC,yCAAyC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;gBACxE,CAAC,CAAC,EAAE,CAAC,CACV,CAAC;QATO,YAAO,GAAP,OAAO,CAAmB;QAE1B,oBAAe,GAAf,eAAe,CAAmB;IAQ7C,CAAC;CACF;AAMD,MAAM,iBAAiB,GAAG,aAAa,CAAC;AACxC,MAAM,eAAe,GAAG,GAAG,iBAAiB,aAAa,CAAC;AAC1D,6EAA6E;AAC7E,2EAA2E;AAC3E,MAAM,mBAAmB,GAAG,iBAAiB,CAAC;AAC9C,MAAM,oBAAoB,GAAG,GAAG,iBAAiB,kBAAkB,CAAC;AACpE,MAAM,eAAe,GAAG,GAAG,iBAAiB,aAAa,CAAC;AAE1D,MAAM,oBAAoB,GAAG;IAC3B,eAAe;IACf,mBAAmB;IACnB,oBAAoB;IACpB,eAAe;IACf,0BAA0B;IAC1B,yBAAyB;IACzB,qBAAqB;IACrB,oBAAoB;IACpB,oBAAoB;CACZ,CAAC;AAOX,kFAAkF;AAClF,MAAM,UAAU,sBAAsB,CACpC,GAAsB;IAEtB,MAAM,cAAc,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACpC,OAAO;QACL,OAAO,EAAE,cAAc;QACvB,MAAM,EAAE,MAAM,CAAC,WAAW,CACxB,CAAC,GAAG,oBAAoB,EAAE,cAAc,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CACxE;KACF,CAAC;AACJ,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,qBAAqB,CACnC,GAAsB,EACtB,QAAgC;IAEhC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3D,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;QAClB,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACnB,CAAC;IACH,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAsB;IAC1D,KAAK,MAAM,GAAG,IAAI,oBAAoB,EAAE,CAAC;QACvC,IAAI,GAAG,KAAK,oBAAoB;YAAE,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;IACpD,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,GAAW;IAC/C,OAAO,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,kBAAkB,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,UAAU,sBAAsB;IACpC,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,YAAY,EAAE,kBAAkB,CAAC,CAAC;AAC1D,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,GAAW;IACnD,OAAO,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC;AAC3C,CAAC;AAED,MAAM,UAAU,0BAA0B;IACxC,OAAO,IAAI,CAAC,MAAM,EAAE,EAAE,YAAY,EAAE,eAAe,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,GAAW;IACnD,OAAO,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,gBAAgB,CAAC,CAAC;AAC5C,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,IAIzC;IACC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACpC,MAAM,UAAU,GAAG,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAC7C,IAAI,UAAU;QAAE,OAAO,UAAU,CAAC;IAElC,MAAM,eAAe,GAAG,yBAAyB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC5D,IAAI,UAAU,CAAC,eAAe,CAAC;QAAE,OAAO,eAAe,CAAC;IAExD,MAAM,YAAY,GAAG,yBAAyB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAC/D,OAAO,UAAU,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS,CAAC;AAC7D,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,IAI3C;IACC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACpC,MAAM,IAAI,GAAG,yBAAyB,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC;IACzD,IAAI,CAAC,IAAI;QAAE,OAAO,SAAS,CAAC;IAC5B,GAAG,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAAC;IACjC,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,GAAW;IAC1C,OAAO,IAAI,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,yBAAyB;IACvC,OAAO,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,kBAAkB,CAAC,IAAY;IACtC,MAAM,QAAQ,GAAG,aAAa,CAAC,IAAI,GAAG,CAAC,KAAK,IAAI,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACtE,IAAI,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,QAAQ,CAAC;IAC1C,OAAO,aAAa,CAAC,IAAI,GAAG,CAAC,WAAW,IAAI,EAAE,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,OAAO,kBAAkB,CAAC,YAAY,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,uBAAuB;IACrC,OAAO,kBAAkB,CAAC,eAAe,CAAC,CAAC;AAC7C,CAAC;AAED,MAAM,UAAU,mBAAmB,CACjC,QAAQ,GAAG,OAAO,CAAC,QAAQ,EAC3B,IAAI,GAAG,OAAO,CAAC,IAAI;IAEnB,MAAM,UAAU,GAAG,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,YAAY,CAAC;IAC1E,MAAM,iBAAiB,GAAG,aAAa,CACrC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,2BAA2B,CAAC,CACjD,CAAC;IACF,MAAM,SAAS,GAAG,OAAO,CACvB,OAAO,CAAC,iBAAiB,CAAC,EAC1B,IAAI,EACJ,QAAQ,EACR,YAAY,EACZ,GAAG,QAAQ,IAAI,IAAI,EAAE,EACrB,UAAU,CACX,CAAC;IACF,OAAO,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;AACvD,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC;AAC7C,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAa;IACtC,OAAO,KAAK,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AAC3C,CAAC;AAED,SAAS,OAAO,CAAC,GAAsB;IACrC,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC;AAChF,CAAC;AAED,SAAS,WAAW,CAAC,GAAsB,EAAE,GAAW;IACtD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACzB,MAAM,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;IAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACzD,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,OAAO;IAClC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAAC,IAG9C;IACC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACpC,GAAG,CAAC,oBAAoB,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;IACrC,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IACrC,MAAM,YAAY,GAAG,mBAAmB,EAAE,CAAC;IAC3C,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CACb,wCAAwC,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,GAAG,CAC5E,CAAC;IACJ,CAAC;IACD,IAAI,YAAY,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjD,MAAM,MAAM,CAAC,YAAY,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE;YAC1D,MAAM,KAAK,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;YACjC,MAAM,MAAM,CAAC,YAAY,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC;IACD,qEAAqE;IACrE,wEAAwE;IACxE,wEAAwE;IACxE,uEAAuE;IACvE,wDAAwD;IACxD,MAAM,MAAM,GAAG;QACb,WAAW;QACX,+BAA+B,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;QACrD,oCAAoC;QACpC,SAAS,mBAAmB,KAAK,iBAAiB,CAAC,yBAAyB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI;QAC3F,UAAU,mBAAmB,EAAE;QAC/B,eAAe,qBAAqB,cAAc;QAClD,GAAG,CAAC,YAAY;YACd,CAAC,CAAC;gBACE,KAAK,UAAU,CAAC,YAAY,CAAC,OAAO;gBACpC,oBAAoB;gBACpB,sEAAsE;gBACtE,KAAK,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,uBAAuB,EAAE,CAAC,iBAAiB;gBAC3F,wBAAwB;gBACxB,6EAA6E;gBAC7E,UAAU,UAAU,CAAC,YAAY,CAAC,OAAO;aAC1C;YACH,CAAC,CAAC;gBACE,UAAU,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,uBAAuB,EAAE,CAAC,OAAO;aACvF,CAAC;QACN,IAAI;QACJ,QAAQ,UAAU,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,UAAU,CAAC,oBAAoB,EAAE,CAAC,OAAO;QACjF,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACzC,MAAM,SAAS,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAClC,MAAM,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC7B,GAAG,CAAC,eAAe,CAAC,GAAG,MAAM,CAAC;IAC9B,WAAW,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACzB,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AAC9B,CAAC;AAED,SAAS,WAAW,CAAC,GAAsB,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IAC9D,OAAO,GAAG,CAAC,eAAe,CAAC,IAAI,qBAAqB,CAAC,GAAG,CAAC,CAAC;AAC5D,CAAC;AAED,SAAS,kBAAkB,CAAC,GAAsB,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE;IACrE,OAAO,GAAG,CAAC,oBAAoB,CAAC,IAAI,yBAAyB,CAAC,GAAG,CAAC,CAAC;AACrE,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,MAAM,EAAE,GAAG,KAAK;SACb,IAAI,EAAE;SACN,WAAW,EAAE;SACb,OAAO,CAAC,eAAe,EAAE,GAAG,CAAC;SAC7B,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC3B,OAAO,EAAE,IAAI,KAAK,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAa;IAChD,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;AAC7B,CAAC;AAED,SAAS,UAAU,CAAC,KAAa;IAC/B,IAAI,CAAC;QACH,OAAO,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;IAC/C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,KAAa,EAAE,GAAsB;IAC3D,OAAO,KAAK,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC,MAAM,EAAE,IAAY,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAC1F,CAAC;AAED,SAAS,QAAQ,CAAC,IAAY;IAC5B,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAY,CAAC;AAC3D,CAAC;AAED,SAAS,mBAAmB,CAC1B,GAAsB,EACtB,GAAW,EACX,WAA4B;IAE5B,IAAI,WAAW,EAAE,CAAC;QAChB,OAAO,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,CAAC;IACD,MAAM,IAAI,GAAG,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC1C,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAA0B,CAAC;QACvD,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAE,MAAM,CAAC,OAA4B,CAAC,CAAC,CAAC,EAAE,CAAC;IACnF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CACpB,GAAsB,EACtB,GAAW,EACX,WAA4B;IAE5B,OAAO,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE;QACnE,IAAI,MAAM,CAAC,SAAS,IAAI,MAAM,CAAC,SAAS,KAAK,iBAAiB;YAAE,OAAO,EAAE,CAAC;QAC1E,MAAM,OAAO,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,cAAc,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,EAAE,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC;QACzE,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;QACxC,MAAM,UAAU,GACd,MAAM,CAAC,IAAI,KAAK,OAAO;YACrB,CAAC,CAAC;gBACE,IAAI,EAAE,OAAO;gBACb,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxE,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/D,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,MAAM,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACxE,GAAG,CAAC,MAAM,CAAC,oBAAoB;oBAC7B,CAAC,CAAC,EAAE,oBAAoB,EAAE,MAAM,CAAC,oBAAoB,EAAE;oBACvD,CAAC,CAAC,EAAE,CAAC;gBACP,GAAG,CAAC,MAAM,CAAC,4BAA4B;oBACrC,CAAC,CAAC,EAAE,4BAA4B,EAAE,MAAM,CAAC,4BAA4B,EAAE;oBACvE,CAAC,CAAC,EAAE,CAAC;gBACP,GAAG,CAAC,MAAM,CAAC,gBAAgB;oBACzB,CAAC,CAAC,EAAE,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,EAAE;oBAC/C,CAAC,CAAC,EAAE,CAAC;gBACP,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC/D,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC7D;YACH,CAAC,CAAC,SAAS,CAAC;QAChB,OAAO,CAAC;gBACN,EAAE,EAAE,YAAY,CAAC,MAAM,CAAC,EAAE,IAAI,KAAK,CAAC;gBACpC,IAAI,EAAE,KAAK;gBACX,OAAO;gBACP,UAAU;gBACV,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACtC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,gBAAgB,CACvB,GAAsB,EACtB,GAAW,EACX,WAA4B;IAE5B,MAAM,UAAU,GAAG,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,MAAM,QAAQ,GAAyB,EAAE,CAAC;IAC1C,KAAK,MAAM,OAAO,IAAI,UAAU,EAAE,CAAC;QACjC,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QAC/C,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC5B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACd,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAOD,MAAM,UAAU,yBAAyB,CACvC,GAAiE;IAEjE,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,EAAE,EAAE,CAAC,CAAC;QAC/D,QAAQ,EAAE,YAAY,CAAC,QAAQ,CAAC;QAChC,KAAK,EAAE,SAAS;KACjB,CAAC,CAAC,CAAC;AACN,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,KAAwB;IAChE,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,WAAkD,EAClD,KAAK,GAAG,CAAC;IAET,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE;QACxC,OAAO,GAAG,UAAU,CAAC,QAAQ,IAAI,UAAU,CAAC,KAAK,KAAK,UAAU,CAAC,IAAI,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC;IAClG,CAAC,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC;IACvD,IAAI,SAAS,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS,mCAAmC,CAAC,CAAC;IAC/E,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,SAAS,eAAe,CAAC,GAA2B;IAIlD,OAAO;QACL,QAAQ,EAAE,IAAI,GAAG,CACf,GAAG,CAAC,OAAO;aACR,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC;aACnC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAC5C;QACD,KAAK,EAAE,IAAI,GAAG,CACZ,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CACrE;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,SAAiC,EACjC,QAAgB;IAEhB,MAAM,QAAQ,GAAG,SAAS,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;QACpD,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;QAChC,OAAO,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,QAAQ,CAAC;IACjD,CAAC,CAAC,IAAI,KAAK,CAAC;IACZ,IAAI,CAAC,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5B,OAAO,CAAC,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,QAAQ,CAAC,CAAC;AACrF,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,MAA+D,EAC/D,QAAgB;IAEhB,OAAO,CACL,sBAAsB,CAAC,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC;QACtD,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CACpC,sBAAsB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAC5C,CACF,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE,MAAM,CAAC,CAAC;AACtD,CAAC;AAED,MAAM,UAAU,gBAAgB,CAC9B,MAA+D,EAC/D,OAAuC;IAEvC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CACtC,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CACxC,CAAC;IACF,MAAM,WAAW,GAAG,OAAO;SACxB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;SAC1D,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC;SACxB,MAAM,CAAC,OAAO,CAAC;SACf,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IACrD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IAC7C,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC5B,GAAG,IAAI;QACP,GAAG,CAAC,IAAI,CAAC,WAAW;YAClB,CAAC,CAAC;gBACE,WAAW,EAAE,WAAW,CAAC,MAAM,CAC7B,CAAC,WAAW,EAAE,IAAI,EAAE,EAAE,CACpB,WAAW,CAAC,OAAO,CACjB,IAAI,MAAM,CACR,qBAAqB,YAAY,CAAC,IAAI,CAAC,sBAAsB,EAC7D,GAAG,CACJ,EACD,0BAA0B,CAC3B,EACH,IAAI,CAAC,WAAW,CACjB;aACF;YACH,CAAC,CAAC,EAAE,CAAC;KACR,CAAC,CAAC,CAAC;AACN,CAAC;AAaD,SAAS,uBAAuB,CAC9B,QAA+B;IAE/B,MAAM,OAAO,GAA0B,EAAE,CAAC;IAC1C,KAAK,MAAM,IAAI,IAAI,gCAAgC,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC9D,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAA0B,CAAC;QACvD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,oBAAoB,CAAC,MAAwB;IACpD,MAAM,eAAe,GAAG,MAAM,CAAC,aAAa,CAAC,OAAO,IAAI,EAAE,CAAC;IAC3D,MAAM,aAAa,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAC9C,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,OAAO,IAAI,EAAE,CACvC,CAAC;IACF,MAAM,UAAU,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,GAAG,CAAC;QAC/C,CAAC,CAAC,eAAe;QACjB,CAAC,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC;YAC5B,CAAC,CAAC,aAAa;YACf,CAAC,CAAC,SAAS,CAAC;IAChB,IAAI,CAAC,UAAU;QAAE,OAAO,SAAS,CAAC;IAClC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAC9C,oBAAoB,CAAC,MAAM,EAAE,IAAI,CAAC,CACnC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,iBAAiB,CAC9B,IAAY,EACZ,UAAkB,EAClB,WAAmB,EACnB,YAAoB;IAEpB,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,MAAM,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAClC,OAAO,IAAI,CAAC;IACd,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,IAAI,IAAI,KAAK,WAAW;YAAE,MAAM,GAAG,CAAC;QACpC,MAAM,KAAK,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACxD,MAAM,SAAS,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;QAC1C,OAAO,YAAY,CAAC;IACtB,CAAC;AACH,CAAC;AAsBD;;;;;;;GAOG;AACH,MAAM,UAAU,mBAAmB,CACjC,OAAyB,EACzB,OAAkD,EAAE;IAEpD,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACpC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC;IACtC,OAAO,qBAAqB,CAAC,OAAO,EAAE,aAAa,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AACjE,CAAC;AAED,SAAS,qBAAqB,CAC5B,OAAyB,EACzB,QAAuC;IAEvC,MAAM,UAAU,GAAyC,EAAE,CAAC;IAC5D,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACrC,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAC3B,CAAC,SAAS,EAAE,EAAE,CACZ,SAAS,CAAC,EAAE,KAAK,MAAM,CAAC,EAAE,IAAI,SAAS,CAAC,OAAO,KAAK,MAAM,CAAC,QAAQ,CACtE,CAAC;QACF,MAAM,YAAY,GAAG,oBAAoB,CAAC,MAAM,CAAC,CAAC;QAClD,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG;YACtB,OAAO,EAAE,MAAM,CAAC,QAAQ;YACxB,OAAO,EAAE,OAAO,EAAE,UAAU,IAAI,EAAE;YAClC,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACzC,GAAG,CAAC,OAAO,EAAE,UAAU,IAAI,EAAE,CAAC;SAC/B,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC;AACrC,CAAC;AAED,KAAK,UAAU,mBAAmB,CAChC,GAAsB,EACtB,GAAW,EACX,OAAyB,EACzB,QAAwC;IAExC,MAAM,MAAM,GAAG,QAAQ;QACrB,CAAC,CAAC,qBAAqB,CAAC,OAAO,EAAE,QAAQ,CAAC;QAC1C,CAAC,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC;IAC/C,MAAM,WAAW,GAAG,MAAM,iBAAiB,CACzC,yBAAyB,CAAC,GAAG,CAAC,EAC9B,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EACtC,yBAAyB,CAAC,GAAG,CAAC,EAC9B,0BAA0B,EAAE,CAC7B,CAAC;IACF,GAAG,CAAC,mBAAmB,CAAC,GAAG,WAAW,CAAC;IACvC,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,GAAsB,EACtB,GAAW;IAEX,MAAM,aAAa,CAAC,GAAG,CAAC,CAAC;IACzB,MAAM,cAAc,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;IAC7C,OAAO,GAAG,CAAC,eAAe,CAAC,CAAC;IAC5B,MAAM,EAAE,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1C,IAAI,cAAc,KAAK,qBAAqB,CAAC,GAAG,CAAC,EAAE,CAAC;QAClD,MAAM,EAAE,CAAC,qBAAqB,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC;IACD,0EAA0E;IAC1E,sEAAsE;IACtE,0CAA0C;IAC1C,MAAM,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,IAAkC;IAElC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACpC,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;IAC5C,MAAM,mBAAmB,GAAG,gBAAgB,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;IAC9E,MAAM,QAAQ,GAAG,IAAI,GAAG,CACtB,mBAAmB,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAC5D,CAAC;IACF,MAAM,UAAU,GAAG,IAAI,GAAG,CACxB,uBAAuB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC;QACrD,YAAY,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,MAAM;KACP,CAAC,CACH,CAAC;IACF,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IAClD,MAAM,SAAS,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,IAAI,EAAE,EAAE,GAAG,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACtE,MAAM,eAAe,GAAG,CAAC,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC,MAAM,CACjD,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CACvC,CAAC;IACF,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,eAAe,CACvB,eAAe,EACf,eAAe,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,uBAAuB,CAAC,QAAQ,CAAC,CAAC,CACzE,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAiC,EAAE,CAAC;IACrD,MAAM,OAAO,GAAuB,EAAE,CAAC;IACvC,KAAK,MAAM,aAAa,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;QACtD,MAAM,EAAE,GAAG,YAAY,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,eAAe;aAC7B,MAAM,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,QAAQ,KAAK,EAAE,CAAC;aAChD,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACvC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,EAAE,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;YACpF,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACjC,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,OAAO,IAAI,CAAC,QAAQ;YAAE,SAAS;QACpC,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,QAAS,CAAC,QAAQ,CAAC;QACvD,MAAM,aAAa,GAAG;YACpB,aAAa,EAAE,aAAa,CAAC,KAAK;YAClC,WAAW,EAAE,QAAQ;SACtB,CAAC;QACF,MAAM,OAAO,GAAG,gBAAgB,CAC9B,aAAa,EACb,QAAQ,EAAE,KAAK,IAAI,EAAE,CACtB,CAAC;QACF,IAAI,QAAQ,EAAE,KAAK,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5C,WAAW,CAAC,IAAI,CAAC;gBACf,IAAI,EAAE,oBAAoB;gBAC1B,QAAQ,EAAE,EAAE;gBACZ,GAAG,EAAE,OAAO;gBACZ,KAAK,EAAE,QAAQ;gBACf,OAAO,EAAE,oFAAoF;aAC9F,CAAC,CAAC;YACH,SAAS;QACX,CAAC;QACD,OAAO,CAAC,IAAI,CAAC;YACX,EAAE;YACF,IAAI,EAAE,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,IAAI,IAAI,EAAE;YAC3C,QAAQ,EAAE,OAAO;YACjB,aAAa,EAAE,aAAa,CAAC,KAAK;YAClC,WAAW,EAAE,QAAQ;YACrB,GAAG,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACxC,CAAC,CAAC;IACL,CAAC;IAED,MAAM,OAAO,GAAqB;QAChC,OAAO,EAAE,CAAC;QACV,OAAO;KACR,CAAC;IACF,MAAM,WAAW,GAAG,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpD,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;IAC3D,MAAM,WAAW,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACvF,MAAM,mBAAmB,GAAG,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAC5D,MAAM,aAAa,GAAG,GAAG,CAAC,oBAAoB,CAAC,CAAC;IAChD,IACE,mBAAmB;QACnB,mBAAmB,KAAK,WAAW,EACnC,CAAC;QACD,MAAM,aAAa,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IACD,MAAM,WAAW,GAAG,MAAM,iBAAiB,CACzC,MAAM,EACN,UAAU,EACV,WAAW,EACX,sBAAsB,EAAE,CACzB,CAAC;IACF,GAAG,CAAC,eAAe,CAAC,GAAG,WAAW,CAAC;IACnC,GAAG,CAAC,0BAA0B,CAAC,GAAG,WAAW,CAAC;IAC9C,GAAG,CAAC,yBAAyB,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC;SACnC,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,KAAK,WAAW,EAAE,CAAC;SACrC,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAChB,GAAG,CAAC,qBAAqB,CAAC;QACxB,OAAO,CAAC,QAAQ,KAAK,OAAO;YAC1B,CAAC,CAAC,+BAA+B,SAAS,EAAE;YAC5C,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,kBAAkB,SAAS,OAAO,CAAC,CAAC;IACzD,4EAA4E;IAC5E,6EAA6E;IAC7E,GAAG,CAAC,oBAAoB,CAAC;QACvB,mBAAmB,KAAK,WAAW,IAAI,aAAa;YAClD,CAAC,CAAC,aAAa;YACf,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACtC,MAAM,mBAAmB,CAAC,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,mBAAmB,CAAC,CAAC;IACvE,OAAO,EAAE,GAAG,OAAO,EAAE,WAAW,EAAE,CAAC;AACrC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,GAAsB;IACxD,MAAM,UAAU,GAAG,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACxC,IAAI,UAAU,IAAI,KAAK,EAAE,CAAC;QACxB,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,EAAE;YAClC,MAAM,MAAM,GAAG,gBAAgB,CAAC,UAAU,CAAC,CAAC;YAC5C,MAAM,MAAM,GAAG,GAAG,EAAE;gBAClB,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC;YACF,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YAC/B,MAAM,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,EAAE;gBAC1B,MAAM,CAAC,GAAG,CACR,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,IAAI,CACjE,CAAC;YACJ,CAAC,CAAC,CAAC;YACH,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;YAC3B,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,GAAG,CAAC,qBAAqB,CAAC,CAAC;IAClC,OAAO,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACjC,OAAO,GAAG,CAAC,0BAA0B,CAAC,CAAC;IACvC,OAAO,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACtC,OAAO,GAAG,CAAC,oBAAoB,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type ExtensionFactory, type ModelRegistry } from "@earendil-works/pi-coding-agent";
|
|
2
|
+
import { type RecipeChildToolEvent } from "./child-agent.js";
|
|
3
|
+
export interface RecipesExtensionOptions {
|
|
4
|
+
env?: NodeJS.ProcessEnv;
|
|
5
|
+
createChildAgentRunner?: CreateRecipeChildAgentRunner;
|
|
6
|
+
}
|
|
7
|
+
/** @deprecated Use `RecipesExtensionOptions`. */
|
|
8
|
+
export type PiRecipesExtensionOptions = RecipesExtensionOptions;
|
|
9
|
+
interface RecipeChildAgentRunner {
|
|
10
|
+
start(): Promise<void>;
|
|
11
|
+
prompt(prompt: string): Promise<unknown>;
|
|
12
|
+
steer(message: string): Promise<void>;
|
|
13
|
+
cancel(): Promise<void>;
|
|
14
|
+
shutdown(): Promise<void>;
|
|
15
|
+
}
|
|
16
|
+
type CreateRecipeChildAgentRunner = (opts: {
|
|
17
|
+
recipeDir: string;
|
|
18
|
+
workspaceDir: string;
|
|
19
|
+
agentName: string;
|
|
20
|
+
env?: NodeJS.ProcessEnv;
|
|
21
|
+
modelRegistry?: ModelRegistry;
|
|
22
|
+
onAssistantMessage?: (text: string, stream: "delta" | "final") => void;
|
|
23
|
+
onToolEvent?: (event: RecipeChildToolEvent) => void;
|
|
24
|
+
}) => RecipeChildAgentRunner;
|
|
25
|
+
export declare function createRecipesExtension(opts?: RecipesExtensionOptions): ExtensionFactory;
|
|
26
|
+
/** @deprecated Use `createRecipesExtension`. */
|
|
27
|
+
export declare const createPiRecipesExtension: typeof createRecipesExtension;
|
|
28
|
+
declare const _default: ExtensionFactory;
|
|
29
|
+
export default _default;
|
|
30
|
+
//# sourceMappingURL=pi-extension.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pi-extension.d.ts","sourceRoot":"","sources":["../src/pi-extension.ts"],"names":[],"mappings":"AAIA,OAAO,EAGL,KAAK,gBAAgB,EACrB,KAAK,aAAa,EACnB,MAAM,iCAAiC,CAAC;AAEzC,OAAO,EAGL,KAAK,oBAAoB,EAC1B,MAAM,kBAAkB,CAAC;AAsC1B,MAAM,WAAW,uBAAuB;IACtC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,sBAAsB,CAAC,EAAE,4BAA4B,CAAC;CACvD;AAED,iDAAiD;AACjD,MAAM,MAAM,yBAAyB,GAAG,uBAAuB,CAAC;AAEhE,UAAU,sBAAsB;IAC9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACvB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACxB,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC3B;AAED,KAAK,4BAA4B,GAAG,CAAC,IAAI,EAAE;IACzC,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,kBAAkB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,KAAK,IAAI,CAAC;IACvE,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,oBAAoB,KAAK,IAAI,CAAC;CACrD,KAAK,sBAAsB,CAAC;AA0U7B,wBAAgB,sBAAsB,CACpC,IAAI,GAAE,uBAA4B,GACjC,gBAAgB,CA2rBlB;AAED,gDAAgD;AAChD,eAAO,MAAM,wBAAwB,+BAAyB,CAAC;;AAE/D,wBAAwC"}
|