@introspection-ai/recipes 0.13.0 → 0.14.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +45 -58
- package/dist/{agent-tool.d.ts → agents.d.ts} +4 -1
- package/dist/agents.d.ts.map +1 -0
- package/dist/{agent-tool.js → agents.js} +1 -1
- package/dist/agents.js.map +1 -0
- package/dist/api/extensions.d.ts +3 -0
- package/dist/api/extensions.d.ts.map +1 -0
- package/dist/api/extensions.js +2 -0
- package/dist/api/extensions.js.map +1 -0
- package/dist/api/mcp.d.ts +4 -0
- package/dist/api/mcp.d.ts.map +1 -0
- package/dist/api/mcp.js +2 -0
- package/dist/api/mcp.js.map +1 -0
- package/dist/api/session.d.ts +3 -0
- package/dist/api/session.d.ts.map +1 -0
- package/dist/api/session.js +2 -0
- package/dist/api/session.js.map +1 -0
- package/dist/child-agent.d.ts +5 -4
- package/dist/child-agent.d.ts.map +1 -1
- package/dist/child-agent.js +26 -117
- package/dist/child-agent.js.map +1 -1
- package/dist/child-session.d.ts +23 -0
- package/dist/child-session.d.ts.map +1 -0
- package/dist/child-session.js +48 -0
- package/dist/child-session.js.map +1 -0
- package/dist/extensions.d.ts +29 -0
- package/dist/extensions.d.ts.map +1 -0
- package/dist/extensions.js +119 -0
- package/dist/extensions.js.map +1 -0
- package/dist/index.d.ts +4 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -13
- package/dist/index.js.map +1 -1
- package/dist/inspect.d.ts +38 -5
- package/dist/inspect.d.ts.map +1 -1
- package/dist/inspect.js +92 -41
- package/dist/inspect.js.map +1 -1
- package/dist/interactions.d.ts +18 -2
- package/dist/interactions.d.ts.map +1 -1
- package/dist/interactions.js +41 -10
- package/dist/interactions.js.map +1 -1
- package/dist/mcp-catalog.d.ts +1 -0
- package/dist/mcp-catalog.d.ts.map +1 -1
- package/dist/mcp-catalog.js +14 -6
- package/dist/mcp-catalog.js.map +1 -1
- package/dist/mcp-chunks/auth-command-ZLGYIEUY.js +273 -0
- package/dist/mcp-chunks/call-arguments-LU3W6D3K.js +13 -0
- package/dist/mcp-chunks/call-command-LKTKSYTH.js +612 -0
- package/dist/mcp-chunks/chunk-2U4BSDC4.js +3951 -0
- package/dist/mcp-chunks/chunk-2XL7MG7R.js +272 -0
- package/dist/mcp-chunks/chunk-3BJA27PY.js +2321 -0
- package/dist/mcp-chunks/chunk-4SQKWYFF.js +15 -0
- package/dist/mcp-chunks/chunk-5QOSCSQB.js +290 -0
- package/dist/mcp-chunks/chunk-6W5QFASN.js +77 -0
- package/dist/mcp-chunks/chunk-6XCZGU3G.js +1004 -0
- package/dist/mcp-chunks/chunk-7FHEBT5G.js +149 -0
- package/dist/mcp-chunks/chunk-7KA2VJVZ.js +114 -0
- package/dist/mcp-chunks/chunk-7UDVSOOF.js +138 -0
- package/dist/mcp-chunks/chunk-BNV3TPE4.js +66 -0
- package/dist/mcp-chunks/chunk-BTLAWHTA.js +129 -0
- package/dist/mcp-chunks/chunk-BV56DXPW.js +13 -0
- package/dist/mcp-chunks/chunk-BWHIA4PC.js +90 -0
- package/dist/mcp-chunks/chunk-BZIQOWE6.js +267 -0
- package/dist/mcp-chunks/chunk-D3MRAZ6H.js +16140 -0
- package/dist/mcp-chunks/chunk-DHBE7UBH.js +750 -0
- package/dist/mcp-chunks/chunk-E22DYOW5.js +251 -0
- package/dist/mcp-chunks/chunk-ECIVB7P4.js +139 -0
- package/dist/mcp-chunks/chunk-HKRJ6O36.js +1076 -0
- package/dist/mcp-chunks/chunk-IABRYROW.js +44 -0
- package/dist/mcp-chunks/chunk-J6LYIZXN.js +45 -0
- package/dist/mcp-chunks/chunk-L7NTQVYN.js +161 -0
- package/dist/mcp-chunks/chunk-LEZSACDE.js +141 -0
- package/dist/mcp-chunks/chunk-LKIBAYKU.js +208 -0
- package/dist/mcp-chunks/chunk-LNH5LAJD.js +152 -0
- package/dist/mcp-chunks/chunk-LQQEYD76.js +124 -0
- package/dist/mcp-chunks/chunk-LRKZP7DJ.js +47 -0
- package/dist/mcp-chunks/chunk-LS7PMWSR.js +109 -0
- package/dist/mcp-chunks/chunk-M3TPODXI.js +95 -0
- package/dist/mcp-chunks/chunk-MZ2NARG7.js +400 -0
- package/dist/mcp-chunks/chunk-N46NEFAF.js +45 -0
- package/dist/mcp-chunks/chunk-NNOEGEUZ.js +17273 -0
- package/dist/mcp-chunks/chunk-NRAJX5E4.js +69 -0
- package/dist/mcp-chunks/chunk-P3PSC54P.js +869 -0
- package/dist/mcp-chunks/chunk-PIIYJR44.js +6341 -0
- package/dist/mcp-chunks/chunk-PWYFKGKG.js +385 -0
- package/dist/mcp-chunks/chunk-SJCCBNZ4.js +45 -0
- package/dist/mcp-chunks/chunk-TATVT5IT.js +194 -0
- package/dist/mcp-chunks/chunk-TEUKFFQL.js +29 -0
- package/dist/mcp-chunks/chunk-UKYNQGNE.js +150 -0
- package/dist/mcp-chunks/chunk-UNKB4SBV.js +37 -0
- package/dist/mcp-chunks/chunk-WD6BOD24.js +138 -0
- package/dist/mcp-chunks/chunk-WQJZMCJN.js +73 -0
- package/dist/mcp-chunks/chunk-XANPGTLI.js +364 -0
- package/dist/mcp-chunks/chunk-XQK2JSW4.js +35 -0
- package/dist/mcp-chunks/chunk-YHQUTU6L.js +571 -0
- package/dist/mcp-chunks/chunk-YVZKMV5H.js +57 -0
- package/dist/mcp-chunks/cli-UV4QJZZM.js +929 -0
- package/dist/mcp-chunks/client-S7RQUG5U.js +13 -0
- package/dist/mcp-chunks/config-command-NLAGKID5.js +1101 -0
- package/dist/mcp-chunks/daemon-command-U242Z6VY.js +26 -0
- package/dist/mcp-chunks/dist-LK3SHAMX.js +6478 -0
- package/dist/mcp-chunks/emit-ts-command-VBXVXO6V.js +386 -0
- package/dist/mcp-chunks/generate-cli-runner-6CAZZA3P.js +1426 -0
- package/dist/mcp-chunks/inspect-cli-command-3ZORTOR7.js +111 -0
- package/dist/mcp-chunks/launch-YKRXHXJI.js +10 -0
- package/dist/mcp-chunks/lifecycle-XVKRHPH3.js +16 -0
- package/dist/mcp-chunks/list-command-2MEGGNFQ.js +4190 -0
- package/dist/mcp-chunks/output-utils-NKESLAJ6.js +12 -0
- package/dist/mcp-chunks/prompt-B1Yc1NPt-VGOTWJMN.js +918 -0
- package/dist/mcp-chunks/record-command-YXHTTTT5.js +17 -0
- package/dist/mcp-chunks/replay-command-25HJ6AQU.js +85 -0
- package/dist/mcp-chunks/resource-command-OO4NYF5C.js +97 -0
- package/dist/mcp-chunks/result-utils-MOHHLNM7.js +15 -0
- package/dist/mcp-chunks/runtime-5WJ3G25Y.js +33 -0
- package/dist/mcp-chunks/runtime-wrapper-RPWDIDBF.js +10 -0
- package/dist/mcp-chunks/serve-command-DHXJZMMN.js +3302 -0
- package/dist/mcp-chunks/timeouts-W2XWCCXR.js +18 -0
- package/dist/mcp-chunks/vault-command-PIYIUEZL.js +154 -0
- package/dist/mcp-daemon-client.d.ts +6 -1
- package/dist/mcp-daemon-client.d.ts.map +1 -1
- package/dist/mcp-daemon-client.js +119 -2
- package/dist/mcp-daemon-client.js.map +1 -1
- package/dist/mcp-daemon-protocol.d.ts +18 -1
- package/dist/mcp-daemon-protocol.d.ts.map +1 -1
- package/dist/mcp-daemon-protocol.js +31 -0
- package/dist/mcp-daemon-protocol.js.map +1 -1
- package/dist/mcp-daemon.js +169 -76602
- package/dist/mcp-daemon.js.map +1 -1
- package/dist/mcp-policy.d.ts +11 -0
- package/dist/mcp-policy.d.ts.map +1 -0
- package/dist/mcp-policy.js +27 -0
- package/dist/mcp-policy.js.map +1 -0
- package/dist/mcp-run-worker.js +38 -76540
- package/dist/mcp-tools.d.ts +39 -0
- package/dist/mcp-tools.d.ts.map +1 -0
- package/dist/mcp-tools.js +493 -0
- package/dist/mcp-tools.js.map +1 -0
- package/dist/mcp.d.ts +21 -9
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +101 -31
- package/dist/mcp.js.map +1 -1
- package/dist/model-binding.d.ts +39 -0
- package/dist/model-binding.d.ts.map +1 -0
- package/dist/model-binding.js +103 -0
- package/dist/model-binding.js.map +1 -0
- package/dist/pi-extension.d.ts +2 -22
- package/dist/pi-extension.d.ts.map +1 -1
- package/dist/pi-extension.js +296 -71
- package/dist/pi-extension.js.map +1 -1
- package/dist/recipe/resolve.d.ts +43 -20
- package/dist/recipe/resolve.d.ts.map +1 -1
- package/dist/recipe/resolve.js +215 -70
- package/dist/recipe/resolve.js.map +1 -1
- package/dist/recipe-agent.d.ts +24 -27
- package/dist/recipe-agent.d.ts.map +1 -1
- package/dist/recipe-agent.js +278 -230
- package/dist/recipe-agent.js.map +1 -1
- package/dist/recipe-check.d.ts +17 -0
- package/dist/recipe-check.d.ts.map +1 -0
- package/dist/recipe-check.js +258 -0
- package/dist/recipe-check.js.map +1 -0
- package/dist/recipe-extensions.d.ts.map +1 -1
- package/dist/recipe-extensions.js +0 -3
- package/dist/recipe-extensions.js.map +1 -1
- package/dist/recipe-model.d.ts +3 -1
- package/dist/recipe-model.d.ts.map +1 -1
- package/dist/recipe-model.js +15 -12
- package/dist/recipe-model.js.map +1 -1
- package/dist/recipe-package.d.ts +6 -28
- package/dist/recipe-package.d.ts.map +1 -1
- package/dist/recipe-package.js +248 -191
- package/dist/recipe-package.js.map +1 -1
- package/dist/recipe-skills.d.ts.map +1 -1
- package/dist/recipe-skills.js +42 -29
- package/dist/recipe-skills.js.map +1 -1
- package/dist/run-controller.d.ts +10 -9
- package/dist/run-controller.d.ts.map +1 -1
- package/dist/run-controller.js +28 -21
- package/dist/run-controller.js.map +1 -1
- package/dist/session.d.ts +40 -53
- package/dist/session.d.ts.map +1 -1
- package/dist/session.js +312 -173
- package/dist/session.js.map +1 -1
- package/dist/test-utils.d.ts +7 -7
- package/dist/test-utils.d.ts.map +1 -1
- package/dist/test-utils.js +32 -15
- package/dist/test-utils.js.map +1 -1
- package/docs/agent-composition.md +41 -35
- package/docs/host-api.md +201 -0
- package/docs/index.md +8 -14
- package/docs/interactions.md +12 -11
- package/docs/mcp-auth.md +6 -6
- package/docs/mcp-configuration.md +72 -24
- package/docs/pi-extension.md +39 -11
- package/docs/recipe-flow.md +9 -9
- package/docs/recipe-format.md +90 -41
- package/package.json +23 -17
- 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/recipe-check/darwin-arm64/recipe-check +0 -0
- package/vendor/recipe-check/darwin-x64/recipe-check +0 -0
- package/vendor/recipe-check/linux-arm64/recipe-check +0 -0
- package/vendor/recipe-check/linux-x64/recipe-check +0 -0
- package/vendor/recipe-check/linux-x64-musl/recipe-check +0 -0
- package/vendor/recipe-check/win32-x64/recipe-check.exe +0 -0
- package/dist/agent-tool.d.ts.map +0 -1
- package/dist/agent-tool.js.map +0 -1
- package/dist/run.d.ts +0 -28
- package/dist/run.d.ts.map +0 -1
- package/dist/run.js +0 -84
- package/dist/run.js.map +0 -1
- package/dist/testing.d.ts +0 -25
- package/dist/testing.d.ts.map +0 -1
- package/dist/testing.js +0 -96
- package/dist/testing.js.map +0 -1
- package/docs/deployment-configuration.md +0 -65
- package/docs/migration.md +0 -70
- package/docs/python-bindings-release.md +0 -47
- package/docs/recipe-evals.md +0 -70
- package/docs/recipe-judges.md +0 -152
- package/docs/runtime-library.md +0 -171
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { createRequire as __createRequire } from "node:module"; const require = __createRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
LIST_TIMEOUT_MS,
|
|
4
|
+
consumeTimeoutFlag,
|
|
5
|
+
parsePositiveInteger,
|
|
6
|
+
parseTimeout,
|
|
7
|
+
resolveCallTimeout,
|
|
8
|
+
withTimeout
|
|
9
|
+
} from "./chunk-BNV3TPE4.js";
|
|
10
|
+
import "./chunk-LRKZP7DJ.js";
|
|
11
|
+
export {
|
|
12
|
+
LIST_TIMEOUT_MS,
|
|
13
|
+
consumeTimeoutFlag,
|
|
14
|
+
parsePositiveInteger,
|
|
15
|
+
parseTimeout,
|
|
16
|
+
resolveCallTimeout,
|
|
17
|
+
withTimeout
|
|
18
|
+
};
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import { createRequire as __createRequire } from "node:module"; const require = __createRequire(import.meta.url);
|
|
2
|
+
import {
|
|
3
|
+
CliUsageError
|
|
4
|
+
} from "./chunk-BV56DXPW.js";
|
|
5
|
+
import {
|
|
6
|
+
clearVaultEntry,
|
|
7
|
+
getOAuthVaultPath,
|
|
8
|
+
saveVaultEntry
|
|
9
|
+
} from "./chunk-TATVT5IT.js";
|
|
10
|
+
import "./chunk-2XL7MG7R.js";
|
|
11
|
+
import "./chunk-ECIVB7P4.js";
|
|
12
|
+
import "./chunk-LRKZP7DJ.js";
|
|
13
|
+
|
|
14
|
+
// node_modules/.pnpm/mcporter@0.12.3/node_modules/mcporter/dist/cli/vault-command.js
|
|
15
|
+
import fs from "node:fs/promises";
|
|
16
|
+
async function handleVault(runtime, args, options = {}) {
|
|
17
|
+
const subcommand = args.shift();
|
|
18
|
+
if (subcommand === "set") {
|
|
19
|
+
await handleVaultSet(runtime, args, options);
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
if (subcommand === "clear") {
|
|
23
|
+
await handleVaultClear(runtime, args);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
throw new CliUsageError("Usage: mcporter vault <set|clear> ...");
|
|
27
|
+
}
|
|
28
|
+
async function handleVaultSet(runtime, args, options) {
|
|
29
|
+
const server = args.shift();
|
|
30
|
+
if (!server) {
|
|
31
|
+
throw new CliUsageError("Usage: mcporter vault set <server> (--tokens-file <path> | --stdin)");
|
|
32
|
+
}
|
|
33
|
+
const source = consumeVaultPayloadSource(args);
|
|
34
|
+
if (args.length > 0) {
|
|
35
|
+
throw new CliUsageError(`Unknown vault set argument '${args[0]}'.`);
|
|
36
|
+
}
|
|
37
|
+
const definition = runtime.getDefinition(server);
|
|
38
|
+
const payload = validateVaultPayload(JSON.parse(await readPayload(source, options)));
|
|
39
|
+
await saveVaultEntry(definition, {
|
|
40
|
+
tokens: payload.tokens,
|
|
41
|
+
...payload.clientInfo ? { clientInfo: payload.clientInfo } : {}
|
|
42
|
+
});
|
|
43
|
+
console.log(`Saved OAuth credentials for '${definition.name}' to ${getOAuthVaultPath()}`);
|
|
44
|
+
}
|
|
45
|
+
async function handleVaultClear(runtime, args) {
|
|
46
|
+
const server = args.shift();
|
|
47
|
+
if (!server) {
|
|
48
|
+
throw new CliUsageError("Usage: mcporter vault clear <server>");
|
|
49
|
+
}
|
|
50
|
+
if (args.length > 0) {
|
|
51
|
+
throw new CliUsageError(`Unknown vault clear argument '${args[0]}'.`);
|
|
52
|
+
}
|
|
53
|
+
const definition = runtime.getDefinition(server);
|
|
54
|
+
await clearVaultEntry(definition, "all");
|
|
55
|
+
console.log(`Cleared OAuth vault entry for '${definition.name}'`);
|
|
56
|
+
}
|
|
57
|
+
function consumeVaultPayloadSource(args) {
|
|
58
|
+
const fileIndex = args.indexOf("--tokens-file");
|
|
59
|
+
const stdinIndex = args.indexOf("--stdin");
|
|
60
|
+
if (fileIndex !== -1 && stdinIndex !== -1) {
|
|
61
|
+
throw new CliUsageError("Use either '--tokens-file' or '--stdin', not both.");
|
|
62
|
+
}
|
|
63
|
+
if (fileIndex !== -1) {
|
|
64
|
+
const filePath = args[fileIndex + 1];
|
|
65
|
+
if (!filePath) {
|
|
66
|
+
throw new CliUsageError("Flag '--tokens-file' requires a path.");
|
|
67
|
+
}
|
|
68
|
+
args.splice(fileIndex, 2);
|
|
69
|
+
return { kind: "file", path: filePath };
|
|
70
|
+
}
|
|
71
|
+
if (stdinIndex !== -1) {
|
|
72
|
+
args.splice(stdinIndex, 1);
|
|
73
|
+
return { kind: "stdin" };
|
|
74
|
+
}
|
|
75
|
+
throw new CliUsageError("Usage: mcporter vault set <server> (--tokens-file <path> | --stdin)");
|
|
76
|
+
}
|
|
77
|
+
async function readPayload(source, options) {
|
|
78
|
+
if (source.kind === "file") {
|
|
79
|
+
return fs.readFile(source.path, "utf8");
|
|
80
|
+
}
|
|
81
|
+
if (options.readStdin) {
|
|
82
|
+
return options.readStdin();
|
|
83
|
+
}
|
|
84
|
+
return new Promise((resolve, reject) => {
|
|
85
|
+
let data = "";
|
|
86
|
+
process.stdin.setEncoding("utf8");
|
|
87
|
+
process.stdin.on("data", (chunk) => {
|
|
88
|
+
data += chunk;
|
|
89
|
+
});
|
|
90
|
+
process.stdin.on("end", () => resolve(data));
|
|
91
|
+
process.stdin.on("error", reject);
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
function validateVaultPayload(value) {
|
|
95
|
+
if (!value || typeof value !== "object") {
|
|
96
|
+
throw new CliUsageError("Vault payload must be a JSON object.");
|
|
97
|
+
}
|
|
98
|
+
const record = value;
|
|
99
|
+
if (!record.tokens || typeof record.tokens !== "object" || Array.isArray(record.tokens)) {
|
|
100
|
+
throw new CliUsageError("Vault payload must include a 'tokens' object.");
|
|
101
|
+
}
|
|
102
|
+
if (record.clientInfo !== void 0 && (!record.clientInfo || typeof record.clientInfo !== "object" || Array.isArray(record.clientInfo))) {
|
|
103
|
+
throw new CliUsageError("Vault payload 'clientInfo' must be an object.");
|
|
104
|
+
}
|
|
105
|
+
validateOAuthTokens(record.tokens);
|
|
106
|
+
if (record.clientInfo !== void 0) {
|
|
107
|
+
validateOAuthClientInfo(record.clientInfo);
|
|
108
|
+
}
|
|
109
|
+
return {
|
|
110
|
+
tokens: record.tokens,
|
|
111
|
+
...record.clientInfo ? { clientInfo: record.clientInfo } : {}
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
function validateOAuthTokens(tokens) {
|
|
115
|
+
if (typeof tokens.access_token !== "string" || tokens.access_token.length === 0) {
|
|
116
|
+
throw new CliUsageError("Vault payload tokens.access_token must be a non-empty string.");
|
|
117
|
+
}
|
|
118
|
+
if (typeof tokens.token_type !== "string" || tokens.token_type.length === 0) {
|
|
119
|
+
throw new CliUsageError("Vault payload tokens.token_type must be a non-empty string.");
|
|
120
|
+
}
|
|
121
|
+
for (const key of ["refresh_token", "scope"]) {
|
|
122
|
+
if (tokens[key] !== void 0 && typeof tokens[key] !== "string") {
|
|
123
|
+
throw new CliUsageError(`Vault payload tokens.${key} must be a string.`);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
if (tokens.expires_in !== void 0 && (!Number.isFinite(tokens.expires_in) || typeof tokens.expires_in !== "number")) {
|
|
127
|
+
throw new CliUsageError("Vault payload tokens.expires_in must be a finite number.");
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
function validateOAuthClientInfo(clientInfo) {
|
|
131
|
+
for (const [key, value] of Object.entries(clientInfo)) {
|
|
132
|
+
if (value !== void 0 && value !== null && typeof value !== "string") {
|
|
133
|
+
throw new CliUsageError(`Vault payload clientInfo.${key} must be a string.`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
function printVaultHelp() {
|
|
138
|
+
const lines = [
|
|
139
|
+
"Usage: mcporter vault <set|clear> ...",
|
|
140
|
+
"",
|
|
141
|
+
"Commands:",
|
|
142
|
+
" vault set <server> --tokens-file <path> Seed OAuth tokens from JSON.",
|
|
143
|
+
" vault set <server> --stdin Seed OAuth tokens from stdin JSON.",
|
|
144
|
+
" vault clear <server> Remove the server entry from the OAuth vault.",
|
|
145
|
+
"",
|
|
146
|
+
"Payload:",
|
|
147
|
+
' { "tokens": { "access_token": "...", "token_type": "Bearer" }, "clientInfo": { "client_id": "..." } }'
|
|
148
|
+
];
|
|
149
|
+
console.error(lines.join("\n"));
|
|
150
|
+
}
|
|
151
|
+
export {
|
|
152
|
+
handleVault,
|
|
153
|
+
printVaultHelp
|
|
154
|
+
};
|
|
@@ -5,6 +5,11 @@ export declare function mcpDaemonEnvironment(env?: NodeJS.ProcessEnv): {
|
|
|
5
5
|
token: string;
|
|
6
6
|
fingerprint: string;
|
|
7
7
|
};
|
|
8
|
-
export declare function exchangeMcpDaemon(request: McpDaemonRequest, onEnvelope: (envelope: McpDaemonEnvelope, socket: Socket) => void, env?: NodeJS.ProcessEnv): Promise<void>;
|
|
8
|
+
export declare function exchangeMcpDaemon(request: McpDaemonRequest, onEnvelope: (envelope: McpDaemonEnvelope, socket: Socket) => void, env?: NodeJS.ProcessEnv, onRequestWritten?: () => void): Promise<void>;
|
|
9
9
|
export declare function ensureMcpDaemon(env?: NodeJS.ProcessEnv): Promise<void>;
|
|
10
|
+
export declare function callMcpDaemonTool(server: string, tool: string, args: Record<string, unknown>, options?: {
|
|
11
|
+
env?: NodeJS.ProcessEnv;
|
|
12
|
+
signal?: AbortSignal;
|
|
13
|
+
timeoutMs?: number;
|
|
14
|
+
}): Promise<unknown>;
|
|
10
15
|
//# sourceMappingURL=mcp-daemon-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-daemon-client.d.ts","sourceRoot":"","sources":["../src/mcp-daemon-client.ts"],"names":[],"mappings":"AAIA,OAAO,EAAoB,KAAK,MAAM,EAAE,MAAM,UAAU,CAAC;AAIzD,OAAO,EAKL,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACtB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-daemon-client.d.ts","sourceRoot":"","sources":["../src/mcp-daemon-client.ts"],"names":[],"mappings":"AAIA,OAAO,EAAoB,KAAK,MAAM,EAAE,MAAM,UAAU,CAAC;AAIzD,OAAO,EAKL,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACtB,MAAM,0BAA0B,CAAC;AAWlC,wBAAgB,oBAAoB,CAAC,GAAG,GAAE,MAAM,CAAC,UAAwB,GAAG;IAC1E,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB,CAQA;AAED,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,gBAAgB,EACzB,UAAU,EAAE,CAAC,QAAQ,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,KAAK,IAAI,EACjE,GAAG,GAAE,MAAM,CAAC,UAAwB,EACpC,gBAAgB,CAAC,EAAE,MAAM,IAAI,GAC5B,OAAO,CAAC,IAAI,CAAC,CAoCf;AAeD,wBAAsB,eAAe,CACnC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,OAAO,CAAC,IAAI,CAAC,CAuDf;AAED,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,GAAE;IACP,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;CACf,GACL,OAAO,CAAC,OAAO,CAAC,CAsHlB"}
|
|
@@ -7,6 +7,7 @@ import { setTimeout as delay } from "node:timers/promises";
|
|
|
7
7
|
import { fileURLToPath } from "node:url";
|
|
8
8
|
import { MCP_DAEMON_FINGERPRINT_ENV, MCP_DAEMON_SOCKET_ENV, MCP_DAEMON_TOKEN_ENV, MCP_SESSION_ROOT_ENV, } from "./mcp-daemon-protocol.js";
|
|
9
9
|
const START_TIMEOUT_MS = 20_000;
|
|
10
|
+
const MAX_DAEMON_FRAME_BYTES = 10 * 1024 * 1024;
|
|
10
11
|
function daemonPath() {
|
|
11
12
|
const adjacent = fileURLToPath(new URL("./mcp-daemon.js", import.meta.url));
|
|
12
13
|
if (existsSync(adjacent))
|
|
@@ -22,19 +23,33 @@ export function mcpDaemonEnvironment(env = process.env) {
|
|
|
22
23
|
}
|
|
23
24
|
return { socketPath, token, fingerprint };
|
|
24
25
|
}
|
|
25
|
-
export function exchangeMcpDaemon(request, onEnvelope, env = process.env) {
|
|
26
|
+
export function exchangeMcpDaemon(request, onEnvelope, env = process.env, onRequestWritten) {
|
|
26
27
|
const { socketPath } = mcpDaemonEnvironment(env);
|
|
27
28
|
return new Promise((resolve, reject) => {
|
|
28
29
|
const socket = createConnection(socketPath);
|
|
29
30
|
let buffer = "";
|
|
30
31
|
socket.setEncoding("utf8");
|
|
31
|
-
socket.once("connect", () =>
|
|
32
|
+
socket.once("connect", () => {
|
|
33
|
+
socket.write(`${JSON.stringify(request)}\n`);
|
|
34
|
+
onRequestWritten?.();
|
|
35
|
+
});
|
|
32
36
|
socket.on("data", (chunk) => {
|
|
33
37
|
buffer += chunk;
|
|
38
|
+
if (buffer.indexOf("\n") < 0 &&
|
|
39
|
+
Buffer.byteLength(buffer, "utf8") > MAX_DAEMON_FRAME_BYTES) {
|
|
40
|
+
socket.destroy();
|
|
41
|
+
reject(new Error("MCP daemon response exceeded the frame limit."));
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
34
44
|
let newline = buffer.indexOf("\n");
|
|
35
45
|
while (newline >= 0) {
|
|
36
46
|
const line = buffer.slice(0, newline);
|
|
37
47
|
buffer = buffer.slice(newline + 1);
|
|
48
|
+
if (Buffer.byteLength(line, "utf8") > MAX_DAEMON_FRAME_BYTES) {
|
|
49
|
+
socket.destroy();
|
|
50
|
+
reject(new Error("MCP daemon response exceeded the frame limit."));
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
38
53
|
if (line)
|
|
39
54
|
onEnvelope(JSON.parse(line), socket);
|
|
40
55
|
newline = buffer.indexOf("\n");
|
|
@@ -116,4 +131,106 @@ export async function ensureMcpDaemon(env = process.env) {
|
|
|
116
131
|
await rm(lockPath, { force: true });
|
|
117
132
|
throw new Error("MCP daemon did not become ready before the startup deadline.");
|
|
118
133
|
}
|
|
134
|
+
export async function callMcpDaemonTool(server, tool, args, options = {}) {
|
|
135
|
+
const env = options.env ?? process.env;
|
|
136
|
+
const signal = options.signal;
|
|
137
|
+
if (signal?.aborted) {
|
|
138
|
+
throw new Error(`MCP tool call '${server}.${tool}' was cancelled before execution.`);
|
|
139
|
+
}
|
|
140
|
+
await ensureMcpDaemon(env);
|
|
141
|
+
if (signal?.aborted) {
|
|
142
|
+
throw new Error(`MCP tool call '${server}.${tool}' was cancelled before execution.`);
|
|
143
|
+
}
|
|
144
|
+
const { token, fingerprint } = mcpDaemonEnvironment(env);
|
|
145
|
+
const id = randomUUID();
|
|
146
|
+
const timeoutMs = options.timeoutMs ?? 120_000;
|
|
147
|
+
let result;
|
|
148
|
+
let hasResult = false;
|
|
149
|
+
let daemonError;
|
|
150
|
+
let requestWritten = false;
|
|
151
|
+
let aborted = false;
|
|
152
|
+
let timedOut = false;
|
|
153
|
+
let resolveAbort;
|
|
154
|
+
const abortPromise = new Promise((resolve) => {
|
|
155
|
+
resolveAbort = resolve;
|
|
156
|
+
});
|
|
157
|
+
const sendCancel = () => {
|
|
158
|
+
let cancelToken;
|
|
159
|
+
try {
|
|
160
|
+
({ token: cancelToken } = mcpDaemonEnvironment(env));
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
void exchangeMcpDaemon({
|
|
166
|
+
type: "cancel",
|
|
167
|
+
id: randomUUID(),
|
|
168
|
+
token: cancelToken,
|
|
169
|
+
requestId: id,
|
|
170
|
+
}, () => { }, env).catch(() => { });
|
|
171
|
+
};
|
|
172
|
+
const onAbort = () => {
|
|
173
|
+
aborted = true;
|
|
174
|
+
resolveAbort?.();
|
|
175
|
+
sendCancel();
|
|
176
|
+
};
|
|
177
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
178
|
+
const hardTimeout = setTimeout(() => {
|
|
179
|
+
timedOut = true;
|
|
180
|
+
aborted = true;
|
|
181
|
+
resolveAbort?.();
|
|
182
|
+
sendCancel();
|
|
183
|
+
}, timeoutMs + 1_000);
|
|
184
|
+
hardTimeout.unref?.();
|
|
185
|
+
const exchange = exchangeMcpDaemon({
|
|
186
|
+
type: "call",
|
|
187
|
+
id,
|
|
188
|
+
token,
|
|
189
|
+
fingerprint,
|
|
190
|
+
server,
|
|
191
|
+
tool,
|
|
192
|
+
arguments: args,
|
|
193
|
+
timeoutMs,
|
|
194
|
+
}, (envelope, socket) => {
|
|
195
|
+
if ("result" in envelope) {
|
|
196
|
+
result = envelope.result;
|
|
197
|
+
hasResult = true;
|
|
198
|
+
socket.end();
|
|
199
|
+
}
|
|
200
|
+
else if ("error" in envelope) {
|
|
201
|
+
daemonError = envelope.error;
|
|
202
|
+
socket.end();
|
|
203
|
+
}
|
|
204
|
+
}, env, () => {
|
|
205
|
+
requestWritten = true;
|
|
206
|
+
});
|
|
207
|
+
try {
|
|
208
|
+
await Promise.race([exchange, abortPromise]);
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
if (requestWritten) {
|
|
212
|
+
throw new Error(`MCP tool call '${server}.${tool}' lost its daemon response after dispatch; remote outcome is unknown; do not retry automatically.`, { cause: error });
|
|
213
|
+
}
|
|
214
|
+
throw error;
|
|
215
|
+
}
|
|
216
|
+
finally {
|
|
217
|
+
clearTimeout(hardTimeout);
|
|
218
|
+
signal?.removeEventListener("abort", onAbort);
|
|
219
|
+
}
|
|
220
|
+
if (aborted) {
|
|
221
|
+
// The remote request may already have crossed the transport boundary.
|
|
222
|
+
// Cancellation is best-effort, so detach the exchange while retaining an
|
|
223
|
+
// error handler and report the outcome as unknown immediately.
|
|
224
|
+
void exchange.catch(() => { });
|
|
225
|
+
throw new Error(`MCP tool call '${server}.${tool}' ${timedOut ? "timed out" : "was cancelled"}; remote outcome is unknown; do not retry automatically.`);
|
|
226
|
+
}
|
|
227
|
+
if (daemonError)
|
|
228
|
+
throw new Error(`MCP daemon: ${daemonError}`);
|
|
229
|
+
if (!hasResult) {
|
|
230
|
+
throw new Error(requestWritten
|
|
231
|
+
? `MCP tool call '${server}.${tool}' returned no daemon result after dispatch; remote outcome is unknown; do not retry automatically.`
|
|
232
|
+
: "MCP daemon returned no tool result.");
|
|
233
|
+
}
|
|
234
|
+
return result;
|
|
235
|
+
}
|
|
119
236
|
//# sourceMappingURL=mcp-daemon-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-daemon-client.js","sourceRoot":"","sources":["../src/mcp-daemon-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAe,MAAM,UAAU,CAAC;AACzD,OAAO,EAAE,UAAU,IAAI,KAAK,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EACL,0BAA0B,EAC1B,qBAAqB,EACrB,oBAAoB,EACpB,oBAAoB,GAGrB,MAAM,0BAA0B,CAAC;AAElC,MAAM,gBAAgB,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-daemon-client.js","sourceRoot":"","sources":["../src/mcp-daemon-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,6 +4,8 @@ export declare const MCP_DAEMON_TOKEN_ENV = "PI_RECIPES_MCP_DAEMON_TOKEN";
|
|
|
4
4
|
export declare const MCP_DAEMON_FINGERPRINT_ENV = "PI_RECIPES_MCP_DAEMON_FINGERPRINT";
|
|
5
5
|
export declare const MCP_DAEMON_PARENT_PID_ENV = "PI_RECIPES_MCP_DAEMON_PARENT_PID";
|
|
6
6
|
export declare const MCP_SESSION_ROOT_ENV = "PI_RECIPES_MCP_SESSION_ROOT";
|
|
7
|
+
export declare const MCP_DAEMON_GENERATION_ENV = "PI_RECIPES_MCP_DAEMON_GENERATION";
|
|
8
|
+
export declare const MCP_DAEMON_MAX_FRAME_BYTES: number;
|
|
7
9
|
export interface McpDaemonExecuteRequest {
|
|
8
10
|
type: "execute";
|
|
9
11
|
id: string;
|
|
@@ -35,6 +37,17 @@ export interface McpDaemonCatalogRequest {
|
|
|
35
37
|
token: string;
|
|
36
38
|
fingerprint: string;
|
|
37
39
|
timeoutMs: number;
|
|
40
|
+
allowPartial?: boolean;
|
|
41
|
+
}
|
|
42
|
+
export interface McpDaemonCallRequest {
|
|
43
|
+
type: "call";
|
|
44
|
+
id: string;
|
|
45
|
+
token: string;
|
|
46
|
+
fingerprint: string;
|
|
47
|
+
server: string;
|
|
48
|
+
tool: string;
|
|
49
|
+
arguments: Record<string, unknown>;
|
|
50
|
+
timeoutMs: number;
|
|
38
51
|
}
|
|
39
52
|
export interface McpCatalogServer {
|
|
40
53
|
id: string;
|
|
@@ -42,7 +55,7 @@ export interface McpCatalogServer {
|
|
|
42
55
|
tools: McpToolCatalogEntry[];
|
|
43
56
|
error?: string;
|
|
44
57
|
}
|
|
45
|
-
export type McpDaemonRequest = McpDaemonExecuteRequest | McpDaemonCancelRequest | McpDaemonStopRequest | McpDaemonPingRequest | McpDaemonCatalogRequest;
|
|
58
|
+
export type McpDaemonRequest = McpDaemonExecuteRequest | McpDaemonCancelRequest | McpDaemonStopRequest | McpDaemonPingRequest | McpDaemonCatalogRequest | McpDaemonCallRequest;
|
|
46
59
|
export type McpDaemonEnvelope = {
|
|
47
60
|
id: string;
|
|
48
61
|
stream: "stdout" | "stderr";
|
|
@@ -54,6 +67,9 @@ export type McpDaemonEnvelope = {
|
|
|
54
67
|
} | {
|
|
55
68
|
id: string;
|
|
56
69
|
catalogs: McpCatalogServer[];
|
|
70
|
+
} | {
|
|
71
|
+
id: string;
|
|
72
|
+
result: unknown;
|
|
57
73
|
} | {
|
|
58
74
|
id: string;
|
|
59
75
|
exitCode: number;
|
|
@@ -61,4 +77,5 @@ export type McpDaemonEnvelope = {
|
|
|
61
77
|
id: string;
|
|
62
78
|
error: string;
|
|
63
79
|
};
|
|
80
|
+
export declare function serializeMcpDaemonEnvelope(envelope: McpDaemonEnvelope, maxBytes?: number): string;
|
|
64
81
|
//# sourceMappingURL=mcp-daemon-protocol.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-daemon-protocol.d.ts","sourceRoot":"","sources":["../src/mcp-daemon-protocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC;AAEpD,eAAO,MAAM,qBAAqB,iCAAiC,CAAC;AACpE,eAAO,MAAM,oBAAoB,gCAAgC,CAAC;AAClE,eAAO,MAAM,0BAA0B,sCAAsC,CAAC;AAC9E,eAAO,MAAM,yBAAyB,qCAAqC,CAAC;AAC5E,eAAO,MAAM,oBAAoB,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"mcp-daemon-protocol.d.ts","sourceRoot":"","sources":["../src/mcp-daemon-protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,4 +3,35 @@ export const MCP_DAEMON_TOKEN_ENV = "PI_RECIPES_MCP_DAEMON_TOKEN";
|
|
|
3
3
|
export const MCP_DAEMON_FINGERPRINT_ENV = "PI_RECIPES_MCP_DAEMON_FINGERPRINT";
|
|
4
4
|
export const MCP_DAEMON_PARENT_PID_ENV = "PI_RECIPES_MCP_DAEMON_PARENT_PID";
|
|
5
5
|
export const MCP_SESSION_ROOT_ENV = "PI_RECIPES_MCP_SESSION_ROOT";
|
|
6
|
+
export const MCP_DAEMON_GENERATION_ENV = "PI_RECIPES_MCP_DAEMON_GENERATION";
|
|
7
|
+
export const MCP_DAEMON_MAX_FRAME_BYTES = 10 * 1024 * 1024;
|
|
8
|
+
export function serializeMcpDaemonEnvelope(envelope, maxBytes = MCP_DAEMON_MAX_FRAME_BYTES) {
|
|
9
|
+
let estimatedBytes = 0;
|
|
10
|
+
const seen = new WeakSet();
|
|
11
|
+
const serialized = JSON.stringify(envelope, (key, value) => {
|
|
12
|
+
estimatedBytes += Buffer.byteLength(key, "utf8") + 4;
|
|
13
|
+
if (typeof value === "string") {
|
|
14
|
+
estimatedBytes += Buffer.byteLength(value, "utf8") + 2;
|
|
15
|
+
}
|
|
16
|
+
else if (typeof value === "number" ||
|
|
17
|
+
typeof value === "boolean" ||
|
|
18
|
+
value === null) {
|
|
19
|
+
estimatedBytes += 16;
|
|
20
|
+
}
|
|
21
|
+
else if (value && typeof value === "object") {
|
|
22
|
+
if (seen.has(value)) {
|
|
23
|
+
throw new Error("MCP daemon envelope contains a circular value.");
|
|
24
|
+
}
|
|
25
|
+
seen.add(value);
|
|
26
|
+
}
|
|
27
|
+
if (estimatedBytes > maxBytes) {
|
|
28
|
+
throw new Error("MCP daemon envelope exceeded the frame limit.");
|
|
29
|
+
}
|
|
30
|
+
return value;
|
|
31
|
+
});
|
|
32
|
+
if (Buffer.byteLength(serialized, "utf8") > maxBytes) {
|
|
33
|
+
throw new Error("MCP daemon envelope exceeded the frame limit.");
|
|
34
|
+
}
|
|
35
|
+
return `${serialized}\n`;
|
|
36
|
+
}
|
|
6
37
|
//# sourceMappingURL=mcp-daemon-protocol.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-daemon-protocol.js","sourceRoot":"","sources":["../src/mcp-daemon-protocol.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,qBAAqB,GAAG,8BAA8B,CAAC;AACpE,MAAM,CAAC,MAAM,oBAAoB,GAAG,6BAA6B,CAAC;AAClE,MAAM,CAAC,MAAM,0BAA0B,GAAG,mCAAmC,CAAC;AAC9E,MAAM,CAAC,MAAM,yBAAyB,GAAG,kCAAkC,CAAC;AAC5E,MAAM,CAAC,MAAM,oBAAoB,GAAG,6BAA6B,CAAC"}
|
|
1
|
+
{"version":3,"file":"mcp-daemon-protocol.js","sourceRoot":"","sources":["../src/mcp-daemon-protocol.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,qBAAqB,GAAG,8BAA8B,CAAC;AACpE,MAAM,CAAC,MAAM,oBAAoB,GAAG,6BAA6B,CAAC;AAClE,MAAM,CAAC,MAAM,0BAA0B,GAAG,mCAAmC,CAAC;AAC9E,MAAM,CAAC,MAAM,yBAAyB,GAAG,kCAAkC,CAAC;AAC5E,MAAM,CAAC,MAAM,oBAAoB,GAAG,6BAA6B,CAAC;AAClE,MAAM,CAAC,MAAM,yBAAyB,GAAG,kCAAkC,CAAC;AAC5E,MAAM,CAAC,MAAM,0BAA0B,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AA0E3D,MAAM,UAAU,0BAA0B,CACxC,QAA2B,EAC3B,QAAQ,GAAG,0BAA0B;IAErC,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,MAAM,IAAI,GAAG,IAAI,OAAO,EAAU,CAAC;IACnC,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,KAAc,EAAE,EAAE;QAClE,cAAc,IAAI,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QACrD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,cAAc,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC;QACzD,CAAC;aAAM,IACL,OAAO,KAAK,KAAK,QAAQ;YACzB,OAAO,KAAK,KAAK,SAAS;YAC1B,KAAK,KAAK,IAAI,EACd,CAAC;YACD,cAAc,IAAI,EAAE,CAAC;QACvB,CAAC;aAAM,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9C,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;YACpE,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAClB,CAAC;QACD,IAAI,cAAc,GAAG,QAAQ,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;IACH,IAAI,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,MAAM,CAAC,GAAG,QAAQ,EAAE,CAAC;QACrD,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACnE,CAAC;IACD,OAAO,GAAG,UAAU,IAAI,CAAC;AAC3B,CAAC"}
|