@mcpjam/inspector 0.9.20 → 0.9.21

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.
@@ -1 +1 @@
1
- {"version":3,"sources":["../../node_modules/isexe/windows.js","../../node_modules/isexe/mode.js","../../node_modules/isexe/index.js","../../node_modules/which/which.js","../../node_modules/path-key/index.js","../../node_modules/cross-spawn/lib/util/resolveCommand.js","../../node_modules/cross-spawn/lib/util/escape.js","../../node_modules/shebang-regex/index.js","../../node_modules/shebang-command/index.js","../../node_modules/cross-spawn/lib/util/readShebang.js","../../node_modules/cross-spawn/lib/parse.js","../../node_modules/cross-spawn/lib/enoent.js","../../node_modules/cross-spawn/index.js","../../node_modules/strip-final-newline/index.js","../../node_modules/shell-env/node_modules/npm-run-path/index.js","../../node_modules/mimic-fn/index.js","../../node_modules/onetime/index.js","../../node_modules/human-signals/src/core.js","../../node_modules/human-signals/src/realtime.js","../../node_modules/human-signals/src/signals.js","../../node_modules/human-signals/src/main.js","../../node_modules/shell-env/node_modules/execa/lib/error.js","../../node_modules/shell-env/node_modules/execa/lib/stdio.js","../../node_modules/shell-env/node_modules/signal-exit/signals.js","../../node_modules/shell-env/node_modules/signal-exit/index.js","../../node_modules/shell-env/node_modules/execa/lib/kill.js","../../node_modules/is-stream/index.js","../../node_modules/shell-env/node_modules/get-stream/buffer-stream.js","../../node_modules/shell-env/node_modules/get-stream/index.js","../../node_modules/merge-stream/index.js","../../node_modules/shell-env/node_modules/execa/lib/stream.js","../../node_modules/shell-env/node_modules/execa/lib/promise.js","../../node_modules/shell-env/node_modules/execa/lib/command.js","../../node_modules/shell-env/node_modules/execa/index.js","../../server/index.ts","../../node_modules/fix-path/index.js","../../node_modules/shell-env/index.js","../../node_modules/shell-env/node_modules/ansi-regex/index.js","../../node_modules/shell-env/node_modules/strip-ansi/index.js","../../node_modules/default-shell/index.js","../../node_modules/shell-path/index.js","../../server/routes/mcp/index.ts","../../server/routes/mcp/connect.ts","../../server/routes/mcp/servers.ts","../../server/routes/mcp/tools.ts","../../server/routes/mcp/resources.ts","../../server/routes/mcp/prompts.ts","../../server/routes/mcp/chat.ts","../../client/src/lib/chat-utils.ts","../../server/routes/mcp/tests.ts","../../server/utils/mcp-utils.ts","../../server/routes/mcp/oauth.ts","../../server/services/mcpjam-client-manager.ts"],"sourcesContent":["module.exports = isexe\nisexe.sync = sync\n\nvar fs = require('fs')\n\nfunction checkPathExt (path, options) {\n var pathext = options.pathExt !== undefined ?\n options.pathExt : process.env.PATHEXT\n\n if (!pathext) {\n return true\n }\n\n pathext = pathext.split(';')\n if (pathext.indexOf('') !== -1) {\n return true\n }\n for (var i = 0; i < pathext.length; i++) {\n var p = pathext[i].toLowerCase()\n if (p && path.substr(-p.length).toLowerCase() === p) {\n return true\n }\n }\n return false\n}\n\nfunction checkStat (stat, path, options) {\n if (!stat.isSymbolicLink() && !stat.isFile()) {\n return false\n }\n return checkPathExt(path, options)\n}\n\nfunction isexe (path, options, cb) {\n fs.stat(path, function (er, stat) {\n cb(er, er ? false : checkStat(stat, path, options))\n })\n}\n\nfunction sync (path, options) {\n return checkStat(fs.statSync(path), path, options)\n}\n","module.exports = isexe\nisexe.sync = sync\n\nvar fs = require('fs')\n\nfunction isexe (path, options, cb) {\n fs.stat(path, function (er, stat) {\n cb(er, er ? false : checkStat(stat, options))\n })\n}\n\nfunction sync (path, options) {\n return checkStat(fs.statSync(path), options)\n}\n\nfunction checkStat (stat, options) {\n return stat.isFile() && checkMode(stat, options)\n}\n\nfunction checkMode (stat, options) {\n var mod = stat.mode\n var uid = stat.uid\n var gid = stat.gid\n\n var myUid = options.uid !== undefined ?\n options.uid : process.getuid && process.getuid()\n var myGid = options.gid !== undefined ?\n options.gid : process.getgid && process.getgid()\n\n var u = parseInt('100', 8)\n var g = parseInt('010', 8)\n var o = parseInt('001', 8)\n var ug = u | g\n\n var ret = (mod & o) ||\n (mod & g) && gid === myGid ||\n (mod & u) && uid === myUid ||\n (mod & ug) && myUid === 0\n\n return ret\n}\n","var fs = require('fs')\nvar core\nif (process.platform === 'win32' || global.TESTING_WINDOWS) {\n core = require('./windows.js')\n} else {\n core = require('./mode.js')\n}\n\nmodule.exports = isexe\nisexe.sync = sync\n\nfunction isexe (path, options, cb) {\n if (typeof options === 'function') {\n cb = options\n options = {}\n }\n\n if (!cb) {\n if (typeof Promise !== 'function') {\n throw new TypeError('callback not provided')\n }\n\n return new Promise(function (resolve, reject) {\n isexe(path, options || {}, function (er, is) {\n if (er) {\n reject(er)\n } else {\n resolve(is)\n }\n })\n })\n }\n\n core(path, options || {}, function (er, is) {\n // ignore EACCES because that just means we aren't allowed to run it\n if (er) {\n if (er.code === 'EACCES' || options && options.ignoreErrors) {\n er = null\n is = false\n }\n }\n cb(er, is)\n })\n}\n\nfunction sync (path, options) {\n // my kingdom for a filtered catch\n try {\n return core.sync(path, options || {})\n } catch (er) {\n if (options && options.ignoreErrors || er.code === 'EACCES') {\n return false\n } else {\n throw er\n }\n }\n}\n","const isWindows = process.platform === 'win32' ||\n process.env.OSTYPE === 'cygwin' ||\n process.env.OSTYPE === 'msys'\n\nconst path = require('path')\nconst COLON = isWindows ? ';' : ':'\nconst isexe = require('isexe')\n\nconst getNotFoundError = (cmd) =>\n Object.assign(new Error(`not found: ${cmd}`), { code: 'ENOENT' })\n\nconst getPathInfo = (cmd, opt) => {\n const colon = opt.colon || COLON\n\n // If it has a slash, then we don't bother searching the pathenv.\n // just check the file itself, and that's it.\n const pathEnv = cmd.match(/\\//) || isWindows && cmd.match(/\\\\/) ? ['']\n : (\n [\n // windows always checks the cwd first\n ...(isWindows ? [process.cwd()] : []),\n ...(opt.path || process.env.PATH ||\n /* istanbul ignore next: very unusual */ '').split(colon),\n ]\n )\n const pathExtExe = isWindows\n ? opt.pathExt || process.env.PATHEXT || '.EXE;.CMD;.BAT;.COM'\n : ''\n const pathExt = isWindows ? pathExtExe.split(colon) : ['']\n\n if (isWindows) {\n if (cmd.indexOf('.') !== -1 && pathExt[0] !== '')\n pathExt.unshift('')\n }\n\n return {\n pathEnv,\n pathExt,\n pathExtExe,\n }\n}\n\nconst which = (cmd, opt, cb) => {\n if (typeof opt === 'function') {\n cb = opt\n opt = {}\n }\n if (!opt)\n opt = {}\n\n const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt)\n const found = []\n\n const step = i => new Promise((resolve, reject) => {\n if (i === pathEnv.length)\n return opt.all && found.length ? resolve(found)\n : reject(getNotFoundError(cmd))\n\n const ppRaw = pathEnv[i]\n const pathPart = /^\".*\"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw\n\n const pCmd = path.join(pathPart, cmd)\n const p = !pathPart && /^\\.[\\\\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd\n : pCmd\n\n resolve(subStep(p, i, 0))\n })\n\n const subStep = (p, i, ii) => new Promise((resolve, reject) => {\n if (ii === pathExt.length)\n return resolve(step(i + 1))\n const ext = pathExt[ii]\n isexe(p + ext, { pathExt: pathExtExe }, (er, is) => {\n if (!er && is) {\n if (opt.all)\n found.push(p + ext)\n else\n return resolve(p + ext)\n }\n return resolve(subStep(p, i, ii + 1))\n })\n })\n\n return cb ? step(0).then(res => cb(null, res), cb) : step(0)\n}\n\nconst whichSync = (cmd, opt) => {\n opt = opt || {}\n\n const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt)\n const found = []\n\n for (let i = 0; i < pathEnv.length; i ++) {\n const ppRaw = pathEnv[i]\n const pathPart = /^\".*\"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw\n\n const pCmd = path.join(pathPart, cmd)\n const p = !pathPart && /^\\.[\\\\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd\n : pCmd\n\n for (let j = 0; j < pathExt.length; j ++) {\n const cur = p + pathExt[j]\n try {\n const is = isexe.sync(cur, { pathExt: pathExtExe })\n if (is) {\n if (opt.all)\n found.push(cur)\n else\n return cur\n }\n } catch (ex) {}\n }\n }\n\n if (opt.all && found.length)\n return found\n\n if (opt.nothrow)\n return null\n\n throw getNotFoundError(cmd)\n}\n\nmodule.exports = which\nwhich.sync = whichSync\n","'use strict';\n\nconst pathKey = (options = {}) => {\n\tconst environment = options.env || process.env;\n\tconst platform = options.platform || process.platform;\n\n\tif (platform !== 'win32') {\n\t\treturn 'PATH';\n\t}\n\n\treturn Object.keys(environment).reverse().find(key => key.toUpperCase() === 'PATH') || 'Path';\n};\n\nmodule.exports = pathKey;\n// TODO: Remove this for the next major release\nmodule.exports.default = pathKey;\n","'use strict';\n\nconst path = require('path');\nconst which = require('which');\nconst getPathKey = require('path-key');\n\nfunction resolveCommandAttempt(parsed, withoutPathExt) {\n const env = parsed.options.env || process.env;\n const cwd = process.cwd();\n const hasCustomCwd = parsed.options.cwd != null;\n // Worker threads do not have process.chdir()\n const shouldSwitchCwd = hasCustomCwd && process.chdir !== undefined && !process.chdir.disabled;\n\n // If a custom `cwd` was specified, we need to change the process cwd\n // because `which` will do stat calls but does not support a custom cwd\n if (shouldSwitchCwd) {\n try {\n process.chdir(parsed.options.cwd);\n } catch (err) {\n /* Empty */\n }\n }\n\n let resolved;\n\n try {\n resolved = which.sync(parsed.command, {\n path: env[getPathKey({ env })],\n pathExt: withoutPathExt ? path.delimiter : undefined,\n });\n } catch (e) {\n /* Empty */\n } finally {\n if (shouldSwitchCwd) {\n process.chdir(cwd);\n }\n }\n\n // If we successfully resolved, ensure that an absolute path is returned\n // Note that when a custom `cwd` was used, we need to resolve to an absolute path based on it\n if (resolved) {\n resolved = path.resolve(hasCustomCwd ? parsed.options.cwd : '', resolved);\n }\n\n return resolved;\n}\n\nfunction resolveCommand(parsed) {\n return resolveCommandAttempt(parsed) || resolveCommandAttempt(parsed, true);\n}\n\nmodule.exports = resolveCommand;\n","'use strict';\n\n// See http://www.robvanderwoude.com/escapechars.php\nconst metaCharsRegExp = /([()\\][%!^\"`<>&|;, *?])/g;\n\nfunction escapeCommand(arg) {\n // Escape meta chars\n arg = arg.replace(metaCharsRegExp, '^$1');\n\n return arg;\n}\n\nfunction escapeArgument(arg, doubleEscapeMetaChars) {\n // Convert to string\n arg = `${arg}`;\n\n // Algorithm below is based on https://qntm.org/cmd\n // It's slightly altered to disable JS backtracking to avoid hanging on specially crafted input\n // Please see https://github.com/moxystudio/node-cross-spawn/pull/160 for more information\n\n // Sequence of backslashes followed by a double quote:\n // double up all the backslashes and escape the double quote\n arg = arg.replace(/(?=(\\\\+?)?)\\1\"/g, '$1$1\\\\\"');\n\n // Sequence of backslashes followed by the end of the string\n // (which will become a double quote later):\n // double up all the backslashes\n arg = arg.replace(/(?=(\\\\+?)?)\\1$/, '$1$1');\n\n // All other backslashes occur literally\n\n // Quote the whole thing:\n arg = `\"${arg}\"`;\n\n // Escape meta chars\n arg = arg.replace(metaCharsRegExp, '^$1');\n\n // Double escape meta chars if necessary\n if (doubleEscapeMetaChars) {\n arg = arg.replace(metaCharsRegExp, '^$1');\n }\n\n return arg;\n}\n\nmodule.exports.command = escapeCommand;\nmodule.exports.argument = escapeArgument;\n","'use strict';\nmodule.exports = /^#!(.*)/;\n","'use strict';\nconst shebangRegex = require('shebang-regex');\n\nmodule.exports = (string = '') => {\n\tconst match = string.match(shebangRegex);\n\n\tif (!match) {\n\t\treturn null;\n\t}\n\n\tconst [path, argument] = match[0].replace(/#! ?/, '').split(' ');\n\tconst binary = path.split('/').pop();\n\n\tif (binary === 'env') {\n\t\treturn argument;\n\t}\n\n\treturn argument ? `${binary} ${argument}` : binary;\n};\n","'use strict';\n\nconst fs = require('fs');\nconst shebangCommand = require('shebang-command');\n\nfunction readShebang(command) {\n // Read the first 150 bytes from the file\n const size = 150;\n const buffer = Buffer.alloc(size);\n\n let fd;\n\n try {\n fd = fs.openSync(command, 'r');\n fs.readSync(fd, buffer, 0, size, 0);\n fs.closeSync(fd);\n } catch (e) { /* Empty */ }\n\n // Attempt to extract shebang (null is returned if not a shebang)\n return shebangCommand(buffer.toString());\n}\n\nmodule.exports = readShebang;\n","'use strict';\n\nconst path = require('path');\nconst resolveCommand = require('./util/resolveCommand');\nconst escape = require('./util/escape');\nconst readShebang = require('./util/readShebang');\n\nconst isWin = process.platform === 'win32';\nconst isExecutableRegExp = /\\.(?:com|exe)$/i;\nconst isCmdShimRegExp = /node_modules[\\\\/].bin[\\\\/][^\\\\/]+\\.cmd$/i;\n\nfunction detectShebang(parsed) {\n parsed.file = resolveCommand(parsed);\n\n const shebang = parsed.file && readShebang(parsed.file);\n\n if (shebang) {\n parsed.args.unshift(parsed.file);\n parsed.command = shebang;\n\n return resolveCommand(parsed);\n }\n\n return parsed.file;\n}\n\nfunction parseNonShell(parsed) {\n if (!isWin) {\n return parsed;\n }\n\n // Detect & add support for shebangs\n const commandFile = detectShebang(parsed);\n\n // We don't need a shell if the command filename is an executable\n const needsShell = !isExecutableRegExp.test(commandFile);\n\n // If a shell is required, use cmd.exe and take care of escaping everything correctly\n // Note that `forceShell` is an hidden option used only in tests\n if (parsed.options.forceShell || needsShell) {\n // Need to double escape meta chars if the command is a cmd-shim located in `node_modules/.bin/`\n // The cmd-shim simply calls execute the package bin file with NodeJS, proxying any argument\n // Because the escape of metachars with ^ gets interpreted when the cmd.exe is first called,\n // we need to double escape them\n const needsDoubleEscapeMetaChars = isCmdShimRegExp.test(commandFile);\n\n // Normalize posix paths into OS compatible paths (e.g.: foo/bar -> foo\\bar)\n // This is necessary otherwise it will always fail with ENOENT in those cases\n parsed.command = path.normalize(parsed.command);\n\n // Escape command & arguments\n parsed.command = escape.command(parsed.command);\n parsed.args = parsed.args.map((arg) => escape.argument(arg, needsDoubleEscapeMetaChars));\n\n const shellCommand = [parsed.command].concat(parsed.args).join(' ');\n\n parsed.args = ['/d', '/s', '/c', `\"${shellCommand}\"`];\n parsed.command = process.env.comspec || 'cmd.exe';\n parsed.options.windowsVerbatimArguments = true; // Tell node's spawn that the arguments are already escaped\n }\n\n return parsed;\n}\n\nfunction parse(command, args, options) {\n // Normalize arguments, similar to nodejs\n if (args && !Array.isArray(args)) {\n options = args;\n args = null;\n }\n\n args = args ? args.slice(0) : []; // Clone array to avoid changing the original\n options = Object.assign({}, options); // Clone object to avoid changing the original\n\n // Build our parsed object\n const parsed = {\n command,\n args,\n options,\n file: undefined,\n original: {\n command,\n args,\n },\n };\n\n // Delegate further parsing to shell or non-shell\n return options.shell ? parsed : parseNonShell(parsed);\n}\n\nmodule.exports = parse;\n","'use strict';\n\nconst isWin = process.platform === 'win32';\n\nfunction notFoundError(original, syscall) {\n return Object.assign(new Error(`${syscall} ${original.command} ENOENT`), {\n code: 'ENOENT',\n errno: 'ENOENT',\n syscall: `${syscall} ${original.command}`,\n path: original.command,\n spawnargs: original.args,\n });\n}\n\nfunction hookChildProcess(cp, parsed) {\n if (!isWin) {\n return;\n }\n\n const originalEmit = cp.emit;\n\n cp.emit = function (name, arg1) {\n // If emitting \"exit\" event and exit code is 1, we need to check if\n // the command exists and emit an \"error\" instead\n // See https://github.com/IndigoUnited/node-cross-spawn/issues/16\n if (name === 'exit') {\n const err = verifyENOENT(arg1, parsed);\n\n if (err) {\n return originalEmit.call(cp, 'error', err);\n }\n }\n\n return originalEmit.apply(cp, arguments); // eslint-disable-line prefer-rest-params\n };\n}\n\nfunction verifyENOENT(status, parsed) {\n if (isWin && status === 1 && !parsed.file) {\n return notFoundError(parsed.original, 'spawn');\n }\n\n return null;\n}\n\nfunction verifyENOENTSync(status, parsed) {\n if (isWin && status === 1 && !parsed.file) {\n return notFoundError(parsed.original, 'spawnSync');\n }\n\n return null;\n}\n\nmodule.exports = {\n hookChildProcess,\n verifyENOENT,\n verifyENOENTSync,\n notFoundError,\n};\n","'use strict';\n\nconst cp = require('child_process');\nconst parse = require('./lib/parse');\nconst enoent = require('./lib/enoent');\n\nfunction spawn(command, args, options) {\n // Parse the arguments\n const parsed = parse(command, args, options);\n\n // Spawn the child process\n const spawned = cp.spawn(parsed.command, parsed.args, parsed.options);\n\n // Hook into child process \"exit\" event to emit an error if the command\n // does not exists, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16\n enoent.hookChildProcess(spawned, parsed);\n\n return spawned;\n}\n\nfunction spawnSync(command, args, options) {\n // Parse the arguments\n const parsed = parse(command, args, options);\n\n // Spawn the child process\n const result = cp.spawnSync(parsed.command, parsed.args, parsed.options);\n\n // Analyze if the command does not exist, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16\n result.error = result.error || enoent.verifyENOENTSync(result.status, parsed);\n\n return result;\n}\n\nmodule.exports = spawn;\nmodule.exports.spawn = spawn;\nmodule.exports.sync = spawnSync;\n\nmodule.exports._parse = parse;\nmodule.exports._enoent = enoent;\n","'use strict';\n\nmodule.exports = input => {\n\tconst LF = typeof input === 'string' ? '\\n' : '\\n'.charCodeAt();\n\tconst CR = typeof input === 'string' ? '\\r' : '\\r'.charCodeAt();\n\n\tif (input[input.length - 1] === LF) {\n\t\tinput = input.slice(0, input.length - 1);\n\t}\n\n\tif (input[input.length - 1] === CR) {\n\t\tinput = input.slice(0, input.length - 1);\n\t}\n\n\treturn input;\n};\n","'use strict';\nconst path = require('path');\nconst pathKey = require('path-key');\n\nconst npmRunPath = options => {\n\toptions = {\n\t\tcwd: process.cwd(),\n\t\tpath: process.env[pathKey()],\n\t\texecPath: process.execPath,\n\t\t...options\n\t};\n\n\tlet previous;\n\tlet cwdPath = path.resolve(options.cwd);\n\tconst result = [];\n\n\twhile (previous !== cwdPath) {\n\t\tresult.push(path.join(cwdPath, 'node_modules/.bin'));\n\t\tprevious = cwdPath;\n\t\tcwdPath = path.resolve(cwdPath, '..');\n\t}\n\n\t// Ensure the running `node` binary is used\n\tconst execPathDir = path.resolve(options.cwd, options.execPath, '..');\n\tresult.push(execPathDir);\n\n\treturn result.concat(options.path).join(path.delimiter);\n};\n\nmodule.exports = npmRunPath;\n// TODO: Remove this for the next major release\nmodule.exports.default = npmRunPath;\n\nmodule.exports.env = options => {\n\toptions = {\n\t\tenv: process.env,\n\t\t...options\n\t};\n\n\tconst env = {...options.env};\n\tconst path = pathKey({env});\n\n\toptions.path = env[path];\n\tenv[path] = module.exports(options);\n\n\treturn env;\n};\n","'use strict';\n\nconst mimicFn = (to, from) => {\n\tfor (const prop of Reflect.ownKeys(from)) {\n\t\tObject.defineProperty(to, prop, Object.getOwnPropertyDescriptor(from, prop));\n\t}\n\n\treturn to;\n};\n\nmodule.exports = mimicFn;\n// TODO: Remove this for the next major release\nmodule.exports.default = mimicFn;\n","'use strict';\nconst mimicFn = require('mimic-fn');\n\nconst calledFunctions = new WeakMap();\n\nconst onetime = (function_, options = {}) => {\n\tif (typeof function_ !== 'function') {\n\t\tthrow new TypeError('Expected a function');\n\t}\n\n\tlet returnValue;\n\tlet callCount = 0;\n\tconst functionName = function_.displayName || function_.name || '<anonymous>';\n\n\tconst onetime = function (...arguments_) {\n\t\tcalledFunctions.set(onetime, ++callCount);\n\n\t\tif (callCount === 1) {\n\t\t\treturnValue = function_.apply(this, arguments_);\n\t\t\tfunction_ = null;\n\t\t} else if (options.throw === true) {\n\t\t\tthrow new Error(`Function \\`${functionName}\\` can only be called once`);\n\t\t}\n\n\t\treturn returnValue;\n\t};\n\n\tmimicFn(onetime, function_);\n\tcalledFunctions.set(onetime, callCount);\n\n\treturn onetime;\n};\n\nmodule.exports = onetime;\n// TODO: Remove this for the next major release\nmodule.exports.default = onetime;\n\nmodule.exports.callCount = function_ => {\n\tif (!calledFunctions.has(function_)) {\n\t\tthrow new Error(`The given function \\`${function_.name}\\` is not wrapped by the \\`onetime\\` package`);\n\t}\n\n\treturn calledFunctions.get(function_);\n};\n","/* eslint-disable max-lines */\n// List of known process signals with information about them\nexport const SIGNALS = [\n {\n name: 'SIGHUP',\n number: 1,\n action: 'terminate',\n description: 'Terminal closed',\n standard: 'posix',\n },\n {\n name: 'SIGINT',\n number: 2,\n action: 'terminate',\n description: 'User interruption with CTRL-C',\n standard: 'ansi',\n },\n {\n name: 'SIGQUIT',\n number: 3,\n action: 'core',\n description: 'User interruption with CTRL-\\\\',\n standard: 'posix',\n },\n {\n name: 'SIGILL',\n number: 4,\n action: 'core',\n description: 'Invalid machine instruction',\n standard: 'ansi',\n },\n {\n name: 'SIGTRAP',\n number: 5,\n action: 'core',\n description: 'Debugger breakpoint',\n standard: 'posix',\n },\n {\n name: 'SIGABRT',\n number: 6,\n action: 'core',\n description: 'Aborted',\n standard: 'ansi',\n },\n {\n name: 'SIGIOT',\n number: 6,\n action: 'core',\n description: 'Aborted',\n standard: 'bsd',\n },\n {\n name: 'SIGBUS',\n number: 7,\n action: 'core',\n description:\n 'Bus error due to misaligned, non-existing address or paging error',\n standard: 'bsd',\n },\n {\n name: 'SIGEMT',\n number: 7,\n action: 'terminate',\n description: 'Command should be emulated but is not implemented',\n standard: 'other',\n },\n {\n name: 'SIGFPE',\n number: 8,\n action: 'core',\n description: 'Floating point arithmetic error',\n standard: 'ansi',\n },\n {\n name: 'SIGKILL',\n number: 9,\n action: 'terminate',\n description: 'Forced termination',\n standard: 'posix',\n forced: true,\n },\n {\n name: 'SIGUSR1',\n number: 10,\n action: 'terminate',\n description: 'Application-specific signal',\n standard: 'posix',\n },\n {\n name: 'SIGSEGV',\n number: 11,\n action: 'core',\n description: 'Segmentation fault',\n standard: 'ansi',\n },\n {\n name: 'SIGUSR2',\n number: 12,\n action: 'terminate',\n description: 'Application-specific signal',\n standard: 'posix',\n },\n {\n name: 'SIGPIPE',\n number: 13,\n action: 'terminate',\n description: 'Broken pipe or socket',\n standard: 'posix',\n },\n {\n name: 'SIGALRM',\n number: 14,\n action: 'terminate',\n description: 'Timeout or timer',\n standard: 'posix',\n },\n {\n name: 'SIGTERM',\n number: 15,\n action: 'terminate',\n description: 'Termination',\n standard: 'ansi',\n },\n {\n name: 'SIGSTKFLT',\n number: 16,\n action: 'terminate',\n description: 'Stack is empty or overflowed',\n standard: 'other',\n },\n {\n name: 'SIGCHLD',\n number: 17,\n action: 'ignore',\n description: 'Child process terminated, paused or unpaused',\n standard: 'posix',\n },\n {\n name: 'SIGCLD',\n number: 17,\n action: 'ignore',\n description: 'Child process terminated, paused or unpaused',\n standard: 'other',\n },\n {\n name: 'SIGCONT',\n number: 18,\n action: 'unpause',\n description: 'Unpaused',\n standard: 'posix',\n forced: true,\n },\n {\n name: 'SIGSTOP',\n number: 19,\n action: 'pause',\n description: 'Paused',\n standard: 'posix',\n forced: true,\n },\n {\n name: 'SIGTSTP',\n number: 20,\n action: 'pause',\n description: 'Paused using CTRL-Z or \"suspend\"',\n standard: 'posix',\n },\n {\n name: 'SIGTTIN',\n number: 21,\n action: 'pause',\n description: 'Background process cannot read terminal input',\n standard: 'posix',\n },\n {\n name: 'SIGBREAK',\n number: 21,\n action: 'terminate',\n description: 'User interruption with CTRL-BREAK',\n standard: 'other',\n },\n {\n name: 'SIGTTOU',\n number: 22,\n action: 'pause',\n description: 'Background process cannot write to terminal output',\n standard: 'posix',\n },\n {\n name: 'SIGURG',\n number: 23,\n action: 'ignore',\n description: 'Socket received out-of-band data',\n standard: 'bsd',\n },\n {\n name: 'SIGXCPU',\n number: 24,\n action: 'core',\n description: 'Process timed out',\n standard: 'bsd',\n },\n {\n name: 'SIGXFSZ',\n number: 25,\n action: 'core',\n description: 'File too big',\n standard: 'bsd',\n },\n {\n name: 'SIGVTALRM',\n number: 26,\n action: 'terminate',\n description: 'Timeout or timer',\n standard: 'bsd',\n },\n {\n name: 'SIGPROF',\n number: 27,\n action: 'terminate',\n description: 'Timeout or timer',\n standard: 'bsd',\n },\n {\n name: 'SIGWINCH',\n number: 28,\n action: 'ignore',\n description: 'Terminal window size changed',\n standard: 'bsd',\n },\n {\n name: 'SIGIO',\n number: 29,\n action: 'terminate',\n description: 'I/O is available',\n standard: 'other',\n },\n {\n name: 'SIGPOLL',\n number: 29,\n action: 'terminate',\n description: 'Watched event',\n standard: 'other',\n },\n {\n name: 'SIGINFO',\n number: 29,\n action: 'ignore',\n description: 'Request for process information',\n standard: 'other',\n },\n {\n name: 'SIGPWR',\n number: 30,\n action: 'terminate',\n description: 'Device running out of power',\n standard: 'systemv',\n },\n {\n name: 'SIGSYS',\n number: 31,\n action: 'core',\n description: 'Invalid system call',\n standard: 'other',\n },\n {\n name: 'SIGUNUSED',\n number: 31,\n action: 'terminate',\n description: 'Invalid system call',\n standard: 'other',\n },\n]\n/* eslint-enable max-lines */\n","// List of realtime signals with information about them\nexport const getRealtimeSignals = function() {\n const length = SIGRTMAX - SIGRTMIN + 1\n return Array.from({ length }, getRealtimeSignal)\n}\n\nconst getRealtimeSignal = function(value, index) {\n return {\n name: `SIGRT${index + 1}`,\n number: SIGRTMIN + index,\n action: 'terminate',\n description: 'Application-specific signal (realtime)',\n standard: 'posix',\n }\n}\n\nconst SIGRTMIN = 34\nexport const SIGRTMAX = 64\n","import { constants } from 'os'\n\nimport { SIGNALS } from './core.js'\nimport { getRealtimeSignals } from './realtime.js'\n\n// Retrieve list of know signals (including realtime) with information about\n// them\nexport const getSignals = function() {\n const realtimeSignals = getRealtimeSignals()\n const signals = [...SIGNALS, ...realtimeSignals].map(normalizeSignal)\n return signals\n}\n\n// Normalize signal:\n// - `number`: signal numbers are OS-specific. This is taken into account by\n// `os.constants.signals`. However we provide a default `number` since some\n// signals are not defined for some OS.\n// - `forced`: set default to `false`\n// - `supported`: set value\nconst normalizeSignal = function({\n name,\n number: defaultNumber,\n description,\n action,\n forced = false,\n standard,\n}) {\n const {\n signals: { [name]: constantSignal },\n } = constants\n const supported = constantSignal !== undefined\n const number = supported ? constantSignal : defaultNumber\n return { name, number, description, supported, action, forced, standard }\n}\n","import { constants } from 'os'\n\nimport { getSignals } from './signals.js'\nimport { SIGRTMAX } from './realtime.js'\n\n// Retrieve `signalsByName`, an object mapping signal name to signal properties.\n// We make sure the object is sorted by `number`.\nconst getSignalsByName = function() {\n const signals = getSignals()\n return signals.reduce(getSignalByName, {})\n}\n\nconst getSignalByName = function(\n signalByNameMemo,\n { name, number, description, supported, action, forced, standard },\n) {\n return {\n ...signalByNameMemo,\n [name]: { name, number, description, supported, action, forced, standard },\n }\n}\n\nexport const signalsByName = getSignalsByName()\n\n// Retrieve `signalsByNumber`, an object mapping signal number to signal\n// properties.\n// We make sure the object is sorted by `number`.\nconst getSignalsByNumber = function() {\n const signals = getSignals()\n const length = SIGRTMAX + 1\n const signalsA = Array.from({ length }, (value, number) =>\n getSignalByNumber(number, signals),\n )\n return Object.assign({}, ...signalsA)\n}\n\nconst getSignalByNumber = function(number, signals) {\n const signal = findSignalByNumber(number, signals)\n\n if (signal === undefined) {\n return {}\n }\n\n const { name, description, supported, action, forced, standard } = signal\n return {\n [number]: {\n name,\n number,\n description,\n supported,\n action,\n forced,\n standard,\n },\n }\n}\n\n// Several signals might end up sharing the same number because of OS-specific\n// numbers, in which case those prevail.\nconst findSignalByNumber = function(number, signals) {\n const signal = signals.find(({ name }) => constants.signals[name] === number)\n\n if (signal !== undefined) {\n return signal\n }\n\n return signals.find(signalA => signalA.number === number)\n}\n\nexport const signalsByNumber = getSignalsByNumber()\n","'use strict';\nconst {signalsByName} = require('human-signals');\n\nconst getErrorPrefix = ({timedOut, timeout, errorCode, signal, signalDescription, exitCode, isCanceled}) => {\n\tif (timedOut) {\n\t\treturn `timed out after ${timeout} milliseconds`;\n\t}\n\n\tif (isCanceled) {\n\t\treturn 'was canceled';\n\t}\n\n\tif (errorCode !== undefined) {\n\t\treturn `failed with ${errorCode}`;\n\t}\n\n\tif (signal !== undefined) {\n\t\treturn `was killed with ${signal} (${signalDescription})`;\n\t}\n\n\tif (exitCode !== undefined) {\n\t\treturn `failed with exit code ${exitCode}`;\n\t}\n\n\treturn 'failed';\n};\n\nconst makeError = ({\n\tstdout,\n\tstderr,\n\tall,\n\terror,\n\tsignal,\n\texitCode,\n\tcommand,\n\tescapedCommand,\n\ttimedOut,\n\tisCanceled,\n\tkilled,\n\tparsed: {options: {timeout}}\n}) => {\n\t// `signal` and `exitCode` emitted on `spawned.on('exit')` event can be `null`.\n\t// We normalize them to `undefined`\n\texitCode = exitCode === null ? undefined : exitCode;\n\tsignal = signal === null ? undefined : signal;\n\tconst signalDescription = signal === undefined ? undefined : signalsByName[signal].description;\n\n\tconst errorCode = error && error.code;\n\n\tconst prefix = getErrorPrefix({timedOut, timeout, errorCode, signal, signalDescription, exitCode, isCanceled});\n\tconst execaMessage = `Command ${prefix}: ${command}`;\n\tconst isError = Object.prototype.toString.call(error) === '[object Error]';\n\tconst shortMessage = isError ? `${execaMessage}\\n${error.message}` : execaMessage;\n\tconst message = [shortMessage, stderr, stdout].filter(Boolean).join('\\n');\n\n\tif (isError) {\n\t\terror.originalMessage = error.message;\n\t\terror.message = message;\n\t} else {\n\t\terror = new Error(message);\n\t}\n\n\terror.shortMessage = shortMessage;\n\terror.command = command;\n\terror.escapedCommand = escapedCommand;\n\terror.exitCode = exitCode;\n\terror.signal = signal;\n\terror.signalDescription = signalDescription;\n\terror.stdout = stdout;\n\terror.stderr = stderr;\n\n\tif (all !== undefined) {\n\t\terror.all = all;\n\t}\n\n\tif ('bufferedData' in error) {\n\t\tdelete error.bufferedData;\n\t}\n\n\terror.failed = true;\n\terror.timedOut = Boolean(timedOut);\n\terror.isCanceled = isCanceled;\n\terror.killed = killed && !timedOut;\n\n\treturn error;\n};\n\nmodule.exports = makeError;\n","'use strict';\nconst aliases = ['stdin', 'stdout', 'stderr'];\n\nconst hasAlias = options => aliases.some(alias => options[alias] !== undefined);\n\nconst normalizeStdio = options => {\n\tif (!options) {\n\t\treturn;\n\t}\n\n\tconst {stdio} = options;\n\n\tif (stdio === undefined) {\n\t\treturn aliases.map(alias => options[alias]);\n\t}\n\n\tif (hasAlias(options)) {\n\t\tthrow new Error(`It's not possible to provide \\`stdio\\` in combination with one of ${aliases.map(alias => `\\`${alias}\\``).join(', ')}`);\n\t}\n\n\tif (typeof stdio === 'string') {\n\t\treturn stdio;\n\t}\n\n\tif (!Array.isArray(stdio)) {\n\t\tthrow new TypeError(`Expected \\`stdio\\` to be of type \\`string\\` or \\`Array\\`, got \\`${typeof stdio}\\``);\n\t}\n\n\tconst length = Math.max(stdio.length, aliases.length);\n\treturn Array.from({length}, (value, index) => stdio[index]);\n};\n\nmodule.exports = normalizeStdio;\n\n// `ipc` is pushed unless it is already present\nmodule.exports.node = options => {\n\tconst stdio = normalizeStdio(options);\n\n\tif (stdio === 'ipc') {\n\t\treturn 'ipc';\n\t}\n\n\tif (stdio === undefined || typeof stdio === 'string') {\n\t\treturn [stdio, stdio, stdio, 'ipc'];\n\t}\n\n\tif (stdio.includes('ipc')) {\n\t\treturn stdio;\n\t}\n\n\treturn [...stdio, 'ipc'];\n};\n","// This is not the set of all possible signals.\n//\n// It IS, however, the set of all signals that trigger\n// an exit on either Linux or BSD systems. Linux is a\n// superset of the signal names supported on BSD, and\n// the unknown signals just fail to register, so we can\n// catch that easily enough.\n//\n// Don't bother with SIGKILL. It's uncatchable, which\n// means that we can't fire any callbacks anyway.\n//\n// If a user does happen to register a handler on a non-\n// fatal signal like SIGWINCH or something, and then\n// exit, it'll end up firing `process.emit('exit')`, so\n// the handler will be fired anyway.\n//\n// SIGBUS, SIGFPE, SIGSEGV and SIGILL, when not raised\n// artificially, inherently leave the process in a\n// state from which it is not safe to try and enter JS\n// listeners.\nmodule.exports = [\n 'SIGABRT',\n 'SIGALRM',\n 'SIGHUP',\n 'SIGINT',\n 'SIGTERM'\n]\n\nif (process.platform !== 'win32') {\n module.exports.push(\n 'SIGVTALRM',\n 'SIGXCPU',\n 'SIGXFSZ',\n 'SIGUSR2',\n 'SIGTRAP',\n 'SIGSYS',\n 'SIGQUIT',\n 'SIGIOT'\n // should detect profiler and enable/disable accordingly.\n // see #21\n // 'SIGPROF'\n )\n}\n\nif (process.platform === 'linux') {\n module.exports.push(\n 'SIGIO',\n 'SIGPOLL',\n 'SIGPWR',\n 'SIGSTKFLT',\n 'SIGUNUSED'\n )\n}\n","// Note: since nyc uses this module to output coverage, any lines\n// that are in the direct sync flow of nyc's outputCoverage are\n// ignored, since we can never get coverage for them.\n// grab a reference to node's real process object right away\nvar process = global.process\n\nconst processOk = function (process) {\n return process &&\n typeof process === 'object' &&\n typeof process.removeListener === 'function' &&\n typeof process.emit === 'function' &&\n typeof process.reallyExit === 'function' &&\n typeof process.listeners === 'function' &&\n typeof process.kill === 'function' &&\n typeof process.pid === 'number' &&\n typeof process.on === 'function'\n}\n\n// some kind of non-node environment, just no-op\n/* istanbul ignore if */\nif (!processOk(process)) {\n module.exports = function () {\n return function () {}\n }\n} else {\n var assert = require('assert')\n var signals = require('./signals.js')\n var isWin = /^win/i.test(process.platform)\n\n var EE = require('events')\n /* istanbul ignore if */\n if (typeof EE !== 'function') {\n EE = EE.EventEmitter\n }\n\n var emitter\n if (process.__signal_exit_emitter__) {\n emitter = process.__signal_exit_emitter__\n } else {\n emitter = process.__signal_exit_emitter__ = new EE()\n emitter.count = 0\n emitter.emitted = {}\n }\n\n // Because this emitter is a global, we have to check to see if a\n // previous version of this library failed to enable infinite listeners.\n // I know what you're about to say. But literally everything about\n // signal-exit is a compromise with evil. Get used to it.\n if (!emitter.infinite) {\n emitter.setMaxListeners(Infinity)\n emitter.infinite = true\n }\n\n module.exports = function (cb, opts) {\n /* istanbul ignore if */\n if (!processOk(global.process)) {\n return function () {}\n }\n assert.equal(typeof cb, 'function', 'a callback must be provided for exit handler')\n\n if (loaded === false) {\n load()\n }\n\n var ev = 'exit'\n if (opts && opts.alwaysLast) {\n ev = 'afterexit'\n }\n\n var remove = function () {\n emitter.removeListener(ev, cb)\n if (emitter.listeners('exit').length === 0 &&\n emitter.listeners('afterexit').length === 0) {\n unload()\n }\n }\n emitter.on(ev, cb)\n\n return remove\n }\n\n var unload = function unload () {\n if (!loaded || !processOk(global.process)) {\n return\n }\n loaded = false\n\n signals.forEach(function (sig) {\n try {\n process.removeListener(sig, sigListeners[sig])\n } catch (er) {}\n })\n process.emit = originalProcessEmit\n process.reallyExit = originalProcessReallyExit\n emitter.count -= 1\n }\n module.exports.unload = unload\n\n var emit = function emit (event, code, signal) {\n /* istanbul ignore if */\n if (emitter.emitted[event]) {\n return\n }\n emitter.emitted[event] = true\n emitter.emit(event, code, signal)\n }\n\n // { <signal>: <listener fn>, ... }\n var sigListeners = {}\n signals.forEach(function (sig) {\n sigListeners[sig] = function listener () {\n /* istanbul ignore if */\n if (!processOk(global.process)) {\n return\n }\n // If there are no other listeners, an exit is coming!\n // Simplest way: remove us and then re-send the signal.\n // We know that this will kill the process, so we can\n // safely emit now.\n var listeners = process.listeners(sig)\n if (listeners.length === emitter.count) {\n unload()\n emit('exit', null, sig)\n /* istanbul ignore next */\n emit('afterexit', null, sig)\n /* istanbul ignore next */\n if (isWin && sig === 'SIGHUP') {\n // \"SIGHUP\" throws an `ENOSYS` error on Windows,\n // so use a supported signal instead\n sig = 'SIGINT'\n }\n /* istanbul ignore next */\n process.kill(process.pid, sig)\n }\n }\n })\n\n module.exports.signals = function () {\n return signals\n }\n\n var loaded = false\n\n var load = function load () {\n if (loaded || !processOk(global.process)) {\n return\n }\n loaded = true\n\n // This is the number of onSignalExit's that are in play.\n // It's important so that we can count the correct number of\n // listeners on signals, and don't wait for the other one to\n // handle it instead of us.\n emitter.count += 1\n\n signals = signals.filter(function (sig) {\n try {\n process.on(sig, sigListeners[sig])\n return true\n } catch (er) {\n return false\n }\n })\n\n process.emit = processEmit\n process.reallyExit = processReallyExit\n }\n module.exports.load = load\n\n var originalProcessReallyExit = process.reallyExit\n var processReallyExit = function processReallyExit (code) {\n /* istanbul ignore if */\n if (!processOk(global.process)) {\n return\n }\n process.exitCode = code || /* istanbul ignore next */ 0\n emit('exit', process.exitCode, null)\n /* istanbul ignore next */\n emit('afterexit', process.exitCode, null)\n /* istanbul ignore next */\n originalProcessReallyExit.call(process, process.exitCode)\n }\n\n var originalProcessEmit = process.emit\n var processEmit = function processEmit (ev, arg) {\n if (ev === 'exit' && processOk(global.process)) {\n /* istanbul ignore else */\n if (arg !== undefined) {\n process.exitCode = arg\n }\n var ret = originalProcessEmit.apply(this, arguments)\n /* istanbul ignore next */\n emit('exit', process.exitCode, null)\n /* istanbul ignore next */\n emit('afterexit', process.exitCode, null)\n /* istanbul ignore next */\n return ret\n } else {\n return originalProcessEmit.apply(this, arguments)\n }\n }\n}\n","'use strict';\nconst os = require('os');\nconst onExit = require('signal-exit');\n\nconst DEFAULT_FORCE_KILL_TIMEOUT = 1000 * 5;\n\n// Monkey-patches `childProcess.kill()` to add `forceKillAfterTimeout` behavior\nconst spawnedKill = (kill, signal = 'SIGTERM', options = {}) => {\n\tconst killResult = kill(signal);\n\tsetKillTimeout(kill, signal, options, killResult);\n\treturn killResult;\n};\n\nconst setKillTimeout = (kill, signal, options, killResult) => {\n\tif (!shouldForceKill(signal, options, killResult)) {\n\t\treturn;\n\t}\n\n\tconst timeout = getForceKillAfterTimeout(options);\n\tconst t = setTimeout(() => {\n\t\tkill('SIGKILL');\n\t}, timeout);\n\n\t// Guarded because there's no `.unref()` when `execa` is used in the renderer\n\t// process in Electron. This cannot be tested since we don't run tests in\n\t// Electron.\n\t// istanbul ignore else\n\tif (t.unref) {\n\t\tt.unref();\n\t}\n};\n\nconst shouldForceKill = (signal, {forceKillAfterTimeout}, killResult) => {\n\treturn isSigterm(signal) && forceKillAfterTimeout !== false && killResult;\n};\n\nconst isSigterm = signal => {\n\treturn signal === os.constants.signals.SIGTERM ||\n\t\t(typeof signal === 'string' && signal.toUpperCase() === 'SIGTERM');\n};\n\nconst getForceKillAfterTimeout = ({forceKillAfterTimeout = true}) => {\n\tif (forceKillAfterTimeout === true) {\n\t\treturn DEFAULT_FORCE_KILL_TIMEOUT;\n\t}\n\n\tif (!Number.isFinite(forceKillAfterTimeout) || forceKillAfterTimeout < 0) {\n\t\tthrow new TypeError(`Expected the \\`forceKillAfterTimeout\\` option to be a non-negative integer, got \\`${forceKillAfterTimeout}\\` (${typeof forceKillAfterTimeout})`);\n\t}\n\n\treturn forceKillAfterTimeout;\n};\n\n// `childProcess.cancel()`\nconst spawnedCancel = (spawned, context) => {\n\tconst killResult = spawned.kill();\n\n\tif (killResult) {\n\t\tcontext.isCanceled = true;\n\t}\n};\n\nconst timeoutKill = (spawned, signal, reject) => {\n\tspawned.kill(signal);\n\treject(Object.assign(new Error('Timed out'), {timedOut: true, signal}));\n};\n\n// `timeout` option handling\nconst setupTimeout = (spawned, {timeout, killSignal = 'SIGTERM'}, spawnedPromise) => {\n\tif (timeout === 0 || timeout === undefined) {\n\t\treturn spawnedPromise;\n\t}\n\n\tlet timeoutId;\n\tconst timeoutPromise = new Promise((resolve, reject) => {\n\t\ttimeoutId = setTimeout(() => {\n\t\t\ttimeoutKill(spawned, killSignal, reject);\n\t\t}, timeout);\n\t});\n\n\tconst safeSpawnedPromise = spawnedPromise.finally(() => {\n\t\tclearTimeout(timeoutId);\n\t});\n\n\treturn Promise.race([timeoutPromise, safeSpawnedPromise]);\n};\n\nconst validateTimeout = ({timeout}) => {\n\tif (timeout !== undefined && (!Number.isFinite(timeout) || timeout < 0)) {\n\t\tthrow new TypeError(`Expected the \\`timeout\\` option to be a non-negative integer, got \\`${timeout}\\` (${typeof timeout})`);\n\t}\n};\n\n// `cleanup` option handling\nconst setExitHandler = async (spawned, {cleanup, detached}, timedPromise) => {\n\tif (!cleanup || detached) {\n\t\treturn timedPromise;\n\t}\n\n\tconst removeExitHandler = onExit(() => {\n\t\tspawned.kill();\n\t});\n\n\treturn timedPromise.finally(() => {\n\t\tremoveExitHandler();\n\t});\n};\n\nmodule.exports = {\n\tspawnedKill,\n\tspawnedCancel,\n\tsetupTimeout,\n\tvalidateTimeout,\n\tsetExitHandler\n};\n","'use strict';\n\nconst isStream = stream =>\n\tstream !== null &&\n\ttypeof stream === 'object' &&\n\ttypeof stream.pipe === 'function';\n\nisStream.writable = stream =>\n\tisStream(stream) &&\n\tstream.writable !== false &&\n\ttypeof stream._write === 'function' &&\n\ttypeof stream._writableState === 'object';\n\nisStream.readable = stream =>\n\tisStream(stream) &&\n\tstream.readable !== false &&\n\ttypeof stream._read === 'function' &&\n\ttypeof stream._readableState === 'object';\n\nisStream.duplex = stream =>\n\tisStream.writable(stream) &&\n\tisStream.readable(stream);\n\nisStream.transform = stream =>\n\tisStream.duplex(stream) &&\n\ttypeof stream._transform === 'function';\n\nmodule.exports = isStream;\n","'use strict';\nconst {PassThrough: PassThroughStream} = require('stream');\n\nmodule.exports = options => {\n\toptions = {...options};\n\n\tconst {array} = options;\n\tlet {encoding} = options;\n\tconst isBuffer = encoding === 'buffer';\n\tlet objectMode = false;\n\n\tif (array) {\n\t\tobjectMode = !(encoding || isBuffer);\n\t} else {\n\t\tencoding = encoding || 'utf8';\n\t}\n\n\tif (isBuffer) {\n\t\tencoding = null;\n\t}\n\n\tconst stream = new PassThroughStream({objectMode});\n\n\tif (encoding) {\n\t\tstream.setEncoding(encoding);\n\t}\n\n\tlet length = 0;\n\tconst chunks = [];\n\n\tstream.on('data', chunk => {\n\t\tchunks.push(chunk);\n\n\t\tif (objectMode) {\n\t\t\tlength = chunks.length;\n\t\t} else {\n\t\t\tlength += chunk.length;\n\t\t}\n\t});\n\n\tstream.getBufferedValue = () => {\n\t\tif (array) {\n\t\t\treturn chunks;\n\t\t}\n\n\t\treturn isBuffer ? Buffer.concat(chunks, length) : chunks.join('');\n\t};\n\n\tstream.getBufferedLength = () => length;\n\n\treturn stream;\n};\n","'use strict';\nconst {constants: BufferConstants} = require('buffer');\nconst stream = require('stream');\nconst {promisify} = require('util');\nconst bufferStream = require('./buffer-stream');\n\nconst streamPipelinePromisified = promisify(stream.pipeline);\n\nclass MaxBufferError extends Error {\n\tconstructor() {\n\t\tsuper('maxBuffer exceeded');\n\t\tthis.name = 'MaxBufferError';\n\t}\n}\n\nasync function getStream(inputStream, options) {\n\tif (!inputStream) {\n\t\tthrow new Error('Expected a stream');\n\t}\n\n\toptions = {\n\t\tmaxBuffer: Infinity,\n\t\t...options\n\t};\n\n\tconst {maxBuffer} = options;\n\tconst stream = bufferStream(options);\n\n\tawait new Promise((resolve, reject) => {\n\t\tconst rejectPromise = error => {\n\t\t\t// Don't retrieve an oversized buffer.\n\t\t\tif (error && stream.getBufferedLength() <= BufferConstants.MAX_LENGTH) {\n\t\t\t\terror.bufferedData = stream.getBufferedValue();\n\t\t\t}\n\n\t\t\treject(error);\n\t\t};\n\n\t\t(async () => {\n\t\t\ttry {\n\t\t\t\tawait streamPipelinePromisified(inputStream, stream);\n\t\t\t\tresolve();\n\t\t\t} catch (error) {\n\t\t\t\trejectPromise(error);\n\t\t\t}\n\t\t})();\n\n\t\tstream.on('data', () => {\n\t\t\tif (stream.getBufferedLength() > maxBuffer) {\n\t\t\t\trejectPromise(new MaxBufferError());\n\t\t\t}\n\t\t});\n\t});\n\n\treturn stream.getBufferedValue();\n}\n\nmodule.exports = getStream;\nmodule.exports.buffer = (stream, options) => getStream(stream, {...options, encoding: 'buffer'});\nmodule.exports.array = (stream, options) => getStream(stream, {...options, array: true});\nmodule.exports.MaxBufferError = MaxBufferError;\n","'use strict';\n\nconst { PassThrough } = require('stream');\n\nmodule.exports = function (/*streams...*/) {\n var sources = []\n var output = new PassThrough({objectMode: true})\n\n output.setMaxListeners(0)\n\n output.add = add\n output.isEmpty = isEmpty\n\n output.on('unpipe', remove)\n\n Array.prototype.slice.call(arguments).forEach(add)\n\n return output\n\n function add (source) {\n if (Array.isArray(source)) {\n source.forEach(add)\n return this\n }\n\n sources.push(source);\n source.once('end', remove.bind(null, source))\n source.once('error', output.emit.bind(output, 'error'))\n source.pipe(output, {end: false})\n return this\n }\n\n function isEmpty () {\n return sources.length == 0;\n }\n\n function remove (source) {\n sources = sources.filter(function (it) { return it !== source })\n if (!sources.length && output.readable) { output.end() }\n }\n}\n","'use strict';\nconst isStream = require('is-stream');\nconst getStream = require('get-stream');\nconst mergeStream = require('merge-stream');\n\n// `input` option\nconst handleInput = (spawned, input) => {\n\t// Checking for stdin is workaround for https://github.com/nodejs/node/issues/26852\n\t// @todo remove `|| spawned.stdin === undefined` once we drop support for Node.js <=12.2.0\n\tif (input === undefined || spawned.stdin === undefined) {\n\t\treturn;\n\t}\n\n\tif (isStream(input)) {\n\t\tinput.pipe(spawned.stdin);\n\t} else {\n\t\tspawned.stdin.end(input);\n\t}\n};\n\n// `all` interleaves `stdout` and `stderr`\nconst makeAllStream = (spawned, {all}) => {\n\tif (!all || (!spawned.stdout && !spawned.stderr)) {\n\t\treturn;\n\t}\n\n\tconst mixed = mergeStream();\n\n\tif (spawned.stdout) {\n\t\tmixed.add(spawned.stdout);\n\t}\n\n\tif (spawned.stderr) {\n\t\tmixed.add(spawned.stderr);\n\t}\n\n\treturn mixed;\n};\n\n// On failure, `result.stdout|stderr|all` should contain the currently buffered stream\nconst getBufferedData = async (stream, streamPromise) => {\n\tif (!stream) {\n\t\treturn;\n\t}\n\n\tstream.destroy();\n\n\ttry {\n\t\treturn await streamPromise;\n\t} catch (error) {\n\t\treturn error.bufferedData;\n\t}\n};\n\nconst getStreamPromise = (stream, {encoding, buffer, maxBuffer}) => {\n\tif (!stream || !buffer) {\n\t\treturn;\n\t}\n\n\tif (encoding) {\n\t\treturn getStream(stream, {encoding, maxBuffer});\n\t}\n\n\treturn getStream.buffer(stream, {maxBuffer});\n};\n\n// Retrieve result of child process: exit code, signal, error, streams (stdout/stderr/all)\nconst getSpawnedResult = async ({stdout, stderr, all}, {encoding, buffer, maxBuffer}, processDone) => {\n\tconst stdoutPromise = getStreamPromise(stdout, {encoding, buffer, maxBuffer});\n\tconst stderrPromise = getStreamPromise(stderr, {encoding, buffer, maxBuffer});\n\tconst allPromise = getStreamPromise(all, {encoding, buffer, maxBuffer: maxBuffer * 2});\n\n\ttry {\n\t\treturn await Promise.all([processDone, stdoutPromise, stderrPromise, allPromise]);\n\t} catch (error) {\n\t\treturn Promise.all([\n\t\t\t{error, signal: error.signal, timedOut: error.timedOut},\n\t\t\tgetBufferedData(stdout, stdoutPromise),\n\t\t\tgetBufferedData(stderr, stderrPromise),\n\t\t\tgetBufferedData(all, allPromise)\n\t\t]);\n\t}\n};\n\nconst validateInputSync = ({input}) => {\n\tif (isStream(input)) {\n\t\tthrow new TypeError('The `input` option cannot be a stream in sync mode');\n\t}\n};\n\nmodule.exports = {\n\thandleInput,\n\tmakeAllStream,\n\tgetSpawnedResult,\n\tvalidateInputSync\n};\n\n","'use strict';\n\nconst nativePromisePrototype = (async () => {})().constructor.prototype;\nconst descriptors = ['then', 'catch', 'finally'].map(property => [\n\tproperty,\n\tReflect.getOwnPropertyDescriptor(nativePromisePrototype, property)\n]);\n\n// The return value is a mixin of `childProcess` and `Promise`\nconst mergePromise = (spawned, promise) => {\n\tfor (const [property, descriptor] of descriptors) {\n\t\t// Starting the main `promise` is deferred to avoid consuming streams\n\t\tconst value = typeof promise === 'function' ?\n\t\t\t(...args) => Reflect.apply(descriptor.value, promise(), args) :\n\t\t\tdescriptor.value.bind(promise);\n\n\t\tReflect.defineProperty(spawned, property, {...descriptor, value});\n\t}\n\n\treturn spawned;\n};\n\n// Use promises instead of `child_process` events\nconst getSpawnedPromise = spawned => {\n\treturn new Promise((resolve, reject) => {\n\t\tspawned.on('exit', (exitCode, signal) => {\n\t\t\tresolve({exitCode, signal});\n\t\t});\n\n\t\tspawned.on('error', error => {\n\t\t\treject(error);\n\t\t});\n\n\t\tif (spawned.stdin) {\n\t\t\tspawned.stdin.on('error', error => {\n\t\t\t\treject(error);\n\t\t\t});\n\t\t}\n\t});\n};\n\nmodule.exports = {\n\tmergePromise,\n\tgetSpawnedPromise\n};\n\n","'use strict';\nconst normalizeArgs = (file, args = []) => {\n\tif (!Array.isArray(args)) {\n\t\treturn [file];\n\t}\n\n\treturn [file, ...args];\n};\n\nconst NO_ESCAPE_REGEXP = /^[\\w.-]+$/;\nconst DOUBLE_QUOTES_REGEXP = /\"/g;\n\nconst escapeArg = arg => {\n\tif (typeof arg !== 'string' || NO_ESCAPE_REGEXP.test(arg)) {\n\t\treturn arg;\n\t}\n\n\treturn `\"${arg.replace(DOUBLE_QUOTES_REGEXP, '\\\\\"')}\"`;\n};\n\nconst joinCommand = (file, args) => {\n\treturn normalizeArgs(file, args).join(' ');\n};\n\nconst getEscapedCommand = (file, args) => {\n\treturn normalizeArgs(file, args).map(arg => escapeArg(arg)).join(' ');\n};\n\nconst SPACES_REGEXP = / +/g;\n\n// Handle `execa.command()`\nconst parseCommand = command => {\n\tconst tokens = [];\n\tfor (const token of command.trim().split(SPACES_REGEXP)) {\n\t\t// Allow spaces to be escaped by a backslash if not meant as a delimiter\n\t\tconst previousToken = tokens[tokens.length - 1];\n\t\tif (previousToken && previousToken.endsWith('\\\\')) {\n\t\t\t// Merge previous token with current one\n\t\t\ttokens[tokens.length - 1] = `${previousToken.slice(0, -1)} ${token}`;\n\t\t} else {\n\t\t\ttokens.push(token);\n\t\t}\n\t}\n\n\treturn tokens;\n};\n\nmodule.exports = {\n\tjoinCommand,\n\tgetEscapedCommand,\n\tparseCommand\n};\n","'use strict';\nconst path = require('path');\nconst childProcess = require('child_process');\nconst crossSpawn = require('cross-spawn');\nconst stripFinalNewline = require('strip-final-newline');\nconst npmRunPath = require('npm-run-path');\nconst onetime = require('onetime');\nconst makeError = require('./lib/error');\nconst normalizeStdio = require('./lib/stdio');\nconst {spawnedKill, spawnedCancel, setupTimeout, validateTimeout, setExitHandler} = require('./lib/kill');\nconst {handleInput, getSpawnedResult, makeAllStream, validateInputSync} = require('./lib/stream');\nconst {mergePromise, getSpawnedPromise} = require('./lib/promise');\nconst {joinCommand, parseCommand, getEscapedCommand} = require('./lib/command');\n\nconst DEFAULT_MAX_BUFFER = 1000 * 1000 * 100;\n\nconst getEnv = ({env: envOption, extendEnv, preferLocal, localDir, execPath}) => {\n\tconst env = extendEnv ? {...process.env, ...envOption} : envOption;\n\n\tif (preferLocal) {\n\t\treturn npmRunPath.env({env, cwd: localDir, execPath});\n\t}\n\n\treturn env;\n};\n\nconst handleArguments = (file, args, options = {}) => {\n\tconst parsed = crossSpawn._parse(file, args, options);\n\tfile = parsed.command;\n\targs = parsed.args;\n\toptions = parsed.options;\n\n\toptions = {\n\t\tmaxBuffer: DEFAULT_MAX_BUFFER,\n\t\tbuffer: true,\n\t\tstripFinalNewline: true,\n\t\textendEnv: true,\n\t\tpreferLocal: false,\n\t\tlocalDir: options.cwd || process.cwd(),\n\t\texecPath: process.execPath,\n\t\tencoding: 'utf8',\n\t\treject: true,\n\t\tcleanup: true,\n\t\tall: false,\n\t\twindowsHide: true,\n\t\t...options\n\t};\n\n\toptions.env = getEnv(options);\n\n\toptions.stdio = normalizeStdio(options);\n\n\tif (process.platform === 'win32' && path.basename(file, '.exe') === 'cmd') {\n\t\t// #116\n\t\targs.unshift('/q');\n\t}\n\n\treturn {file, args, options, parsed};\n};\n\nconst handleOutput = (options, value, error) => {\n\tif (typeof value !== 'string' && !Buffer.isBuffer(value)) {\n\t\t// When `execa.sync()` errors, we normalize it to '' to mimic `execa()`\n\t\treturn error === undefined ? undefined : '';\n\t}\n\n\tif (options.stripFinalNewline) {\n\t\treturn stripFinalNewline(value);\n\t}\n\n\treturn value;\n};\n\nconst execa = (file, args, options) => {\n\tconst parsed = handleArguments(file, args, options);\n\tconst command = joinCommand(file, args);\n\tconst escapedCommand = getEscapedCommand(file, args);\n\n\tvalidateTimeout(parsed.options);\n\n\tlet spawned;\n\ttry {\n\t\tspawned = childProcess.spawn(parsed.file, parsed.args, parsed.options);\n\t} catch (error) {\n\t\t// Ensure the returned error is always both a promise and a child process\n\t\tconst dummySpawned = new childProcess.ChildProcess();\n\t\tconst errorPromise = Promise.reject(makeError({\n\t\t\terror,\n\t\t\tstdout: '',\n\t\t\tstderr: '',\n\t\t\tall: '',\n\t\t\tcommand,\n\t\t\tescapedCommand,\n\t\t\tparsed,\n\t\t\ttimedOut: false,\n\t\t\tisCanceled: false,\n\t\t\tkilled: false\n\t\t}));\n\t\treturn mergePromise(dummySpawned, errorPromise);\n\t}\n\n\tconst spawnedPromise = getSpawnedPromise(spawned);\n\tconst timedPromise = setupTimeout(spawned, parsed.options, spawnedPromise);\n\tconst processDone = setExitHandler(spawned, parsed.options, timedPromise);\n\n\tconst context = {isCanceled: false};\n\n\tspawned.kill = spawnedKill.bind(null, spawned.kill.bind(spawned));\n\tspawned.cancel = spawnedCancel.bind(null, spawned, context);\n\n\tconst handlePromise = async () => {\n\t\tconst [{error, exitCode, signal, timedOut}, stdoutResult, stderrResult, allResult] = await getSpawnedResult(spawned, parsed.options, processDone);\n\t\tconst stdout = handleOutput(parsed.options, stdoutResult);\n\t\tconst stderr = handleOutput(parsed.options, stderrResult);\n\t\tconst all = handleOutput(parsed.options, allResult);\n\n\t\tif (error || exitCode !== 0 || signal !== null) {\n\t\t\tconst returnedError = makeError({\n\t\t\t\terror,\n\t\t\t\texitCode,\n\t\t\t\tsignal,\n\t\t\t\tstdout,\n\t\t\t\tstderr,\n\t\t\t\tall,\n\t\t\t\tcommand,\n\t\t\t\tescapedCommand,\n\t\t\t\tparsed,\n\t\t\t\ttimedOut,\n\t\t\t\tisCanceled: context.isCanceled,\n\t\t\t\tkilled: spawned.killed\n\t\t\t});\n\n\t\t\tif (!parsed.options.reject) {\n\t\t\t\treturn returnedError;\n\t\t\t}\n\n\t\t\tthrow returnedError;\n\t\t}\n\n\t\treturn {\n\t\t\tcommand,\n\t\t\tescapedCommand,\n\t\t\texitCode: 0,\n\t\t\tstdout,\n\t\t\tstderr,\n\t\t\tall,\n\t\t\tfailed: false,\n\t\t\ttimedOut: false,\n\t\t\tisCanceled: false,\n\t\t\tkilled: false\n\t\t};\n\t};\n\n\tconst handlePromiseOnce = onetime(handlePromise);\n\n\thandleInput(spawned, parsed.options.input);\n\n\tspawned.all = makeAllStream(spawned, parsed.options);\n\n\treturn mergePromise(spawned, handlePromiseOnce);\n};\n\nmodule.exports = execa;\n\nmodule.exports.sync = (file, args, options) => {\n\tconst parsed = handleArguments(file, args, options);\n\tconst command = joinCommand(file, args);\n\tconst escapedCommand = getEscapedCommand(file, args);\n\n\tvalidateInputSync(parsed.options);\n\n\tlet result;\n\ttry {\n\t\tresult = childProcess.spawnSync(parsed.file, parsed.args, parsed.options);\n\t} catch (error) {\n\t\tthrow makeError({\n\t\t\terror,\n\t\t\tstdout: '',\n\t\t\tstderr: '',\n\t\t\tall: '',\n\t\t\tcommand,\n\t\t\tescapedCommand,\n\t\t\tparsed,\n\t\t\ttimedOut: false,\n\t\t\tisCanceled: false,\n\t\t\tkilled: false\n\t\t});\n\t}\n\n\tconst stdout = handleOutput(parsed.options, result.stdout, result.error);\n\tconst stderr = handleOutput(parsed.options, result.stderr, result.error);\n\n\tif (result.error || result.status !== 0 || result.signal !== null) {\n\t\tconst error = makeError({\n\t\t\tstdout,\n\t\t\tstderr,\n\t\t\terror: result.error,\n\t\t\tsignal: result.signal,\n\t\t\texitCode: result.status,\n\t\t\tcommand,\n\t\t\tescapedCommand,\n\t\t\tparsed,\n\t\t\ttimedOut: result.error && result.error.code === 'ETIMEDOUT',\n\t\t\tisCanceled: false,\n\t\t\tkilled: result.signal !== null\n\t\t});\n\n\t\tif (!parsed.options.reject) {\n\t\t\treturn error;\n\t\t}\n\n\t\tthrow error;\n\t}\n\n\treturn {\n\t\tcommand,\n\t\tescapedCommand,\n\t\texitCode: 0,\n\t\tstdout,\n\t\tstderr,\n\t\tfailed: false,\n\t\ttimedOut: false,\n\t\tisCanceled: false,\n\t\tkilled: false\n\t};\n};\n\nmodule.exports.command = (command, options) => {\n\tconst [file, ...args] = parseCommand(command);\n\treturn execa(file, args, options);\n};\n\nmodule.exports.commandSync = (command, options) => {\n\tconst [file, ...args] = parseCommand(command);\n\treturn execa.sync(file, args, options);\n};\n\nmodule.exports.node = (scriptPath, args, options = {}) => {\n\tif (args && !Array.isArray(args) && typeof args === 'object') {\n\t\toptions = args;\n\t\targs = [];\n\t}\n\n\tconst stdio = normalizeStdio.node(options);\n\tconst defaultExecArgv = process.execArgv.filter(arg => !arg.startsWith('--inspect'));\n\n\tconst {\n\t\tnodePath = process.execPath,\n\t\tnodeOptions = defaultExecArgv\n\t} = options;\n\n\treturn execa(\n\t\tnodePath,\n\t\t[\n\t\t\t...nodeOptions,\n\t\t\tscriptPath,\n\t\t\t...(Array.isArray(args) ? args : [])\n\t\t],\n\t\t{\n\t\t\t...options,\n\t\t\tstdin: undefined,\n\t\t\tstdout: undefined,\n\t\t\tstderr: undefined,\n\t\t\tstdio,\n\t\t\tshell: false\n\t\t}\n\t);\n};\n","import { serve } from \"@hono/node-server\";\nimport fixPath from \"fix-path\";\nimport { Hono } from \"hono\";\nimport { cors } from \"hono/cors\";\nimport { logger } from \"hono/logger\";\nimport { serveStatic } from \"@hono/node-server/serve-static\";\nimport { readFileSync } from \"fs\";\nimport { join } from \"path\";\n\n// ANSI color codes for console output\nconst colors = {\n reset: \"\\x1b[0m\",\n bright: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\",\n};\n\n// Utility function to create a boxed console output\nfunction logBox(content: string, title?: string) {\n const lines = content.split(\"\\n\");\n const maxLength = Math.max(...lines.map((line) => line.length));\n const width = maxLength + 4;\n\n console.log(\"┌\" + \"─\".repeat(width) + \"┐\");\n if (title) {\n const titlePadding = Math.floor((width - title.length - 2) / 2);\n console.log(\n \"│\" +\n \" \".repeat(titlePadding) +\n title +\n \" \".repeat(width - title.length - titlePadding) +\n \"│\",\n );\n console.log(\"├\" + \"─\".repeat(width) + \"┤\");\n }\n\n lines.forEach((line) => {\n const padding = width - line.length - 2;\n console.log(\"│ \" + line + \" \".repeat(padding) + \" │\");\n });\n\n console.log(\"└\" + \"─\".repeat(width) + \"┘\");\n}\n\n// Import routes and services\nimport mcpRoutes from \"./routes/mcp/index\";\nimport { MCPJamClientManager } from \"./services/mcpjam-client-manager\";\nimport \"./types/hono\"; // Type extensions\n\n// Utility function to extract MCP server config from environment variables\nfunction getMCPConfigFromEnv() {\n const command = process.env.MCP_SERVER_COMMAND;\n if (!command) {\n return null;\n }\n\n const argsString = process.env.MCP_SERVER_ARGS;\n const args = argsString ? JSON.parse(argsString) : [];\n\n return {\n command,\n args,\n name: \"CLI Server\", // Default name for CLI-provided servers\n };\n}\n\n// Ensure PATH is initialized from the user's shell so spawned processes can find binaries (e.g., npx)\ntry {\n fixPath();\n} catch {}\n\nconst app = new Hono();\n\n// Initialize centralized MCPJam Client Manager\nconst mcpJamClientManager = new MCPJamClientManager();\n\n// Middleware to inject client manager into context\napp.use(\"*\", async (c, next) => {\n c.mcpJamClientManager = mcpJamClientManager;\n await next();\n});\n\n// Middleware\napp.use(\"*\", logger());\n// Dynamic CORS origin based on PORT environment variable\nconst serverPort = process.env.PORT || \"3000\";\nconst corsOrigins = [\n `http://localhost:${serverPort}`,\n \"http://localhost:3000\", // Keep for development\n];\n\napp.use(\n \"*\",\n cors({\n origin: corsOrigins,\n credentials: true,\n }),\n);\n\n// API Routes\napp.route(\"/api/mcp\", mcpRoutes);\n\n// Health check\napp.get(\"/health\", (c) => {\n return c.json({ status: \"ok\", timestamp: new Date().toISOString() });\n});\n\n// API endpoint to get MCP CLI config (for development mode)\napp.get(\"/api/mcp-cli-config\", (c) => {\n const mcpConfig = getMCPConfigFromEnv();\n return c.json({ config: mcpConfig });\n});\n\n// Static file serving (for production)\nif (process.env.NODE_ENV === \"production\") {\n // Serve static assets (JS, CSS, images, etc.)\n app.use(\"/*\", serveStatic({ root: \"./dist/client\" }));\n\n // SPA fallback - serve index.html for all non-API routes\n app.get(\"*\", async (c) => {\n const path = c.req.path;\n // Don't intercept API routes\n if (path.startsWith(\"/api/\")) {\n return c.notFound();\n }\n // Return index.html for SPA routes\n const indexPath = join(process.cwd(), \"dist\", \"client\", \"index.html\");\n let htmlContent = readFileSync(indexPath, \"utf-8\");\n\n // Inject MCP server config if provided via CLI\n const mcpConfig = getMCPConfigFromEnv();\n if (mcpConfig) {\n const configScript = `<script>window.MCP_CLI_CONFIG = ${JSON.stringify(mcpConfig)};</script>`;\n htmlContent = htmlContent.replace(\"</head>\", `${configScript}</head>`);\n }\n\n return c.html(htmlContent);\n });\n} else {\n // Development mode - just API\n app.get(\"/\", (c) => {\n return c.json({\n message: \"MCPJam API Server\",\n environment: \"development\",\n frontend: `http://localhost:${serverPort}`,\n });\n });\n}\n\nconst port = parseInt(process.env.PORT || \"3000\");\n\n// Display the localhost URL in a box\nlogBox(`http://localhost:${port}`, \"🚀 Inspector Launched\");\n\n// Graceful shutdown handling\nconst server = serve({\n fetch: app.fetch,\n port,\n hostname: \"0.0.0.0\", // Bind to all interfaces for Docker\n});\n\n// Handle graceful shutdown\nprocess.on(\"SIGINT\", () => {\n console.log(\"\\n🛑 Shutting down gracefully...\");\n server.close();\n process.exit(0);\n});\n\nprocess.on(\"SIGTERM\", () => {\n console.log(\"\\n🛑 Shutting down gracefully...\");\n server.close();\n process.exit(0);\n});\n\nexport default app;\n","import process from 'node:process';\nimport {shellPathSync} from 'shell-path';\n\nexport default function fixPath() {\n\tif (process.platform === 'win32') {\n\t\treturn;\n\t}\n\n\tprocess.env.PATH = shellPathSync() || [\n\t\t'./node_modules/.bin',\n\t\t'/.nodebrew/current/bin',\n\t\t'/usr/local/bin',\n\t\tprocess.env.PATH,\n\t].join(':');\n}\n","import process from 'node:process';\nimport execa from 'execa';\nimport stripAnsi from 'strip-ansi';\nimport defaultShell from 'default-shell';\n\nconst args = [\n\t'-ilc',\n\t'echo -n \"_SHELL_ENV_DELIMITER_\"; env; echo -n \"_SHELL_ENV_DELIMITER_\"; exit',\n];\n\nconst env = {\n\t// Disables Oh My Zsh auto-update thing that can block the process.\n\tDISABLE_AUTO_UPDATE: 'true',\n};\n\nconst parseEnv = env => {\n\tenv = env.split('_SHELL_ENV_DELIMITER_')[1];\n\tconst returnValue = {};\n\n\tfor (const line of stripAnsi(env).split('\\n').filter(line => Boolean(line))) {\n\t\tconst [key, ...values] = line.split('=');\n\t\treturnValue[key] = values.join('=');\n\t}\n\n\treturn returnValue;\n};\n\nexport async function shellEnv(shell) {\n\tif (process.platform === 'win32') {\n\t\treturn process.env;\n\t}\n\n\ttry {\n\t\tconst {stdout} = await execa(shell || defaultShell, args, {env});\n\t\treturn parseEnv(stdout);\n\t} catch (error) {\n\t\tif (shell) {\n\t\t\tthrow error;\n\t\t} else {\n\t\t\treturn process.env;\n\t\t}\n\t}\n}\n\nexport function shellEnvSync(shell) {\n\tif (process.platform === 'win32') {\n\t\treturn process.env;\n\t}\n\n\ttry {\n\t\tconst {stdout} = execa.sync(shell || defaultShell, args, {env});\n\t\treturn parseEnv(stdout);\n\t} catch (error) {\n\t\tif (shell) {\n\t\t\tthrow error;\n\t\t} else {\n\t\t\treturn process.env;\n\t\t}\n\t}\n}\n","export default function ansiRegex({onlyFirst = false} = {}) {\n\t// Valid string terminator sequences are BEL, ESC\\, and 0x9c\n\tconst ST = '(?:\\\\u0007|\\\\u001B\\\\u005C|\\\\u009C)';\n\tconst pattern = [\n\t\t`[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]+)*|[a-zA-Z\\\\d]+(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]*)*)?${ST})`,\n\t\t'(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PR-TZcf-nq-uy=><~]))',\n\t].join('|');\n\n\treturn new RegExp(pattern, onlyFirst ? undefined : 'g');\n}\n","import ansiRegex from 'ansi-regex';\n\nconst regex = ansiRegex();\n\nexport default function stripAnsi(string) {\n\tif (typeof string !== 'string') {\n\t\tthrow new TypeError(`Expected a \\`string\\`, got \\`${typeof string}\\``);\n\t}\n\n\t// Even though the regex is global, we don't need to reset the `.lastIndex`\n\t// because unlike `.exec()` and `.test()`, `.replace()` does it automatically\n\t// and doing it manually has a performance penalty.\n\treturn string.replace(regex, '');\n}\n","import process from 'node:process';\nimport {userInfo} from 'node:os';\n\nexport const detectDefaultShell = () => {\n\tconst {env} = process;\n\n\tif (process.platform === 'win32') {\n\t\treturn env.COMSPEC || 'cmd.exe';\n\t}\n\n\ttry {\n\t\tconst {shell} = userInfo();\n\t\tif (shell) {\n\t\t\treturn shell;\n\t\t}\n\t} catch {}\n\n\tif (process.platform === 'darwin') {\n\t\treturn env.SHELL || '/bin/zsh';\n\t}\n\n\treturn env.SHELL || '/bin/sh';\n};\n\n// Stores default shell when imported.\nconst defaultShell = detectDefaultShell();\n\nexport default defaultShell;\n","import {shellEnv, shellEnvSync} from 'shell-env';\n\nexport async function shellPath() {\n\tconst {PATH} = await shellEnv();\n\treturn PATH;\n}\n\nexport function shellPathSync() {\n\tconst {PATH} = shellEnvSync();\n\treturn PATH;\n}\n","import { Hono } from \"hono\";\nimport connect from \"./connect\";\nimport servers from \"./servers\";\nimport tools from \"./tools\";\nimport resources from \"./resources\";\nimport prompts from \"./prompts\";\nimport chat from \"./chat\";\nimport tests from \"./tests.ts\";\nimport oauth from \"./oauth\";\n\nconst mcp = new Hono();\n\n// Health check\nmcp.get(\"/health\", (c) => {\n return c.json({\n service: \"MCP API\",\n status: \"ready\",\n timestamp: new Date().toISOString(),\n });\n});\n\n// Chat endpoint - REAL IMPLEMENTATION\nmcp.route(\"/chat\", chat);\n\n// Connect endpoint - REAL IMPLEMENTATION\nmcp.route(\"/connect\", connect);\n\n// Servers management endpoints - REAL IMPLEMENTATION\nmcp.route(\"/servers\", servers);\n\n// Tools endpoint - REAL IMPLEMENTATION\nmcp.route(\"/tools\", tools);\n\n// Tests endpoint - generate per-test agents\nmcp.route(\"/tests\", tests);\n\n// Resources endpoints - REAL IMPLEMENTATION\nmcp.route(\"/resources\", resources);\n\n// Prompts endpoints - REAL IMPLEMENTATION\nmcp.route(\"/prompts\", prompts);\n\n// OAuth proxy endpoints\nmcp.route(\"/oauth\", oauth);\n\nexport default mcp;\n","import { Hono } from \"hono\";\nimport \"../../types/hono\"; // Type extensions\n\nconst connect = new Hono();\n\nconnect.post(\"/\", async (c) => {\n try {\n const { serverConfig, serverId } = await c.req.json();\n\n if (!serverConfig) {\n return c.json(\n {\n success: false,\n error: \"serverConfig is required\",\n },\n 400,\n );\n }\n\n if (!serverId) {\n return c.json(\n {\n success: false,\n error: \"serverId is required\",\n },\n 400,\n );\n }\n\n const mcpClientManager = c.mcpJamClientManager;\n\n try {\n await mcpClientManager.connectToServer(serverId, serverConfig);\n const status = mcpClientManager.getConnectionStatus(serverId);\n if (status === \"connected\") {\n return c.json({\n success: true,\n status: \"connected\",\n });\n } else {\n return c.json(\n {\n success: false,\n error: \"Connection failed\",\n status,\n },\n 500,\n );\n }\n } catch (error) {\n return c.json(\n {\n success: false,\n error: `MCP configuration is invalid. Please double check your server configuration: ${JSON.stringify(serverConfig)}`,\n details: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n } catch (error) {\n return c.json(\n {\n success: false,\n error: \"Failed to parse request body\",\n details: error instanceof Error ? error.message : \"Unknown error\",\n },\n 400,\n );\n }\n});\n\nexport default connect;\n","import { Hono } from \"hono\";\nimport \"../../types/hono\"; // Type extensions\n\nconst servers = new Hono();\n\n// List all connected servers with their status\nservers.get(\"/\", async (c) => {\n try {\n const mcpJamClientManager = c.mcpJamClientManager;\n\n // Get all server configurations and statuses\n const connectedServers = mcpJamClientManager.getConnectedServers();\n\n const serverList = Object.entries(connectedServers).map(\n ([serverId, serverInfo]) => ({\n id: serverId,\n name: serverId,\n status: serverInfo.status,\n config: serverInfo.config,\n }),\n );\n\n return c.json({\n success: true,\n servers: serverList,\n });\n } catch (error) {\n console.error(\"Error listing servers:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\n// Get status for a specific server\nservers.get(\"/status/:serverId\", async (c) => {\n try {\n const serverId = c.req.param(\"serverId\");\n const mcpJamClientManager = c.mcpJamClientManager;\n\n const status = mcpJamClientManager.getConnectionStatus(serverId);\n\n return c.json({\n success: true,\n serverId,\n status,\n });\n } catch (error) {\n console.error(\"Error getting server status:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\n// Disconnect from a server\nservers.delete(\"/:serverId\", async (c) => {\n try {\n const serverId = c.req.param(\"serverId\");\n const mcpJamClientManager = c.mcpJamClientManager;\n\n await mcpJamClientManager.disconnectFromServer(serverId);\n\n return c.json({\n success: true,\n message: `Disconnected from server: ${serverId}`,\n });\n } catch (error) {\n console.error(\"Error disconnecting server:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\n// Reconnect to a server\nservers.post(\"/reconnect\", async (c) => {\n try {\n const { serverId, serverConfig } = await c.req.json();\n\n if (!serverId || !serverConfig) {\n return c.json(\n {\n success: false,\n error: \"serverId and serverConfig are required\",\n },\n 400,\n );\n }\n\n const mcpJamClientManager = c.mcpJamClientManager;\n\n // Disconnect first, then reconnect\n await mcpJamClientManager.disconnectFromServer(serverId);\n await mcpJamClientManager.connectToServer(serverId, serverConfig);\n\n const status = mcpJamClientManager.getConnectionStatus(serverId);\n\n return c.json({\n success: true,\n serverId,\n status,\n message: `Reconnected to server: ${serverId}`,\n });\n } catch (error) {\n console.error(\"Error reconnecting server:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\nexport default servers;\n","import { Hono } from \"hono\";\nimport { z } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport { TextEncoder } from \"util\";\nimport \"../../types/hono\"; // Type extensions\n\nconst tools = new Hono();\n\n// Store for pending elicitation requests\nconst pendingElicitations = new Map<\n string,\n {\n resolve: (response: any) => void;\n reject: (error: any) => void;\n }\n>();\n\ntools.post(\"/\", async (c) => {\n let action: string | undefined;\n let toolName: string | undefined;\n\n try {\n const requestData = await c.req.json();\n action = requestData.action;\n toolName = requestData.toolName;\n const { serverConfig, parameters, requestId, response } = requestData;\n\n if (!action || ![\"list\", \"execute\", \"respond\"].includes(action)) {\n return c.json(\n {\n success: false,\n error: \"Action must be 'list', 'execute', or 'respond'\",\n },\n 400,\n );\n }\n\n // Handle elicitation response\n if (action === \"respond\") {\n if (!requestId) {\n return c.json(\n {\n success: false,\n error: \"requestId is required for respond action\",\n },\n 400,\n );\n }\n\n const mcpJamClientManager = c.mcpJamClientManager;\n const success = mcpJamClientManager.respondToElicitation(\n requestId,\n response,\n );\n\n if (!success) {\n // Also check local pendingElicitations for backward compatibility\n const pending = pendingElicitations.get(requestId);\n if (pending) {\n pending.resolve(response);\n pendingElicitations.delete(requestId);\n return c.json({ success: true });\n }\n\n return c.json(\n {\n success: false,\n error: \"No pending elicitation found for this requestId\",\n },\n 404,\n );\n }\n\n return c.json({ success: true });\n }\n\n // Use centralized MCPJam Agent\n const encoder = new TextEncoder();\n const readableStream = new ReadableStream({\n async start(controller) {\n try {\n if (!serverConfig) {\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"tool_error\", error: \"serverConfig is required\" })}\\n\\n`,\n ),\n );\n controller.enqueue(encoder.encode(`data: [DONE]\\n\\n`));\n controller.close();\n return;\n }\n\n const mcpJamClientManager = c.mcpJamClientManager;\n // Use server name from config or default key\n const serverId =\n (serverConfig as any).name || (serverConfig as any).id || \"server\";\n await mcpJamClientManager.connectToServer(serverId, serverConfig);\n\n // Set up elicitation callback for streaming context\n mcpJamClientManager.setElicitationCallback(async (request) => {\n const { requestId, message, schema } = request;\n\n // Stream elicitation request to client\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({\n type: \"elicitation_request\",\n requestId,\n message,\n schema,\n toolName: toolName || \"unknown\",\n timestamp: new Date(),\n })}\\n\\n`,\n ),\n );\n\n // Return a promise that will be resolved by the respond endpoint\n return new Promise((resolve, reject) => {\n pendingElicitations.set(requestId, {\n resolve: (response: any) => {\n resolve(response);\n pendingElicitations.delete(requestId);\n },\n reject: (error: any) => {\n reject(error);\n pendingElicitations.delete(requestId);\n },\n });\n\n // Set timeout\n setTimeout(() => {\n if (pendingElicitations.has(requestId)) {\n pendingElicitations.delete(requestId);\n reject(new Error(\"Elicitation timeout\"));\n }\n }, 300000); // 5 minutes\n });\n });\n\n if (action === \"list\") {\n // Use existing connection through MCPJam Agent to get un-prefixed tools\n try {\n const flattenedTools =\n await mcpJamClientManager.getToolsetsForServer(serverId);\n\n // Convert to the expected format with JSON schema conversion\n const toolsWithJsonSchema: Record<string, any> = {};\n for (const [name, tool] of Object.entries(flattenedTools)) {\n let inputSchema = (tool as any).inputSchema;\n try {\n // If original schemas are Zod, convert to JSON Schema. Otherwise pass through.\n inputSchema = zodToJsonSchema(inputSchema as z.ZodType<any>);\n } catch {\n // ignore conversion errors and use existing schema shape\n }\n toolsWithJsonSchema[name] = {\n name,\n description: (tool as any).description,\n inputSchema,\n outputSchema: (tool as any).outputSchema,\n };\n }\n\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"tools_list\", tools: toolsWithJsonSchema })}\\n\\n`,\n ),\n );\n controller.enqueue(encoder.encode(`data: [DONE]\\n\\n`));\n controller.close();\n return;\n } catch (err) {\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"tool_error\", error: err instanceof Error ? err.message : String(err) })}\\n\\n`,\n ),\n );\n controller.enqueue(encoder.encode(`data: [DONE]\\n\\n`));\n controller.close();\n return;\n }\n }\n\n if (action === \"execute\") {\n if (!toolName) {\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"tool_error\", error: \"Tool name is required for execution\" })}\\n\\n`,\n ),\n );\n controller.enqueue(encoder.encode(`data: [DONE]\\n\\n`));\n controller.close();\n return;\n }\n\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"tool_executing\", toolName, parameters: parameters || {}, message: \"Executing tool...\" })}\\n\\n`,\n ),\n );\n\n // Execute tool using centralized client manager\n const exec = await mcpJamClientManager.executeToolDirect(\n toolName,\n parameters || {},\n );\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"tool_result\", toolName, result: exec.result })}\\n\\n`,\n ),\n );\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"elicitation_complete\", toolName })}\\n\\n`,\n ),\n );\n controller.enqueue(encoder.encode(`data: [DONE]\\n\\n`));\n controller.close();\n return;\n }\n } catch (err) {\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"tool_error\", error: err instanceof Error ? err.message : String(err) })}\\n\\n`,\n ),\n );\n controller.enqueue(encoder.encode(`data: [DONE]\\n\\n`));\n controller.close();\n } finally {\n // Clear the elicitation callback\n const mcpJamClientManager = c.mcpJamClientManager;\n if (mcpJamClientManager) {\n mcpJamClientManager.clearElicitationCallback();\n }\n }\n },\n });\n\n return new Response(readableStream, {\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n },\n });\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : \"Unknown error\";\n\n return c.json(\n {\n success: false,\n error: errorMsg,\n },\n 500,\n );\n }\n});\n\nexport default tools;\n","import { Hono } from \"hono\";\nimport \"../../types/hono\"; // Type extensions\n\nconst resources = new Hono();\n\n// List resources endpoint\nresources.post(\"/list\", async (c) => {\n try {\n const { serverId } = await c.req.json();\n\n if (!serverId) {\n return c.json({ success: false, error: \"serverId is required\" }, 400);\n }\n const mcpClientManager = c.mcpJamClientManager;\n const serverResources = mcpClientManager.getResourcesForServer(serverId);\n return c.json({ resources: { [serverId]: serverResources } });\n } catch (error) {\n console.error(\"Error fetching resources:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\n// Read resource endpoint\nresources.post(\"/read\", async (c) => {\n try {\n const { serverId, uri } = await c.req.json();\n\n if (!serverId) {\n return c.json({ success: false, error: \"serverId is required\" }, 400);\n }\n\n if (!uri) {\n return c.json(\n {\n success: false,\n error: \"Resource URI is required\",\n },\n 400,\n );\n }\n\n const mcpClientManager = c.mcpJamClientManager;\n\n const content = await mcpClientManager.getResource(uri, serverId);\n\n return c.json({ content });\n } catch (error) {\n console.error(\"Error reading resource:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\nexport default resources;\n","import { Hono } from \"hono\";\nimport \"../../types/hono\"; // Type extensions\n\nconst prompts = new Hono();\n\n// List prompts endpoint\nprompts.post(\"/list\", async (c) => {\n try {\n const { serverId } = await c.req.json();\n\n if (!serverId) {\n return c.json({ success: false, error: \"serverId is required\" }, 400);\n }\n\n const mcpJamClientManager = c.mcpJamClientManager;\n\n // Get prompts for specific server\n const serverPrompts = mcpJamClientManager.getPromptsForServer(serverId);\n\n return c.json({ prompts: { [serverId]: serverPrompts } });\n } catch (error) {\n console.error(\"Error fetching prompts:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\n// Get prompt endpoint\nprompts.post(\"/get\", async (c) => {\n try {\n const { serverId, name, args } = await c.req.json();\n\n if (!serverId) {\n return c.json({ success: false, error: \"serverId is required\" }, 400);\n }\n\n if (!name) {\n return c.json(\n {\n success: false,\n error: \"Prompt name is required\",\n },\n 400,\n );\n }\n\n const mcpJamClientManager = c.mcpJamClientManager;\n\n // Get prompt content directly - servers are already connected\n const content = await mcpJamClientManager.getPrompt(\n name,\n serverId,\n args || {},\n );\n\n return c.json({ content });\n } catch (error) {\n console.error(\"Error getting prompt:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\nexport default prompts;\n","import { Hono } from \"hono\";\nimport { Agent } from \"@mastra/core/agent\";\nimport { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { createGoogleGenerativeAI } from \"@ai-sdk/google\";\nimport { createOllama } from \"ollama-ai-provider\";\nimport {\n ChatMessage,\n ModelDefinition,\n ModelProvider,\n} from \"../../../shared/types\";\nimport { TextEncoder } from \"util\";\nimport { getDefaultTemperatureByProvider } from \"../../../client/src/lib/chat-utils\";\n\n// Types\ninterface ElicitationResponse {\n [key: string]: unknown;\n action: \"accept\" | \"decline\" | \"cancel\";\n content?: any;\n _meta?: any;\n}\n\ninterface PendingElicitation {\n resolve: (response: ElicitationResponse) => void;\n reject: (error: any) => void;\n}\n\ninterface StreamingContext {\n controller: ReadableStreamDefaultController;\n encoder: TextEncoder;\n toolCallId: number;\n lastEmittedToolCallId: number | null;\n stepIndex: number;\n}\n\ninterface ChatRequest {\n serverConfigs?: Record<string, any>;\n model: ModelDefinition;\n provider: ModelProvider;\n apiKey?: string;\n systemPrompt?: string;\n temperature?: number;\n messages?: ChatMessage[];\n ollamaBaseUrl?: string;\n action?: string;\n requestId?: string;\n response?: any;\n}\n\n// Constants\nconst DEBUG_ENABLED = process.env.MCP_DEBUG !== \"false\";\nconst ELICITATION_TIMEOUT = 300000; // 5 minutes\nconst MAX_AGENT_STEPS = 10;\n\n// Debug logging helper\nconst dbg = (...args: any[]) => {\n if (DEBUG_ENABLED) console.log(\"[mcp/chat]\", ...args);\n};\n\n// Avoid MaxListeners warnings when repeatedly creating MCP clients in dev\ntry {\n (process as any).setMaxListeners?.(50);\n} catch {}\n\n// Store for pending elicitation requests\nconst pendingElicitations = new Map<string, PendingElicitation>();\n\n// Use the context-injected MCPJamClientManager (see server/index.ts middleware)\n\nconst chat = new Hono();\n\n// Helper Functions\n\n/**\n * Creates an LLM model based on the provider and configuration\n */\nconst createLlmModel = (\n modelDefinition: ModelDefinition,\n apiKey: string,\n ollamaBaseUrl?: string,\n) => {\n if (!modelDefinition?.id || !modelDefinition?.provider) {\n throw new Error(\n `Invalid model definition: ${JSON.stringify(modelDefinition)}`,\n );\n }\n\n switch (modelDefinition.provider) {\n case \"anthropic\":\n return createAnthropic({ apiKey })(modelDefinition.id);\n case \"openai\":\n return createOpenAI({ apiKey })(modelDefinition.id);\n case \"deepseek\":\n return createOpenAI({ apiKey, baseURL: \"https://api.deepseek.com/v1\" })(\n modelDefinition.id,\n );\n case \"google\":\n return createGoogleGenerativeAI({ apiKey })(modelDefinition.id);\n case \"ollama\":\n const baseUrl = ollamaBaseUrl || \"http://localhost:11434/api\";\n return createOllama({\n baseURL: `${baseUrl}`,\n })(modelDefinition.id, {\n simulateStreaming: true,\n });\n default:\n throw new Error(\n `Unsupported provider: ${modelDefinition.provider} for model: ${modelDefinition.id}`,\n );\n }\n};\n\n// Removed unused createElicitationHandler\n\n/**\n * Wraps MCP tools to capture execution events and stream them to the client\n */\nconst wrapToolsWithStreaming = (\n tools: Record<string, any>,\n streamingContext: StreamingContext,\n) => {\n const wrappedTools: Record<string, any> = {};\n\n for (const [name, tool] of Object.entries(tools)) {\n wrappedTools[name] = {\n ...(tool as any),\n execute: async (params: any) => {\n const currentToolCallId = ++streamingContext.toolCallId;\n const startedAt = Date.now();\n\n // Stream tool call event immediately\n if (streamingContext.controller && streamingContext.encoder) {\n streamingContext.controller.enqueue(\n streamingContext.encoder.encode(\n `data: ${JSON.stringify({\n type: \"tool_call\",\n toolCall: {\n id: currentToolCallId,\n name,\n parameters: params,\n timestamp: new Date(),\n status: \"executing\",\n },\n })}\\n\\n`,\n ),\n );\n }\n\n dbg(\"Tool executing\", { name, currentToolCallId, params });\n\n try {\n const result = await (tool as any).execute(params);\n dbg(\"Tool result\", {\n name,\n currentToolCallId,\n ms: Date.now() - startedAt,\n });\n\n // Stream tool result event\n if (streamingContext.controller && streamingContext.encoder) {\n streamingContext.controller.enqueue(\n streamingContext.encoder.encode(\n `data: ${JSON.stringify({\n type: \"tool_result\",\n toolResult: {\n id: currentToolCallId,\n toolCallId: currentToolCallId,\n result,\n timestamp: new Date(),\n },\n })}\\n\\n`,\n ),\n );\n }\n\n return result;\n } catch (error) {\n dbg(\"Tool error\", {\n name,\n currentToolCallId,\n error: error instanceof Error ? error.message : String(error),\n });\n\n // Stream tool error event\n if (streamingContext.controller && streamingContext.encoder) {\n streamingContext.controller.enqueue(\n streamingContext.encoder.encode(\n `data: ${JSON.stringify({\n type: \"tool_result\",\n toolResult: {\n id: currentToolCallId,\n toolCallId: currentToolCallId,\n error:\n error instanceof Error ? error.message : String(error),\n timestamp: new Date(),\n },\n })}\\n\\n`,\n ),\n );\n }\n throw error;\n }\n },\n };\n }\n\n return wrappedTools;\n};\n\n/**\n * Handles tool call and result events from the agent's onStepFinish callback\n */\nconst handleAgentStepFinish = (\n streamingContext: StreamingContext,\n text: string,\n toolCalls: any[] | undefined,\n toolResults: any[] | undefined,\n) => {\n try {\n // Handle tool calls\n if (toolCalls && Array.isArray(toolCalls)) {\n for (const call of toolCalls) {\n const currentToolCallId = ++streamingContext.toolCallId;\n streamingContext.lastEmittedToolCallId = currentToolCallId;\n\n if (streamingContext.controller && streamingContext.encoder) {\n streamingContext.controller.enqueue(\n streamingContext.encoder.encode(\n `data: ${JSON.stringify({\n type: \"tool_call\",\n toolCall: {\n id: currentToolCallId,\n name: call.name || call.toolName,\n parameters: call.params || call.args || {},\n timestamp: new Date(),\n status: \"executing\",\n },\n })}\\n\\n`,\n ),\n );\n }\n }\n }\n\n // Handle tool results\n if (toolResults && Array.isArray(toolResults)) {\n for (const result of toolResults) {\n const currentToolCallId =\n streamingContext.lastEmittedToolCallId != null\n ? streamingContext.lastEmittedToolCallId\n : ++streamingContext.toolCallId;\n\n if (streamingContext.controller && streamingContext.encoder) {\n streamingContext.controller.enqueue(\n streamingContext.encoder.encode(\n `data: ${JSON.stringify({\n type: \"tool_result\",\n toolResult: {\n id: currentToolCallId,\n toolCallId: currentToolCallId,\n result: result.result,\n error: (result as any).error,\n timestamp: new Date(),\n },\n })}\\n\\n`,\n ),\n );\n }\n }\n }\n\n // Emit a consolidated trace step event for UI tracing panels\n streamingContext.stepIndex = (streamingContext.stepIndex || 0) + 1;\n if (streamingContext.controller && streamingContext.encoder) {\n streamingContext.controller.enqueue(\n streamingContext.encoder.encode(\n `data: ${JSON.stringify({\n type: \"trace_step\",\n step: streamingContext.stepIndex,\n text,\n toolCalls: (toolCalls || []).map((c: any) => ({\n name: c.name || c.toolName,\n params: c.params || c.args || {},\n })),\n toolResults: (toolResults || []).map((r: any) => ({\n result: r.result,\n error: (r as any).error,\n })),\n timestamp: new Date(),\n })}\\n\\n`,\n ),\n );\n }\n } catch (err) {\n dbg(\"onStepFinish error\", err);\n }\n};\n\n/**\n * Streams text content from the agent's response\n */\nconst streamAgentResponse = async (\n streamingContext: StreamingContext,\n stream: any,\n) => {\n let hasContent = false;\n let chunkCount = 0;\n\n for await (const chunk of stream.textStream) {\n if (chunk && chunk.trim()) {\n hasContent = true;\n chunkCount++;\n streamingContext.controller.enqueue(\n streamingContext.encoder!.encode(\n `data: ${JSON.stringify({ type: \"text\", content: chunk })}\\n\\n`,\n ),\n );\n }\n }\n\n dbg(\"Streaming finished\", { hasContent, chunkCount });\n return { hasContent, chunkCount };\n};\n\n/**\n * Falls back to regular completion when streaming fails\n */\nconst fallbackToCompletion = async (\n agent: Agent,\n messages: any[],\n streamingContext: StreamingContext,\n provider: ModelProvider,\n temperature?: number,\n) => {\n try {\n const result = await agent.generate(messages, {\n temperature:\n temperature == null || undefined\n ? getDefaultTemperatureByProvider(provider)\n : temperature,\n });\n if (result.text && result.text.trim()) {\n streamingContext.controller.enqueue(\n streamingContext.encoder!.encode(\n `data: ${JSON.stringify({\n type: \"text\",\n content: result.text,\n })}\\n\\n`,\n ),\n );\n }\n } catch (fallbackErr) {\n streamingContext.controller.enqueue(\n streamingContext.encoder!.encode(\n `data: ${JSON.stringify({\n type: \"text\",\n content: \"Failed to generate response. Please try again. \",\n error:\n fallbackErr instanceof Error\n ? fallbackErr.message\n : \"Unknown error\",\n })}\\n\\n`,\n ),\n );\n }\n};\n\n/**\n * Creates the streaming response for the chat\n */\nconst createStreamingResponse = async (\n agent: Agent,\n messages: any[],\n toolsets: any,\n streamingContext: StreamingContext,\n provider: ModelProvider,\n temperature?: number,\n) => {\n const stream = await agent.stream(messages, {\n maxSteps: MAX_AGENT_STEPS,\n temperature:\n temperature == null || undefined\n ? getDefaultTemperatureByProvider(provider)\n : temperature,\n toolsets,\n onStepFinish: ({ text, toolCalls, toolResults }) => {\n handleAgentStepFinish(streamingContext, text, toolCalls, toolResults);\n },\n });\n\n const { hasContent } = await streamAgentResponse(streamingContext, stream);\n\n // Fall back to completion if no content was streamed\n if (!hasContent) {\n dbg(\"No content from textStream; falling back to completion\");\n await fallbackToCompletion(\n agent,\n messages,\n streamingContext,\n provider,\n temperature,\n );\n }\n\n // Stream elicitation completion\n streamingContext.controller.enqueue(\n streamingContext.encoder!.encode(\n `data: ${JSON.stringify({\n type: \"elicitation_complete\",\n })}\\n\\n`,\n ),\n );\n\n // End stream\n streamingContext.controller.enqueue(\n streamingContext.encoder!.encode(`data: [DONE]\\n\\n`),\n );\n};\n\n// Main chat endpoint\nchat.post(\"/\", async (c) => {\n const mcpClientManager = c.mcpJamClientManager;\n try {\n const requestData: ChatRequest = await c.req.json();\n const {\n serverConfigs,\n model,\n provider,\n apiKey,\n systemPrompt,\n temperature,\n messages,\n ollamaBaseUrl,\n action,\n requestId,\n response,\n } = requestData;\n\n // Handle elicitation response\n if (action === \"elicitation_response\") {\n if (!requestId) {\n return c.json(\n {\n success: false,\n error: \"requestId is required for elicitation_response action\",\n },\n 400,\n );\n }\n\n const pending = pendingElicitations.get(requestId);\n if (!pending) {\n return c.json(\n {\n success: false,\n error: \"No pending elicitation found for this requestId\",\n },\n 404,\n );\n }\n\n pending.resolve(response);\n pendingElicitations.delete(requestId);\n return c.json({ success: true });\n }\n\n // Validate required parameters\n if (!model?.id || !apiKey || !messages) {\n return c.json(\n {\n success: false,\n error: \"model (with id), apiKey, and messages are required\",\n },\n 400,\n );\n }\n\n // Connect to servers through MCPJamClientManager\n if (!serverConfigs || Object.keys(serverConfigs).length === 0) {\n return c.json(\n {\n success: false,\n error: \"No server configs provided\",\n },\n 400,\n );\n }\n\n // Connect to each server using MCPJamClientManager\n const serverErrors: Record<string, string> = {};\n const connectedServers: string[] = [];\n\n for (const [serverName, serverConfig] of Object.entries(serverConfigs)) {\n try {\n await mcpClientManager.connectToServer(serverName, serverConfig);\n connectedServers.push(serverName);\n dbg(\"Connected to server\", { serverName });\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Unknown error\";\n serverErrors[serverName] = errorMessage;\n dbg(\"Failed to connect to server\", { serverName, error: errorMessage });\n }\n }\n\n // Check if any servers connected successfully\n if (connectedServers.length === 0) {\n return c.json(\n {\n success: false,\n error: \"Failed to connect to any servers\",\n details: serverErrors,\n },\n 400,\n );\n }\n\n // Log warnings for failed connections but continue with successful ones\n if (Object.keys(serverErrors).length > 0) {\n dbg(\"Some servers failed to connect\", {\n connectedServers,\n failedServers: Object.keys(serverErrors),\n errors: serverErrors,\n });\n }\n\n // Create LLM model\n const llmModel = createLlmModel(model, apiKey, ollamaBaseUrl);\n\n // Create agent without tools initially - we'll add them in the streaming context\n const agent = new Agent({\n name: \"MCP Chat Agent\",\n instructions:\n systemPrompt || \"You are a helpful assistant with access to MCP tools.\",\n model: llmModel,\n tools: undefined, // Start without tools, add them in streaming context\n });\n\n const formattedMessages = messages.map((msg: ChatMessage) => ({\n role: msg.role,\n content: msg.content,\n }));\n\n // Get available tools from all connected servers\n const allTools = mcpClientManager.getAvailableTools();\n const toolsByServer: Record<string, any> = {};\n\n // Group tools by server for the agent\n for (const tool of allTools) {\n if (!toolsByServer[tool.serverId]) {\n toolsByServer[tool.serverId] = {};\n }\n toolsByServer[tool.serverId][tool.name] = {\n description: tool.description,\n inputSchema: tool.inputSchema,\n execute: async (params: any) => {\n return await mcpClientManager.executeToolDirect(\n `${tool.serverId}:${tool.name}`,\n params,\n );\n },\n };\n }\n\n dbg(\"Streaming start\", {\n connectedServers,\n toolCount: allTools.length,\n messageCount: formattedMessages.length,\n });\n\n // Create streaming response\n const encoder = new TextEncoder();\n const readableStream = new ReadableStream({\n async start(controller) {\n const streamingContext: StreamingContext = {\n controller,\n encoder,\n toolCallId: 0,\n lastEmittedToolCallId: null,\n stepIndex: 0,\n };\n\n // Flatten toolsets into a single tools object for streaming wrapper\n const flattenedTools: Record<string, any> = {};\n Object.values(toolsByServer).forEach((serverTools: any) => {\n Object.assign(flattenedTools, serverTools);\n });\n\n // Create streaming-wrapped tools\n const streamingWrappedTools = wrapToolsWithStreaming(\n flattenedTools,\n streamingContext,\n );\n\n // Create a new agent instance with streaming tools since tools property is read-only\n const streamingAgent = new Agent({\n name: agent.name,\n instructions: agent.instructions,\n model: agent.model!,\n tools:\n Object.keys(streamingWrappedTools).length > 0\n ? streamingWrappedTools\n : undefined,\n });\n\n // Register elicitation handler with MCPJamClientManager\n mcpClientManager.setElicitationCallback(async (request) => {\n // Convert MCPJamClientManager format to createElicitationHandler format\n const elicitationRequest = {\n message: request.message,\n requestedSchema: request.schema,\n };\n\n // Stream elicitation request to client using the provided requestId\n if (streamingContext.controller && streamingContext.encoder) {\n streamingContext.controller.enqueue(\n streamingContext.encoder.encode(\n `data: ${JSON.stringify({\n type: \"elicitation_request\",\n requestId: request.requestId,\n message: elicitationRequest.message,\n schema: elicitationRequest.requestedSchema,\n timestamp: new Date(),\n })}\\n\\n`,\n ),\n );\n }\n\n // Return a promise that will be resolved when user responds\n return new Promise<ElicitationResponse>((resolve, reject) => {\n pendingElicitations.set(request.requestId, { resolve, reject });\n\n // Set timeout to clean up if no response\n setTimeout(() => {\n if (pendingElicitations.has(request.requestId)) {\n pendingElicitations.delete(request.requestId);\n reject(new Error(\"Elicitation timeout\"));\n }\n }, ELICITATION_TIMEOUT);\n });\n });\n\n try {\n await createStreamingResponse(\n streamingAgent,\n formattedMessages,\n toolsByServer,\n streamingContext,\n provider,\n temperature,\n );\n } catch (error) {\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({\n type: \"error\",\n error: error instanceof Error ? error.message : \"Unknown error\",\n })}\\n\\n`,\n ),\n );\n } finally {\n // Clear elicitation callback to prevent memory leaks\n mcpClientManager.clearElicitationCallback();\n controller.close();\n }\n },\n });\n\n return new Response(readableStream, {\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n },\n });\n } catch (error) {\n console.error(\"[mcp/chat] Error in chat API:\", error);\n\n // Clear elicitation callback on error\n mcpClientManager.clearElicitationCallback();\n\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\nexport default chat;\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\nimport { ChatMessage } from \"./chat-types\";\nimport { ModelDefinition } from \"@/shared/types.js\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport function generateId(): string {\n return Math.random().toString(36).substr(2, 9);\n}\n\nexport function sanitizeText(text: string): string {\n // Basic sanitization - in production you might want more robust sanitization\n return text.trim();\n}\n\nexport function formatTimestamp(date: Date): string {\n return new Intl.DateTimeFormat(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\",\n hour12: true,\n }).format(date);\n}\n\nexport function formatMessageDate(date: Date): string {\n const now = new Date();\n const diffInMs = now.getTime() - date.getTime();\n const diffInDays = Math.floor(diffInMs / (1000 * 60 * 60 * 24));\n\n if (diffInDays === 0) {\n return formatTimestamp(date);\n } else if (diffInDays === 1) {\n return `Yesterday ${formatTimestamp(date)}`;\n } else if (diffInDays < 7) {\n return `${diffInDays} days ago`;\n } else {\n return new Intl.DateTimeFormat(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: date.getFullYear() !== now.getFullYear() ? \"numeric\" : undefined,\n }).format(date);\n }\n}\n\nexport function createMessage(\n role: \"user\" | \"assistant\",\n content: string,\n attachments?: any[],\n): ChatMessage {\n return {\n id: generateId(),\n role,\n content,\n timestamp: new Date(),\n attachments,\n metadata: {\n createdAt: new Date().toISOString(),\n },\n };\n}\n\nexport function isValidFileType(file: File): boolean {\n const allowedTypes = [\n \"text/plain\",\n \"application/pdf\",\n \"image/jpeg\",\n \"image/jpg\",\n \"image/png\",\n \"image/gif\",\n \"image/webp\",\n \"application/json\",\n \"text/csv\",\n \"application/vnd.ms-excel\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n ];\n\n return allowedTypes.includes(file.type);\n}\n\nexport function isImageFile(file: File): boolean {\n return file.type.startsWith(\"image/\");\n}\n\nexport function isImageUrl(url: string): boolean {\n const imageExtensions = [\".jpg\", \".jpeg\", \".png\", \".gif\", \".webp\", \".svg\"];\n const lowerUrl = url.toLowerCase();\n return (\n imageExtensions.some((ext) => lowerUrl.includes(ext)) ||\n lowerUrl.includes(\"data:image/\") ||\n lowerUrl.includes(\"blob:\")\n );\n}\n\nexport function getImageDimensions(\n url: string,\n): Promise<{ width: number; height: number }> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => {\n resolve({ width: img.naturalWidth, height: img.naturalHeight });\n };\n img.onerror = reject;\n img.src = url;\n });\n}\n\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return \"0 B\";\n\n const k = 1024;\n const sizes = [\"B\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + \" \" + sizes[i];\n}\n\nexport function truncateText(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n return text.substring(0, maxLength) + \"...\";\n}\n\nexport function scrollToBottom(element?: Element | null) {\n if (element) {\n element.scrollTop = element.scrollHeight;\n } else {\n window.scrollTo(0, document.body.scrollHeight);\n }\n}\n\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number,\n): (...args: Parameters<T>) => void {\n let timeout: NodeJS.Timeout;\n return (...args: Parameters<T>) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => func(...args), wait);\n };\n}\n\nexport function getDefaultTemperatureByProvider(provider: string): number {\n switch (provider) {\n case \"openai\":\n return 1.0;\n case \"anthropic\":\n return 0;\n case \"google\":\n return 0.9; // Google's recommended default\n default:\n return 0;\n }\n}\n\nexport function getDefaultTemperatureForModel(model: ModelDefinition): number {\n return getDefaultTemperatureByProvider(model.provider);\n}\n","import { Hono } from \"hono\";\nimport { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { createOllama } from \"ollama-ai-provider\";\nimport { MastraMCPServerDefinition, MCPClient } from \"@mastra/mcp\";\nimport type { ModelDefinition } from \"../../../shared/types\";\nimport { Agent } from \"@mastra/core/agent\";\nimport {\n validateMultipleServerConfigs,\n createMCPClientWithMultipleConnections,\n} from \"../../utils/mcp-utils\";\n\nconst tests = new Hono();\n\nexport default tests;\n\n// Run-all (parallel orchestrated) endpoint\ntests.post(\"/run-all\", async (c) => {\n const encoder = new TextEncoder();\n try {\n const body = await c.req.json();\n const testsInput = (body?.tests || []) as Array<{\n id: string;\n title: string;\n prompt: string;\n expectedTools: string[];\n model: ModelDefinition;\n selectedServers?: string[];\n }>;\n const allServers = (body?.allServers || {}) as Record<\n string,\n MastraMCPServerDefinition\n >;\n const providerApiKeys = body?.providerApiKeys || {};\n const ollamaBaseUrl: string | undefined = body?.ollamaBaseUrl;\n const maxConcurrency: number = Math.max(\n 1,\n Math.min(8, body?.concurrency ?? 5),\n );\n\n if (!Array.isArray(testsInput) || testsInput.length === 0) {\n return c.json({ success: false, error: \"No tests provided\" }, 400);\n }\n\n function createModel(model: ModelDefinition) {\n switch (model.provider) {\n case \"anthropic\":\n return createAnthropic({\n apiKey:\n providerApiKeys?.anthropic || process.env.ANTHROPIC_API_KEY || \"\",\n })(model.id);\n case \"openai\":\n return createOpenAI({\n apiKey: providerApiKeys?.openai || process.env.OPENAI_API_KEY || \"\",\n })(model.id);\n case \"deepseek\":\n return createOpenAI({\n apiKey:\n providerApiKeys?.deepseek || process.env.DEEPSEEK_API_KEY || \"\",\n baseURL: \"https://api.deepseek.com/v1\",\n })(model.id);\n case \"ollama\":\n return createOllama({\n baseURL:\n ollamaBaseUrl ||\n process.env.OLLAMA_BASE_URL ||\n \"http://localhost:11434/api\",\n })(model.id, { simulateStreaming: true });\n default:\n throw new Error(`Unsupported provider: ${model.provider}`);\n }\n }\n\n const readableStream = new ReadableStream({\n async start(controller) {\n let active = 0;\n let index = 0;\n let failed = false;\n\n const runNext = async () => {\n if (index >= testsInput.length) {\n if (active === 0) {\n // All done\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"run_complete\", passed: !failed })}\\n\\n`,\n ),\n );\n controller.enqueue(encoder.encode(`data: [DONE]\\n\\n`));\n controller.close();\n }\n return;\n }\n const test = testsInput[index++];\n active++;\n (async () => {\n const calledTools = new Set<string>();\n const expectedSet = new Set<string>(test.expectedTools || []);\n let step = 0;\n let client: MCPClient | null = null;\n try {\n // Build servers for this test\n let serverConfigs: Record<string, MastraMCPServerDefinition> = {};\n if (test.selectedServers && test.selectedServers.length > 0) {\n for (const name of test.selectedServers) {\n if (allServers[name]) serverConfigs[name] = allServers[name];\n }\n } else {\n for (const [name, cfg] of Object.entries(allServers)) {\n serverConfigs[name] = cfg;\n }\n }\n\n // Validate and connect with multiple servers like chat endpoint to ensure headers/eventSourceInit are set\n const validation = validateMultipleServerConfigs(serverConfigs);\n let finalServers: Record<string, MastraMCPServerDefinition> = {};\n if (validation.success && validation.validConfigs) {\n finalServers = validation.validConfigs;\n } else if (\n validation.validConfigs &&\n Object.keys(validation.validConfigs).length > 0\n ) {\n finalServers = validation.validConfigs; // partial success; continue with valid ones\n } else {\n throw new Error(\"No valid MCP server configs for test\");\n }\n\n client = createMCPClientWithMultipleConnections(finalServers);\n const model = createModel(test.model);\n const agent = new Agent({\n name: `TestAgent-${test.id}`,\n instructions:\n \"You are a helpful assistant with access to MCP tools\",\n model,\n });\n const toolsets = await client.getToolsets();\n const stream = await agent.stream(\n [{ role: \"user\", content: test.prompt || \"\" }] as any,\n {\n maxSteps: 10,\n toolsets,\n onStepFinish: ({ text, toolCalls, toolResults }) => {\n step += 1;\n // Accumulate tool names\n (toolCalls || []).forEach((c: any) => {\n const toolName = c?.name || c?.toolName;\n if (toolName) {\n calledTools.add(toolName);\n }\n });\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({\n type: \"trace_step\",\n testId: test.id,\n step,\n text,\n toolCalls,\n toolResults,\n })}\\n\\n`,\n ),\n );\n },\n },\n );\n // Drain text (no need to forward text here)\n for await (const _ of stream.textStream) {\n // no-op\n }\n const called = Array.from(calledTools);\n const missing = Array.from(expectedSet).filter(\n (t) => !calledTools.has(t),\n );\n const unexpected = called.filter((t) => !expectedSet.has(t));\n const passed = missing.length === 0 && unexpected.length === 0;\n if (!passed) failed = true;\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"result\", testId: test.id, passed, calledTools: called, missingTools: missing, unexpectedTools: unexpected })}\\n\\n`,\n ),\n );\n } catch (err) {\n failed = true;\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"result\", testId: test.id, passed: false, error: (err as Error)?.message })}\\n\\n`,\n ),\n );\n } finally {\n try {\n await client?.disconnect();\n } catch {}\n active--;\n runNext();\n }\n })();\n };\n\n for (let i = 0; i < Math.min(maxConcurrency, testsInput.length); i++) {\n runNext();\n }\n },\n });\n\n return new Response(readableStream, {\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n },\n });\n } catch (err) {\n return c.json(\n { success: false, error: (err as Error)?.message || \"Unknown error\" },\n 500,\n );\n }\n});\n","import { MastraMCPServerDefinition, MCPClient } from \"@mastra/mcp\";\n\n// Hono-compatible error response type\nexport interface HonoErrorResponse {\n message: string;\n status: number;\n}\n\nexport interface ValidationResult {\n success: boolean;\n config?: MastraMCPServerDefinition;\n error?: HonoErrorResponse;\n}\n\nexport interface MultipleValidationResult {\n success: boolean;\n validConfigs?: Record<string, MastraMCPServerDefinition>;\n errors?: Record<string, string>;\n error?: HonoErrorResponse;\n}\n\nexport function validateServerConfig(serverConfig: any): ValidationResult {\n if (!serverConfig) {\n return {\n success: false,\n error: {\n message: \"Server configuration is required\",\n status: 400,\n },\n };\n }\n\n // Validate and prepare config\n const config = { ...serverConfig };\n\n // Validate and convert URL if provided\n if (config.url) {\n try {\n // Convert string URL to URL object if needed and strip query/hash\n if (typeof config.url === \"string\") {\n const parsed = new URL(config.url);\n parsed.search = \"\";\n parsed.hash = \"\";\n config.url = parsed;\n } else if (typeof config.url === \"object\" && !config.url.href) {\n return {\n success: false,\n error: {\n message: \"Invalid URL configuration\",\n status: 400,\n },\n };\n }\n\n // Handle OAuth authentication for HTTP servers\n if (config.oauth?.access_token) {\n const authHeaders = {\n Authorization: `Bearer ${config.oauth.access_token}`,\n ...(config.requestInit?.headers || {}),\n };\n\n config.requestInit = {\n ...config.requestInit,\n headers: authHeaders,\n };\n\n // For SSE connections, add eventSourceInit with OAuth headers\n config.eventSourceInit = {\n fetch(input: Request | URL | string, init?: RequestInit) {\n const headers = new Headers(init?.headers || {});\n\n // Add OAuth authorization header\n headers.set(\n \"Authorization\",\n `Bearer ${config.oauth!.access_token}`,\n );\n\n // Copy other headers from requestInit\n if (config.requestInit?.headers) {\n const requestHeaders = new Headers(config.requestInit.headers);\n requestHeaders.forEach((value, key) => {\n if (key.toLowerCase() !== \"authorization\") {\n headers.set(key, value);\n }\n });\n }\n\n return fetch(input, {\n ...init,\n headers,\n });\n },\n };\n } else if (config.requestInit?.headers) {\n // For SSE connections without OAuth, add eventSourceInit if requestInit has custom headers\n config.eventSourceInit = {\n fetch(input: Request | URL | string, init?: RequestInit) {\n const headers = new Headers(init?.headers || {});\n\n // Copy headers from requestInit\n const requestHeaders = new Headers(config.requestInit.headers);\n requestHeaders.forEach((value, key) => {\n headers.set(key, value);\n });\n\n return fetch(input, {\n ...init,\n headers,\n });\n },\n };\n }\n } catch (error) {\n return {\n success: false,\n error: {\n message: `Invalid URL format: ${error}`,\n status: 400,\n },\n };\n }\n }\n\n return {\n success: true,\n config,\n };\n}\n\nexport function createMCPClient(\n config: MastraMCPServerDefinition,\n id: string,\n): MCPClient {\n return new MCPClient({\n id,\n servers: {\n server: config,\n },\n });\n}\n\nexport interface MultipleValidationResult {\n success: boolean;\n validConfigs?: Record<string, MastraMCPServerDefinition>;\n serverNameMapping?: Record<string, string>; // serverID -> originalName\n errors?: Record<string, string>;\n error?: HonoErrorResponse;\n}\n\n// Generate unique server ID that avoids collisions\nfunction generateUniqueServerID(serverName: string): string {\n // Use normalized name as base + timestamp + random suffix to ensure uniqueness\n const normalizedBase = normalizeServerConfigName(serverName);\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `${normalizedBase}_${timestamp}_${random}`;\n}\n\nexport const validateMultipleServerConfigs = (\n serverConfigs: Record<string, MastraMCPServerDefinition>,\n): MultipleValidationResult => {\n if (!serverConfigs || Object.keys(serverConfigs).length === 0) {\n return {\n success: false,\n error: {\n message: \"At least one server configuration is required\",\n status: 400,\n },\n };\n }\n\n const validConfigs: Record<string, MastraMCPServerDefinition> = {};\n const serverNameMapping: Record<string, string> = {};\n const errors: Record<string, string> = {};\n let hasErrors = false;\n\n // Validate each server configuration\n for (const [serverName, serverConfig] of Object.entries(serverConfigs)) {\n const validationResult = validateServerConfig(serverConfig);\n\n if (validationResult.success && validationResult.config) {\n // Generate unique server ID to avoid collisions from normalized names\n const serverID = generateUniqueServerID(serverName);\n validConfigs[serverID] = validationResult.config;\n serverNameMapping[serverID] = serverName; // Map serverID back to original name\n } else {\n hasErrors = true;\n let errorMessage = \"Configuration validation failed\";\n if (validationResult.error) {\n errorMessage = validationResult.error.message;\n }\n // Use original server name for error keys since this is for user display\n errors[serverName] = errorMessage;\n }\n }\n\n // If all configs are valid, return success\n if (!hasErrors) {\n return {\n success: true,\n validConfigs,\n serverNameMapping,\n };\n }\n\n // If some configs are valid but others failed, return partial success\n if (Object.keys(validConfigs).length > 0) {\n return {\n success: false,\n validConfigs,\n serverNameMapping,\n errors,\n };\n }\n\n // If all configs failed, return error\n return {\n success: false,\n errors,\n error: {\n message: \"All server configurations failed validation\",\n status: 400,\n },\n };\n};\n\nexport function createMCPClientWithMultipleConnections(\n serverConfigs: Record<string, MastraMCPServerDefinition>,\n): MCPClient {\n // Custom MCPClient wrapper to fix double prefixing issue\n const originalMCPClient = new MCPClient({\n id: `chat-${Date.now()}`,\n servers: serverConfigs,\n });\n\n // Override getTools method to fix double prefixing\n const originalGetTools = originalMCPClient.getTools.bind(originalMCPClient);\n originalMCPClient.getTools = async () => {\n const tools = await originalGetTools();\n const fixedTools: Record<string, any> = {};\n\n for (const [toolName, toolConfig] of Object.entries(tools)) {\n // Check if tool name has double prefix pattern (serverName_serverName_actualTool)\n const parts = toolName.split(\"_\");\n if (parts.length >= 3 && parts[0] === parts[1]) {\n // Remove the duplicate prefix: \"asana_asana_list_workspaces\" -> \"asana_list_workspaces\"\n const fixedName = parts.slice(1).join(\"_\");\n fixedTools[fixedName] = toolConfig;\n } else {\n fixedTools[toolName] = toolConfig;\n }\n }\n\n return fixedTools;\n };\n\n return originalMCPClient;\n}\n\nexport function normalizeServerConfigName(serverName: string): string {\n // Convert to lowercase and replace spaces/hyphens with underscores\n return serverName\n .toLowerCase()\n .replace(/[\\s\\-]+/g, \"_\")\n .replace(/[^a-z0-9_]/g, \"\");\n}\n\nexport function createErrorResponse(\n message: string,\n details?: string,\n status: number = 500,\n): HonoErrorResponse {\n return {\n message: details ? `${message}: ${details}` : message,\n status,\n };\n}\n","import { Hono } from \"hono\";\nimport { ContentfulStatusCode } from \"hono/utils/http-status\";\n\nconst oauth = new Hono();\n\n/**\n * Proxy OAuth metadata requests to bypass CORS restrictions\n * GET /api/mcp/oauth/metadata?url=https://mcp.asana.com/.well-known/oauth-authorization-server/sse\n */\noauth.get(\"/metadata\", async (c) => {\n try {\n const url = c.req.query(\"url\");\n\n if (!url) {\n return c.json({ error: \"Missing url parameter\" }, 400);\n }\n\n // Validate URL format and ensure it's HTTPS\n let metadataUrl: URL;\n try {\n metadataUrl = new URL(url);\n if (metadataUrl.protocol !== \"https:\") {\n return c.json({ error: \"Only HTTPS URLs are allowed\" }, 400);\n }\n } catch (error) {\n return c.json({ error: \"Invalid URL format\" }, 400);\n }\n\n // Fetch OAuth metadata from the server\n const response = await fetch(metadataUrl.toString(), {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n \"User-Agent\": \"MCP-Inspector/1.0\",\n },\n });\n\n if (!response.ok) {\n return c.json(\n {\n error: `Failed to fetch OAuth metadata: ${response.status} ${response.statusText}`,\n },\n response.status as ContentfulStatusCode,\n );\n }\n\n const metadata = (await response.json()) as Record<string, unknown>;\n\n // Return the metadata with proper CORS headers\n return c.json(metadata);\n } catch (error) {\n console.error(\"OAuth metadata proxy error:\", error);\n return c.json(\n {\n error:\n error instanceof Error ? error.message : \"Unknown error occurred\",\n },\n 500,\n );\n }\n});\n\nexport default oauth;\n","import { MCPClient, MastraMCPServerDefinition } from \"@mastra/mcp\";\nimport { validateServerConfig } from \"../utils/mcp-utils\";\n\nexport type ConnectionStatus =\n | \"disconnected\"\n | \"connecting\"\n | \"connected\"\n | \"error\";\n\nexport interface DiscoveredTool {\n name: string;\n description?: string;\n inputSchema: any;\n outputSchema?: any;\n serverId: string;\n}\n\nexport interface DiscoveredResource {\n uri: string;\n name: string;\n description?: string;\n mimeType?: string;\n serverId: string;\n}\n\nexport interface DiscoveredPrompt {\n name: string;\n description?: string;\n arguments?: Record<string, any>;\n serverId: string;\n}\n\nexport interface ChatMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string;\n}\n\nexport interface ChatResponse {\n text?: string;\n toolCalls?: any[];\n toolResults?: any[];\n}\n\nexport interface ToolResult {\n result: any;\n}\n\nexport interface ElicitationRequest {\n message: string;\n requestedSchema: any;\n}\n\nexport interface ElicitationResponse {\n [key: string]: unknown;\n action: \"accept\" | \"decline\" | \"cancel\";\n content?: any;\n _meta?: any;\n}\n\nexport interface ResourceContent {\n contents: any[];\n}\n\nexport interface PromptResult {\n content: any;\n}\n\nfunction generateUniqueServerId(serverId: string) {\n // Generate unique server ID that avoids collisions\n const normalizedBase = serverId\n .toLowerCase()\n .replace(/[\\s\\-]+/g, \"_\")\n .replace(/[^a-z0-9_]/g, \"\");\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `${normalizedBase}_${timestamp}_${random}`;\n}\n\nclass MCPJamClientManager {\n private mcpClients: Map<string, MCPClient> = new Map();\n private statuses: Map<string, ConnectionStatus> = new Map();\n private configs: Map<string, MastraMCPServerDefinition> = new Map();\n\n // Map original server names to unique IDs\n private serverIdMapping: Map<string, string> = new Map();\n\n // Track in-flight connections to avoid duplicate concurrent connects\n private pendingConnections: Map<string, Promise<void>> = new Map();\n\n private toolRegistry: Map<string, DiscoveredTool> = new Map();\n private resourceRegistry: Map<string, DiscoveredResource> = new Map();\n private promptRegistry: Map<string, DiscoveredPrompt> = new Map();\n\n // Store for pending elicitation requests with Promise resolvers\n private pendingElicitations: Map<\n string,\n {\n resolve: (response: ElicitationResponse) => void;\n reject: (error: any) => void;\n }\n > = new Map();\n\n // Optional callback for handling elicitation requests\n private elicitationCallback?: (request: {\n requestId: string;\n message: string;\n schema: any;\n }) => Promise<ElicitationResponse>;\n\n // Helper method to get unique ID for a server name\n private getServerUniqueId(serverName: string): string | undefined {\n return this.serverIdMapping.get(serverName);\n }\n\n // Public method to get server ID for external use (like frontend)\n getServerIdForName(serverName: string): string | undefined {\n return this.serverIdMapping.get(serverName);\n }\n\n // Public method to get original server name from a unique server ID\n getOriginalNameForId(uniqueServerId: string): string | undefined {\n for (const [originalName, uid] of this.serverIdMapping.entries()) {\n if (uid === uniqueServerId) return originalName;\n }\n return undefined;\n }\n\n // Convenience: map an array of unique IDs to their original names (fallback to ID if not found)\n mapIdsToOriginalNames(uniqueIds: string[]): string[] {\n return uniqueIds.map((id) => this.getOriginalNameForId(id) || id);\n }\n\n async connectToServer(serverId: string, serverConfig: any): Promise<void> {\n // If a connection is already in-flight for this server name, wait for it\n const pending = this.pendingConnections.get(serverId);\n if (pending) {\n await pending;\n return;\n }\n\n const connectPromise = (async () => {\n // Reuse existing unique ID for this server name if present; otherwise generate and map one\n let id = this.serverIdMapping.get(serverId);\n if (!id) {\n id = generateUniqueServerId(serverId);\n this.serverIdMapping.set(serverId, id);\n }\n\n // If already connected, no-op\n if (this.mcpClients.has(id)) return;\n\n // Validate server configuration\n const validation = validateServerConfig(serverConfig);\n if (!validation.success) {\n this.statuses.set(id, \"error\");\n throw new Error(validation.error!.message);\n }\n\n this.configs.set(id, validation.config!);\n this.statuses.set(id, \"connecting\");\n\n const client = new MCPClient({\n id: `mcpjam-${id}`,\n servers: { [id]: validation.config! },\n });\n\n try {\n // touch the server to verify connection\n await client.getTools();\n this.mcpClients.set(id, client);\n this.statuses.set(id, \"connected\");\n\n // Register elicitation handler for this server\n if (client.elicitation?.onRequest) {\n client.elicitation.onRequest(\n id,\n async (elicitationRequest: ElicitationRequest) => {\n return await this.handleElicitationRequest(elicitationRequest);\n },\n );\n }\n\n await this.discoverServerResources(id);\n } catch (err) {\n this.statuses.set(id, \"error\");\n try {\n await client.disconnect();\n } catch {}\n this.mcpClients.delete(id);\n throw err;\n }\n })().finally(() => {\n this.pendingConnections.delete(serverId);\n });\n\n this.pendingConnections.set(serverId, connectPromise);\n await connectPromise;\n }\n\n async disconnectFromServer(serverId: string): Promise<void> {\n const id = this.getServerUniqueId(serverId);\n if (!id) return; // Server not found\n\n const client = this.mcpClients.get(id);\n if (client) {\n try {\n await client.disconnect();\n } catch {}\n }\n this.mcpClients.delete(id);\n this.statuses.set(id, \"disconnected\");\n this.serverIdMapping.delete(serverId); // Clean up the mapping\n\n // purge registries for this server\n for (const key of Array.from(this.toolRegistry.keys())) {\n const item = this.toolRegistry.get(key)!;\n if (item.serverId === id) this.toolRegistry.delete(key);\n }\n for (const key of Array.from(this.resourceRegistry.keys())) {\n const item = this.resourceRegistry.get(key)!;\n if (item.serverId === id) this.resourceRegistry.delete(key);\n }\n for (const key of Array.from(this.promptRegistry.keys())) {\n const item = this.promptRegistry.get(key)!;\n if (item.serverId === id) this.promptRegistry.delete(key);\n }\n }\n\n getConnectionStatus(serverId: string): ConnectionStatus {\n const id = this.getServerUniqueId(serverId);\n return id ? this.statuses.get(id) || \"disconnected\" : \"disconnected\";\n }\n\n getConnectedServers(): Record<\n string,\n { status: ConnectionStatus; config?: any }\n > {\n const servers: Record<string, { status: ConnectionStatus; config?: any }> =\n {};\n\n // Return data keyed by the original server names provided by callers\n for (const [originalName, uniqueId] of this.serverIdMapping.entries()) {\n servers[originalName] = {\n status: this.statuses.get(uniqueId) || \"disconnected\",\n config: this.configs.get(uniqueId),\n };\n }\n\n return servers;\n }\n\n async discoverAllResources(): Promise<void> {\n const serverIds = Array.from(this.mcpClients.keys());\n await Promise.all(serverIds.map((id) => this.discoverServerResources(id)));\n }\n\n private async discoverServerResources(serverId: string): Promise<void> {\n // serverId is already the unique ID when called from connectToServer\n const client = this.mcpClients.get(serverId);\n if (!client) return;\n\n // Tools - use toolsets instead of getTools for consistency\n const toolsets = await client.getToolsets();\n const flattenedTools: Record<string, any> = {};\n Object.values(toolsets).forEach((serverTools: any) => {\n Object.assign(flattenedTools, serverTools);\n });\n\n for (const [name, tool] of Object.entries<any>(flattenedTools)) {\n this.toolRegistry.set(`${serverId}:${name}`, {\n name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n outputSchema: (tool as any).outputSchema,\n serverId: serverId,\n });\n }\n\n // Resources\n try {\n const res = await client.resources.list();\n for (const [, list] of Object.entries<any>(res)) {\n for (const r of list as any[]) {\n this.resourceRegistry.set(`${serverId}:${r.uri}`, {\n uri: r.uri,\n name: r.name,\n description: r.description,\n mimeType: r.mimeType,\n serverId: serverId,\n });\n }\n }\n } catch {}\n\n // Prompts\n try {\n const prompts = await client.prompts.list();\n for (const [, list] of Object.entries<any>(prompts)) {\n for (const p of list as any[]) {\n this.promptRegistry.set(`${serverId}:${p.name}`, {\n name: p.name,\n description: p.description,\n arguments: p.arguments,\n serverId: serverId,\n });\n }\n }\n } catch {}\n }\n\n getAvailableTools(): DiscoveredTool[] {\n return Array.from(this.toolRegistry.values());\n }\n\n async getToolsetsForServer(serverId: string): Promise<Record<string, any>> {\n const id = this.getServerUniqueId(serverId);\n if (!id) {\n throw new Error(`No MCP client available for server: ${serverId}`);\n }\n const client = this.mcpClients.get(id);\n if (!client) {\n throw new Error(`No MCP client available for server: ${serverId}`);\n }\n\n // Get toolsets like in the chat route - this gives us server-prefixed tools\n const toolsets = await client.getToolsets();\n\n // Flatten toolsets to get un-prefixed tool names like in chat route\n const flattenedTools: Record<string, any> = {};\n Object.values(toolsets).forEach((serverTools: any) => {\n Object.assign(flattenedTools, serverTools);\n });\n\n return flattenedTools;\n }\n getAvailableResources(): DiscoveredResource[] {\n return Array.from(this.resourceRegistry.values());\n }\n\n getResourcesForServer(serverId: string): DiscoveredResource[] {\n const id = this.getServerUniqueId(serverId);\n if (!id) return [];\n return Array.from(this.resourceRegistry.values()).filter(\n (r) => r.serverId === id,\n );\n }\n\n getAvailablePrompts(): DiscoveredPrompt[] {\n return Array.from(this.promptRegistry.values());\n }\n\n getPromptsForServer(serverId: string): DiscoveredPrompt[] {\n const id = this.getServerUniqueId(serverId);\n if (!id) return [];\n return Array.from(this.promptRegistry.values()).filter(\n (p) => p.serverId === id,\n );\n }\n\n async executeToolDirect(\n toolName: string,\n parameters: Record<string, any> = {},\n ): Promise<ToolResult> {\n // toolName may include server prefix \"serverId:tool\"\n let serverId = \"\";\n let name = toolName;\n\n if (toolName.includes(\":\")) {\n const [sid, n] = toolName.split(\":\", 2);\n // Resolve provided server identifier (original name or unique ID) to the unique ID\n const mappedId = this.getServerUniqueId(sid);\n serverId = mappedId || (this.mcpClients.has(sid) ? sid : \"\");\n name = n;\n } else {\n // Find which server has this tool by checking un-prefixed name\n for (const tool of this.toolRegistry.values()) {\n if (tool.name === toolName) {\n serverId = tool.serverId;\n name = toolName;\n break;\n }\n }\n }\n\n // If not found in registry, try to find it using toolsets from all connected servers\n if (!serverId) {\n for (const [clientServerId, client] of this.mcpClients.entries()) {\n try {\n const toolsets = await client.getToolsets();\n // Flatten toolsets to check for the tool\n const flattenedTools: Record<string, any> = {};\n Object.values(toolsets).forEach((serverTools: any) => {\n Object.assign(flattenedTools, serverTools);\n });\n\n if (flattenedTools[toolName]) {\n serverId = clientServerId;\n name = toolName;\n break;\n }\n } catch {\n // Continue to next server if this one fails\n }\n }\n }\n\n if (!serverId) {\n throw new Error(`Tool not found in any connected server: ${toolName}`);\n }\n\n const client = this.mcpClients.get(serverId);\n if (!client)\n throw new Error(`No MCP client available for server: ${serverId}`);\n\n // Use toolsets to get the actual tool (since tools might be prefixed in getTools())\n const toolsets = await client.getToolsets();\n const flattenedTools: Record<string, any> = {};\n Object.values(toolsets).forEach((serverTools: any) => {\n Object.assign(flattenedTools, serverTools);\n });\n\n const tool = flattenedTools[name];\n if (!tool)\n throw new Error(`Tool '${name}' not found in server '${serverId}'`);\n\n // Inspect input schema to choose the most likely argument shape, but be robust and\n // fall back to the alternate shape on invalid-arguments errors.\n const schema: any = (tool as any).inputSchema;\n const hasContextProperty =\n schema &&\n typeof schema === \"object\" &&\n (schema as any).properties &&\n Object.prototype.hasOwnProperty.call(\n (schema as any).properties,\n \"context\",\n );\n const requiresContext =\n hasContextProperty ||\n (schema &&\n Array.isArray((schema as any).required) &&\n (schema as any).required.includes(\"context\"));\n\n const contextWrapped = { context: parameters || {} };\n const direct = parameters || {};\n const attempts = requiresContext\n ? [contextWrapped, direct]\n : [direct, contextWrapped];\n\n let lastError: any = undefined;\n for (const args of attempts) {\n try {\n const result = await tool.execute(args);\n\n // Check if the result indicates an error\n if (result && result.isError) {\n const errorText =\n result.content && result.content[0] && result.content[0].text\n ? result.content[0].text\n : \"Unknown error\";\n throw new Error(errorText);\n }\n\n return { result };\n } catch (err: any) {\n lastError = err;\n }\n }\n throw lastError;\n }\n\n async getResource(\n resourceUri: string,\n serverId: string,\n ): Promise<ResourceContent> {\n // resourceUri may include server prefix\n let uri = resourceUri;\n // Resolve provided server identifier (original name or unique ID) to the unique ID\n const mappedId = this.getServerUniqueId(serverId);\n const resolvedServerId =\n mappedId || (this.mcpClients.has(serverId) ? serverId : undefined);\n\n if (!resolvedServerId) {\n throw new Error(`No MCP client available for server: ${serverId}`);\n }\n\n const client = this.mcpClients.get(resolvedServerId);\n if (!client) throw new Error(\"No MCP client available\");\n const content = await client.resources.read(resolvedServerId, uri);\n return { contents: content?.contents || [] };\n }\n\n async getPrompt(\n promptName: string,\n serverId: string,\n args?: Record<string, any>,\n ): Promise<PromptResult> {\n // Resolve provided server identifier (original name or unique ID) to the unique ID\n const mappedId = this.getServerUniqueId(serverId);\n const resolvedServerId =\n mappedId || (this.mcpClients.has(serverId) ? serverId : undefined);\n\n if (!resolvedServerId) {\n throw new Error(`No MCP client available for server: ${serverId}`);\n }\n\n const client = this.mcpClients.get(resolvedServerId);\n if (!client) throw new Error(\"No MCP client available\");\n const content = await client.prompts.get({\n serverName: resolvedServerId,\n name: promptName,\n args: args || {},\n });\n return { content };\n }\n\n /**\n * Handles elicitation requests from MCP servers during direct tool execution\n */\n private async handleElicitationRequest(\n elicitationRequest: ElicitationRequest,\n ): Promise<ElicitationResponse> {\n const requestId = `elicit_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n\n // Create a promise that will be resolved when the user responds\n return new Promise<ElicitationResponse>((resolve, reject) => {\n this.pendingElicitations.set(requestId, { resolve, reject });\n\n // If there's an active elicitation callback, use it\n if (this.elicitationCallback) {\n this.elicitationCallback({\n requestId,\n message: elicitationRequest.message,\n schema: elicitationRequest.requestedSchema,\n })\n .then(resolve)\n .catch(reject);\n } else {\n // If no callback is set, reject with details for the tools route to handle\n const error = new Error(\"ELICITATION_REQUIRED\");\n (error as any).elicitationRequest = {\n requestId,\n message: elicitationRequest.message,\n schema: elicitationRequest.requestedSchema,\n };\n reject(error);\n }\n });\n }\n\n /**\n * Responds to a pending elicitation request\n */\n respondToElicitation(\n requestId: string,\n response: ElicitationResponse,\n ): boolean {\n const pending = this.pendingElicitations.get(requestId);\n if (!pending) {\n return false;\n }\n\n pending.resolve(response);\n this.pendingElicitations.delete(requestId);\n return true;\n }\n\n /**\n * Gets the pending elicitations map for external access\n */\n getPendingElicitations(): Map<\n string,\n {\n resolve: (response: ElicitationResponse) => void;\n reject: (error: any) => void;\n }\n > {\n return this.pendingElicitations;\n }\n\n /**\n * Sets a callback to handle elicitation requests\n */\n setElicitationCallback(\n callback: (request: {\n requestId: string;\n message: string;\n schema: any;\n }) => Promise<ElicitationResponse>,\n ): void {\n this.elicitationCallback = callback;\n }\n\n /**\n * Clears the elicitation callback\n */\n clearElicitationCallback(): void {\n this.elicitationCallback = undefined;\n }\n}\n\n// Export the class directly instead of singleton\nexport { MCPJamClientManager };\nexport default MCPJamClientManager;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA,WAAO,UAAU;AACjB,UAAM,OAAO;AAEb,QAAI,KAAK,UAAQ,IAAI;AAErB,aAAS,aAAc,MAAM,SAAS;AACpC,UAAI,UAAU,QAAQ,YAAY,SAChC,QAAQ,UAAU,QAAQ,IAAI;AAEhC,UAAI,CAAC,SAAS;AACZ,eAAO;AAAA,MACT;AAEA,gBAAU,QAAQ,MAAM,GAAG;AAC3B,UAAI,QAAQ,QAAQ,EAAE,MAAM,IAAI;AAC9B,eAAO;AAAA,MACT;AACA,eAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACvC,YAAI,IAAI,QAAQ,CAAC,EAAE,YAAY;AAC/B,YAAI,KAAK,KAAK,OAAO,CAAC,EAAE,MAAM,EAAE,YAAY,MAAM,GAAG;AACnD,iBAAO;AAAA,QACT;AAAA,MACF;AACA,aAAO;AAAA,IACT;AAEA,aAAS,UAAW,MAAM,MAAM,SAAS;AACvC,UAAI,CAAC,KAAK,eAAe,KAAK,CAAC,KAAK,OAAO,GAAG;AAC5C,eAAO;AAAA,MACT;AACA,aAAO,aAAa,MAAM,OAAO;AAAA,IACnC;AAEA,aAAS,MAAO,MAAM,SAAS,IAAI;AACjC,SAAG,KAAK,MAAM,SAAU,IAAI,MAAM;AAChC,WAAG,IAAI,KAAK,QAAQ,UAAU,MAAM,MAAM,OAAO,CAAC;AAAA,MACpD,CAAC;AAAA,IACH;AAEA,aAAS,KAAM,MAAM,SAAS;AAC5B,aAAO,UAAU,GAAG,SAAS,IAAI,GAAG,MAAM,OAAO;AAAA,IACnD;AAAA;AAAA;;;ACzCA;AAAA;AAAA;AAAA,WAAO,UAAU;AACjB,UAAM,OAAO;AAEb,QAAI,KAAK,UAAQ,IAAI;AAErB,aAAS,MAAO,MAAM,SAAS,IAAI;AACjC,SAAG,KAAK,MAAM,SAAU,IAAI,MAAM;AAChC,WAAG,IAAI,KAAK,QAAQ,UAAU,MAAM,OAAO,CAAC;AAAA,MAC9C,CAAC;AAAA,IACH;AAEA,aAAS,KAAM,MAAM,SAAS;AAC5B,aAAO,UAAU,GAAG,SAAS,IAAI,GAAG,OAAO;AAAA,IAC7C;AAEA,aAAS,UAAW,MAAM,SAAS;AACjC,aAAO,KAAK,OAAO,KAAK,UAAU,MAAM,OAAO;AAAA,IACjD;AAEA,aAAS,UAAW,MAAM,SAAS;AACjC,UAAI,MAAM,KAAK;AACf,UAAI,MAAM,KAAK;AACf,UAAI,MAAM,KAAK;AAEf,UAAI,QAAQ,QAAQ,QAAQ,SAC1B,QAAQ,MAAM,QAAQ,UAAU,QAAQ,OAAO;AACjD,UAAI,QAAQ,QAAQ,QAAQ,SAC1B,QAAQ,MAAM,QAAQ,UAAU,QAAQ,OAAO;AAEjD,UAAI,IAAI,SAAS,OAAO,CAAC;AACzB,UAAI,IAAI,SAAS,OAAO,CAAC;AACzB,UAAI,IAAI,SAAS,OAAO,CAAC;AACzB,UAAI,KAAK,IAAI;AAEb,UAAI,MAAO,MAAM,KACd,MAAM,KAAM,QAAQ,SACpB,MAAM,KAAM,QAAQ,SACpB,MAAM,MAAO,UAAU;AAE1B,aAAO;AAAA,IACT;AAAA;AAAA;;;ACxCA;AAAA;AAAA;AAAA,QAAI,KAAK,UAAQ,IAAI;AACrB,QAAI;AACJ,QAAI,QAAQ,aAAa,WAAW,OAAO,iBAAiB;AAC1D,aAAO;AAAA,IACT,OAAO;AACL,aAAO;AAAA,IACT;AAEA,WAAO,UAAU;AACjB,UAAM,OAAO;AAEb,aAAS,MAAO,MAAM,SAAS,IAAI;AACjC,UAAI,OAAO,YAAY,YAAY;AACjC,aAAK;AACL,kBAAU,CAAC;AAAA,MACb;AAEA,UAAI,CAAC,IAAI;AACP,YAAI,OAAO,YAAY,YAAY;AACjC,gBAAM,IAAI,UAAU,uBAAuB;AAAA,QAC7C;AAEA,eAAO,IAAI,QAAQ,SAAU,SAAS,QAAQ;AAC5C,gBAAM,MAAM,WAAW,CAAC,GAAG,SAAU,IAAI,IAAI;AAC3C,gBAAI,IAAI;AACN,qBAAO,EAAE;AAAA,YACX,OAAO;AACL,sBAAQ,EAAE;AAAA,YACZ;AAAA,UACF,CAAC;AAAA,QACH,CAAC;AAAA,MACH;AAEA,WAAK,MAAM,WAAW,CAAC,GAAG,SAAU,IAAI,IAAI;AAE1C,YAAI,IAAI;AACN,cAAI,GAAG,SAAS,YAAY,WAAW,QAAQ,cAAc;AAC3D,iBAAK;AACL,iBAAK;AAAA,UACP;AAAA,QACF;AACA,WAAG,IAAI,EAAE;AAAA,MACX,CAAC;AAAA,IACH;AAEA,aAAS,KAAM,MAAM,SAAS;AAE5B,UAAI;AACF,eAAO,KAAK,KAAK,MAAM,WAAW,CAAC,CAAC;AAAA,MACtC,SAAS,IAAI;AACX,YAAI,WAAW,QAAQ,gBAAgB,GAAG,SAAS,UAAU;AAC3D,iBAAO;AAAA,QACT,OAAO;AACL,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACxDA;AAAA;AAAA;AAAA,QAAM,YAAY,QAAQ,aAAa,WACnC,QAAQ,IAAI,WAAW,YACvB,QAAQ,IAAI,WAAW;AAE3B,QAAM,OAAO,UAAQ,MAAM;AAC3B,QAAM,QAAQ,YAAY,MAAM;AAChC,QAAM,QAAQ;AAEd,QAAM,mBAAmB,CAAC,QACxB,OAAO,OAAO,IAAI,MAAM,cAAc,GAAG,EAAE,GAAG,EAAE,MAAM,SAAS,CAAC;AAElE,QAAM,cAAc,CAAC,KAAK,QAAQ;AAChC,YAAM,QAAQ,IAAI,SAAS;AAI3B,YAAM,UAAU,IAAI,MAAM,IAAI,KAAK,aAAa,IAAI,MAAM,IAAI,IAAI,CAAC,EAAE,IAEjE;AAAA;AAAA,QAEE,GAAI,YAAY,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC;AAAA,QACnC,IAAI,IAAI,QAAQ,QAAQ,IAAI;AAAA,QACe,IAAI,MAAM,KAAK;AAAA,MAC5D;AAEJ,YAAM,aAAa,YACf,IAAI,WAAW,QAAQ,IAAI,WAAW,wBACtC;AACJ,YAAM,UAAU,YAAY,WAAW,MAAM,KAAK,IAAI,CAAC,EAAE;AAEzD,UAAI,WAAW;AACb,YAAI,IAAI,QAAQ,GAAG,MAAM,MAAM,QAAQ,CAAC,MAAM;AAC5C,kBAAQ,QAAQ,EAAE;AAAA,MACtB;AAEA,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAM,QAAQ,CAAC,KAAK,KAAK,OAAO;AAC9B,UAAI,OAAO,QAAQ,YAAY;AAC7B,aAAK;AACL,cAAM,CAAC;AAAA,MACT;AACA,UAAI,CAAC;AACH,cAAM,CAAC;AAET,YAAM,EAAE,SAAS,SAAS,WAAW,IAAI,YAAY,KAAK,GAAG;AAC7D,YAAM,QAAQ,CAAC;AAEf,YAAM,OAAO,OAAK,IAAI,QAAQ,CAAC,SAAS,WAAW;AACjD,YAAI,MAAM,QAAQ;AAChB,iBAAO,IAAI,OAAO,MAAM,SAAS,QAAQ,KAAK,IAC1C,OAAO,iBAAiB,GAAG,CAAC;AAElC,cAAM,QAAQ,QAAQ,CAAC;AACvB,cAAM,WAAW,SAAS,KAAK,KAAK,IAAI,MAAM,MAAM,GAAG,EAAE,IAAI;AAE7D,cAAM,OAAO,KAAK,KAAK,UAAU,GAAG;AACpC,cAAM,IAAI,CAAC,YAAY,YAAY,KAAK,GAAG,IAAI,IAAI,MAAM,GAAG,CAAC,IAAI,OAC7D;AAEJ,gBAAQ,QAAQ,GAAG,GAAG,CAAC,CAAC;AAAA,MAC1B,CAAC;AAED,YAAM,UAAU,CAAC,GAAG,GAAG,OAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AAC7D,YAAI,OAAO,QAAQ;AACjB,iBAAO,QAAQ,KAAK,IAAI,CAAC,CAAC;AAC5B,cAAM,MAAM,QAAQ,EAAE;AACtB,cAAM,IAAI,KAAK,EAAE,SAAS,WAAW,GAAG,CAAC,IAAI,OAAO;AAClD,cAAI,CAAC,MAAM,IAAI;AACb,gBAAI,IAAI;AACN,oBAAM,KAAK,IAAI,GAAG;AAAA;AAElB,qBAAO,QAAQ,IAAI,GAAG;AAAA,UAC1B;AACA,iBAAO,QAAQ,QAAQ,GAAG,GAAG,KAAK,CAAC,CAAC;AAAA,QACtC,CAAC;AAAA,MACH,CAAC;AAED,aAAO,KAAK,KAAK,CAAC,EAAE,KAAK,SAAO,GAAG,MAAM,GAAG,GAAG,EAAE,IAAI,KAAK,CAAC;AAAA,IAC7D;AAEA,QAAM,YAAY,CAAC,KAAK,QAAQ;AAC9B,YAAM,OAAO,CAAC;AAEd,YAAM,EAAE,SAAS,SAAS,WAAW,IAAI,YAAY,KAAK,GAAG;AAC7D,YAAM,QAAQ,CAAC;AAEf,eAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAM;AACxC,cAAM,QAAQ,QAAQ,CAAC;AACvB,cAAM,WAAW,SAAS,KAAK,KAAK,IAAI,MAAM,MAAM,GAAG,EAAE,IAAI;AAE7D,cAAM,OAAO,KAAK,KAAK,UAAU,GAAG;AACpC,cAAM,IAAI,CAAC,YAAY,YAAY,KAAK,GAAG,IAAI,IAAI,MAAM,GAAG,CAAC,IAAI,OAC7D;AAEJ,iBAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAM;AACxC,gBAAM,MAAM,IAAI,QAAQ,CAAC;AACzB,cAAI;AACF,kBAAM,KAAK,MAAM,KAAK,KAAK,EAAE,SAAS,WAAW,CAAC;AAClD,gBAAI,IAAI;AACN,kBAAI,IAAI;AACN,sBAAM,KAAK,GAAG;AAAA;AAEd,uBAAO;AAAA,YACX;AAAA,UACF,SAAS,IAAI;AAAA,UAAC;AAAA,QAChB;AAAA,MACF;AAEA,UAAI,IAAI,OAAO,MAAM;AACnB,eAAO;AAET,UAAI,IAAI;AACN,eAAO;AAET,YAAM,iBAAiB,GAAG;AAAA,IAC5B;AAEA,WAAO,UAAU;AACjB,UAAM,OAAO;AAAA;AAAA;;;AC5Hb;AAAA;AAAA;AAEA,QAAM,UAAU,CAAC,UAAU,CAAC,MAAM;AACjC,YAAM,cAAc,QAAQ,OAAO,QAAQ;AAC3C,YAAM,WAAW,QAAQ,YAAY,QAAQ;AAE7C,UAAI,aAAa,SAAS;AACzB,eAAO;AAAA,MACR;AAEA,aAAO,OAAO,KAAK,WAAW,EAAE,QAAQ,EAAE,KAAK,SAAO,IAAI,YAAY,MAAM,MAAM,KAAK;AAAA,IACxF;AAEA,WAAO,UAAU;AAEjB,WAAO,QAAQ,UAAU;AAAA;AAAA;;;ACfzB;AAAA;AAAA;AAEA,QAAM,OAAO,UAAQ,MAAM;AAC3B,QAAM,QAAQ;AACd,QAAM,aAAa;AAEnB,aAAS,sBAAsB,QAAQ,gBAAgB;AACnD,YAAMA,OAAM,OAAO,QAAQ,OAAO,QAAQ;AAC1C,YAAM,MAAM,QAAQ,IAAI;AACxB,YAAM,eAAe,OAAO,QAAQ,OAAO;AAE3C,YAAM,kBAAkB,gBAAgB,QAAQ,UAAU,UAAa,CAAC,QAAQ,MAAM;AAItF,UAAI,iBAAiB;AACjB,YAAI;AACA,kBAAQ,MAAM,OAAO,QAAQ,GAAG;AAAA,QACpC,SAAS,KAAK;AAAA,QAEd;AAAA,MACJ;AAEA,UAAI;AAEJ,UAAI;AACA,mBAAW,MAAM,KAAK,OAAO,SAAS;AAAA,UAClC,MAAMA,KAAI,WAAW,EAAE,KAAAA,KAAI,CAAC,CAAC;AAAA,UAC7B,SAAS,iBAAiB,KAAK,YAAY;AAAA,QAC/C,CAAC;AAAA,MACL,SAAS,GAAG;AAAA,MAEZ,UAAE;AACE,YAAI,iBAAiB;AACjB,kBAAQ,MAAM,GAAG;AAAA,QACrB;AAAA,MACJ;AAIA,UAAI,UAAU;AACV,mBAAW,KAAK,QAAQ,eAAe,OAAO,QAAQ,MAAM,IAAI,QAAQ;AAAA,MAC5E;AAEA,aAAO;AAAA,IACX;AAEA,aAAS,eAAe,QAAQ;AAC5B,aAAO,sBAAsB,MAAM,KAAK,sBAAsB,QAAQ,IAAI;AAAA,IAC9E;AAEA,WAAO,UAAU;AAAA;AAAA;;;ACnDjB;AAAA;AAAA;AAGA,QAAM,kBAAkB;AAExB,aAAS,cAAc,KAAK;AAExB,YAAM,IAAI,QAAQ,iBAAiB,KAAK;AAExC,aAAO;AAAA,IACX;AAEA,aAAS,eAAe,KAAK,uBAAuB;AAEhD,YAAM,GAAG,GAAG;AAQZ,YAAM,IAAI,QAAQ,mBAAmB,SAAS;AAK9C,YAAM,IAAI,QAAQ,kBAAkB,MAAM;AAK1C,YAAM,IAAI,GAAG;AAGb,YAAM,IAAI,QAAQ,iBAAiB,KAAK;AAGxC,UAAI,uBAAuB;AACvB,cAAM,IAAI,QAAQ,iBAAiB,KAAK;AAAA,MAC5C;AAEA,aAAO;AAAA,IACX;AAEA,WAAO,QAAQ,UAAU;AACzB,WAAO,QAAQ,WAAW;AAAA;AAAA;;;AC9C1B;AAAA;AAAA;AACA,WAAO,UAAU;AAAA;AAAA;;;ACDjB;AAAA;AAAA;AACA,QAAM,eAAe;AAErB,WAAO,UAAU,CAAC,SAAS,OAAO;AACjC,YAAM,QAAQ,OAAO,MAAM,YAAY;AAEvC,UAAI,CAAC,OAAO;AACX,eAAO;AAAA,MACR;AAEA,YAAM,CAAC,MAAM,QAAQ,IAAI,MAAM,CAAC,EAAE,QAAQ,QAAQ,EAAE,EAAE,MAAM,GAAG;AAC/D,YAAM,SAAS,KAAK,MAAM,GAAG,EAAE,IAAI;AAEnC,UAAI,WAAW,OAAO;AACrB,eAAO;AAAA,MACR;AAEA,aAAO,WAAW,GAAG,MAAM,IAAI,QAAQ,KAAK;AAAA,IAC7C;AAAA;AAAA;;;AClBA;AAAA;AAAA;AAEA,QAAM,KAAK,UAAQ,IAAI;AACvB,QAAM,iBAAiB;AAEvB,aAAS,YAAY,SAAS;AAE1B,YAAM,OAAO;AACb,YAAM,SAAS,OAAO,MAAM,IAAI;AAEhC,UAAI;AAEJ,UAAI;AACA,aAAK,GAAG,SAAS,SAAS,GAAG;AAC7B,WAAG,SAAS,IAAI,QAAQ,GAAG,MAAM,CAAC;AAClC,WAAG,UAAU,EAAE;AAAA,MACnB,SAAS,GAAG;AAAA,MAAc;AAG1B,aAAO,eAAe,OAAO,SAAS,CAAC;AAAA,IAC3C;AAEA,WAAO,UAAU;AAAA;AAAA;;;ACtBjB;AAAA;AAAA;AAEA,QAAM,OAAO,UAAQ,MAAM;AAC3B,QAAM,iBAAiB;AACvB,QAAM,SAAS;AACf,QAAM,cAAc;AAEpB,QAAM,QAAQ,QAAQ,aAAa;AACnC,QAAM,qBAAqB;AAC3B,QAAM,kBAAkB;AAExB,aAAS,cAAc,QAAQ;AAC3B,aAAO,OAAO,eAAe,MAAM;AAEnC,YAAM,UAAU,OAAO,QAAQ,YAAY,OAAO,IAAI;AAEtD,UAAI,SAAS;AACT,eAAO,KAAK,QAAQ,OAAO,IAAI;AAC/B,eAAO,UAAU;AAEjB,eAAO,eAAe,MAAM;AAAA,MAChC;AAEA,aAAO,OAAO;AAAA,IAClB;AAEA,aAAS,cAAc,QAAQ;AAC3B,UAAI,CAAC,OAAO;AACR,eAAO;AAAA,MACX;AAGA,YAAM,cAAc,cAAc,MAAM;AAGxC,YAAM,aAAa,CAAC,mBAAmB,KAAK,WAAW;AAIvD,UAAI,OAAO,QAAQ,cAAc,YAAY;AAKzC,cAAM,6BAA6B,gBAAgB,KAAK,WAAW;AAInE,eAAO,UAAU,KAAK,UAAU,OAAO,OAAO;AAG9C,eAAO,UAAU,OAAO,QAAQ,OAAO,OAAO;AAC9C,eAAO,OAAO,OAAO,KAAK,IAAI,CAAC,QAAQ,OAAO,SAAS,KAAK,0BAA0B,CAAC;AAEvF,cAAM,eAAe,CAAC,OAAO,OAAO,EAAE,OAAO,OAAO,IAAI,EAAE,KAAK,GAAG;AAElE,eAAO,OAAO,CAAC,MAAM,MAAM,MAAM,IAAI,YAAY,GAAG;AACpD,eAAO,UAAU,QAAQ,IAAI,WAAW;AACxC,eAAO,QAAQ,2BAA2B;AAAA,MAC9C;AAEA,aAAO;AAAA,IACX;AAEA,aAAS,MAAM,SAASC,OAAM,SAAS;AAEnC,UAAIA,SAAQ,CAAC,MAAM,QAAQA,KAAI,GAAG;AAC9B,kBAAUA;AACV,QAAAA,QAAO;AAAA,MACX;AAEA,MAAAA,QAAOA,QAAOA,MAAK,MAAM,CAAC,IAAI,CAAC;AAC/B,gBAAU,OAAO,OAAO,CAAC,GAAG,OAAO;AAGnC,YAAM,SAAS;AAAA,QACX;AAAA,QACA,MAAAA;AAAA,QACA;AAAA,QACA,MAAM;AAAA,QACN,UAAU;AAAA,UACN;AAAA,UACA,MAAAA;AAAA,QACJ;AAAA,MACJ;AAGA,aAAO,QAAQ,QAAQ,SAAS,cAAc,MAAM;AAAA,IACxD;AAEA,WAAO,UAAU;AAAA;AAAA;;;AC1FjB;AAAA;AAAA;AAEA,QAAM,QAAQ,QAAQ,aAAa;AAEnC,aAAS,cAAc,UAAU,SAAS;AACtC,aAAO,OAAO,OAAO,IAAI,MAAM,GAAG,OAAO,IAAI,SAAS,OAAO,SAAS,GAAG;AAAA,QACrE,MAAM;AAAA,QACN,OAAO;AAAA,QACP,SAAS,GAAG,OAAO,IAAI,SAAS,OAAO;AAAA,QACvC,MAAM,SAAS;AAAA,QACf,WAAW,SAAS;AAAA,MACxB,CAAC;AAAA,IACL;AAEA,aAAS,iBAAiB,IAAI,QAAQ;AAClC,UAAI,CAAC,OAAO;AACR;AAAA,MACJ;AAEA,YAAM,eAAe,GAAG;AAExB,SAAG,OAAO,SAAU,MAAM,MAAM;AAI5B,YAAI,SAAS,QAAQ;AACjB,gBAAM,MAAM,aAAa,MAAM,MAAM;AAErC,cAAI,KAAK;AACL,mBAAO,aAAa,KAAK,IAAI,SAAS,GAAG;AAAA,UAC7C;AAAA,QACJ;AAEA,eAAO,aAAa,MAAM,IAAI,SAAS;AAAA,MAC3C;AAAA,IACJ;AAEA,aAAS,aAAa,QAAQ,QAAQ;AAClC,UAAI,SAAS,WAAW,KAAK,CAAC,OAAO,MAAM;AACvC,eAAO,cAAc,OAAO,UAAU,OAAO;AAAA,MACjD;AAEA,aAAO;AAAA,IACX;AAEA,aAAS,iBAAiB,QAAQ,QAAQ;AACtC,UAAI,SAAS,WAAW,KAAK,CAAC,OAAO,MAAM;AACvC,eAAO,cAAc,OAAO,UAAU,WAAW;AAAA,MACrD;AAEA,aAAO;AAAA,IACX;AAEA,WAAO,UAAU;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACJ;AAAA;AAAA;;;AC1DA;AAAA;AAAA;AAEA,QAAM,KAAK,UAAQ,eAAe;AAClC,QAAM,QAAQ;AACd,QAAM,SAAS;AAEf,aAAS,MAAM,SAASC,OAAM,SAAS;AAEnC,YAAM,SAAS,MAAM,SAASA,OAAM,OAAO;AAG3C,YAAM,UAAU,GAAG,MAAM,OAAO,SAAS,OAAO,MAAM,OAAO,OAAO;AAIpE,aAAO,iBAAiB,SAAS,MAAM;AAEvC,aAAO;AAAA,IACX;AAEA,aAAS,UAAU,SAASA,OAAM,SAAS;AAEvC,YAAM,SAAS,MAAM,SAASA,OAAM,OAAO;AAG3C,YAAM,SAAS,GAAG,UAAU,OAAO,SAAS,OAAO,MAAM,OAAO,OAAO;AAGvE,aAAO,QAAQ,OAAO,SAAS,OAAO,iBAAiB,OAAO,QAAQ,MAAM;AAE5E,aAAO;AAAA,IACX;AAEA,WAAO,UAAU;AACjB,WAAO,QAAQ,QAAQ;AACvB,WAAO,QAAQ,OAAO;AAEtB,WAAO,QAAQ,SAAS;AACxB,WAAO,QAAQ,UAAU;AAAA;AAAA;;;ACtCzB;AAAA;AAAA;AAEA,WAAO,UAAU,WAAS;AACzB,YAAM,KAAK,OAAO,UAAU,WAAW,OAAO,KAAK,WAAW;AAC9D,YAAM,KAAK,OAAO,UAAU,WAAW,OAAO,KAAK,WAAW;AAE9D,UAAI,MAAM,MAAM,SAAS,CAAC,MAAM,IAAI;AACnC,gBAAQ,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC;AAAA,MACxC;AAEA,UAAI,MAAM,MAAM,SAAS,CAAC,MAAM,IAAI;AACnC,gBAAQ,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC;AAAA,MACxC;AAEA,aAAO;AAAA,IACR;AAAA;AAAA;;;ACfA;AAAA;AAAA;AACA,QAAM,OAAO,UAAQ,MAAM;AAC3B,QAAM,UAAU;AAEhB,QAAM,aAAa,aAAW;AAC7B,gBAAU;AAAA,QACT,KAAK,QAAQ,IAAI;AAAA,QACjB,MAAM,QAAQ,IAAI,QAAQ,CAAC;AAAA,QAC3B,UAAU,QAAQ;AAAA,QAClB,GAAG;AAAA,MACJ;AAEA,UAAI;AACJ,UAAI,UAAU,KAAK,QAAQ,QAAQ,GAAG;AACtC,YAAM,SAAS,CAAC;AAEhB,aAAO,aAAa,SAAS;AAC5B,eAAO,KAAK,KAAK,KAAK,SAAS,mBAAmB,CAAC;AACnD,mBAAW;AACX,kBAAU,KAAK,QAAQ,SAAS,IAAI;AAAA,MACrC;AAGA,YAAM,cAAc,KAAK,QAAQ,QAAQ,KAAK,QAAQ,UAAU,IAAI;AACpE,aAAO,KAAK,WAAW;AAEvB,aAAO,OAAO,OAAO,QAAQ,IAAI,EAAE,KAAK,KAAK,SAAS;AAAA,IACvD;AAEA,WAAO,UAAU;AAEjB,WAAO,QAAQ,UAAU;AAEzB,WAAO,QAAQ,MAAM,aAAW;AAC/B,gBAAU;AAAA,QACT,KAAK,QAAQ;AAAA,QACb,GAAG;AAAA,MACJ;AAEA,YAAMC,OAAM,EAAC,GAAG,QAAQ,IAAG;AAC3B,YAAMC,QAAO,QAAQ,EAAC,KAAAD,KAAG,CAAC;AAE1B,cAAQ,OAAOA,KAAIC,KAAI;AACvB,MAAAD,KAAIC,KAAI,IAAI,OAAO,QAAQ,OAAO;AAElC,aAAOD;AAAA,IACR;AAAA;AAAA;;;AC9CA;AAAA;AAAA;AAEA,QAAM,UAAU,CAAC,IAAI,SAAS;AAC7B,iBAAW,QAAQ,QAAQ,QAAQ,IAAI,GAAG;AACzC,eAAO,eAAe,IAAI,MAAM,OAAO,yBAAyB,MAAM,IAAI,CAAC;AAAA,MAC5E;AAEA,aAAO;AAAA,IACR;AAEA,WAAO,UAAU;AAEjB,WAAO,QAAQ,UAAU;AAAA;AAAA;;;ACZzB;AAAA;AAAA;AACA,QAAM,UAAU;AAEhB,QAAM,kBAAkB,oBAAI,QAAQ;AAEpC,QAAM,UAAU,CAAC,WAAW,UAAU,CAAC,MAAM;AAC5C,UAAI,OAAO,cAAc,YAAY;AACpC,cAAM,IAAI,UAAU,qBAAqB;AAAA,MAC1C;AAEA,UAAI;AACJ,UAAI,YAAY;AAChB,YAAM,eAAe,UAAU,eAAe,UAAU,QAAQ;AAEhE,YAAME,WAAU,YAAa,YAAY;AACxC,wBAAgB,IAAIA,UAAS,EAAE,SAAS;AAExC,YAAI,cAAc,GAAG;AACpB,wBAAc,UAAU,MAAM,MAAM,UAAU;AAC9C,sBAAY;AAAA,QACb,WAAW,QAAQ,UAAU,MAAM;AAClC,gBAAM,IAAI,MAAM,cAAc,YAAY,4BAA4B;AAAA,QACvE;AAEA,eAAO;AAAA,MACR;AAEA,cAAQA,UAAS,SAAS;AAC1B,sBAAgB,IAAIA,UAAS,SAAS;AAEtC,aAAOA;AAAA,IACR;AAEA,WAAO,UAAU;AAEjB,WAAO,QAAQ,UAAU;AAEzB,WAAO,QAAQ,YAAY,eAAa;AACvC,UAAI,CAAC,gBAAgB,IAAI,SAAS,GAAG;AACpC,cAAM,IAAI,MAAM,wBAAwB,UAAU,IAAI,8CAA8C;AAAA,MACrG;AAEA,aAAO,gBAAgB,IAAI,SAAS;AAAA,IACrC;AAAA;AAAA;;;;;;;;ACzCO,QAAMC,UAAU;MACrB;QACEC,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;MALZ;MAOA;QACEJ,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;MALZ;MAOA;QACEJ,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;MALZ;MAOA;QACEJ,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;MALZ;MAOA;QACEJ,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;MALZ;MAOA;QACEJ,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;MALZ;MAOA;QACEJ,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;MALZ;MAOA;QACEJ,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aACE;QACFC,UAAU;MANZ;MAQA;QACEJ,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;MALZ;MAOA;QACEJ,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;MALZ;MAOA;QACEJ,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;QACVC,QAAQ;MANV;MAQA;QACEL,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;MALZ;MAOA;QACEJ,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;MALZ;MAOA;QACEJ,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;MALZ;MAOA;QACEJ,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;MALZ;MAOA;QACEJ,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;MALZ;MAOA;QACEJ,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;MALZ;MAOA;QACEJ,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;MALZ;MAOA;QACEJ,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;MALZ;MAOA;QACEJ,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;MALZ;MAOA;QACEJ,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;QACVC,QAAQ;MANV;MAQA;QACEL,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;QACVC,QAAQ;MANV;MAQA;QACEL,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;MALZ;MAOA;QACEJ,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;MALZ;MAOA;QACEJ,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;MALZ;MAOA;QACEJ,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;MALZ;MAOA;QACEJ,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;MALZ;MAOA;QACEJ,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;MALZ;MAOA;QACEJ,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;MALZ;MAOA;QACEJ,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;MALZ;MAOA;QACEJ,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;MALZ;MAOA;QACEJ,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;MALZ;MAOA;QACEJ,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;MALZ;MAOA;QACEJ,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;MALZ;MAOA;QACEJ,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;MALZ;MAOA;QACEJ,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;MALZ;MAOA;QACEJ,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;MALZ;MAOA;QACEJ,MAAM;QACNC,QAAQ;QACRC,QAAQ;QACRC,aAAa;QACbC,UAAU;MALZ;IAxQqB;AAAhB,YAAA,UAAA;;;;;;;;;;ACDA,QAAME,qBAAqB,WAAW;AAC3C,YAAMC,SAASC,WAAWC,WAAW;AACrC,aAAOC,MAAMC,KAAK,EAAEJ,OAAF,GAAYK,iBAAvB;IACR;AAHM,YAAA,qBAAA;AAKP,QAAMA,oBAAoB,SAASC,OAAOC,OAAO;AAC/C,aAAO;QACLC,MAAO,QAAOD,QAAQ,CAAE;QACxBE,QAAQP,WAAWK;QACnBG,QAAQ;QACRC,aAAa;QACbC,UAAU;MALL;IAOR;AAED,QAAMV,WAAW;AACV,QAAMD,WAAW;AAAjB,YAAA,WAAA;;;;;;;;;;ACjBP,QAAA,MAAA,UAAA,IAAA;AAEA,QAAA,QAAA;AACA,QAAA,YAAA;AAIO,QAAMY,aAAa,WAAW;AACnC,YAAMC,mBAAkB,GAAA,UAAA,oBAAA;AACxB,YAAMC,UAAU,CAAC,GAAGC,MAAAA,SAAS,GAAGF,eAAhB,EAAiCG,IAAIC,eAArC;AAChB,aAAOH;IACR;AAJM,YAAA,aAAA;AAYP,QAAMG,kBAAkB,SAAS;MAC/BC;MACAC,QAAQC;MACRC;MACAC;MACAC,SAAS;MACTC;IAN+B,GAO9B;AACD,YAAM;QACJV,SAAS,EAAE,CAACI,IAAD,GAAQO,eAAV;MADL,IAEFC,IAAAA;AACJ,YAAMC,YAAYF,mBAAmBG;AACrC,YAAMT,SAASQ,YAAYF,iBAAiBL;AAC5C,aAAO,EAAEF,MAAMC,QAAQE,aAAaM,WAAWL,QAAQC,QAAQC,SAAxD;IACR;;;;;;;;;;ACjCD,QAAA,MAAA,UAAA,IAAA;AAEA,QAAA,WAAA;AACA,QAAA,YAAA;AAIA,QAAMK,mBAAmB,WAAW;AAClC,YAAMC,WAAU,GAAA,SAAA,YAAA;AAChB,aAAOA,QAAQC,OAAOC,iBAAiB,CAAA,CAAhC;IACR;AAED,QAAMA,kBAAkB,SACtBC,kBACA,EAAEC,MAAMC,QAAQC,aAAaC,WAAWC,QAAQC,QAAQC,SAAxD,GACA;AACA,aAAO;QACL,GAAGP;QACH,CAACC,IAAD,GAAQ,EAAEA,MAAMC,QAAQC,aAAaC,WAAWC,QAAQC,QAAQC,SAAxD;MAFH;IAIR;AAEM,QAAMC,gBAAgBZ,iBAAgB;AAAtC,YAAA,gBAAA;AAKP,QAAMa,qBAAqB,WAAW;AACpC,YAAMZ,WAAU,GAAA,SAAA,YAAA;AAChB,YAAMa,SAASC,UAAAA,WAAW;AAC1B,YAAMC,WAAWC,MAAMC,KAAK,EAAEJ,OAAF,GAAY,CAACK,OAAOb,WAC9Cc,kBAAkBd,QAAQL,OAAT,CADF;AAGjB,aAAOoB,OAAOC,OAAO,CAAA,GAAI,GAAGN,QAArB;IACR;AAED,QAAMI,oBAAoB,SAASd,QAAQL,SAAS;AAClD,YAAMsB,SAASC,mBAAmBlB,QAAQL,OAAT;AAEjC,UAAIsB,WAAWE,QAAW;AACxB,eAAO,CAAA;MACR;AAED,YAAM,EAAEpB,MAAME,aAAaC,WAAWC,QAAQC,QAAQC,SAAhD,IAA6DY;AACnE,aAAO;QACL,CAACjB,MAAD,GAAU;UACRD;UACAC;UACAC;UACAC;UACAC;UACAC;UACAC;QAPQ;MADL;IAWR;AAID,QAAMa,qBAAqB,SAASlB,QAAQL,SAAS;AACnD,YAAMsB,SAAStB,QAAQyB,KAAK,CAAC,EAAErB,KAAF,MAAasB,IAAAA,UAAU1B,QAAQI,IAAlB,MAA4BC,MAAvD;AAEf,UAAIiB,WAAWE,QAAW;AACxB,eAAOF;MACR;AAED,aAAOtB,QAAQyB,KAAKE,aAAWA,QAAQtB,WAAWA,MAA3C;IACR;AAEM,QAAMuB,kBAAkBhB,mBAAkB;AAA1C,YAAA,kBAAA;;;;;ACrEP;AAAA;AAAA;AACA,QAAM,EAAC,cAAa,IAAI;AAExB,QAAM,iBAAiB,CAAC,EAAC,UAAU,SAAS,WAAW,QAAQ,mBAAmB,UAAU,WAAU,MAAM;AAC3G,UAAI,UAAU;AACb,eAAO,mBAAmB,OAAO;AAAA,MAClC;AAEA,UAAI,YAAY;AACf,eAAO;AAAA,MACR;AAEA,UAAI,cAAc,QAAW;AAC5B,eAAO,eAAe,SAAS;AAAA,MAChC;AAEA,UAAI,WAAW,QAAW;AACzB,eAAO,mBAAmB,MAAM,KAAK,iBAAiB;AAAA,MACvD;AAEA,UAAI,aAAa,QAAW;AAC3B,eAAO,yBAAyB,QAAQ;AAAA,MACzC;AAEA,aAAO;AAAA,IACR;AAEA,QAAM,YAAY,CAAC;AAAA,MAClB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,QAAQ,EAAC,SAAS,EAAC,QAAO,EAAC;AAAA,IAC5B,MAAM;AAGL,iBAAW,aAAa,OAAO,SAAY;AAC3C,eAAS,WAAW,OAAO,SAAY;AACvC,YAAM,oBAAoB,WAAW,SAAY,SAAY,cAAc,MAAM,EAAE;AAEnF,YAAM,YAAY,SAAS,MAAM;AAEjC,YAAM,SAAS,eAAe,EAAC,UAAU,SAAS,WAAW,QAAQ,mBAAmB,UAAU,WAAU,CAAC;AAC7G,YAAM,eAAe,WAAW,MAAM,KAAK,OAAO;AAClD,YAAM,UAAU,OAAO,UAAU,SAAS,KAAK,KAAK,MAAM;AAC1D,YAAM,eAAe,UAAU,GAAG,YAAY;AAAA,EAAK,MAAM,OAAO,KAAK;AACrE,YAAM,UAAU,CAAC,cAAc,QAAQ,MAAM,EAAE,OAAO,OAAO,EAAE,KAAK,IAAI;AAExE,UAAI,SAAS;AACZ,cAAM,kBAAkB,MAAM;AAC9B,cAAM,UAAU;AAAA,MACjB,OAAO;AACN,gBAAQ,IAAI,MAAM,OAAO;AAAA,MAC1B;AAEA,YAAM,eAAe;AACrB,YAAM,UAAU;AAChB,YAAM,iBAAiB;AACvB,YAAM,WAAW;AACjB,YAAM,SAAS;AACf,YAAM,oBAAoB;AAC1B,YAAM,SAAS;AACf,YAAM,SAAS;AAEf,UAAI,QAAQ,QAAW;AACtB,cAAM,MAAM;AAAA,MACb;AAEA,UAAI,kBAAkB,OAAO;AAC5B,eAAO,MAAM;AAAA,MACd;AAEA,YAAM,SAAS;AACf,YAAM,WAAW,QAAQ,QAAQ;AACjC,YAAM,aAAa;AACnB,YAAM,SAAS,UAAU,CAAC;AAE1B,aAAO;AAAA,IACR;AAEA,WAAO,UAAU;AAAA;AAAA;;;ACvFjB;AAAA;AAAA;AACA,QAAM,UAAU,CAAC,SAAS,UAAU,QAAQ;AAE5C,QAAM,WAAW,aAAW,QAAQ,KAAK,WAAS,QAAQ,KAAK,MAAM,MAAS;AAE9E,QAAM,iBAAiB,aAAW;AACjC,UAAI,CAAC,SAAS;AACb;AAAA,MACD;AAEA,YAAM,EAAC,MAAK,IAAI;AAEhB,UAAI,UAAU,QAAW;AACxB,eAAO,QAAQ,IAAI,WAAS,QAAQ,KAAK,CAAC;AAAA,MAC3C;AAEA,UAAI,SAAS,OAAO,GAAG;AACtB,cAAM,IAAI,MAAM,qEAAqE,QAAQ,IAAI,WAAS,KAAK,KAAK,IAAI,EAAE,KAAK,IAAI,CAAC,EAAE;AAAA,MACvI;AAEA,UAAI,OAAO,UAAU,UAAU;AAC9B,eAAO;AAAA,MACR;AAEA,UAAI,CAAC,MAAM,QAAQ,KAAK,GAAG;AAC1B,cAAM,IAAI,UAAU,mEAAmE,OAAO,KAAK,IAAI;AAAA,MACxG;AAEA,YAAM,SAAS,KAAK,IAAI,MAAM,QAAQ,QAAQ,MAAM;AACpD,aAAO,MAAM,KAAK,EAAC,OAAM,GAAG,CAAC,OAAO,UAAU,MAAM,KAAK,CAAC;AAAA,IAC3D;AAEA,WAAO,UAAU;AAGjB,WAAO,QAAQ,OAAO,aAAW;AAChC,YAAM,QAAQ,eAAe,OAAO;AAEpC,UAAI,UAAU,OAAO;AACpB,eAAO;AAAA,MACR;AAEA,UAAI,UAAU,UAAa,OAAO,UAAU,UAAU;AACrD,eAAO,CAAC,OAAO,OAAO,OAAO,KAAK;AAAA,MACnC;AAEA,UAAI,MAAM,SAAS,KAAK,GAAG;AAC1B,eAAO;AAAA,MACR;AAEA,aAAO,CAAC,GAAG,OAAO,KAAK;AAAA,IACxB;AAAA;AAAA;;;ACnDA,IAAAiB,mBAAA;AAAA;AAAA;AAoBA,WAAO,UAAU;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,QAAI,QAAQ,aAAa,SAAS;AAChC,aAAO,QAAQ;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA;AAAA;AAAA;AAAA,MAIF;AAAA,IACF;AAEA,QAAI,QAAQ,aAAa,SAAS;AAChC,aAAO,QAAQ;AAAA,QACb;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA;AAAA;;;ACpDA;AAAA;AAAA;AAIA,QAAIC,WAAU,OAAO;AAErB,QAAM,YAAY,SAAUA,UAAS;AACnC,aAAOA,YACL,OAAOA,aAAY,YACnB,OAAOA,SAAQ,mBAAmB,cAClC,OAAOA,SAAQ,SAAS,cACxB,OAAOA,SAAQ,eAAe,cAC9B,OAAOA,SAAQ,cAAc,cAC7B,OAAOA,SAAQ,SAAS,cACxB,OAAOA,SAAQ,QAAQ,YACvB,OAAOA,SAAQ,OAAO;AAAA,IAC1B;AAIA,QAAI,CAAC,UAAUA,QAAO,GAAG;AACvB,aAAO,UAAU,WAAY;AAC3B,eAAO,WAAY;AAAA,QAAC;AAAA,MACtB;AAAA,IACF,OAAO;AACD,eAAS,UAAQ,QAAQ;AACzB,gBAAU;AACV,cAAQ,QAAQ,KAAKA,SAAQ,QAAQ;AAErC,WAAK,UAAQ,QAAQ;AAEzB,UAAI,OAAO,OAAO,YAAY;AAC5B,aAAK,GAAG;AAAA,MACV;AAGA,UAAIA,SAAQ,yBAAyB;AACnC,kBAAUA,SAAQ;AAAA,MACpB,OAAO;AACL,kBAAUA,SAAQ,0BAA0B,IAAI,GAAG;AACnD,gBAAQ,QAAQ;AAChB,gBAAQ,UAAU,CAAC;AAAA,MACrB;AAMA,UAAI,CAAC,QAAQ,UAAU;AACrB,gBAAQ,gBAAgB,QAAQ;AAChC,gBAAQ,WAAW;AAAA,MACrB;AAEA,aAAO,UAAU,SAAU,IAAI,MAAM;AAEnC,YAAI,CAAC,UAAU,OAAO,OAAO,GAAG;AAC9B,iBAAO,WAAY;AAAA,UAAC;AAAA,QACtB;AACA,eAAO,MAAM,OAAO,IAAI,YAAY,8CAA8C;AAElF,YAAI,WAAW,OAAO;AACpB,eAAK;AAAA,QACP;AAEA,YAAI,KAAK;AACT,YAAI,QAAQ,KAAK,YAAY;AAC3B,eAAK;AAAA,QACP;AAEA,YAAI,SAAS,WAAY;AACvB,kBAAQ,eAAe,IAAI,EAAE;AAC7B,cAAI,QAAQ,UAAU,MAAM,EAAE,WAAW,KACrC,QAAQ,UAAU,WAAW,EAAE,WAAW,GAAG;AAC/C,mBAAO;AAAA,UACT;AAAA,QACF;AACA,gBAAQ,GAAG,IAAI,EAAE;AAEjB,eAAO;AAAA,MACT;AAEI,eAAS,SAASC,UAAU;AAC9B,YAAI,CAAC,UAAU,CAAC,UAAU,OAAO,OAAO,GAAG;AACzC;AAAA,QACF;AACA,iBAAS;AAET,gBAAQ,QAAQ,SAAU,KAAK;AAC7B,cAAI;AACF,YAAAD,SAAQ,eAAe,KAAK,aAAa,GAAG,CAAC;AAAA,UAC/C,SAAS,IAAI;AAAA,UAAC;AAAA,QAChB,CAAC;AACD,QAAAA,SAAQ,OAAO;AACf,QAAAA,SAAQ,aAAa;AACrB,gBAAQ,SAAS;AAAA,MACnB;AACA,aAAO,QAAQ,SAAS;AAEpB,aAAO,SAASE,MAAM,OAAO,MAAM,QAAQ;AAE7C,YAAI,QAAQ,QAAQ,KAAK,GAAG;AAC1B;AAAA,QACF;AACA,gBAAQ,QAAQ,KAAK,IAAI;AACzB,gBAAQ,KAAK,OAAO,MAAM,MAAM;AAAA,MAClC;AAGI,qBAAe,CAAC;AACpB,cAAQ,QAAQ,SAAU,KAAK;AAC7B,qBAAa,GAAG,IAAI,SAAS,WAAY;AAEvC,cAAI,CAAC,UAAU,OAAO,OAAO,GAAG;AAC9B;AAAA,UACF;AAKA,cAAI,YAAYF,SAAQ,UAAU,GAAG;AACrC,cAAI,UAAU,WAAW,QAAQ,OAAO;AACtC,mBAAO;AACP,iBAAK,QAAQ,MAAM,GAAG;AAEtB,iBAAK,aAAa,MAAM,GAAG;AAE3B,gBAAI,SAAS,QAAQ,UAAU;AAG7B,oBAAM;AAAA,YACR;AAEA,YAAAA,SAAQ,KAAKA,SAAQ,KAAK,GAAG;AAAA,UAC/B;AAAA,QACF;AAAA,MACF,CAAC;AAED,aAAO,QAAQ,UAAU,WAAY;AACnC,eAAO;AAAA,MACT;AAEI,eAAS;AAET,aAAO,SAASG,QAAQ;AAC1B,YAAI,UAAU,CAAC,UAAU,OAAO,OAAO,GAAG;AACxC;AAAA,QACF;AACA,iBAAS;AAMT,gBAAQ,SAAS;AAEjB,kBAAU,QAAQ,OAAO,SAAU,KAAK;AACtC,cAAI;AACF,YAAAH,SAAQ,GAAG,KAAK,aAAa,GAAG,CAAC;AACjC,mBAAO;AAAA,UACT,SAAS,IAAI;AACX,mBAAO;AAAA,UACT;AAAA,QACF,CAAC;AAED,QAAAA,SAAQ,OAAO;AACf,QAAAA,SAAQ,aAAa;AAAA,MACvB;AACA,aAAO,QAAQ,OAAO;AAElB,kCAA4BA,SAAQ;AACpC,0BAAoB,SAASI,mBAAmB,MAAM;AAExD,YAAI,CAAC,UAAU,OAAO,OAAO,GAAG;AAC9B;AAAA,QACF;AACA,QAAAJ,SAAQ,WAAW;AAAA,QAAmC;AACtD,aAAK,QAAQA,SAAQ,UAAU,IAAI;AAEnC,aAAK,aAAaA,SAAQ,UAAU,IAAI;AAExC,kCAA0B,KAAKA,UAASA,SAAQ,QAAQ;AAAA,MAC1D;AAEI,4BAAsBA,SAAQ;AAC9B,oBAAc,SAASK,aAAa,IAAI,KAAK;AAC/C,YAAI,OAAO,UAAU,UAAU,OAAO,OAAO,GAAG;AAE9C,cAAI,QAAQ,QAAW;AACrB,YAAAL,SAAQ,WAAW;AAAA,UACrB;AACA,cAAI,MAAM,oBAAoB,MAAM,MAAM,SAAS;AAEnD,eAAK,QAAQA,SAAQ,UAAU,IAAI;AAEnC,eAAK,aAAaA,SAAQ,UAAU,IAAI;AAExC,iBAAO;AAAA,QACT,OAAO;AACL,iBAAO,oBAAoB,MAAM,MAAM,SAAS;AAAA,QAClD;AAAA,MACF;AAAA,IACF;AAhLM;AACA;AACA;AAEA;AAMA;AA8CA;AAiBA;AAUA;AAiCA;AAEA;AA0BA;AACA;AAaA;AACA;AAAA;AAAA;;;ACxLN;AAAA;AAAA;AACA,QAAM,KAAK,UAAQ,IAAI;AACvB,QAAM,SAAS;AAEf,QAAM,6BAA6B,MAAO;AAG1C,QAAM,cAAc,CAAC,MAAM,SAAS,WAAW,UAAU,CAAC,MAAM;AAC/D,YAAM,aAAa,KAAK,MAAM;AAC9B,qBAAe,MAAM,QAAQ,SAAS,UAAU;AAChD,aAAO;AAAA,IACR;AAEA,QAAM,iBAAiB,CAAC,MAAM,QAAQ,SAAS,eAAe;AAC7D,UAAI,CAAC,gBAAgB,QAAQ,SAAS,UAAU,GAAG;AAClD;AAAA,MACD;AAEA,YAAM,UAAU,yBAAyB,OAAO;AAChD,YAAM,IAAI,WAAW,MAAM;AAC1B,aAAK,SAAS;AAAA,MACf,GAAG,OAAO;AAMV,UAAI,EAAE,OAAO;AACZ,UAAE,MAAM;AAAA,MACT;AAAA,IACD;AAEA,QAAM,kBAAkB,CAAC,QAAQ,EAAC,sBAAqB,GAAG,eAAe;AACxE,aAAO,UAAU,MAAM,KAAK,0BAA0B,SAAS;AAAA,IAChE;AAEA,QAAM,YAAY,YAAU;AAC3B,aAAO,WAAW,GAAG,UAAU,QAAQ,WACrC,OAAO,WAAW,YAAY,OAAO,YAAY,MAAM;AAAA,IAC1D;AAEA,QAAM,2BAA2B,CAAC,EAAC,wBAAwB,KAAI,MAAM;AACpE,UAAI,0BAA0B,MAAM;AACnC,eAAO;AAAA,MACR;AAEA,UAAI,CAAC,OAAO,SAAS,qBAAqB,KAAK,wBAAwB,GAAG;AACzE,cAAM,IAAI,UAAU,qFAAqF,qBAAqB,OAAO,OAAO,qBAAqB,GAAG;AAAA,MACrK;AAEA,aAAO;AAAA,IACR;AAGA,QAAM,gBAAgB,CAAC,SAAS,YAAY;AAC3C,YAAM,aAAa,QAAQ,KAAK;AAEhC,UAAI,YAAY;AACf,gBAAQ,aAAa;AAAA,MACtB;AAAA,IACD;AAEA,QAAM,cAAc,CAAC,SAAS,QAAQ,WAAW;AAChD,cAAQ,KAAK,MAAM;AACnB,aAAO,OAAO,OAAO,IAAI,MAAM,WAAW,GAAG,EAAC,UAAU,MAAM,OAAM,CAAC,CAAC;AAAA,IACvE;AAGA,QAAM,eAAe,CAAC,SAAS,EAAC,SAAS,aAAa,UAAS,GAAG,mBAAmB;AACpF,UAAI,YAAY,KAAK,YAAY,QAAW;AAC3C,eAAO;AAAA,MACR;AAEA,UAAI;AACJ,YAAM,iBAAiB,IAAI,QAAQ,CAAC,SAAS,WAAW;AACvD,oBAAY,WAAW,MAAM;AAC5B,sBAAY,SAAS,YAAY,MAAM;AAAA,QACxC,GAAG,OAAO;AAAA,MACX,CAAC;AAED,YAAM,qBAAqB,eAAe,QAAQ,MAAM;AACvD,qBAAa,SAAS;AAAA,MACvB,CAAC;AAED,aAAO,QAAQ,KAAK,CAAC,gBAAgB,kBAAkB,CAAC;AAAA,IACzD;AAEA,QAAM,kBAAkB,CAAC,EAAC,QAAO,MAAM;AACtC,UAAI,YAAY,WAAc,CAAC,OAAO,SAAS,OAAO,KAAK,UAAU,IAAI;AACxE,cAAM,IAAI,UAAU,uEAAuE,OAAO,OAAO,OAAO,OAAO,GAAG;AAAA,MAC3H;AAAA,IACD;AAGA,QAAM,iBAAiB,OAAO,SAAS,EAAC,SAAS,SAAQ,GAAG,iBAAiB;AAC5E,UAAI,CAAC,WAAW,UAAU;AACzB,eAAO;AAAA,MACR;AAEA,YAAM,oBAAoB,OAAO,MAAM;AACtC,gBAAQ,KAAK;AAAA,MACd,CAAC;AAED,aAAO,aAAa,QAAQ,MAAM;AACjC,0BAAkB;AAAA,MACnB,CAAC;AAAA,IACF;AAEA,WAAO,UAAU;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA;AAAA;;;AClHA;AAAA;AAAA;AAEA,QAAM,WAAW,YAChB,WAAW,QACX,OAAO,WAAW,YAClB,OAAO,OAAO,SAAS;AAExB,aAAS,WAAW,YACnB,SAAS,MAAM,KACf,OAAO,aAAa,SACpB,OAAO,OAAO,WAAW,cACzB,OAAO,OAAO,mBAAmB;AAElC,aAAS,WAAW,YACnB,SAAS,MAAM,KACf,OAAO,aAAa,SACpB,OAAO,OAAO,UAAU,cACxB,OAAO,OAAO,mBAAmB;AAElC,aAAS,SAAS,YACjB,SAAS,SAAS,MAAM,KACxB,SAAS,SAAS,MAAM;AAEzB,aAAS,YAAY,YACpB,SAAS,OAAO,MAAM,KACtB,OAAO,OAAO,eAAe;AAE9B,WAAO,UAAU;AAAA;AAAA;;;AC3BjB;AAAA;AAAA;AACA,QAAM,EAAC,aAAa,kBAAiB,IAAI,UAAQ,QAAQ;AAEzD,WAAO,UAAU,aAAW;AAC3B,gBAAU,EAAC,GAAG,QAAO;AAErB,YAAM,EAAC,MAAK,IAAI;AAChB,UAAI,EAAC,SAAQ,IAAI;AACjB,YAAM,WAAW,aAAa;AAC9B,UAAI,aAAa;AAEjB,UAAI,OAAO;AACV,qBAAa,EAAE,YAAY;AAAA,MAC5B,OAAO;AACN,mBAAW,YAAY;AAAA,MACxB;AAEA,UAAI,UAAU;AACb,mBAAW;AAAA,MACZ;AAEA,YAAM,SAAS,IAAI,kBAAkB,EAAC,WAAU,CAAC;AAEjD,UAAI,UAAU;AACb,eAAO,YAAY,QAAQ;AAAA,MAC5B;AAEA,UAAI,SAAS;AACb,YAAM,SAAS,CAAC;AAEhB,aAAO,GAAG,QAAQ,WAAS;AAC1B,eAAO,KAAK,KAAK;AAEjB,YAAI,YAAY;AACf,mBAAS,OAAO;AAAA,QACjB,OAAO;AACN,oBAAU,MAAM;AAAA,QACjB;AAAA,MACD,CAAC;AAED,aAAO,mBAAmB,MAAM;AAC/B,YAAI,OAAO;AACV,iBAAO;AAAA,QACR;AAEA,eAAO,WAAW,OAAO,OAAO,QAAQ,MAAM,IAAI,OAAO,KAAK,EAAE;AAAA,MACjE;AAEA,aAAO,oBAAoB,MAAM;AAEjC,aAAO;AAAA,IACR;AAAA;AAAA;;;ACnDA;AAAA;AAAA;AACA,QAAM,EAAC,WAAW,gBAAe,IAAI,UAAQ,QAAQ;AACrD,QAAM,SAAS,UAAQ,QAAQ;AAC/B,QAAM,EAAC,UAAS,IAAI,UAAQ,MAAM;AAClC,QAAM,eAAe;AAErB,QAAM,4BAA4B,UAAU,OAAO,QAAQ;AAE3D,QAAM,iBAAN,cAA6B,MAAM;AAAA,MAClC,cAAc;AACb,cAAM,oBAAoB;AAC1B,aAAK,OAAO;AAAA,MACb;AAAA,IACD;AAEA,mBAAe,UAAU,aAAa,SAAS;AAC9C,UAAI,CAAC,aAAa;AACjB,cAAM,IAAI,MAAM,mBAAmB;AAAA,MACpC;AAEA,gBAAU;AAAA,QACT,WAAW;AAAA,QACX,GAAG;AAAA,MACJ;AAEA,YAAM,EAAC,UAAS,IAAI;AACpB,YAAMM,UAAS,aAAa,OAAO;AAEnC,YAAM,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,cAAM,gBAAgB,WAAS;AAE9B,cAAI,SAASA,QAAO,kBAAkB,KAAK,gBAAgB,YAAY;AACtE,kBAAM,eAAeA,QAAO,iBAAiB;AAAA,UAC9C;AAEA,iBAAO,KAAK;AAAA,QACb;AAEA,SAAC,YAAY;AACZ,cAAI;AACH,kBAAM,0BAA0B,aAAaA,OAAM;AACnD,oBAAQ;AAAA,UACT,SAAS,OAAO;AACf,0BAAc,KAAK;AAAA,UACpB;AAAA,QACD,GAAG;AAEH,QAAAA,QAAO,GAAG,QAAQ,MAAM;AACvB,cAAIA,QAAO,kBAAkB,IAAI,WAAW;AAC3C,0BAAc,IAAI,eAAe,CAAC;AAAA,UACnC;AAAA,QACD,CAAC;AAAA,MACF,CAAC;AAED,aAAOA,QAAO,iBAAiB;AAAA,IAChC;AAEA,WAAO,UAAU;AACjB,WAAO,QAAQ,SAAS,CAACA,SAAQ,YAAY,UAAUA,SAAQ,EAAC,GAAG,SAAS,UAAU,SAAQ,CAAC;AAC/F,WAAO,QAAQ,QAAQ,CAACA,SAAQ,YAAY,UAAUA,SAAQ,EAAC,GAAG,SAAS,OAAO,KAAI,CAAC;AACvF,WAAO,QAAQ,iBAAiB;AAAA;AAAA;;;AC5DhC;AAAA;AAAA;AAEA,QAAM,EAAE,YAAY,IAAI,UAAQ,QAAQ;AAExC,WAAO,UAAU,WAA0B;AACzC,UAAI,UAAU,CAAC;AACf,UAAI,SAAU,IAAI,YAAY,EAAC,YAAY,KAAI,CAAC;AAEhD,aAAO,gBAAgB,CAAC;AAExB,aAAO,MAAM;AACb,aAAO,UAAU;AAEjB,aAAO,GAAG,UAAU,MAAM;AAE1B,YAAM,UAAU,MAAM,KAAK,SAAS,EAAE,QAAQ,GAAG;AAEjD,aAAO;AAEP,eAAS,IAAK,QAAQ;AACpB,YAAI,MAAM,QAAQ,MAAM,GAAG;AACzB,iBAAO,QAAQ,GAAG;AAClB,iBAAO;AAAA,QACT;AAEA,gBAAQ,KAAK,MAAM;AACnB,eAAO,KAAK,OAAO,OAAO,KAAK,MAAM,MAAM,CAAC;AAC5C,eAAO,KAAK,SAAS,OAAO,KAAK,KAAK,QAAQ,OAAO,CAAC;AACtD,eAAO,KAAK,QAAQ,EAAC,KAAK,MAAK,CAAC;AAChC,eAAO;AAAA,MACT;AAEA,eAAS,UAAW;AAClB,eAAO,QAAQ,UAAU;AAAA,MAC3B;AAEA,eAAS,OAAQ,QAAQ;AACvB,kBAAU,QAAQ,OAAO,SAAU,IAAI;AAAE,iBAAO,OAAO;AAAA,QAAO,CAAC;AAC/D,YAAI,CAAC,QAAQ,UAAU,OAAO,UAAU;AAAE,iBAAO,IAAI;AAAA,QAAE;AAAA,MACzD;AAAA,IACF;AAAA;AAAA;;;ACxCA;AAAA;AAAA;AACA,QAAM,WAAW;AACjB,QAAM,YAAY;AAClB,QAAM,cAAc;AAGpB,QAAM,cAAc,CAAC,SAAS,UAAU;AAGvC,UAAI,UAAU,UAAa,QAAQ,UAAU,QAAW;AACvD;AAAA,MACD;AAEA,UAAI,SAAS,KAAK,GAAG;AACpB,cAAM,KAAK,QAAQ,KAAK;AAAA,MACzB,OAAO;AACN,gBAAQ,MAAM,IAAI,KAAK;AAAA,MACxB;AAAA,IACD;AAGA,QAAM,gBAAgB,CAAC,SAAS,EAAC,IAAG,MAAM;AACzC,UAAI,CAAC,OAAQ,CAAC,QAAQ,UAAU,CAAC,QAAQ,QAAS;AACjD;AAAA,MACD;AAEA,YAAM,QAAQ,YAAY;AAE1B,UAAI,QAAQ,QAAQ;AACnB,cAAM,IAAI,QAAQ,MAAM;AAAA,MACzB;AAEA,UAAI,QAAQ,QAAQ;AACnB,cAAM,IAAI,QAAQ,MAAM;AAAA,MACzB;AAEA,aAAO;AAAA,IACR;AAGA,QAAM,kBAAkB,OAAO,QAAQ,kBAAkB;AACxD,UAAI,CAAC,QAAQ;AACZ;AAAA,MACD;AAEA,aAAO,QAAQ;AAEf,UAAI;AACH,eAAO,MAAM;AAAA,MACd,SAAS,OAAO;AACf,eAAO,MAAM;AAAA,MACd;AAAA,IACD;AAEA,QAAM,mBAAmB,CAAC,QAAQ,EAAC,UAAU,QAAQ,UAAS,MAAM;AACnE,UAAI,CAAC,UAAU,CAAC,QAAQ;AACvB;AAAA,MACD;AAEA,UAAI,UAAU;AACb,eAAO,UAAU,QAAQ,EAAC,UAAU,UAAS,CAAC;AAAA,MAC/C;AAEA,aAAO,UAAU,OAAO,QAAQ,EAAC,UAAS,CAAC;AAAA,IAC5C;AAGA,QAAM,mBAAmB,OAAO,EAAC,QAAQ,QAAQ,IAAG,GAAG,EAAC,UAAU,QAAQ,UAAS,GAAG,gBAAgB;AACrG,YAAM,gBAAgB,iBAAiB,QAAQ,EAAC,UAAU,QAAQ,UAAS,CAAC;AAC5E,YAAM,gBAAgB,iBAAiB,QAAQ,EAAC,UAAU,QAAQ,UAAS,CAAC;AAC5E,YAAM,aAAa,iBAAiB,KAAK,EAAC,UAAU,QAAQ,WAAW,YAAY,EAAC,CAAC;AAErF,UAAI;AACH,eAAO,MAAM,QAAQ,IAAI,CAAC,aAAa,eAAe,eAAe,UAAU,CAAC;AAAA,MACjF,SAAS,OAAO;AACf,eAAO,QAAQ,IAAI;AAAA,UAClB,EAAC,OAAO,QAAQ,MAAM,QAAQ,UAAU,MAAM,SAAQ;AAAA,UACtD,gBAAgB,QAAQ,aAAa;AAAA,UACrC,gBAAgB,QAAQ,aAAa;AAAA,UACrC,gBAAgB,KAAK,UAAU;AAAA,QAChC,CAAC;AAAA,MACF;AAAA,IACD;AAEA,QAAM,oBAAoB,CAAC,EAAC,MAAK,MAAM;AACtC,UAAI,SAAS,KAAK,GAAG;AACpB,cAAM,IAAI,UAAU,oDAAoD;AAAA,MACzE;AAAA,IACD;AAEA,WAAO,UAAU;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA;AAAA;;;AC/FA;AAAA;AAAA;AAEA,QAAM,0BAA0B,YAAY;AAAA,IAAC,GAAG,EAAE,YAAY;AAC9D,QAAM,cAAc,CAAC,QAAQ,SAAS,SAAS,EAAE,IAAI,cAAY;AAAA,MAChE;AAAA,MACA,QAAQ,yBAAyB,wBAAwB,QAAQ;AAAA,IAClE,CAAC;AAGD,QAAM,eAAe,CAAC,SAAS,YAAY;AAC1C,iBAAW,CAAC,UAAU,UAAU,KAAK,aAAa;AAEjD,cAAM,QAAQ,OAAO,YAAY,aAChC,IAAIC,UAAS,QAAQ,MAAM,WAAW,OAAO,QAAQ,GAAGA,KAAI,IAC5D,WAAW,MAAM,KAAK,OAAO;AAE9B,gBAAQ,eAAe,SAAS,UAAU,EAAC,GAAG,YAAY,MAAK,CAAC;AAAA,MACjE;AAEA,aAAO;AAAA,IACR;AAGA,QAAM,oBAAoB,aAAW;AACpC,aAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACvC,gBAAQ,GAAG,QAAQ,CAAC,UAAU,WAAW;AACxC,kBAAQ,EAAC,UAAU,OAAM,CAAC;AAAA,QAC3B,CAAC;AAED,gBAAQ,GAAG,SAAS,WAAS;AAC5B,iBAAO,KAAK;AAAA,QACb,CAAC;AAED,YAAI,QAAQ,OAAO;AAClB,kBAAQ,MAAM,GAAG,SAAS,WAAS;AAClC,mBAAO,KAAK;AAAA,UACb,CAAC;AAAA,QACF;AAAA,MACD,CAAC;AAAA,IACF;AAEA,WAAO,UAAU;AAAA,MAChB;AAAA,MACA;AAAA,IACD;AAAA;AAAA;;;AC5CA;AAAA;AAAA;AACA,QAAM,gBAAgB,CAAC,MAAMC,QAAO,CAAC,MAAM;AAC1C,UAAI,CAAC,MAAM,QAAQA,KAAI,GAAG;AACzB,eAAO,CAAC,IAAI;AAAA,MACb;AAEA,aAAO,CAAC,MAAM,GAAGA,KAAI;AAAA,IACtB;AAEA,QAAM,mBAAmB;AACzB,QAAM,uBAAuB;AAE7B,QAAM,YAAY,SAAO;AACxB,UAAI,OAAO,QAAQ,YAAY,iBAAiB,KAAK,GAAG,GAAG;AAC1D,eAAO;AAAA,MACR;AAEA,aAAO,IAAI,IAAI,QAAQ,sBAAsB,KAAK,CAAC;AAAA,IACpD;AAEA,QAAM,cAAc,CAAC,MAAMA,UAAS;AACnC,aAAO,cAAc,MAAMA,KAAI,EAAE,KAAK,GAAG;AAAA,IAC1C;AAEA,QAAM,oBAAoB,CAAC,MAAMA,UAAS;AACzC,aAAO,cAAc,MAAMA,KAAI,EAAE,IAAI,SAAO,UAAU,GAAG,CAAC,EAAE,KAAK,GAAG;AAAA,IACrE;AAEA,QAAM,gBAAgB;AAGtB,QAAM,eAAe,aAAW;AAC/B,YAAM,SAAS,CAAC;AAChB,iBAAW,SAAS,QAAQ,KAAK,EAAE,MAAM,aAAa,GAAG;AAExD,cAAM,gBAAgB,OAAO,OAAO,SAAS,CAAC;AAC9C,YAAI,iBAAiB,cAAc,SAAS,IAAI,GAAG;AAElD,iBAAO,OAAO,SAAS,CAAC,IAAI,GAAG,cAAc,MAAM,GAAG,EAAE,CAAC,IAAI,KAAK;AAAA,QACnE,OAAO;AACN,iBAAO,KAAK,KAAK;AAAA,QAClB;AAAA,MACD;AAEA,aAAO;AAAA,IACR;AAEA,WAAO,UAAU;AAAA,MAChB;AAAA,MACA;AAAA,MACA;AAAA,IACD;AAAA;AAAA;;;ACnDA;AAAA;AAAA;AACA,QAAM,OAAO,UAAQ,MAAM;AAC3B,QAAM,eAAe,UAAQ,eAAe;AAC5C,QAAM,aAAa;AACnB,QAAM,oBAAoB;AAC1B,QAAM,aAAa;AACnB,QAAM,UAAU;AAChB,QAAM,YAAY;AAClB,QAAM,iBAAiB;AACvB,QAAM,EAAC,aAAa,eAAe,cAAc,iBAAiB,eAAc,IAAI;AACpF,QAAM,EAAC,aAAa,kBAAkB,eAAe,kBAAiB,IAAI;AAC1E,QAAM,EAAC,cAAc,kBAAiB,IAAI;AAC1C,QAAM,EAAC,aAAa,cAAc,kBAAiB,IAAI;AAEvD,QAAM,qBAAqB,MAAO,MAAO;AAEzC,QAAM,SAAS,CAAC,EAAC,KAAK,WAAW,WAAW,aAAa,UAAU,SAAQ,MAAM;AAChF,YAAMC,OAAM,YAAY,EAAC,GAAG,QAAQ,KAAK,GAAG,UAAS,IAAI;AAEzD,UAAI,aAAa;AAChB,eAAO,WAAW,IAAI,EAAC,KAAAA,MAAK,KAAK,UAAU,SAAQ,CAAC;AAAA,MACrD;AAEA,aAAOA;AAAA,IACR;AAEA,QAAM,kBAAkB,CAAC,MAAMC,OAAM,UAAU,CAAC,MAAM;AACrD,YAAM,SAAS,WAAW,OAAO,MAAMA,OAAM,OAAO;AACpD,aAAO,OAAO;AACd,MAAAA,QAAO,OAAO;AACd,gBAAU,OAAO;AAEjB,gBAAU;AAAA,QACT,WAAW;AAAA,QACX,QAAQ;AAAA,QACR,mBAAmB;AAAA,QACnB,WAAW;AAAA,QACX,aAAa;AAAA,QACb,UAAU,QAAQ,OAAO,QAAQ,IAAI;AAAA,QACrC,UAAU,QAAQ;AAAA,QAClB,UAAU;AAAA,QACV,QAAQ;AAAA,QACR,SAAS;AAAA,QACT,KAAK;AAAA,QACL,aAAa;AAAA,QACb,GAAG;AAAA,MACJ;AAEA,cAAQ,MAAM,OAAO,OAAO;AAE5B,cAAQ,QAAQ,eAAe,OAAO;AAEtC,UAAI,QAAQ,aAAa,WAAW,KAAK,SAAS,MAAM,MAAM,MAAM,OAAO;AAE1E,QAAAA,MAAK,QAAQ,IAAI;AAAA,MAClB;AAEA,aAAO,EAAC,MAAM,MAAAA,OAAM,SAAS,OAAM;AAAA,IACpC;AAEA,QAAM,eAAe,CAAC,SAAS,OAAO,UAAU;AAC/C,UAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GAAG;AAEzD,eAAO,UAAU,SAAY,SAAY;AAAA,MAC1C;AAEA,UAAI,QAAQ,mBAAmB;AAC9B,eAAO,kBAAkB,KAAK;AAAA,MAC/B;AAEA,aAAO;AAAA,IACR;AAEA,QAAMC,SAAQ,CAAC,MAAMD,OAAM,YAAY;AACtC,YAAM,SAAS,gBAAgB,MAAMA,OAAM,OAAO;AAClD,YAAM,UAAU,YAAY,MAAMA,KAAI;AACtC,YAAM,iBAAiB,kBAAkB,MAAMA,KAAI;AAEnD,sBAAgB,OAAO,OAAO;AAE9B,UAAI;AACJ,UAAI;AACH,kBAAU,aAAa,MAAM,OAAO,MAAM,OAAO,MAAM,OAAO,OAAO;AAAA,MACtE,SAAS,OAAO;AAEf,cAAM,eAAe,IAAI,aAAa,aAAa;AACnD,cAAM,eAAe,QAAQ,OAAO,UAAU;AAAA,UAC7C;AAAA,UACA,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,KAAK;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,QAAQ;AAAA,QACT,CAAC,CAAC;AACF,eAAO,aAAa,cAAc,YAAY;AAAA,MAC/C;AAEA,YAAM,iBAAiB,kBAAkB,OAAO;AAChD,YAAM,eAAe,aAAa,SAAS,OAAO,SAAS,cAAc;AACzE,YAAM,cAAc,eAAe,SAAS,OAAO,SAAS,YAAY;AAExE,YAAM,UAAU,EAAC,YAAY,MAAK;AAElC,cAAQ,OAAO,YAAY,KAAK,MAAM,QAAQ,KAAK,KAAK,OAAO,CAAC;AAChE,cAAQ,SAAS,cAAc,KAAK,MAAM,SAAS,OAAO;AAE1D,YAAM,gBAAgB,YAAY;AACjC,cAAM,CAAC,EAAC,OAAO,UAAU,QAAQ,SAAQ,GAAG,cAAc,cAAc,SAAS,IAAI,MAAM,iBAAiB,SAAS,OAAO,SAAS,WAAW;AAChJ,cAAM,SAAS,aAAa,OAAO,SAAS,YAAY;AACxD,cAAM,SAAS,aAAa,OAAO,SAAS,YAAY;AACxD,cAAM,MAAM,aAAa,OAAO,SAAS,SAAS;AAElD,YAAI,SAAS,aAAa,KAAK,WAAW,MAAM;AAC/C,gBAAM,gBAAgB,UAAU;AAAA,YAC/B;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA,YAAY,QAAQ;AAAA,YACpB,QAAQ,QAAQ;AAAA,UACjB,CAAC;AAED,cAAI,CAAC,OAAO,QAAQ,QAAQ;AAC3B,mBAAO;AAAA,UACR;AAEA,gBAAM;AAAA,QACP;AAEA,eAAO;AAAA,UACN;AAAA,UACA;AAAA,UACA,UAAU;AAAA,UACV;AAAA,UACA;AAAA,UACA;AAAA,UACA,QAAQ;AAAA,UACR,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,QAAQ;AAAA,QACT;AAAA,MACD;AAEA,YAAM,oBAAoB,QAAQ,aAAa;AAE/C,kBAAY,SAAS,OAAO,QAAQ,KAAK;AAEzC,cAAQ,MAAM,cAAc,SAAS,OAAO,OAAO;AAEnD,aAAO,aAAa,SAAS,iBAAiB;AAAA,IAC/C;AAEA,WAAO,UAAUC;AAEjB,WAAO,QAAQ,OAAO,CAAC,MAAMD,OAAM,YAAY;AAC9C,YAAM,SAAS,gBAAgB,MAAMA,OAAM,OAAO;AAClD,YAAM,UAAU,YAAY,MAAMA,KAAI;AACtC,YAAM,iBAAiB,kBAAkB,MAAMA,KAAI;AAEnD,wBAAkB,OAAO,OAAO;AAEhC,UAAI;AACJ,UAAI;AACH,iBAAS,aAAa,UAAU,OAAO,MAAM,OAAO,MAAM,OAAO,OAAO;AAAA,MACzE,SAAS,OAAO;AACf,cAAM,UAAU;AAAA,UACf;AAAA,UACA,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR,KAAK;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA,UAAU;AAAA,UACV,YAAY;AAAA,UACZ,QAAQ;AAAA,QACT,CAAC;AAAA,MACF;AAEA,YAAM,SAAS,aAAa,OAAO,SAAS,OAAO,QAAQ,OAAO,KAAK;AACvE,YAAM,SAAS,aAAa,OAAO,SAAS,OAAO,QAAQ,OAAO,KAAK;AAEvE,UAAI,OAAO,SAAS,OAAO,WAAW,KAAK,OAAO,WAAW,MAAM;AAClE,cAAM,QAAQ,UAAU;AAAA,UACvB;AAAA,UACA;AAAA,UACA,OAAO,OAAO;AAAA,UACd,QAAQ,OAAO;AAAA,UACf,UAAU,OAAO;AAAA,UACjB;AAAA,UACA;AAAA,UACA;AAAA,UACA,UAAU,OAAO,SAAS,OAAO,MAAM,SAAS;AAAA,UAChD,YAAY;AAAA,UACZ,QAAQ,OAAO,WAAW;AAAA,QAC3B,CAAC;AAED,YAAI,CAAC,OAAO,QAAQ,QAAQ;AAC3B,iBAAO;AAAA,QACR;AAEA,cAAM;AAAA,MACP;AAEA,aAAO;AAAA,QACN;AAAA,QACA;AAAA,QACA,UAAU;AAAA,QACV;AAAA,QACA;AAAA,QACA,QAAQ;AAAA,QACR,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,QAAQ;AAAA,MACT;AAAA,IACD;AAEA,WAAO,QAAQ,UAAU,CAAC,SAAS,YAAY;AAC9C,YAAM,CAAC,MAAM,GAAGA,KAAI,IAAI,aAAa,OAAO;AAC5C,aAAOC,OAAM,MAAMD,OAAM,OAAO;AAAA,IACjC;AAEA,WAAO,QAAQ,cAAc,CAAC,SAAS,YAAY;AAClD,YAAM,CAAC,MAAM,GAAGA,KAAI,IAAI,aAAa,OAAO;AAC5C,aAAOC,OAAM,KAAK,MAAMD,OAAM,OAAO;AAAA,IACtC;AAEA,WAAO,QAAQ,OAAO,CAAC,YAAYA,OAAM,UAAU,CAAC,MAAM;AACzD,UAAIA,SAAQ,CAAC,MAAM,QAAQA,KAAI,KAAK,OAAOA,UAAS,UAAU;AAC7D,kBAAUA;AACV,QAAAA,QAAO,CAAC;AAAA,MACT;AAEA,YAAM,QAAQ,eAAe,KAAK,OAAO;AACzC,YAAM,kBAAkB,QAAQ,SAAS,OAAO,SAAO,CAAC,IAAI,WAAW,WAAW,CAAC;AAEnF,YAAM;AAAA,QACL,WAAW,QAAQ;AAAA,QACnB,cAAc;AAAA,MACf,IAAI;AAEJ,aAAOC;AAAA,QACN;AAAA,QACA;AAAA,UACC,GAAG;AAAA,UACH;AAAA,UACA,GAAI,MAAM,QAAQD,KAAI,IAAIA,QAAO,CAAC;AAAA,QACnC;AAAA,QACA;AAAA,UACC,GAAG;AAAA,UACH,OAAO;AAAA,UACP,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR;AAAA,UACA,OAAO;AAAA,QACR;AAAA,MACD;AAAA,IACD;AAAA;AAAA;;;AC3QA,SAAS,aAAa;;;ACAtB,OAAOE,cAAa;;;ACCpB,mBAAkB;AADlB,OAAOC,cAAa;;;ACAL,SAAR,UAA2B,EAAC,YAAY,MAAK,IAAI,CAAC,GAAG;AAE3D,QAAM,KAAK;AACX,QAAM,UAAU;AAAA,IACf,uHAAuH,EAAE;AAAA,IACzH;AAAA,EACD,EAAE,KAAK,GAAG;AAEV,SAAO,IAAI,OAAO,SAAS,YAAY,SAAY,GAAG;AACvD;;;ACPA,IAAM,QAAQ,UAAU;AAET,SAAR,UAA2B,QAAQ;AACzC,MAAI,OAAO,WAAW,UAAU;AAC/B,UAAM,IAAI,UAAU,gCAAgC,OAAO,MAAM,IAAI;AAAA,EACtE;AAKA,SAAO,OAAO,QAAQ,OAAO,EAAE;AAChC;;;ACbA,OAAOC,cAAa;AACpB,SAAQ,gBAAe;AAEhB,IAAM,qBAAqB,MAAM;AACvC,QAAM,EAAC,KAAAC,KAAG,IAAID;AAEd,MAAIA,SAAQ,aAAa,SAAS;AACjC,WAAOC,KAAI,WAAW;AAAA,EACvB;AAEA,MAAI;AACH,UAAM,EAAC,MAAK,IAAI,SAAS;AACzB,QAAI,OAAO;AACV,aAAO;AAAA,IACR;AAAA,EACD,QAAQ;AAAA,EAAC;AAET,MAAID,SAAQ,aAAa,UAAU;AAClC,WAAOC,KAAI,SAAS;AAAA,EACrB;AAEA,SAAOA,KAAI,SAAS;AACrB;AAGA,IAAM,eAAe,mBAAmB;AAExC,IAAO,wBAAQ;;;AHtBf,IAAM,OAAO;AAAA,EACZ;AAAA,EACA;AACD;AAEA,IAAM,MAAM;AAAA;AAAA,EAEX,qBAAqB;AACtB;AAEA,IAAM,WAAW,CAAAC,SAAO;AACvB,EAAAA,OAAMA,KAAI,MAAM,uBAAuB,EAAE,CAAC;AAC1C,QAAM,cAAc,CAAC;AAErB,aAAW,QAAQ,UAAUA,IAAG,EAAE,MAAM,IAAI,EAAE,OAAO,CAAAC,UAAQ,QAAQA,KAAI,CAAC,GAAG;AAC5E,UAAM,CAAC,KAAK,GAAG,MAAM,IAAI,KAAK,MAAM,GAAG;AACvC,gBAAY,GAAG,IAAI,OAAO,KAAK,GAAG;AAAA,EACnC;AAEA,SAAO;AACR;AAmBO,SAAS,aAAa,OAAO;AACnC,MAAIC,SAAQ,aAAa,SAAS;AACjC,WAAOA,SAAQ;AAAA,EAChB;AAEA,MAAI;AACH,UAAM,EAAC,OAAM,IAAI,aAAAC,QAAM,KAAK,SAAS,uBAAc,MAAM,EAAC,IAAG,CAAC;AAC9D,WAAO,SAAS,MAAM;AAAA,EACvB,SAAS,OAAO;AACf,QAAI,OAAO;AACV,YAAM;AAAA,IACP,OAAO;AACN,aAAOD,SAAQ;AAAA,IAChB;AAAA,EACD;AACD;;;AIpDO,SAAS,gBAAgB;AAC/B,QAAM,EAAC,KAAI,IAAI,aAAa;AAC5B,SAAO;AACR;;;ALPe,SAAR,UAA2B;AACjC,MAAIE,SAAQ,aAAa,SAAS;AACjC;AAAA,EACD;AAEA,EAAAA,SAAQ,IAAI,OAAO,cAAc,KAAK;AAAA,IACrC;AAAA,IACA;AAAA,IACA;AAAA,IACAA,SAAQ,IAAI;AAAA,EACb,EAAE,KAAK,GAAG;AACX;;;ADZA,SAAS,QAAAC,cAAY;AACrB,SAAS,YAAY;AACrB,SAAS,cAAc;AACvB,SAAS,mBAAmB;AAC5B,SAAS,oBAAoB;AAC7B,SAAS,YAAY;;;AOPrB,SAAS,QAAAC,aAAY;;;ACArB,SAAS,YAAY;AAGrB,IAAM,UAAU,IAAI,KAAK;AAEzB,QAAQ,KAAK,KAAK,OAAO,MAAM;AAC7B,MAAI;AACF,UAAM,EAAE,cAAc,SAAS,IAAI,MAAM,EAAE,IAAI,KAAK;AAEpD,QAAI,CAAC,cAAc;AACjB,aAAO,EAAE;AAAA,QACP;AAAA,UACE,SAAS;AAAA,UACT,OAAO;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,UAAU;AACb,aAAO,EAAE;AAAA,QACP;AAAA,UACE,SAAS;AAAA,UACT,OAAO;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,mBAAmB,EAAE;AAE3B,QAAI;AACF,YAAM,iBAAiB,gBAAgB,UAAU,YAAY;AAC7D,YAAM,SAAS,iBAAiB,oBAAoB,QAAQ;AAC5D,UAAI,WAAW,aAAa;AAC1B,eAAO,EAAE,KAAK;AAAA,UACZ,SAAS;AAAA,UACT,QAAQ;AAAA,QACV,CAAC;AAAA,MACH,OAAO;AACL,eAAO,EAAE;AAAA,UACP;AAAA,YACE,SAAS;AAAA,YACT,OAAO;AAAA,YACP;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,aAAO,EAAE;AAAA,QACP;AAAA,UACE,SAAS;AAAA,UACT,OAAO,gFAAgF,KAAK,UAAU,YAAY,CAAC;AAAA,UACnH,SAAS,iBAAiB,QAAQ,MAAM,UAAU;AAAA,QACpD;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,OAAO;AACd,WAAO,EAAE;AAAA,MACP;AAAA,QACE,SAAS;AAAA,QACT,OAAO;AAAA,QACP,SAAS,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MACpD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAED,IAAO,kBAAQ;;;ACvEf,SAAS,QAAAC,aAAY;AAGrB,IAAM,UAAU,IAAIC,MAAK;AAGzB,QAAQ,IAAI,KAAK,OAAO,MAAM;AAC5B,MAAI;AACF,UAAMC,uBAAsB,EAAE;AAG9B,UAAM,mBAAmBA,qBAAoB,oBAAoB;AAEjE,UAAM,aAAa,OAAO,QAAQ,gBAAgB,EAAE;AAAA,MAClD,CAAC,CAAC,UAAU,UAAU,OAAO;AAAA,QAC3B,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,QAAQ,WAAW;AAAA,QACnB,QAAQ,WAAW;AAAA,MACrB;AAAA,IACF;AAEA,WAAO,EAAE,KAAK;AAAA,MACZ,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,MAAM,0BAA0B,KAAK;AAC7C,WAAO,EAAE;AAAA,MACP;AAAA,QACE,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAGD,QAAQ,IAAI,qBAAqB,OAAO,MAAM;AAC5C,MAAI;AACF,UAAM,WAAW,EAAE,IAAI,MAAM,UAAU;AACvC,UAAMA,uBAAsB,EAAE;AAE9B,UAAM,SAASA,qBAAoB,oBAAoB,QAAQ;AAE/D,WAAO,EAAE,KAAK;AAAA,MACZ,SAAS;AAAA,MACT;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,MAAM,gCAAgC,KAAK;AACnD,WAAO,EAAE;AAAA,MACP;AAAA,QACE,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAGD,QAAQ,OAAO,cAAc,OAAO,MAAM;AACxC,MAAI;AACF,UAAM,WAAW,EAAE,IAAI,MAAM,UAAU;AACvC,UAAMA,uBAAsB,EAAE;AAE9B,UAAMA,qBAAoB,qBAAqB,QAAQ;AAEvD,WAAO,EAAE,KAAK;AAAA,MACZ,SAAS;AAAA,MACT,SAAS,6BAA6B,QAAQ;AAAA,IAChD,CAAC;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,MAAM,+BAA+B,KAAK;AAClD,WAAO,EAAE;AAAA,MACP;AAAA,QACE,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAGD,QAAQ,KAAK,cAAc,OAAO,MAAM;AACtC,MAAI;AACF,UAAM,EAAE,UAAU,aAAa,IAAI,MAAM,EAAE,IAAI,KAAK;AAEpD,QAAI,CAAC,YAAY,CAAC,cAAc;AAC9B,aAAO,EAAE;AAAA,QACP;AAAA,UACE,SAAS;AAAA,UACT,OAAO;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAMA,uBAAsB,EAAE;AAG9B,UAAMA,qBAAoB,qBAAqB,QAAQ;AACvD,UAAMA,qBAAoB,gBAAgB,UAAU,YAAY;AAEhE,UAAM,SAASA,qBAAoB,oBAAoB,QAAQ;AAE/D,WAAO,EAAE,KAAK;AAAA,MACZ,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA,SAAS,0BAA0B,QAAQ;AAAA,IAC7C,CAAC;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,MAAM,8BAA8B,KAAK;AACjD,WAAO,EAAE;AAAA,MACP;AAAA,QACE,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAED,IAAO,kBAAQ;;;AChIf,SAAS,QAAAC,aAAY;AAErB,SAAS,uBAAuB;AAChC,SAAS,eAAAC,oBAAmB;AAG5B,IAAM,QAAQ,IAAIC,MAAK;AAGvB,IAAM,sBAAsB,oBAAI,IAM9B;AAEF,MAAM,KAAK,KAAK,OAAO,MAAM;AAC3B,MAAI;AACJ,MAAI;AAEJ,MAAI;AACF,UAAM,cAAc,MAAM,EAAE,IAAI,KAAK;AACrC,aAAS,YAAY;AACrB,eAAW,YAAY;AACvB,UAAM,EAAE,cAAc,YAAY,WAAW,SAAS,IAAI;AAE1D,QAAI,CAAC,UAAU,CAAC,CAAC,QAAQ,WAAW,SAAS,EAAE,SAAS,MAAM,GAAG;AAC/D,aAAO,EAAE;AAAA,QACP;AAAA,UACE,SAAS;AAAA,UACT,OAAO;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,QAAI,WAAW,WAAW;AACxB,UAAI,CAAC,WAAW;AACd,eAAO,EAAE;AAAA,UACP;AAAA,YACE,SAAS;AAAA,YACT,OAAO;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,YAAMC,uBAAsB,EAAE;AAC9B,YAAM,UAAUA,qBAAoB;AAAA,QAClC;AAAA,QACA;AAAA,MACF;AAEA,UAAI,CAAC,SAAS;AAEZ,cAAM,UAAU,oBAAoB,IAAI,SAAS;AACjD,YAAI,SAAS;AACX,kBAAQ,QAAQ,QAAQ;AACxB,8BAAoB,OAAO,SAAS;AACpC,iBAAO,EAAE,KAAK,EAAE,SAAS,KAAK,CAAC;AAAA,QACjC;AAEA,eAAO,EAAE;AAAA,UACP;AAAA,YACE,SAAS;AAAA,YACT,OAAO;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,aAAO,EAAE,KAAK,EAAE,SAAS,KAAK,CAAC;AAAA,IACjC;AAGA,UAAM,UAAU,IAAIC,aAAY;AAChC,UAAM,iBAAiB,IAAI,eAAe;AAAA,MACxC,MAAM,MAAM,YAAY;AACtB,YAAI;AACF,cAAI,CAAC,cAAc;AACjB,uBAAW;AAAA,cACT,QAAQ;AAAA,gBACN,SAAS,KAAK,UAAU,EAAE,MAAM,cAAc,OAAO,2BAA2B,CAAC,CAAC;AAAA;AAAA;AAAA,cACpF;AAAA,YACF;AACA,uBAAW,QAAQ,QAAQ,OAAO;AAAA;AAAA,CAAkB,CAAC;AACrD,uBAAW,MAAM;AACjB;AAAA,UACF;AAEA,gBAAMD,uBAAsB,EAAE;AAE9B,gBAAM,WACH,aAAqB,QAAS,aAAqB,MAAM;AAC5D,gBAAMA,qBAAoB,gBAAgB,UAAU,YAAY;AAGhE,UAAAA,qBAAoB,uBAAuB,OAAO,YAAY;AAC5D,kBAAM,EAAE,WAAAE,YAAW,SAAS,OAAO,IAAI;AAGvC,uBAAW;AAAA,cACT,QAAQ;AAAA,gBACN,SAAS,KAAK,UAAU;AAAA,kBACtB,MAAM;AAAA,kBACN,WAAAA;AAAA,kBACA;AAAA,kBACA;AAAA,kBACA,UAAU,YAAY;AAAA,kBACtB,WAAW,oBAAI,KAAK;AAAA,gBACtB,CAAC,CAAC;AAAA;AAAA;AAAA,cACJ;AAAA,YACF;AAGA,mBAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,kCAAoB,IAAIA,YAAW;AAAA,gBACjC,SAAS,CAACC,cAAkB;AAC1B,0BAAQA,SAAQ;AAChB,sCAAoB,OAAOD,UAAS;AAAA,gBACtC;AAAA,gBACA,QAAQ,CAAC,UAAe;AACtB,yBAAO,KAAK;AACZ,sCAAoB,OAAOA,UAAS;AAAA,gBACtC;AAAA,cACF,CAAC;AAGD,yBAAW,MAAM;AACf,oBAAI,oBAAoB,IAAIA,UAAS,GAAG;AACtC,sCAAoB,OAAOA,UAAS;AACpC,yBAAO,IAAI,MAAM,qBAAqB,CAAC;AAAA,gBACzC;AAAA,cACF,GAAG,GAAM;AAAA,YACX,CAAC;AAAA,UACH,CAAC;AAED,cAAI,WAAW,QAAQ;AAErB,gBAAI;AACF,oBAAM,iBACJ,MAAMF,qBAAoB,qBAAqB,QAAQ;AAGzD,oBAAM,sBAA2C,CAAC;AAClD,yBAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQ,cAAc,GAAG;AACzD,oBAAI,cAAe,KAAa;AAChC,oBAAI;AAEF,gCAAc,gBAAgB,WAA6B;AAAA,gBAC7D,QAAQ;AAAA,gBAER;AACA,oCAAoB,IAAI,IAAI;AAAA,kBAC1B;AAAA,kBACA,aAAc,KAAa;AAAA,kBAC3B;AAAA,kBACA,cAAe,KAAa;AAAA,gBAC9B;AAAA,cACF;AAEA,yBAAW;AAAA,gBACT,QAAQ;AAAA,kBACN,SAAS,KAAK,UAAU,EAAE,MAAM,cAAc,OAAO,oBAAoB,CAAC,CAAC;AAAA;AAAA;AAAA,gBAC7E;AAAA,cACF;AACA,yBAAW,QAAQ,QAAQ,OAAO;AAAA;AAAA,CAAkB,CAAC;AACrD,yBAAW,MAAM;AACjB;AAAA,YACF,SAAS,KAAK;AACZ,yBAAW;AAAA,gBACT,QAAQ;AAAA,kBACN,SAAS,KAAK,UAAU,EAAE,MAAM,cAAc,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE,CAAC,CAAC;AAAA;AAAA;AAAA,gBAC1G;AAAA,cACF;AACA,yBAAW,QAAQ,QAAQ,OAAO;AAAA;AAAA,CAAkB,CAAC;AACrD,yBAAW,MAAM;AACjB;AAAA,YACF;AAAA,UACF;AAEA,cAAI,WAAW,WAAW;AACxB,gBAAI,CAAC,UAAU;AACb,yBAAW;AAAA,gBACT,QAAQ;AAAA,kBACN,SAAS,KAAK,UAAU,EAAE,MAAM,cAAc,OAAO,sCAAsC,CAAC,CAAC;AAAA;AAAA;AAAA,gBAC/F;AAAA,cACF;AACA,yBAAW,QAAQ,QAAQ,OAAO;AAAA;AAAA,CAAkB,CAAC;AACrD,yBAAW,MAAM;AACjB;AAAA,YACF;AAEA,uBAAW;AAAA,cACT,QAAQ;AAAA,gBACN,SAAS,KAAK,UAAU,EAAE,MAAM,kBAAkB,UAAU,YAAY,cAAc,CAAC,GAAG,SAAS,oBAAoB,CAAC,CAAC;AAAA;AAAA;AAAA,cAC3H;AAAA,YACF;AAGA,kBAAM,OAAO,MAAMA,qBAAoB;AAAA,cACrC;AAAA,cACA,cAAc,CAAC;AAAA,YACjB;AACA,uBAAW;AAAA,cACT,QAAQ;AAAA,gBACN,SAAS,KAAK,UAAU,EAAE,MAAM,eAAe,UAAU,QAAQ,KAAK,OAAO,CAAC,CAAC;AAAA;AAAA;AAAA,cACjF;AAAA,YACF;AACA,uBAAW;AAAA,cACT,QAAQ;AAAA,gBACN,SAAS,KAAK,UAAU,EAAE,MAAM,wBAAwB,SAAS,CAAC,CAAC;AAAA;AAAA;AAAA,cACrE;AAAA,YACF;AACA,uBAAW,QAAQ,QAAQ,OAAO;AAAA;AAAA,CAAkB,CAAC;AACrD,uBAAW,MAAM;AACjB;AAAA,UACF;AAAA,QACF,SAAS,KAAK;AACZ,qBAAW;AAAA,YACT,QAAQ;AAAA,cACN,SAAS,KAAK,UAAU,EAAE,MAAM,cAAc,OAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAAE,CAAC,CAAC;AAAA;AAAA;AAAA,YAC1G;AAAA,UACF;AACA,qBAAW,QAAQ,QAAQ,OAAO;AAAA;AAAA,CAAkB,CAAC;AACrD,qBAAW,MAAM;AAAA,QACnB,UAAE;AAEA,gBAAMA,uBAAsB,EAAE;AAC9B,cAAIA,sBAAqB;AACvB,YAAAA,qBAAoB,yBAAyB;AAAA,UAC/C;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,IAAI,SAAS,gBAAgB;AAAA,MAClC,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,QACjB,YAAY;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH,SAAS,OAAO;AACd,UAAM,WAAW,iBAAiB,QAAQ,MAAM,UAAU;AAE1D,WAAO,EAAE;AAAA,MACP;AAAA,QACE,SAAS;AAAA,QACT,OAAO;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAED,IAAO,gBAAQ;;;AClQf,SAAS,QAAAI,aAAY;AAGrB,IAAM,YAAY,IAAIC,MAAK;AAG3B,UAAU,KAAK,SAAS,OAAO,MAAM;AACnC,MAAI;AACF,UAAM,EAAE,SAAS,IAAI,MAAM,EAAE,IAAI,KAAK;AAEtC,QAAI,CAAC,UAAU;AACb,aAAO,EAAE,KAAK,EAAE,SAAS,OAAO,OAAO,uBAAuB,GAAG,GAAG;AAAA,IACtE;AACA,UAAM,mBAAmB,EAAE;AAC3B,UAAM,kBAAkB,iBAAiB,sBAAsB,QAAQ;AACvE,WAAO,EAAE,KAAK,EAAE,WAAW,EAAE,CAAC,QAAQ,GAAG,gBAAgB,EAAE,CAAC;AAAA,EAC9D,SAAS,OAAO;AACd,YAAQ,MAAM,6BAA6B,KAAK;AAChD,WAAO,EAAE;AAAA,MACP;AAAA,QACE,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAGD,UAAU,KAAK,SAAS,OAAO,MAAM;AACnC,MAAI;AACF,UAAM,EAAE,UAAU,IAAI,IAAI,MAAM,EAAE,IAAI,KAAK;AAE3C,QAAI,CAAC,UAAU;AACb,aAAO,EAAE,KAAK,EAAE,SAAS,OAAO,OAAO,uBAAuB,GAAG,GAAG;AAAA,IACtE;AAEA,QAAI,CAAC,KAAK;AACR,aAAO,EAAE;AAAA,QACP;AAAA,UACE,SAAS;AAAA,UACT,OAAO;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,mBAAmB,EAAE;AAE3B,UAAM,UAAU,MAAM,iBAAiB,YAAY,KAAK,QAAQ;AAEhE,WAAO,EAAE,KAAK,EAAE,QAAQ,CAAC;AAAA,EAC3B,SAAS,OAAO;AACd,YAAQ,MAAM,2BAA2B,KAAK;AAC9C,WAAO,EAAE;AAAA,MACP;AAAA,QACE,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAED,IAAO,oBAAQ;;;AChEf,SAAS,QAAAC,aAAY;AAGrB,IAAM,UAAU,IAAIC,MAAK;AAGzB,QAAQ,KAAK,SAAS,OAAO,MAAM;AACjC,MAAI;AACF,UAAM,EAAE,SAAS,IAAI,MAAM,EAAE,IAAI,KAAK;AAEtC,QAAI,CAAC,UAAU;AACb,aAAO,EAAE,KAAK,EAAE,SAAS,OAAO,OAAO,uBAAuB,GAAG,GAAG;AAAA,IACtE;AAEA,UAAMC,uBAAsB,EAAE;AAG9B,UAAM,gBAAgBA,qBAAoB,oBAAoB,QAAQ;AAEtE,WAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,QAAQ,GAAG,cAAc,EAAE,CAAC;AAAA,EAC1D,SAAS,OAAO;AACd,YAAQ,MAAM,2BAA2B,KAAK;AAC9C,WAAO,EAAE;AAAA,MACP;AAAA,QACE,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAGD,QAAQ,KAAK,QAAQ,OAAO,MAAM;AAChC,MAAI;AACF,UAAM,EAAE,UAAU,MAAM,MAAAC,MAAK,IAAI,MAAM,EAAE,IAAI,KAAK;AAElD,QAAI,CAAC,UAAU;AACb,aAAO,EAAE,KAAK,EAAE,SAAS,OAAO,OAAO,uBAAuB,GAAG,GAAG;AAAA,IACtE;AAEA,QAAI,CAAC,MAAM;AACT,aAAO,EAAE;AAAA,QACP;AAAA,UACE,SAAS;AAAA,UACT,OAAO;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAMD,uBAAsB,EAAE;AAG9B,UAAM,UAAU,MAAMA,qBAAoB;AAAA,MACxC;AAAA,MACA;AAAA,MACAC,SAAQ,CAAC;AAAA,IACX;AAEA,WAAO,EAAE,KAAK,EAAE,QAAQ,CAAC;AAAA,EAC3B,SAAS,OAAO;AACd,YAAQ,MAAM,yBAAyB,KAAK;AAC5C,WAAO,EAAE;AAAA,MACP;AAAA,QACE,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAED,IAAO,kBAAQ;;;ACzEf,SAAS,QAAAC,aAAY;AACrB,SAAS,aAAa;AACtB,SAAS,uBAAuB;AAChC,SAAS,oBAAoB;AAC7B,SAAS,gCAAgC;AACzC,SAAS,oBAAoB;AAM7B,SAAS,eAAAC,oBAAmB;;;ACX5B,SAA0B,YAAY;AACtC,SAAS,eAAe;AA6IjB,SAAS,gCAAgC,UAA0B;AACxE,UAAQ,UAAU;AAAA,IAChB,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA;AAAA,IACT;AACE,aAAO;AAAA,EACX;AACF;;;ADvGA,IAAM,gBAAgB,QAAQ,IAAI,cAAc;AAChD,IAAM,sBAAsB;AAC5B,IAAM,kBAAkB;AAGxB,IAAM,MAAM,IAAIC,UAAgB;AAC9B,MAAI,cAAe,SAAQ,IAAI,cAAc,GAAGA,KAAI;AACtD;AAGA,IAAI;AACF,EAAC,QAAgB,kBAAkB,EAAE;AACvC,QAAQ;AAAC;AAGT,IAAMC,uBAAsB,oBAAI,IAAgC;AAIhE,IAAM,OAAO,IAAIC,MAAK;AAOtB,IAAM,iBAAiB,CACrB,iBACA,QACA,kBACG;AACH,MAAI,CAAC,iBAAiB,MAAM,CAAC,iBAAiB,UAAU;AACtD,UAAM,IAAI;AAAA,MACR,6BAA6B,KAAK,UAAU,eAAe,CAAC;AAAA,IAC9D;AAAA,EACF;AAEA,UAAQ,gBAAgB,UAAU;AAAA,IAChC,KAAK;AACH,aAAO,gBAAgB,EAAE,OAAO,CAAC,EAAE,gBAAgB,EAAE;AAAA,IACvD,KAAK;AACH,aAAO,aAAa,EAAE,OAAO,CAAC,EAAE,gBAAgB,EAAE;AAAA,IACpD,KAAK;AACH,aAAO,aAAa,EAAE,QAAQ,SAAS,8BAA8B,CAAC;AAAA,QACpE,gBAAgB;AAAA,MAClB;AAAA,IACF,KAAK;AACH,aAAO,yBAAyB,EAAE,OAAO,CAAC,EAAE,gBAAgB,EAAE;AAAA,IAChE,KAAK;AACH,YAAM,UAAU,iBAAiB;AACjC,aAAO,aAAa;AAAA,QAClB,SAAS,GAAG,OAAO;AAAA,MACrB,CAAC,EAAE,gBAAgB,IAAI;AAAA,QACrB,mBAAmB;AAAA,MACrB,CAAC;AAAA,IACH;AACE,YAAM,IAAI;AAAA,QACR,yBAAyB,gBAAgB,QAAQ,eAAe,gBAAgB,EAAE;AAAA,MACpF;AAAA,EACJ;AACF;AAOA,IAAM,yBAAyB,CAC7BC,QACA,qBACG;AACH,QAAM,eAAoC,CAAC;AAE3C,aAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAQA,MAAK,GAAG;AAChD,iBAAa,IAAI,IAAI;AAAA,MACnB,GAAI;AAAA,MACJ,SAAS,OAAO,WAAgB;AAC9B,cAAM,oBAAoB,EAAE,iBAAiB;AAC7C,cAAM,YAAY,KAAK,IAAI;AAG3B,YAAI,iBAAiB,cAAc,iBAAiB,SAAS;AAC3D,2BAAiB,WAAW;AAAA,YAC1B,iBAAiB,QAAQ;AAAA,cACvB,SAAS,KAAK,UAAU;AAAA,gBACtB,MAAM;AAAA,gBACN,UAAU;AAAA,kBACR,IAAI;AAAA,kBACJ;AAAA,kBACA,YAAY;AAAA,kBACZ,WAAW,oBAAI,KAAK;AAAA,kBACpB,QAAQ;AAAA,gBACV;AAAA,cACF,CAAC,CAAC;AAAA;AAAA;AAAA,YACJ;AAAA,UACF;AAAA,QACF;AAEA,YAAI,kBAAkB,EAAE,MAAM,mBAAmB,OAAO,CAAC;AAEzD,YAAI;AACF,gBAAM,SAAS,MAAO,KAAa,QAAQ,MAAM;AACjD,cAAI,eAAe;AAAA,YACjB;AAAA,YACA;AAAA,YACA,IAAI,KAAK,IAAI,IAAI;AAAA,UACnB,CAAC;AAGD,cAAI,iBAAiB,cAAc,iBAAiB,SAAS;AAC3D,6BAAiB,WAAW;AAAA,cAC1B,iBAAiB,QAAQ;AAAA,gBACvB,SAAS,KAAK,UAAU;AAAA,kBACtB,MAAM;AAAA,kBACN,YAAY;AAAA,oBACV,IAAI;AAAA,oBACJ,YAAY;AAAA,oBACZ;AAAA,oBACA,WAAW,oBAAI,KAAK;AAAA,kBACtB;AAAA,gBACF,CAAC,CAAC;AAAA;AAAA;AAAA,cACJ;AAAA,YACF;AAAA,UACF;AAEA,iBAAO;AAAA,QACT,SAAS,OAAO;AACd,cAAI,cAAc;AAAA,YAChB;AAAA,YACA;AAAA,YACA,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,UAC9D,CAAC;AAGD,cAAI,iBAAiB,cAAc,iBAAiB,SAAS;AAC3D,6BAAiB,WAAW;AAAA,cAC1B,iBAAiB,QAAQ;AAAA,gBACvB,SAAS,KAAK,UAAU;AAAA,kBACtB,MAAM;AAAA,kBACN,YAAY;AAAA,oBACV,IAAI;AAAA,oBACJ,YAAY;AAAA,oBACZ,OACE,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,oBACvD,WAAW,oBAAI,KAAK;AAAA,kBACtB;AAAA,gBACF,CAAC,CAAC;AAAA;AAAA;AAAA,cACJ;AAAA,YACF;AAAA,UACF;AACA,gBAAM;AAAA,QACR;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAKA,IAAM,wBAAwB,CAC5B,kBACA,MACA,WACA,gBACG;AACH,MAAI;AAEF,QAAI,aAAa,MAAM,QAAQ,SAAS,GAAG;AACzC,iBAAW,QAAQ,WAAW;AAC5B,cAAM,oBAAoB,EAAE,iBAAiB;AAC7C,yBAAiB,wBAAwB;AAEzC,YAAI,iBAAiB,cAAc,iBAAiB,SAAS;AAC3D,2BAAiB,WAAW;AAAA,YAC1B,iBAAiB,QAAQ;AAAA,cACvB,SAAS,KAAK,UAAU;AAAA,gBACtB,MAAM;AAAA,gBACN,UAAU;AAAA,kBACR,IAAI;AAAA,kBACJ,MAAM,KAAK,QAAQ,KAAK;AAAA,kBACxB,YAAY,KAAK,UAAU,KAAK,QAAQ,CAAC;AAAA,kBACzC,WAAW,oBAAI,KAAK;AAAA,kBACpB,QAAQ;AAAA,gBACV;AAAA,cACF,CAAC,CAAC;AAAA;AAAA;AAAA,YACJ;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,eAAe,MAAM,QAAQ,WAAW,GAAG;AAC7C,iBAAW,UAAU,aAAa;AAChC,cAAM,oBACJ,iBAAiB,yBAAyB,OACtC,iBAAiB,wBACjB,EAAE,iBAAiB;AAEzB,YAAI,iBAAiB,cAAc,iBAAiB,SAAS;AAC3D,2BAAiB,WAAW;AAAA,YAC1B,iBAAiB,QAAQ;AAAA,cACvB,SAAS,KAAK,UAAU;AAAA,gBACtB,MAAM;AAAA,gBACN,YAAY;AAAA,kBACV,IAAI;AAAA,kBACJ,YAAY;AAAA,kBACZ,QAAQ,OAAO;AAAA,kBACf,OAAQ,OAAe;AAAA,kBACvB,WAAW,oBAAI,KAAK;AAAA,gBACtB;AAAA,cACF,CAAC,CAAC;AAAA;AAAA;AAAA,YACJ;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,qBAAiB,aAAa,iBAAiB,aAAa,KAAK;AACjE,QAAI,iBAAiB,cAAc,iBAAiB,SAAS;AAC3D,uBAAiB,WAAW;AAAA,QAC1B,iBAAiB,QAAQ;AAAA,UACvB,SAAS,KAAK,UAAU;AAAA,YACtB,MAAM;AAAA,YACN,MAAM,iBAAiB;AAAA,YACvB;AAAA,YACA,YAAY,aAAa,CAAC,GAAG,IAAI,CAAC,OAAY;AAAA,cAC5C,MAAM,EAAE,QAAQ,EAAE;AAAA,cAClB,QAAQ,EAAE,UAAU,EAAE,QAAQ,CAAC;AAAA,YACjC,EAAE;AAAA,YACF,cAAc,eAAe,CAAC,GAAG,IAAI,CAAC,OAAY;AAAA,cAChD,QAAQ,EAAE;AAAA,cACV,OAAQ,EAAU;AAAA,YACpB,EAAE;AAAA,YACF,WAAW,oBAAI,KAAK;AAAA,UACtB,CAAC,CAAC;AAAA;AAAA;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,QAAI,sBAAsB,GAAG;AAAA,EAC/B;AACF;AAKA,IAAM,sBAAsB,OAC1B,kBACA,WACG;AACH,MAAI,aAAa;AACjB,MAAI,aAAa;AAEjB,mBAAiB,SAAS,OAAO,YAAY;AAC3C,QAAI,SAAS,MAAM,KAAK,GAAG;AACzB,mBAAa;AACb;AACA,uBAAiB,WAAW;AAAA,QAC1B,iBAAiB,QAAS;AAAA,UACxB,SAAS,KAAK,UAAU,EAAE,MAAM,QAAQ,SAAS,MAAM,CAAC,CAAC;AAAA;AAAA;AAAA,QAC3D;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,MAAI,sBAAsB,EAAE,YAAY,WAAW,CAAC;AACpD,SAAO,EAAE,YAAY,WAAW;AAClC;AAKA,IAAM,uBAAuB,OAC3B,OACA,UACA,kBACA,UACA,gBACG;AACH,MAAI;AACF,UAAM,SAAS,MAAM,MAAM,SAAS,UAAU;AAAA,MAC5C,aACE,eAAe,QAAQ,SACnB,gCAAgC,QAAQ,IACxC;AAAA,IACR,CAAC;AACD,QAAI,OAAO,QAAQ,OAAO,KAAK,KAAK,GAAG;AACrC,uBAAiB,WAAW;AAAA,QAC1B,iBAAiB,QAAS;AAAA,UACxB,SAAS,KAAK,UAAU;AAAA,YACtB,MAAM;AAAA,YACN,SAAS,OAAO;AAAA,UAClB,CAAC,CAAC;AAAA;AAAA;AAAA,QACJ;AAAA,MACF;AAAA,IACF;AAAA,EACF,SAAS,aAAa;AACpB,qBAAiB,WAAW;AAAA,MAC1B,iBAAiB,QAAS;AAAA,QACxB,SAAS,KAAK,UAAU;AAAA,UACtB,MAAM;AAAA,UACN,SAAS;AAAA,UACT,OACE,uBAAuB,QACnB,YAAY,UACZ;AAAA,QACR,CAAC,CAAC;AAAA;AAAA;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AACF;AAKA,IAAM,0BAA0B,OAC9B,OACA,UACA,UACA,kBACA,UACA,gBACG;AACH,QAAM,SAAS,MAAM,MAAM,OAAO,UAAU;AAAA,IAC1C,UAAU;AAAA,IACV,aACE,eAAe,QAAQ,SACnB,gCAAgC,QAAQ,IACxC;AAAA,IACN;AAAA,IACA,cAAc,CAAC,EAAE,MAAM,WAAW,YAAY,MAAM;AAClD,4BAAsB,kBAAkB,MAAM,WAAW,WAAW;AAAA,IACtE;AAAA,EACF,CAAC;AAED,QAAM,EAAE,WAAW,IAAI,MAAM,oBAAoB,kBAAkB,MAAM;AAGzE,MAAI,CAAC,YAAY;AACf,QAAI,wDAAwD;AAC5D,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGA,mBAAiB,WAAW;AAAA,IAC1B,iBAAiB,QAAS;AAAA,MACxB,SAAS,KAAK,UAAU;AAAA,QACtB,MAAM;AAAA,MACR,CAAC,CAAC;AAAA;AAAA;AAAA,IACJ;AAAA,EACF;AAGA,mBAAiB,WAAW;AAAA,IAC1B,iBAAiB,QAAS,OAAO;AAAA;AAAA,CAAkB;AAAA,EACrD;AACF;AAGA,KAAK,KAAK,KAAK,OAAO,MAAM;AAC1B,QAAM,mBAAmB,EAAE;AAC3B,MAAI;AACF,UAAM,cAA2B,MAAM,EAAE,IAAI,KAAK;AAClD,UAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,IAAI;AAGJ,QAAI,WAAW,wBAAwB;AACrC,UAAI,CAAC,WAAW;AACd,eAAO,EAAE;AAAA,UACP;AAAA,YACE,SAAS;AAAA,YACT,OAAO;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,YAAM,UAAUF,qBAAoB,IAAI,SAAS;AACjD,UAAI,CAAC,SAAS;AACZ,eAAO,EAAE;AAAA,UACP;AAAA,YACE,SAAS;AAAA,YACT,OAAO;AAAA,UACT;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,cAAQ,QAAQ,QAAQ;AACxB,MAAAA,qBAAoB,OAAO,SAAS;AACpC,aAAO,EAAE,KAAK,EAAE,SAAS,KAAK,CAAC;AAAA,IACjC;AAGA,QAAI,CAAC,OAAO,MAAM,CAAC,UAAU,CAAC,UAAU;AACtC,aAAO,EAAE;AAAA,QACP;AAAA,UACE,SAAS;AAAA,UACT,OAAO;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,QAAI,CAAC,iBAAiB,OAAO,KAAK,aAAa,EAAE,WAAW,GAAG;AAC7D,aAAO,EAAE;AAAA,QACP;AAAA,UACE,SAAS;AAAA,UACT,OAAO;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,UAAM,eAAuC,CAAC;AAC9C,UAAM,mBAA6B,CAAC;AAEpC,eAAW,CAAC,YAAY,YAAY,KAAK,OAAO,QAAQ,aAAa,GAAG;AACtE,UAAI;AACF,cAAM,iBAAiB,gBAAgB,YAAY,YAAY;AAC/D,yBAAiB,KAAK,UAAU;AAChC,YAAI,uBAAuB,EAAE,WAAW,CAAC;AAAA,MAC3C,SAAS,OAAO;AACd,cAAM,eACJ,iBAAiB,QAAQ,MAAM,UAAU;AAC3C,qBAAa,UAAU,IAAI;AAC3B,YAAI,+BAA+B,EAAE,YAAY,OAAO,aAAa,CAAC;AAAA,MACxE;AAAA,IACF;AAGA,QAAI,iBAAiB,WAAW,GAAG;AACjC,aAAO,EAAE;AAAA,QACP;AAAA,UACE,SAAS;AAAA,UACT,OAAO;AAAA,UACP,SAAS;AAAA,QACX;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAGA,QAAI,OAAO,KAAK,YAAY,EAAE,SAAS,GAAG;AACxC,UAAI,kCAAkC;AAAA,QACpC;AAAA,QACA,eAAe,OAAO,KAAK,YAAY;AAAA,QACvC,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AAGA,UAAM,WAAW,eAAe,OAAO,QAAQ,aAAa;AAG5D,UAAM,QAAQ,IAAI,MAAM;AAAA,MACtB,MAAM;AAAA,MACN,cACE,gBAAgB;AAAA,MAClB,OAAO;AAAA,MACP,OAAO;AAAA;AAAA,IACT,CAAC;AAED,UAAM,oBAAoB,SAAS,IAAI,CAAC,SAAsB;AAAA,MAC5D,MAAM,IAAI;AAAA,MACV,SAAS,IAAI;AAAA,IACf,EAAE;AAGF,UAAM,WAAW,iBAAiB,kBAAkB;AACpD,UAAM,gBAAqC,CAAC;AAG5C,eAAW,QAAQ,UAAU;AAC3B,UAAI,CAAC,cAAc,KAAK,QAAQ,GAAG;AACjC,sBAAc,KAAK,QAAQ,IAAI,CAAC;AAAA,MAClC;AACA,oBAAc,KAAK,QAAQ,EAAE,KAAK,IAAI,IAAI;AAAA,QACxC,aAAa,KAAK;AAAA,QAClB,aAAa,KAAK;AAAA,QAClB,SAAS,OAAO,WAAgB;AAC9B,iBAAO,MAAM,iBAAiB;AAAA,YAC5B,GAAG,KAAK,QAAQ,IAAI,KAAK,IAAI;AAAA,YAC7B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,QAAI,mBAAmB;AAAA,MACrB;AAAA,MACA,WAAW,SAAS;AAAA,MACpB,cAAc,kBAAkB;AAAA,IAClC,CAAC;AAGD,UAAM,UAAU,IAAIG,aAAY;AAChC,UAAM,iBAAiB,IAAI,eAAe;AAAA,MACxC,MAAM,MAAM,YAAY;AACtB,cAAM,mBAAqC;AAAA,UACzC;AAAA,UACA;AAAA,UACA,YAAY;AAAA,UACZ,uBAAuB;AAAA,UACvB,WAAW;AAAA,QACb;AAGA,cAAM,iBAAsC,CAAC;AAC7C,eAAO,OAAO,aAAa,EAAE,QAAQ,CAAC,gBAAqB;AACzD,iBAAO,OAAO,gBAAgB,WAAW;AAAA,QAC3C,CAAC;AAGD,cAAM,wBAAwB;AAAA,UAC5B;AAAA,UACA;AAAA,QACF;AAGA,cAAM,iBAAiB,IAAI,MAAM;AAAA,UAC/B,MAAM,MAAM;AAAA,UACZ,cAAc,MAAM;AAAA,UACpB,OAAO,MAAM;AAAA,UACb,OACE,OAAO,KAAK,qBAAqB,EAAE,SAAS,IACxC,wBACA;AAAA,QACR,CAAC;AAGD,yBAAiB,uBAAuB,OAAO,YAAY;AAEzD,gBAAM,qBAAqB;AAAA,YACzB,SAAS,QAAQ;AAAA,YACjB,iBAAiB,QAAQ;AAAA,UAC3B;AAGA,cAAI,iBAAiB,cAAc,iBAAiB,SAAS;AAC3D,6BAAiB,WAAW;AAAA,cAC1B,iBAAiB,QAAQ;AAAA,gBACvB,SAAS,KAAK,UAAU;AAAA,kBACtB,MAAM;AAAA,kBACN,WAAW,QAAQ;AAAA,kBACnB,SAAS,mBAAmB;AAAA,kBAC5B,QAAQ,mBAAmB;AAAA,kBAC3B,WAAW,oBAAI,KAAK;AAAA,gBACtB,CAAC,CAAC;AAAA;AAAA;AAAA,cACJ;AAAA,YACF;AAAA,UACF;AAGA,iBAAO,IAAI,QAA6B,CAAC,SAAS,WAAW;AAC3D,YAAAH,qBAAoB,IAAI,QAAQ,WAAW,EAAE,SAAS,OAAO,CAAC;AAG9D,uBAAW,MAAM;AACf,kBAAIA,qBAAoB,IAAI,QAAQ,SAAS,GAAG;AAC9C,gBAAAA,qBAAoB,OAAO,QAAQ,SAAS;AAC5C,uBAAO,IAAI,MAAM,qBAAqB,CAAC;AAAA,cACzC;AAAA,YACF,GAAG,mBAAmB;AAAA,UACxB,CAAC;AAAA,QACH,CAAC;AAED,YAAI;AACF,gBAAM;AAAA,YACJ;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,YACA;AAAA,UACF;AAAA,QACF,SAAS,OAAO;AACd,qBAAW;AAAA,YACT,QAAQ;AAAA,cACN,SAAS,KAAK,UAAU;AAAA,gBACtB,MAAM;AAAA,gBACN,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,cAClD,CAAC,CAAC;AAAA;AAAA;AAAA,YACJ;AAAA,UACF;AAAA,QACF,UAAE;AAEA,2BAAiB,yBAAyB;AAC1C,qBAAW,MAAM;AAAA,QACnB;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,IAAI,SAAS,gBAAgB;AAAA,MAClC,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,QACjB,YAAY;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH,SAAS,OAAO;AACd,YAAQ,MAAM,iCAAiC,KAAK;AAGpD,qBAAiB,yBAAyB;AAE1C,WAAO,EAAE;AAAA,MACP;AAAA,QACE,SAAS;AAAA,QACT,OAAO,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAClD;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAED,IAAO,eAAQ;;;AEnrBf,SAAS,QAAAI,aAAY;AACrB,SAAS,mBAAAC,wBAAuB;AAChC,SAAS,gBAAAC,qBAAoB;AAC7B,SAAS,gBAAAC,qBAAoB;AAG7B,SAAS,SAAAC,cAAa;;;ACNtB,SAAoC,iBAAiB;AAqB9C,SAAS,qBAAqB,cAAqC;AACxE,MAAI,CAAC,cAAc;AACjB,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAGA,QAAM,SAAS,EAAE,GAAG,aAAa;AAGjC,MAAI,OAAO,KAAK;AACd,QAAI;AAEF,UAAI,OAAO,OAAO,QAAQ,UAAU;AAClC,cAAM,SAAS,IAAI,IAAI,OAAO,GAAG;AACjC,eAAO,SAAS;AAChB,eAAO,OAAO;AACd,eAAO,MAAM;AAAA,MACf,WAAW,OAAO,OAAO,QAAQ,YAAY,CAAC,OAAO,IAAI,MAAM;AAC7D,eAAO;AAAA,UACL,SAAS;AAAA,UACT,OAAO;AAAA,YACL,SAAS;AAAA,YACT,QAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAGA,UAAI,OAAO,OAAO,cAAc;AAC9B,cAAM,cAAc;AAAA,UAClB,eAAe,UAAU,OAAO,MAAM,YAAY;AAAA,UAClD,GAAI,OAAO,aAAa,WAAW,CAAC;AAAA,QACtC;AAEA,eAAO,cAAc;AAAA,UACnB,GAAG,OAAO;AAAA,UACV,SAAS;AAAA,QACX;AAGA,eAAO,kBAAkB;AAAA,UACvB,MAAM,OAA+B,MAAoB;AACvD,kBAAM,UAAU,IAAI,QAAQ,MAAM,WAAW,CAAC,CAAC;AAG/C,oBAAQ;AAAA,cACN;AAAA,cACA,UAAU,OAAO,MAAO,YAAY;AAAA,YACtC;AAGA,gBAAI,OAAO,aAAa,SAAS;AAC/B,oBAAM,iBAAiB,IAAI,QAAQ,OAAO,YAAY,OAAO;AAC7D,6BAAe,QAAQ,CAAC,OAAO,QAAQ;AACrC,oBAAI,IAAI,YAAY,MAAM,iBAAiB;AACzC,0BAAQ,IAAI,KAAK,KAAK;AAAA,gBACxB;AAAA,cACF,CAAC;AAAA,YACH;AAEA,mBAAO,MAAM,OAAO;AAAA,cAClB,GAAG;AAAA,cACH;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF,WAAW,OAAO,aAAa,SAAS;AAEtC,eAAO,kBAAkB;AAAA,UACvB,MAAM,OAA+B,MAAoB;AACvD,kBAAM,UAAU,IAAI,QAAQ,MAAM,WAAW,CAAC,CAAC;AAG/C,kBAAM,iBAAiB,IAAI,QAAQ,OAAO,YAAY,OAAO;AAC7D,2BAAe,QAAQ,CAAC,OAAO,QAAQ;AACrC,sBAAQ,IAAI,KAAK,KAAK;AAAA,YACxB,CAAC;AAED,mBAAO,MAAM,OAAO;AAAA,cAClB,GAAG;AAAA,cACH;AAAA,YACF,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF,SAAS,OAAO;AACd,aAAO;AAAA,QACL,SAAS;AAAA,QACT,OAAO;AAAA,UACL,SAAS,uBAAuB,KAAK;AAAA,UACrC,QAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,EACF;AACF;AAuBA,SAAS,uBAAuB,YAA4B;AAE1D,QAAM,iBAAiB,0BAA0B,UAAU;AAC3D,QAAM,YAAY,KAAK,IAAI,EAAE,SAAS,EAAE;AACxC,QAAM,SAAS,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC;AACxD,SAAO,GAAG,cAAc,IAAI,SAAS,IAAI,MAAM;AACjD;AAEO,IAAM,gCAAgC,CAC3C,kBAC6B;AAC7B,MAAI,CAAC,iBAAiB,OAAO,KAAK,aAAa,EAAE,WAAW,GAAG;AAC7D,WAAO;AAAA,MACL,SAAS;AAAA,MACT,OAAO;AAAA,QACL,SAAS;AAAA,QACT,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAEA,QAAM,eAA0D,CAAC;AACjE,QAAM,oBAA4C,CAAC;AACnD,QAAM,SAAiC,CAAC;AACxC,MAAI,YAAY;AAGhB,aAAW,CAAC,YAAY,YAAY,KAAK,OAAO,QAAQ,aAAa,GAAG;AACtE,UAAM,mBAAmB,qBAAqB,YAAY;AAE1D,QAAI,iBAAiB,WAAW,iBAAiB,QAAQ;AAEvD,YAAM,WAAW,uBAAuB,UAAU;AAClD,mBAAa,QAAQ,IAAI,iBAAiB;AAC1C,wBAAkB,QAAQ,IAAI;AAAA,IAChC,OAAO;AACL,kBAAY;AACZ,UAAI,eAAe;AACnB,UAAI,iBAAiB,OAAO;AAC1B,uBAAe,iBAAiB,MAAM;AAAA,MACxC;AAEA,aAAO,UAAU,IAAI;AAAA,IACvB;AAAA,EACF;AAGA,MAAI,CAAC,WAAW;AACd,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGA,MAAI,OAAO,KAAK,YAAY,EAAE,SAAS,GAAG;AACxC,WAAO;AAAA,MACL,SAAS;AAAA,MACT;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAGA,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA,OAAO;AAAA,MACL,SAAS;AAAA,MACT,QAAQ;AAAA,IACV;AAAA,EACF;AACF;AAEO,SAAS,uCACd,eACW;AAEX,QAAM,oBAAoB,IAAI,UAAU;AAAA,IACtC,IAAI,QAAQ,KAAK,IAAI,CAAC;AAAA,IACtB,SAAS;AAAA,EACX,CAAC;AAGD,QAAM,mBAAmB,kBAAkB,SAAS,KAAK,iBAAiB;AAC1E,oBAAkB,WAAW,YAAY;AACvC,UAAMC,SAAQ,MAAM,iBAAiB;AACrC,UAAM,aAAkC,CAAC;AAEzC,eAAW,CAAC,UAAU,UAAU,KAAK,OAAO,QAAQA,MAAK,GAAG;AAE1D,YAAM,QAAQ,SAAS,MAAM,GAAG;AAChC,UAAI,MAAM,UAAU,KAAK,MAAM,CAAC,MAAM,MAAM,CAAC,GAAG;AAE9C,cAAM,YAAY,MAAM,MAAM,CAAC,EAAE,KAAK,GAAG;AACzC,mBAAW,SAAS,IAAI;AAAA,MAC1B,OAAO;AACL,mBAAW,QAAQ,IAAI;AAAA,MACzB;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEO,SAAS,0BAA0B,YAA4B;AAEpE,SAAO,WACJ,YAAY,EACZ,QAAQ,YAAY,GAAG,EACvB,QAAQ,eAAe,EAAE;AAC9B;;;AD7PA,IAAM,QAAQ,IAAIC,MAAK;AAEvB,IAAO,gBAAQ;AAGf,MAAM,KAAK,YAAY,OAAO,MAAM;AAClC,QAAM,UAAU,IAAI,YAAY;AAChC,MAAI;AAyBF,QAASC,eAAT,SAAqB,OAAwB;AAC3C,cAAQ,MAAM,UAAU;AAAA,QACtB,KAAK;AACH,iBAAOC,iBAAgB;AAAA,YACrB,QACE,iBAAiB,aAAa,QAAQ,IAAI,qBAAqB;AAAA,UACnE,CAAC,EAAE,MAAM,EAAE;AAAA,QACb,KAAK;AACH,iBAAOC,cAAa;AAAA,YAClB,QAAQ,iBAAiB,UAAU,QAAQ,IAAI,kBAAkB;AAAA,UACnE,CAAC,EAAE,MAAM,EAAE;AAAA,QACb,KAAK;AACH,iBAAOA,cAAa;AAAA,YAClB,QACE,iBAAiB,YAAY,QAAQ,IAAI,oBAAoB;AAAA,YAC/D,SAAS;AAAA,UACX,CAAC,EAAE,MAAM,EAAE;AAAA,QACb,KAAK;AACH,iBAAOC,cAAa;AAAA,YAClB,SACE,iBACA,QAAQ,IAAI,mBACZ;AAAA,UACJ,CAAC,EAAE,MAAM,IAAI,EAAE,mBAAmB,KAAK,CAAC;AAAA,QAC1C;AACE,gBAAM,IAAI,MAAM,yBAAyB,MAAM,QAAQ,EAAE;AAAA,MAC7D;AAAA,IACF;AA3BS,sBAAAH;AAxBT,UAAM,OAAO,MAAM,EAAE,IAAI,KAAK;AAC9B,UAAM,aAAc,MAAM,SAAS,CAAC;AAQpC,UAAM,aAAc,MAAM,cAAc,CAAC;AAIzC,UAAM,kBAAkB,MAAM,mBAAmB,CAAC;AAClD,UAAM,gBAAoC,MAAM;AAChD,UAAM,iBAAyB,KAAK;AAAA,MAClC;AAAA,MACA,KAAK,IAAI,GAAG,MAAM,eAAe,CAAC;AAAA,IACpC;AAEA,QAAI,CAAC,MAAM,QAAQ,UAAU,KAAK,WAAW,WAAW,GAAG;AACzD,aAAO,EAAE,KAAK,EAAE,SAAS,OAAO,OAAO,oBAAoB,GAAG,GAAG;AAAA,IACnE;AA+BA,UAAM,iBAAiB,IAAI,eAAe;AAAA,MACxC,MAAM,MAAM,YAAY;AACtB,YAAI,SAAS;AACb,YAAI,QAAQ;AACZ,YAAI,SAAS;AAEb,cAAM,UAAU,YAAY;AAC1B,cAAI,SAAS,WAAW,QAAQ;AAC9B,gBAAI,WAAW,GAAG;AAEhB,yBAAW;AAAA,gBACT,QAAQ;AAAA,kBACN,SAAS,KAAK,UAAU,EAAE,MAAM,gBAAgB,QAAQ,CAAC,OAAO,CAAC,CAAC;AAAA;AAAA;AAAA,gBACpE;AAAA,cACF;AACA,yBAAW,QAAQ,QAAQ,OAAO;AAAA;AAAA,CAAkB,CAAC;AACrD,yBAAW,MAAM;AAAA,YACnB;AACA;AAAA,UACF;AACA,gBAAM,OAAO,WAAW,OAAO;AAC/B;AACA,WAAC,YAAY;AACX,kBAAM,cAAc,oBAAI,IAAY;AACpC,kBAAM,cAAc,IAAI,IAAY,KAAK,iBAAiB,CAAC,CAAC;AAC5D,gBAAI,OAAO;AACX,gBAAI,SAA2B;AAC/B,gBAAI;AAEF,kBAAI,gBAA2D,CAAC;AAChE,kBAAI,KAAK,mBAAmB,KAAK,gBAAgB,SAAS,GAAG;AAC3D,2BAAW,QAAQ,KAAK,iBAAiB;AACvC,sBAAI,WAAW,IAAI,EAAG,eAAc,IAAI,IAAI,WAAW,IAAI;AAAA,gBAC7D;AAAA,cACF,OAAO;AACL,2BAAW,CAAC,MAAM,GAAG,KAAK,OAAO,QAAQ,UAAU,GAAG;AACpD,gCAAc,IAAI,IAAI;AAAA,gBACxB;AAAA,cACF;AAGA,oBAAM,aAAa,8BAA8B,aAAa;AAC9D,kBAAI,eAA0D,CAAC;AAC/D,kBAAI,WAAW,WAAW,WAAW,cAAc;AACjD,+BAAe,WAAW;AAAA,cAC5B,WACE,WAAW,gBACX,OAAO,KAAK,WAAW,YAAY,EAAE,SAAS,GAC9C;AACA,+BAAe,WAAW;AAAA,cAC5B,OAAO;AACL,sBAAM,IAAI,MAAM,sCAAsC;AAAA,cACxD;AAEA,uBAAS,uCAAuC,YAAY;AAC5D,oBAAM,QAAQA,aAAY,KAAK,KAAK;AACpC,oBAAM,QAAQ,IAAII,OAAM;AAAA,gBACtB,MAAM,aAAa,KAAK,EAAE;AAAA,gBAC1B,cACE;AAAA,gBACF;AAAA,cACF,CAAC;AACD,oBAAM,WAAW,MAAM,OAAO,YAAY;AAC1C,oBAAM,SAAS,MAAM,MAAM;AAAA,gBACzB,CAAC,EAAE,MAAM,QAAQ,SAAS,KAAK,UAAU,GAAG,CAAC;AAAA,gBAC7C;AAAA,kBACE,UAAU;AAAA,kBACV;AAAA,kBACA,cAAc,CAAC,EAAE,MAAM,WAAW,YAAY,MAAM;AAClD,4BAAQ;AAER,qBAAC,aAAa,CAAC,GAAG,QAAQ,CAACC,OAAW;AACpC,4BAAM,WAAWA,IAAG,QAAQA,IAAG;AAC/B,0BAAI,UAAU;AACZ,oCAAY,IAAI,QAAQ;AAAA,sBAC1B;AAAA,oBACF,CAAC;AACD,+BAAW;AAAA,sBACT,QAAQ;AAAA,wBACN,SAAS,KAAK,UAAU;AAAA,0BACtB,MAAM;AAAA,0BACN,QAAQ,KAAK;AAAA,0BACb;AAAA,0BACA;AAAA,0BACA;AAAA,0BACA;AAAA,wBACF,CAAC,CAAC;AAAA;AAAA;AAAA,sBACJ;AAAA,oBACF;AAAA,kBACF;AAAA,gBACF;AAAA,cACF;AAEA,+BAAiB,KAAK,OAAO,YAAY;AAAA,cAEzC;AACA,oBAAM,SAAS,MAAM,KAAK,WAAW;AACrC,oBAAM,UAAU,MAAM,KAAK,WAAW,EAAE;AAAA,gBACtC,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC;AAAA,cAC3B;AACA,oBAAM,aAAa,OAAO,OAAO,CAAC,MAAM,CAAC,YAAY,IAAI,CAAC,CAAC;AAC3D,oBAAM,SAAS,QAAQ,WAAW,KAAK,WAAW,WAAW;AAC7D,kBAAI,CAAC,OAAQ,UAAS;AACtB,yBAAW;AAAA,gBACT,QAAQ;AAAA,kBACN,SAAS,KAAK,UAAU,EAAE,MAAM,UAAU,QAAQ,KAAK,IAAI,QAAQ,aAAa,QAAQ,cAAc,SAAS,iBAAiB,WAAW,CAAC,CAAC;AAAA;AAAA;AAAA,gBAC/I;AAAA,cACF;AAAA,YACF,SAAS,KAAK;AACZ,uBAAS;AACT,yBAAW;AAAA,gBACT,QAAQ;AAAA,kBACN,SAAS,KAAK,UAAU,EAAE,MAAM,UAAU,QAAQ,KAAK,IAAI,QAAQ,OAAO,OAAQ,KAAe,QAAQ,CAAC,CAAC;AAAA;AAAA;AAAA,gBAC7G;AAAA,cACF;AAAA,YACF,UAAE;AACA,kBAAI;AACF,sBAAM,QAAQ,WAAW;AAAA,cAC3B,QAAQ;AAAA,cAAC;AACT;AACA,sBAAQ;AAAA,YACV;AAAA,UACF,GAAG;AAAA,QACL;AAEA,iBAAS,IAAI,GAAG,IAAI,KAAK,IAAI,gBAAgB,WAAW,MAAM,GAAG,KAAK;AACpE,kBAAQ;AAAA,QACV;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO,IAAI,SAAS,gBAAgB;AAAA,MAClC,SAAS;AAAA,QACP,gBAAgB;AAAA,QAChB,iBAAiB;AAAA,QACjB,YAAY;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH,SAAS,KAAK;AACZ,WAAO,EAAE;AAAA,MACP,EAAE,SAAS,OAAO,OAAQ,KAAe,WAAW,gBAAgB;AAAA,MACpE;AAAA,IACF;AAAA,EACF;AACF,CAAC;;;AEzND,SAAS,QAAAC,aAAY;AAGrB,IAAM,QAAQ,IAAIA,MAAK;AAMvB,MAAM,IAAI,aAAa,OAAO,MAAM;AAClC,MAAI;AACF,UAAM,MAAM,EAAE,IAAI,MAAM,KAAK;AAE7B,QAAI,CAAC,KAAK;AACR,aAAO,EAAE,KAAK,EAAE,OAAO,wBAAwB,GAAG,GAAG;AAAA,IACvD;AAGA,QAAI;AACJ,QAAI;AACF,oBAAc,IAAI,IAAI,GAAG;AACzB,UAAI,YAAY,aAAa,UAAU;AACrC,eAAO,EAAE,KAAK,EAAE,OAAO,8BAA8B,GAAG,GAAG;AAAA,MAC7D;AAAA,IACF,SAAS,OAAO;AACd,aAAO,EAAE,KAAK,EAAE,OAAO,qBAAqB,GAAG,GAAG;AAAA,IACpD;AAGA,UAAM,WAAW,MAAM,MAAM,YAAY,SAAS,GAAG;AAAA,MACnD,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,QAAQ;AAAA,QACR,cAAc;AAAA,MAChB;AAAA,IACF,CAAC;AAED,QAAI,CAAC,SAAS,IAAI;AAChB,aAAO,EAAE;AAAA,QACP;AAAA,UACE,OAAO,mCAAmC,SAAS,MAAM,IAAI,SAAS,UAAU;AAAA,QAClF;AAAA,QACA,SAAS;AAAA,MACX;AAAA,IACF;AAEA,UAAM,WAAY,MAAM,SAAS,KAAK;AAGtC,WAAO,EAAE,KAAK,QAAQ;AAAA,EACxB,SAAS,OAAO;AACd,YAAQ,MAAM,+BAA+B,KAAK;AAClD,WAAO,EAAE;AAAA,MACP;AAAA,QACE,OACE,iBAAiB,QAAQ,MAAM,UAAU;AAAA,MAC7C;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF,CAAC;AAED,IAAO,gBAAQ;;;AVpDf,IAAM,MAAM,IAAIC,MAAK;AAGrB,IAAI,IAAI,WAAW,CAAC,MAAM;AACxB,SAAO,EAAE,KAAK;AAAA,IACZ,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,EACpC,CAAC;AACH,CAAC;AAGD,IAAI,MAAM,SAAS,YAAI;AAGvB,IAAI,MAAM,YAAY,eAAO;AAG7B,IAAI,MAAM,YAAY,eAAO;AAG7B,IAAI,MAAM,UAAU,aAAK;AAGzB,IAAI,MAAM,UAAU,aAAK;AAGzB,IAAI,MAAM,cAAc,iBAAS;AAGjC,IAAI,MAAM,YAAY,eAAO;AAG7B,IAAI,MAAM,UAAU,aAAK;AAEzB,IAAO,cAAQ;;;AW7Cf,SAAS,aAAAC,kBAA4C;AAmErD,SAAS,uBAAuB,UAAkB;AAEhD,QAAM,iBAAiB,SACpB,YAAY,EACZ,QAAQ,YAAY,GAAG,EACvB,QAAQ,eAAe,EAAE;AAC5B,QAAM,YAAY,KAAK,IAAI,EAAE,SAAS,EAAE;AACxC,QAAM,SAAS,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,UAAU,GAAG,CAAC;AACxD,SAAO,GAAG,cAAc,IAAI,SAAS,IAAI,MAAM;AACjD;AAEA,IAAM,sBAAN,MAA0B;AAAA,EAChB,aAAqC,oBAAI,IAAI;AAAA,EAC7C,WAA0C,oBAAI,IAAI;AAAA,EAClD,UAAkD,oBAAI,IAAI;AAAA;AAAA,EAG1D,kBAAuC,oBAAI,IAAI;AAAA;AAAA,EAG/C,qBAAiD,oBAAI,IAAI;AAAA,EAEzD,eAA4C,oBAAI,IAAI;AAAA,EACpD,mBAAoD,oBAAI,IAAI;AAAA,EAC5D,iBAAgD,oBAAI,IAAI;AAAA;AAAA,EAGxD,sBAMJ,oBAAI,IAAI;AAAA;AAAA,EAGJ;AAAA;AAAA,EAOA,kBAAkB,YAAwC;AAChE,WAAO,KAAK,gBAAgB,IAAI,UAAU;AAAA,EAC5C;AAAA;AAAA,EAGA,mBAAmB,YAAwC;AACzD,WAAO,KAAK,gBAAgB,IAAI,UAAU;AAAA,EAC5C;AAAA;AAAA,EAGA,qBAAqB,gBAA4C;AAC/D,eAAW,CAAC,cAAc,GAAG,KAAK,KAAK,gBAAgB,QAAQ,GAAG;AAChE,UAAI,QAAQ,eAAgB,QAAO;AAAA,IACrC;AACA,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,sBAAsB,WAA+B;AACnD,WAAO,UAAU,IAAI,CAAC,OAAO,KAAK,qBAAqB,EAAE,KAAK,EAAE;AAAA,EAClE;AAAA,EAEA,MAAM,gBAAgB,UAAkB,cAAkC;AAExE,UAAM,UAAU,KAAK,mBAAmB,IAAI,QAAQ;AACpD,QAAI,SAAS;AACX,YAAM;AACN;AAAA,IACF;AAEA,UAAM,kBAAkB,YAAY;AAElC,UAAI,KAAK,KAAK,gBAAgB,IAAI,QAAQ;AAC1C,UAAI,CAAC,IAAI;AACP,aAAK,uBAAuB,QAAQ;AACpC,aAAK,gBAAgB,IAAI,UAAU,EAAE;AAAA,MACvC;AAGA,UAAI,KAAK,WAAW,IAAI,EAAE,EAAG;AAG7B,YAAM,aAAa,qBAAqB,YAAY;AACpD,UAAI,CAAC,WAAW,SAAS;AACvB,aAAK,SAAS,IAAI,IAAI,OAAO;AAC7B,cAAM,IAAI,MAAM,WAAW,MAAO,OAAO;AAAA,MAC3C;AAEA,WAAK,QAAQ,IAAI,IAAI,WAAW,MAAO;AACvC,WAAK,SAAS,IAAI,IAAI,YAAY;AAElC,YAAM,SAAS,IAAIC,WAAU;AAAA,QAC3B,IAAI,UAAU,EAAE;AAAA,QAChB,SAAS,EAAE,CAAC,EAAE,GAAG,WAAW,OAAQ;AAAA,MACtC,CAAC;AAED,UAAI;AAEF,cAAM,OAAO,SAAS;AACtB,aAAK,WAAW,IAAI,IAAI,MAAM;AAC9B,aAAK,SAAS,IAAI,IAAI,WAAW;AAGjC,YAAI,OAAO,aAAa,WAAW;AACjC,iBAAO,YAAY;AAAA,YACjB;AAAA,YACA,OAAO,uBAA2C;AAChD,qBAAO,MAAM,KAAK,yBAAyB,kBAAkB;AAAA,YAC/D;AAAA,UACF;AAAA,QACF;AAEA,cAAM,KAAK,wBAAwB,EAAE;AAAA,MACvC,SAAS,KAAK;AACZ,aAAK,SAAS,IAAI,IAAI,OAAO;AAC7B,YAAI;AACF,gBAAM,OAAO,WAAW;AAAA,QAC1B,QAAQ;AAAA,QAAC;AACT,aAAK,WAAW,OAAO,EAAE;AACzB,cAAM;AAAA,MACR;AAAA,IACF,GAAG,EAAE,QAAQ,MAAM;AACjB,WAAK,mBAAmB,OAAO,QAAQ;AAAA,IACzC,CAAC;AAED,SAAK,mBAAmB,IAAI,UAAU,cAAc;AACpD,UAAM;AAAA,EACR;AAAA,EAEA,MAAM,qBAAqB,UAAiC;AAC1D,UAAM,KAAK,KAAK,kBAAkB,QAAQ;AAC1C,QAAI,CAAC,GAAI;AAET,UAAM,SAAS,KAAK,WAAW,IAAI,EAAE;AACrC,QAAI,QAAQ;AACV,UAAI;AACF,cAAM,OAAO,WAAW;AAAA,MAC1B,QAAQ;AAAA,MAAC;AAAA,IACX;AACA,SAAK,WAAW,OAAO,EAAE;AACzB,SAAK,SAAS,IAAI,IAAI,cAAc;AACpC,SAAK,gBAAgB,OAAO,QAAQ;AAGpC,eAAW,OAAO,MAAM,KAAK,KAAK,aAAa,KAAK,CAAC,GAAG;AACtD,YAAM,OAAO,KAAK,aAAa,IAAI,GAAG;AACtC,UAAI,KAAK,aAAa,GAAI,MAAK,aAAa,OAAO,GAAG;AAAA,IACxD;AACA,eAAW,OAAO,MAAM,KAAK,KAAK,iBAAiB,KAAK,CAAC,GAAG;AAC1D,YAAM,OAAO,KAAK,iBAAiB,IAAI,GAAG;AAC1C,UAAI,KAAK,aAAa,GAAI,MAAK,iBAAiB,OAAO,GAAG;AAAA,IAC5D;AACA,eAAW,OAAO,MAAM,KAAK,KAAK,eAAe,KAAK,CAAC,GAAG;AACxD,YAAM,OAAO,KAAK,eAAe,IAAI,GAAG;AACxC,UAAI,KAAK,aAAa,GAAI,MAAK,eAAe,OAAO,GAAG;AAAA,IAC1D;AAAA,EACF;AAAA,EAEA,oBAAoB,UAAoC;AACtD,UAAM,KAAK,KAAK,kBAAkB,QAAQ;AAC1C,WAAO,KAAK,KAAK,SAAS,IAAI,EAAE,KAAK,iBAAiB;AAAA,EACxD;AAAA,EAEA,sBAGE;AACA,UAAMC,WACJ,CAAC;AAGH,eAAW,CAAC,cAAc,QAAQ,KAAK,KAAK,gBAAgB,QAAQ,GAAG;AACrE,MAAAA,SAAQ,YAAY,IAAI;AAAA,QACtB,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK;AAAA,QACvC,QAAQ,KAAK,QAAQ,IAAI,QAAQ;AAAA,MACnC;AAAA,IACF;AAEA,WAAOA;AAAA,EACT;AAAA,EAEA,MAAM,uBAAsC;AAC1C,UAAM,YAAY,MAAM,KAAK,KAAK,WAAW,KAAK,CAAC;AACnD,UAAM,QAAQ,IAAI,UAAU,IAAI,CAAC,OAAO,KAAK,wBAAwB,EAAE,CAAC,CAAC;AAAA,EAC3E;AAAA,EAEA,MAAc,wBAAwB,UAAiC;AAErE,UAAM,SAAS,KAAK,WAAW,IAAI,QAAQ;AAC3C,QAAI,CAAC,OAAQ;AAGb,UAAM,WAAW,MAAM,OAAO,YAAY;AAC1C,UAAM,iBAAsC,CAAC;AAC7C,WAAO,OAAO,QAAQ,EAAE,QAAQ,CAAC,gBAAqB;AACpD,aAAO,OAAO,gBAAgB,WAAW;AAAA,IAC3C,CAAC;AAED,eAAW,CAAC,MAAM,IAAI,KAAK,OAAO,QAAa,cAAc,GAAG;AAC9D,WAAK,aAAa,IAAI,GAAG,QAAQ,IAAI,IAAI,IAAI;AAAA,QAC3C;AAAA,QACA,aAAa,KAAK;AAAA,QAClB,aAAa,KAAK;AAAA,QAClB,cAAe,KAAa;AAAA,QAC5B;AAAA,MACF,CAAC;AAAA,IACH;AAGA,QAAI;AACF,YAAM,MAAM,MAAM,OAAO,UAAU,KAAK;AACxC,iBAAW,CAAC,EAAE,IAAI,KAAK,OAAO,QAAa,GAAG,GAAG;AAC/C,mBAAW,KAAK,MAAe;AAC7B,eAAK,iBAAiB,IAAI,GAAG,QAAQ,IAAI,EAAE,GAAG,IAAI;AAAA,YAChD,KAAK,EAAE;AAAA,YACP,MAAM,EAAE;AAAA,YACR,aAAa,EAAE;AAAA,YACf,UAAU,EAAE;AAAA,YACZ;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAAC;AAGT,QAAI;AACF,YAAMC,WAAU,MAAM,OAAO,QAAQ,KAAK;AAC1C,iBAAW,CAAC,EAAE,IAAI,KAAK,OAAO,QAAaA,QAAO,GAAG;AACnD,mBAAW,KAAK,MAAe;AAC7B,eAAK,eAAe,IAAI,GAAG,QAAQ,IAAI,EAAE,IAAI,IAAI;AAAA,YAC/C,MAAM,EAAE;AAAA,YACR,aAAa,EAAE;AAAA,YACf,WAAW,EAAE;AAAA,YACb;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAAC;AAAA,EACX;AAAA,EAEA,oBAAsC;AACpC,WAAO,MAAM,KAAK,KAAK,aAAa,OAAO,CAAC;AAAA,EAC9C;AAAA,EAEA,MAAM,qBAAqB,UAAgD;AACzE,UAAM,KAAK,KAAK,kBAAkB,QAAQ;AAC1C,QAAI,CAAC,IAAI;AACP,YAAM,IAAI,MAAM,uCAAuC,QAAQ,EAAE;AAAA,IACnE;AACA,UAAM,SAAS,KAAK,WAAW,IAAI,EAAE;AACrC,QAAI,CAAC,QAAQ;AACX,YAAM,IAAI,MAAM,uCAAuC,QAAQ,EAAE;AAAA,IACnE;AAGA,UAAM,WAAW,MAAM,OAAO,YAAY;AAG1C,UAAM,iBAAsC,CAAC;AAC7C,WAAO,OAAO,QAAQ,EAAE,QAAQ,CAAC,gBAAqB;AACpD,aAAO,OAAO,gBAAgB,WAAW;AAAA,IAC3C,CAAC;AAED,WAAO;AAAA,EACT;AAAA,EACA,wBAA8C;AAC5C,WAAO,MAAM,KAAK,KAAK,iBAAiB,OAAO,CAAC;AAAA,EAClD;AAAA,EAEA,sBAAsB,UAAwC;AAC5D,UAAM,KAAK,KAAK,kBAAkB,QAAQ;AAC1C,QAAI,CAAC,GAAI,QAAO,CAAC;AACjB,WAAO,MAAM,KAAK,KAAK,iBAAiB,OAAO,CAAC,EAAE;AAAA,MAChD,CAAC,MAAM,EAAE,aAAa;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,sBAA0C;AACxC,WAAO,MAAM,KAAK,KAAK,eAAe,OAAO,CAAC;AAAA,EAChD;AAAA,EAEA,oBAAoB,UAAsC;AACxD,UAAM,KAAK,KAAK,kBAAkB,QAAQ;AAC1C,QAAI,CAAC,GAAI,QAAO,CAAC;AACjB,WAAO,MAAM,KAAK,KAAK,eAAe,OAAO,CAAC,EAAE;AAAA,MAC9C,CAAC,MAAM,EAAE,aAAa;AAAA,IACxB;AAAA,EACF;AAAA,EAEA,MAAM,kBACJ,UACA,aAAkC,CAAC,GACd;AAErB,QAAI,WAAW;AACf,QAAI,OAAO;AAEX,QAAI,SAAS,SAAS,GAAG,GAAG;AAC1B,YAAM,CAAC,KAAK,CAAC,IAAI,SAAS,MAAM,KAAK,CAAC;AAEtC,YAAM,WAAW,KAAK,kBAAkB,GAAG;AAC3C,iBAAW,aAAa,KAAK,WAAW,IAAI,GAAG,IAAI,MAAM;AACzD,aAAO;AAAA,IACT,OAAO;AAEL,iBAAWC,SAAQ,KAAK,aAAa,OAAO,GAAG;AAC7C,YAAIA,MAAK,SAAS,UAAU;AAC1B,qBAAWA,MAAK;AAChB,iBAAO;AACP;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAGA,QAAI,CAAC,UAAU;AACb,iBAAW,CAAC,gBAAgBC,OAAM,KAAK,KAAK,WAAW,QAAQ,GAAG;AAChE,YAAI;AACF,gBAAMC,YAAW,MAAMD,QAAO,YAAY;AAE1C,gBAAME,kBAAsC,CAAC;AAC7C,iBAAO,OAAOD,SAAQ,EAAE,QAAQ,CAAC,gBAAqB;AACpD,mBAAO,OAAOC,iBAAgB,WAAW;AAAA,UAC3C,CAAC;AAED,cAAIA,gBAAe,QAAQ,GAAG;AAC5B,uBAAW;AACX,mBAAO;AACP;AAAA,UACF;AAAA,QACF,QAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,UAAU;AACb,YAAM,IAAI,MAAM,2CAA2C,QAAQ,EAAE;AAAA,IACvE;AAEA,UAAM,SAAS,KAAK,WAAW,IAAI,QAAQ;AAC3C,QAAI,CAAC;AACH,YAAM,IAAI,MAAM,uCAAuC,QAAQ,EAAE;AAGnE,UAAM,WAAW,MAAM,OAAO,YAAY;AAC1C,UAAM,iBAAsC,CAAC;AAC7C,WAAO,OAAO,QAAQ,EAAE,QAAQ,CAAC,gBAAqB;AACpD,aAAO,OAAO,gBAAgB,WAAW;AAAA,IAC3C,CAAC;AAED,UAAM,OAAO,eAAe,IAAI;AAChC,QAAI,CAAC;AACH,YAAM,IAAI,MAAM,SAAS,IAAI,0BAA0B,QAAQ,GAAG;AAIpE,UAAM,SAAe,KAAa;AAClC,UAAM,qBACJ,UACA,OAAO,WAAW,YACjB,OAAe,cAChB,OAAO,UAAU,eAAe;AAAA,MAC7B,OAAe;AAAA,MAChB;AAAA,IACF;AACF,UAAM,kBACJ,sBACC,UACC,MAAM,QAAS,OAAe,QAAQ,KACrC,OAAe,SAAS,SAAS,SAAS;AAE/C,UAAM,iBAAiB,EAAE,SAAS,cAAc,CAAC,EAAE;AACnD,UAAM,SAAS,cAAc,CAAC;AAC9B,UAAM,WAAW,kBACb,CAAC,gBAAgB,MAAM,IACvB,CAAC,QAAQ,cAAc;AAE3B,QAAI,YAAiB;AACrB,eAAWC,SAAQ,UAAU;AAC3B,UAAI;AACF,cAAM,SAAS,MAAM,KAAK,QAAQA,KAAI;AAGtC,YAAI,UAAU,OAAO,SAAS;AAC5B,gBAAM,YACJ,OAAO,WAAW,OAAO,QAAQ,CAAC,KAAK,OAAO,QAAQ,CAAC,EAAE,OACrD,OAAO,QAAQ,CAAC,EAAE,OAClB;AACN,gBAAM,IAAI,MAAM,SAAS;AAAA,QAC3B;AAEA,eAAO,EAAE,OAAO;AAAA,MAClB,SAAS,KAAU;AACjB,oBAAY;AAAA,MACd;AAAA,IACF;AACA,UAAM;AAAA,EACR;AAAA,EAEA,MAAM,YACJ,aACA,UAC0B;AAE1B,QAAI,MAAM;AAEV,UAAM,WAAW,KAAK,kBAAkB,QAAQ;AAChD,UAAM,mBACJ,aAAa,KAAK,WAAW,IAAI,QAAQ,IAAI,WAAW;AAE1D,QAAI,CAAC,kBAAkB;AACrB,YAAM,IAAI,MAAM,uCAAuC,QAAQ,EAAE;AAAA,IACnE;AAEA,UAAM,SAAS,KAAK,WAAW,IAAI,gBAAgB;AACnD,QAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,yBAAyB;AACtD,UAAM,UAAU,MAAM,OAAO,UAAU,KAAK,kBAAkB,GAAG;AACjE,WAAO,EAAE,UAAU,SAAS,YAAY,CAAC,EAAE;AAAA,EAC7C;AAAA,EAEA,MAAM,UACJ,YACA,UACAA,OACuB;AAEvB,UAAM,WAAW,KAAK,kBAAkB,QAAQ;AAChD,UAAM,mBACJ,aAAa,KAAK,WAAW,IAAI,QAAQ,IAAI,WAAW;AAE1D,QAAI,CAAC,kBAAkB;AACrB,YAAM,IAAI,MAAM,uCAAuC,QAAQ,EAAE;AAAA,IACnE;AAEA,UAAM,SAAS,KAAK,WAAW,IAAI,gBAAgB;AACnD,QAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,yBAAyB;AACtD,UAAM,UAAU,MAAM,OAAO,QAAQ,IAAI;AAAA,MACvC,YAAY;AAAA,MACZ,MAAM;AAAA,MACN,MAAMA,SAAQ,CAAC;AAAA,IACjB,CAAC;AACD,WAAO,EAAE,QAAQ;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,yBACZ,oBAC8B;AAC9B,UAAM,YAAY,UAAU,KAAK,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,SAAS,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC;AAGjF,WAAO,IAAI,QAA6B,CAAC,SAAS,WAAW;AAC3D,WAAK,oBAAoB,IAAI,WAAW,EAAE,SAAS,OAAO,CAAC;AAG3D,UAAI,KAAK,qBAAqB;AAC5B,aAAK,oBAAoB;AAAA,UACvB;AAAA,UACA,SAAS,mBAAmB;AAAA,UAC5B,QAAQ,mBAAmB;AAAA,QAC7B,CAAC,EACE,KAAK,OAAO,EACZ,MAAM,MAAM;AAAA,MACjB,OAAO;AAEL,cAAM,QAAQ,IAAI,MAAM,sBAAsB;AAC9C,QAAC,MAAc,qBAAqB;AAAA,UAClC;AAAA,UACA,SAAS,mBAAmB;AAAA,UAC5B,QAAQ,mBAAmB;AAAA,QAC7B;AACA,eAAO,KAAK;AAAA,MACd;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,qBACE,WACA,UACS;AACT,UAAM,UAAU,KAAK,oBAAoB,IAAI,SAAS;AACtD,QAAI,CAAC,SAAS;AACZ,aAAO;AAAA,IACT;AAEA,YAAQ,QAAQ,QAAQ;AACxB,SAAK,oBAAoB,OAAO,SAAS;AACzC,WAAO;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,yBAME;AACA,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKA,uBACE,UAKM;AACN,SAAK,sBAAsB;AAAA,EAC7B;AAAA;AAAA;AAAA;AAAA,EAKA,2BAAiC;AAC/B,SAAK,sBAAsB;AAAA,EAC7B;AACF;;;AlB9jBA,SAAS,OAAO,SAAiB,OAAgB;AAC/C,QAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,QAAM,YAAY,KAAK,IAAI,GAAG,MAAM,IAAI,CAAC,SAAS,KAAK,MAAM,CAAC;AAC9D,QAAM,QAAQ,YAAY;AAE1B,UAAQ,IAAI,WAAM,SAAI,OAAO,KAAK,IAAI,QAAG;AACzC,MAAI,OAAO;AACT,UAAM,eAAe,KAAK,OAAO,QAAQ,MAAM,SAAS,KAAK,CAAC;AAC9D,YAAQ;AAAA,MACN,WACE,IAAI,OAAO,YAAY,IACvB,QACA,IAAI,OAAO,QAAQ,MAAM,SAAS,YAAY,IAC9C;AAAA,IACJ;AACA,YAAQ,IAAI,WAAM,SAAI,OAAO,KAAK,IAAI,QAAG;AAAA,EAC3C;AAEA,QAAM,QAAQ,CAAC,SAAS;AACtB,UAAM,UAAU,QAAQ,KAAK,SAAS;AACtC,YAAQ,IAAI,YAAO,OAAO,IAAI,OAAO,OAAO,IAAI,SAAI;AAAA,EACtD,CAAC;AAED,UAAQ,IAAI,WAAM,SAAI,OAAO,KAAK,IAAI,QAAG;AAC3C;AAQA,SAAS,sBAAsB;AAC7B,QAAM,UAAU,QAAQ,IAAI;AAC5B,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,QAAQ,IAAI;AAC/B,QAAMC,QAAO,aAAa,KAAK,MAAM,UAAU,IAAI,CAAC;AAEpD,SAAO;AAAA,IACL;AAAA,IACA,MAAAA;AAAA,IACA,MAAM;AAAA;AAAA,EACR;AACF;AAGA,IAAI;AACF,UAAQ;AACV,QAAQ;AAAC;AAET,IAAM,MAAM,IAAIC,OAAK;AAGrB,IAAM,sBAAsB,IAAI,oBAAoB;AAGpD,IAAI,IAAI,KAAK,OAAO,GAAG,SAAS;AAC9B,IAAE,sBAAsB;AACxB,QAAM,KAAK;AACb,CAAC;AAGD,IAAI,IAAI,KAAK,OAAO,CAAC;AAErB,IAAM,aAAa,QAAQ,IAAI,QAAQ;AACvC,IAAM,cAAc;AAAA,EAClB,oBAAoB,UAAU;AAAA,EAC9B;AAAA;AACF;AAEA,IAAI;AAAA,EACF;AAAA,EACA,KAAK;AAAA,IACH,QAAQ;AAAA,IACR,aAAa;AAAA,EACf,CAAC;AACH;AAGA,IAAI,MAAM,YAAY,WAAS;AAG/B,IAAI,IAAI,WAAW,CAAC,MAAM;AACxB,SAAO,EAAE,KAAK,EAAE,QAAQ,MAAM,YAAW,oBAAI,KAAK,GAAE,YAAY,EAAE,CAAC;AACrE,CAAC;AAGD,IAAI,IAAI,uBAAuB,CAAC,MAAM;AACpC,QAAM,YAAY,oBAAoB;AACtC,SAAO,EAAE,KAAK,EAAE,QAAQ,UAAU,CAAC;AACrC,CAAC;AAGD,IAAI,QAAQ,IAAI,aAAa,cAAc;AAEzC,MAAI,IAAI,MAAM,YAAY,EAAE,MAAM,gBAAgB,CAAC,CAAC;AAGpD,MAAI,IAAI,KAAK,OAAO,MAAM;AACxB,UAAM,OAAO,EAAE,IAAI;AAEnB,QAAI,KAAK,WAAW,OAAO,GAAG;AAC5B,aAAO,EAAE,SAAS;AAAA,IACpB;AAEA,UAAM,YAAY,KAAK,QAAQ,IAAI,GAAG,QAAQ,UAAU,YAAY;AACpE,QAAI,cAAc,aAAa,WAAW,OAAO;AAGjD,UAAM,YAAY,oBAAoB;AACtC,QAAI,WAAW;AACb,YAAM,eAAe,mCAAmC,KAAK,UAAU,SAAS,CAAC;AACjF,oBAAc,YAAY,QAAQ,WAAW,GAAG,YAAY,SAAS;AAAA,IACvE;AAEA,WAAO,EAAE,KAAK,WAAW;AAAA,EAC3B,CAAC;AACH,OAAO;AAEL,MAAI,IAAI,KAAK,CAAC,MAAM;AAClB,WAAO,EAAE,KAAK;AAAA,MACZ,SAAS;AAAA,MACT,aAAa;AAAA,MACb,UAAU,oBAAoB,UAAU;AAAA,IAC1C,CAAC;AAAA,EACH,CAAC;AACH;AAEA,IAAM,OAAO,SAAS,QAAQ,IAAI,QAAQ,MAAM;AAGhD,OAAO,oBAAoB,IAAI,IAAI,8BAAuB;AAG1D,IAAM,SAAS,MAAM;AAAA,EACnB,OAAO,IAAI;AAAA,EACX;AAAA,EACA,UAAU;AAAA;AACZ,CAAC;AAGD,QAAQ,GAAG,UAAU,MAAM;AACzB,UAAQ,IAAI,yCAAkC;AAC9C,SAAO,MAAM;AACb,UAAQ,KAAK,CAAC;AAChB,CAAC;AAED,QAAQ,GAAG,WAAW,MAAM;AAC1B,UAAQ,IAAI,yCAAkC;AAC9C,SAAO,MAAM;AACb,UAAQ,KAAK,CAAC;AAChB,CAAC;AAED,IAAO,gBAAQ;","names":["env","args","args","env","path","onetime","SIGNALS","name","number","action","description","standard","forced","getRealtimeSignals","length","SIGRTMAX","SIGRTMIN","Array","from","getRealtimeSignal","value","index","name","number","action","description","standard","getSignals","realtimeSignals","signals","SIGNALS","map","normalizeSignal","name","number","defaultNumber","description","action","forced","standard","constantSignal","constants","supported","undefined","getSignalsByName","signals","reduce","getSignalByName","signalByNameMemo","name","number","description","supported","action","forced","standard","signalsByName","getSignalsByNumber","length","SIGRTMAX","signalsA","Array","from","value","getSignalByNumber","Object","assign","signal","findSignalByNumber","undefined","find","constants","signalA","signalsByNumber","require_signals","process","unload","emit","load","processReallyExit","processEmit","stream","args","args","env","args","execa","process","process","process","env","env","line","process","execa","process","Hono","Hono","Hono","Hono","mcpJamClientManager","Hono","TextEncoder","Hono","mcpJamClientManager","TextEncoder","requestId","response","Hono","Hono","Hono","Hono","mcpJamClientManager","args","Hono","TextEncoder","args","pendingElicitations","Hono","tools","TextEncoder","Hono","createAnthropic","createOpenAI","createOllama","Agent","tools","Hono","createModel","createAnthropic","createOpenAI","createOllama","Agent","c","Hono","Hono","MCPClient","MCPClient","servers","prompts","tool","client","toolsets","flattenedTools","args","args","Hono"]}
1
+ {"version":3,"sources":["../../server/index.ts","../../server/routes/mcp/index.ts","../../server/routes/mcp/connect.ts","../../server/routes/mcp/servers.ts","../../server/routes/mcp/tools.ts","../../server/routes/mcp/resources.ts","../../server/routes/mcp/prompts.ts","../../server/routes/mcp/chat.ts","../../client/src/lib/chat-utils.ts","../../server/routes/mcp/tests.ts","../../server/utils/mcp-utils.ts","../../server/routes/mcp/oauth.ts","../../server/services/mcpjam-client-manager.ts"],"sourcesContent":["import { serve } from \"@hono/node-server\";\nimport fixPath from \"fix-path\";\nimport { Hono } from \"hono\";\nimport { cors } from \"hono/cors\";\nimport { logger } from \"hono/logger\";\nimport { serveStatic } from \"@hono/node-server/serve-static\";\nimport { readFileSync } from \"fs\";\nimport { join } from \"path\";\n\n// ANSI color codes for console output\nconst colors = {\n reset: \"\\x1b[0m\",\n bright: \"\\x1b[1m\",\n dim: \"\\x1b[2m\",\n red: \"\\x1b[31m\",\n green: \"\\x1b[32m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n white: \"\\x1b[37m\",\n};\n\n// Utility function to create a boxed console output\nfunction logBox(content: string, title?: string) {\n const lines = content.split(\"\\n\");\n const maxLength = Math.max(...lines.map((line) => line.length));\n const width = maxLength + 4;\n\n console.log(\"┌\" + \"─\".repeat(width) + \"┐\");\n if (title) {\n const titlePadding = Math.floor((width - title.length - 2) / 2);\n console.log(\n \"│\" +\n \" \".repeat(titlePadding) +\n title +\n \" \".repeat(width - title.length - titlePadding) +\n \"│\",\n );\n console.log(\"├\" + \"─\".repeat(width) + \"┤\");\n }\n\n lines.forEach((line) => {\n const padding = width - line.length - 2;\n console.log(\"│ \" + line + \" \".repeat(padding) + \" │\");\n });\n\n console.log(\"└\" + \"─\".repeat(width) + \"┘\");\n}\n\n// Import routes and services\nimport mcpRoutes from \"./routes/mcp/index\";\nimport { MCPJamClientManager } from \"./services/mcpjam-client-manager\";\nimport \"./types/hono\"; // Type extensions\n\n// Utility function to extract MCP server config from environment variables\nfunction getMCPConfigFromEnv() {\n const command = process.env.MCP_SERVER_COMMAND;\n if (!command) {\n return null;\n }\n\n const argsString = process.env.MCP_SERVER_ARGS;\n const args = argsString ? JSON.parse(argsString) : [];\n\n return {\n command,\n args,\n name: \"CLI Server\", // Default name for CLI-provided servers\n };\n}\n\n// Ensure PATH is initialized from the user's shell so spawned processes can find binaries (e.g., npx)\ntry {\n fixPath();\n} catch {}\n\nconst app = new Hono();\n\n// Initialize centralized MCPJam Client Manager\nconst mcpJamClientManager = new MCPJamClientManager();\n\n// Middleware to inject client manager into context\napp.use(\"*\", async (c, next) => {\n c.mcpJamClientManager = mcpJamClientManager;\n await next();\n});\n\n// Middleware\napp.use(\"*\", logger());\n// Dynamic CORS origin based on PORT environment variable\nconst serverPort = process.env.PORT || \"3000\";\nconst corsOrigins = [\n `http://localhost:${serverPort}`,\n \"http://localhost:3000\", // Keep for development\n];\n\napp.use(\n \"*\",\n cors({\n origin: corsOrigins,\n credentials: true,\n }),\n);\n\n// API Routes\napp.route(\"/api/mcp\", mcpRoutes);\n\n// Health check\napp.get(\"/health\", (c) => {\n return c.json({ status: \"ok\", timestamp: new Date().toISOString() });\n});\n\n// API endpoint to get MCP CLI config (for development mode)\napp.get(\"/api/mcp-cli-config\", (c) => {\n const mcpConfig = getMCPConfigFromEnv();\n return c.json({ config: mcpConfig });\n});\n\n// Static file serving (for production)\nif (process.env.NODE_ENV === \"production\") {\n // Serve static assets (JS, CSS, images, etc.)\n app.use(\"/*\", serveStatic({ root: \"./dist/client\" }));\n\n // SPA fallback - serve index.html for all non-API routes\n app.get(\"*\", async (c) => {\n const path = c.req.path;\n // Don't intercept API routes\n if (path.startsWith(\"/api/\")) {\n return c.notFound();\n }\n // Return index.html for SPA routes\n const indexPath = join(process.cwd(), \"dist\", \"client\", \"index.html\");\n let htmlContent = readFileSync(indexPath, \"utf-8\");\n\n // Inject MCP server config if provided via CLI\n const mcpConfig = getMCPConfigFromEnv();\n if (mcpConfig) {\n const configScript = `<script>window.MCP_CLI_CONFIG = ${JSON.stringify(mcpConfig)};</script>`;\n htmlContent = htmlContent.replace(\"</head>\", `${configScript}</head>`);\n }\n\n return c.html(htmlContent);\n });\n} else {\n // Development mode - just API\n app.get(\"/\", (c) => {\n return c.json({\n message: \"MCPJam API Server\",\n environment: \"development\",\n frontend: `http://localhost:${serverPort}`,\n });\n });\n}\n\nconst port = parseInt(process.env.PORT || \"3000\");\n\n// Display the localhost URL in a box\nlogBox(`http://localhost:${port}`, \"🚀 Inspector Launched\");\n\n// Graceful shutdown handling\nconst server = serve({\n fetch: app.fetch,\n port,\n hostname: \"0.0.0.0\", // Bind to all interfaces for Docker\n});\n\n// Handle graceful shutdown\nprocess.on(\"SIGINT\", () => {\n console.log(\"\\n🛑 Shutting down gracefully...\");\n server.close();\n process.exit(0);\n});\n\nprocess.on(\"SIGTERM\", () => {\n console.log(\"\\n🛑 Shutting down gracefully...\");\n server.close();\n process.exit(0);\n});\n\nexport default app;\n","import { Hono } from \"hono\";\nimport connect from \"./connect\";\nimport servers from \"./servers\";\nimport tools from \"./tools\";\nimport resources from \"./resources\";\nimport prompts from \"./prompts\";\nimport chat from \"./chat\";\nimport tests from \"./tests.ts\";\nimport oauth from \"./oauth\";\n\nconst mcp = new Hono();\n\n// Health check\nmcp.get(\"/health\", (c) => {\n return c.json({\n service: \"MCP API\",\n status: \"ready\",\n timestamp: new Date().toISOString(),\n });\n});\n\n// Chat endpoint - REAL IMPLEMENTATION\nmcp.route(\"/chat\", chat);\n\n// Connect endpoint - REAL IMPLEMENTATION\nmcp.route(\"/connect\", connect);\n\n// Servers management endpoints - REAL IMPLEMENTATION\nmcp.route(\"/servers\", servers);\n\n// Tools endpoint - REAL IMPLEMENTATION\nmcp.route(\"/tools\", tools);\n\n// Tests endpoint - generate per-test agents\nmcp.route(\"/tests\", tests);\n\n// Resources endpoints - REAL IMPLEMENTATION\nmcp.route(\"/resources\", resources);\n\n// Prompts endpoints - REAL IMPLEMENTATION\nmcp.route(\"/prompts\", prompts);\n\n// OAuth proxy endpoints\nmcp.route(\"/oauth\", oauth);\n\nexport default mcp;\n","import { Hono } from \"hono\";\nimport \"../../types/hono\"; // Type extensions\n\nconst connect = new Hono();\n\nconnect.post(\"/\", async (c) => {\n try {\n const { serverConfig, serverId } = await c.req.json();\n\n if (!serverConfig) {\n return c.json(\n {\n success: false,\n error: \"serverConfig is required\",\n },\n 400,\n );\n }\n\n if (!serverId) {\n return c.json(\n {\n success: false,\n error: \"serverId is required\",\n },\n 400,\n );\n }\n\n const mcpClientManager = c.mcpJamClientManager;\n\n try {\n await mcpClientManager.connectToServer(serverId, serverConfig);\n const status = mcpClientManager.getConnectionStatus(serverId);\n if (status === \"connected\") {\n return c.json({\n success: true,\n status: \"connected\",\n });\n } else {\n return c.json(\n {\n success: false,\n error: \"Connection failed\",\n status,\n },\n 500,\n );\n }\n } catch (error) {\n return c.json(\n {\n success: false,\n error: `MCP configuration is invalid. Please double check your server configuration: ${JSON.stringify(serverConfig)}`,\n details: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n } catch (error) {\n return c.json(\n {\n success: false,\n error: \"Failed to parse request body\",\n details: error instanceof Error ? error.message : \"Unknown error\",\n },\n 400,\n );\n }\n});\n\nexport default connect;\n","import { Hono } from \"hono\";\nimport \"../../types/hono\"; // Type extensions\n\nconst servers = new Hono();\n\n// List all connected servers with their status\nservers.get(\"/\", async (c) => {\n try {\n const mcpJamClientManager = c.mcpJamClientManager;\n\n // Get all server configurations and statuses\n const connectedServers = mcpJamClientManager.getConnectedServers();\n\n const serverList = Object.entries(connectedServers).map(\n ([serverId, serverInfo]) => ({\n id: serverId,\n name: serverId,\n status: serverInfo.status,\n config: serverInfo.config,\n }),\n );\n\n return c.json({\n success: true,\n servers: serverList,\n });\n } catch (error) {\n console.error(\"Error listing servers:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\n// Get status for a specific server\nservers.get(\"/status/:serverId\", async (c) => {\n try {\n const serverId = c.req.param(\"serverId\");\n const mcpJamClientManager = c.mcpJamClientManager;\n\n const status = mcpJamClientManager.getConnectionStatus(serverId);\n\n return c.json({\n success: true,\n serverId,\n status,\n });\n } catch (error) {\n console.error(\"Error getting server status:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\n// Disconnect from a server\nservers.delete(\"/:serverId\", async (c) => {\n try {\n const serverId = c.req.param(\"serverId\");\n const mcpJamClientManager = c.mcpJamClientManager;\n\n await mcpJamClientManager.disconnectFromServer(serverId);\n\n return c.json({\n success: true,\n message: `Disconnected from server: ${serverId}`,\n });\n } catch (error) {\n console.error(\"Error disconnecting server:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\n// Reconnect to a server\nservers.post(\"/reconnect\", async (c) => {\n try {\n const { serverId, serverConfig } = await c.req.json();\n\n if (!serverId || !serverConfig) {\n return c.json(\n {\n success: false,\n error: \"serverId and serverConfig are required\",\n },\n 400,\n );\n }\n\n const mcpJamClientManager = c.mcpJamClientManager;\n\n // Disconnect first, then reconnect\n await mcpJamClientManager.disconnectFromServer(serverId);\n await mcpJamClientManager.connectToServer(serverId, serverConfig);\n\n const status = mcpJamClientManager.getConnectionStatus(serverId);\n\n return c.json({\n success: true,\n serverId,\n status,\n message: `Reconnected to server: ${serverId}`,\n });\n } catch (error) {\n console.error(\"Error reconnecting server:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\nexport default servers;\n","import { Hono } from \"hono\";\nimport { z } from \"zod\";\nimport { zodToJsonSchema } from \"zod-to-json-schema\";\nimport { TextEncoder } from \"util\";\nimport \"../../types/hono\"; // Type extensions\n\nconst tools = new Hono();\n\n// Store for pending elicitation requests\nconst pendingElicitations = new Map<\n string,\n {\n resolve: (response: any) => void;\n reject: (error: any) => void;\n }\n>();\n\ntools.post(\"/\", async (c) => {\n let action: string | undefined;\n let toolName: string | undefined;\n\n try {\n const requestData = await c.req.json();\n action = requestData.action;\n toolName = requestData.toolName;\n const { serverConfig, parameters, requestId, response } = requestData;\n\n if (!action || ![\"list\", \"execute\", \"respond\"].includes(action)) {\n return c.json(\n {\n success: false,\n error: \"Action must be 'list', 'execute', or 'respond'\",\n },\n 400,\n );\n }\n\n // Handle elicitation response\n if (action === \"respond\") {\n if (!requestId) {\n return c.json(\n {\n success: false,\n error: \"requestId is required for respond action\",\n },\n 400,\n );\n }\n\n const mcpJamClientManager = c.mcpJamClientManager;\n const success = mcpJamClientManager.respondToElicitation(\n requestId,\n response,\n );\n\n if (!success) {\n // Also check local pendingElicitations for backward compatibility\n const pending = pendingElicitations.get(requestId);\n if (pending) {\n pending.resolve(response);\n pendingElicitations.delete(requestId);\n return c.json({ success: true });\n }\n\n return c.json(\n {\n success: false,\n error: \"No pending elicitation found for this requestId\",\n },\n 404,\n );\n }\n\n return c.json({ success: true });\n }\n\n // Use centralized MCPJam Agent\n const encoder = new TextEncoder();\n const readableStream = new ReadableStream({\n async start(controller) {\n try {\n if (!serverConfig) {\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"tool_error\", error: \"serverConfig is required\" })}\\n\\n`,\n ),\n );\n controller.enqueue(encoder.encode(`data: [DONE]\\n\\n`));\n controller.close();\n return;\n }\n\n const mcpJamClientManager = c.mcpJamClientManager;\n // Use server name from config or default key\n const serverId =\n (serverConfig as any).name || (serverConfig as any).id || \"server\";\n await mcpJamClientManager.connectToServer(serverId, serverConfig);\n\n // Set up elicitation callback for streaming context\n mcpJamClientManager.setElicitationCallback(async (request) => {\n const { requestId, message, schema } = request;\n\n // Stream elicitation request to client\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({\n type: \"elicitation_request\",\n requestId,\n message,\n schema,\n toolName: toolName || \"unknown\",\n timestamp: new Date(),\n })}\\n\\n`,\n ),\n );\n\n // Return a promise that will be resolved by the respond endpoint\n return new Promise((resolve, reject) => {\n pendingElicitations.set(requestId, {\n resolve: (response: any) => {\n resolve(response);\n pendingElicitations.delete(requestId);\n },\n reject: (error: any) => {\n reject(error);\n pendingElicitations.delete(requestId);\n },\n });\n\n // Set timeout\n setTimeout(() => {\n if (pendingElicitations.has(requestId)) {\n pendingElicitations.delete(requestId);\n reject(new Error(\"Elicitation timeout\"));\n }\n }, 300000); // 5 minutes\n });\n });\n\n if (action === \"list\") {\n // Use existing connection through MCPJam Agent to get un-prefixed tools\n try {\n const flattenedTools =\n await mcpJamClientManager.getToolsetsForServer(serverId);\n\n // Convert to the expected format with JSON schema conversion\n const toolsWithJsonSchema: Record<string, any> = {};\n for (const [name, tool] of Object.entries(flattenedTools)) {\n let inputSchema = (tool as any).inputSchema;\n try {\n // If original schemas are Zod, convert to JSON Schema. Otherwise pass through.\n inputSchema = zodToJsonSchema(inputSchema as z.ZodType<any>);\n } catch {\n // ignore conversion errors and use existing schema shape\n }\n toolsWithJsonSchema[name] = {\n name,\n description: (tool as any).description,\n inputSchema,\n outputSchema: (tool as any).outputSchema,\n };\n }\n\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"tools_list\", tools: toolsWithJsonSchema })}\\n\\n`,\n ),\n );\n controller.enqueue(encoder.encode(`data: [DONE]\\n\\n`));\n controller.close();\n return;\n } catch (err) {\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"tool_error\", error: err instanceof Error ? err.message : String(err) })}\\n\\n`,\n ),\n );\n controller.enqueue(encoder.encode(`data: [DONE]\\n\\n`));\n controller.close();\n return;\n }\n }\n\n if (action === \"execute\") {\n if (!toolName) {\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"tool_error\", error: \"Tool name is required for execution\" })}\\n\\n`,\n ),\n );\n controller.enqueue(encoder.encode(`data: [DONE]\\n\\n`));\n controller.close();\n return;\n }\n\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"tool_executing\", toolName, parameters: parameters || {}, message: \"Executing tool...\" })}\\n\\n`,\n ),\n );\n\n // Execute tool using centralized client manager\n const exec = await mcpJamClientManager.executeToolDirect(\n toolName,\n parameters || {},\n );\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"tool_result\", toolName, result: exec.result })}\\n\\n`,\n ),\n );\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"elicitation_complete\", toolName })}\\n\\n`,\n ),\n );\n controller.enqueue(encoder.encode(`data: [DONE]\\n\\n`));\n controller.close();\n return;\n }\n } catch (err) {\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"tool_error\", error: err instanceof Error ? err.message : String(err) })}\\n\\n`,\n ),\n );\n controller.enqueue(encoder.encode(`data: [DONE]\\n\\n`));\n controller.close();\n } finally {\n // Clear the elicitation callback\n const mcpJamClientManager = c.mcpJamClientManager;\n if (mcpJamClientManager) {\n mcpJamClientManager.clearElicitationCallback();\n }\n }\n },\n });\n\n return new Response(readableStream, {\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n },\n });\n } catch (error) {\n const errorMsg = error instanceof Error ? error.message : \"Unknown error\";\n\n return c.json(\n {\n success: false,\n error: errorMsg,\n },\n 500,\n );\n }\n});\n\nexport default tools;\n","import { Hono } from \"hono\";\nimport \"../../types/hono\"; // Type extensions\n\nconst resources = new Hono();\n\n// List resources endpoint\nresources.post(\"/list\", async (c) => {\n try {\n const { serverId } = await c.req.json();\n\n if (!serverId) {\n return c.json({ success: false, error: \"serverId is required\" }, 400);\n }\n const mcpClientManager = c.mcpJamClientManager;\n const serverResources = mcpClientManager.getResourcesForServer(serverId);\n return c.json({ resources: { [serverId]: serverResources } });\n } catch (error) {\n console.error(\"Error fetching resources:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\n// Read resource endpoint\nresources.post(\"/read\", async (c) => {\n try {\n const { serverId, uri } = await c.req.json();\n\n if (!serverId) {\n return c.json({ success: false, error: \"serverId is required\" }, 400);\n }\n\n if (!uri) {\n return c.json(\n {\n success: false,\n error: \"Resource URI is required\",\n },\n 400,\n );\n }\n\n const mcpClientManager = c.mcpJamClientManager;\n\n const content = await mcpClientManager.getResource(uri, serverId);\n\n return c.json({ content });\n } catch (error) {\n console.error(\"Error reading resource:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\nexport default resources;\n","import { Hono } from \"hono\";\nimport \"../../types/hono\"; // Type extensions\n\nconst prompts = new Hono();\n\n// List prompts endpoint\nprompts.post(\"/list\", async (c) => {\n try {\n const { serverId } = await c.req.json();\n\n if (!serverId) {\n return c.json({ success: false, error: \"serverId is required\" }, 400);\n }\n\n const mcpJamClientManager = c.mcpJamClientManager;\n\n // Get prompts for specific server\n const serverPrompts = mcpJamClientManager.getPromptsForServer(serverId);\n\n return c.json({ prompts: { [serverId]: serverPrompts } });\n } catch (error) {\n console.error(\"Error fetching prompts:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\n// Get prompt endpoint\nprompts.post(\"/get\", async (c) => {\n try {\n const { serverId, name, args } = await c.req.json();\n\n if (!serverId) {\n return c.json({ success: false, error: \"serverId is required\" }, 400);\n }\n\n if (!name) {\n return c.json(\n {\n success: false,\n error: \"Prompt name is required\",\n },\n 400,\n );\n }\n\n const mcpJamClientManager = c.mcpJamClientManager;\n\n // Get prompt content directly - servers are already connected\n const content = await mcpJamClientManager.getPrompt(\n name,\n serverId,\n args || {},\n );\n\n return c.json({ content });\n } catch (error) {\n console.error(\"Error getting prompt:\", error);\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\nexport default prompts;\n","import { Hono } from \"hono\";\nimport { Agent } from \"@mastra/core/agent\";\nimport { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { createGoogleGenerativeAI } from \"@ai-sdk/google\";\nimport { createOllama } from \"ollama-ai-provider\";\nimport {\n ChatMessage,\n ModelDefinition,\n ModelProvider,\n} from \"../../../shared/types\";\nimport { TextEncoder } from \"util\";\nimport { getDefaultTemperatureByProvider } from \"../../../client/src/lib/chat-utils\";\n\n// Types\ninterface ElicitationResponse {\n [key: string]: unknown;\n action: \"accept\" | \"decline\" | \"cancel\";\n content?: any;\n _meta?: any;\n}\n\ninterface PendingElicitation {\n resolve: (response: ElicitationResponse) => void;\n reject: (error: any) => void;\n}\n\ninterface StreamingContext {\n controller: ReadableStreamDefaultController;\n encoder: TextEncoder;\n toolCallId: number;\n lastEmittedToolCallId: number | null;\n stepIndex: number;\n}\n\ninterface ChatRequest {\n serverConfigs?: Record<string, any>;\n model: ModelDefinition;\n provider: ModelProvider;\n apiKey?: string;\n systemPrompt?: string;\n temperature?: number;\n messages?: ChatMessage[];\n ollamaBaseUrl?: string;\n action?: string;\n requestId?: string;\n response?: any;\n}\n\n// Constants\nconst DEBUG_ENABLED = process.env.MCP_DEBUG !== \"false\";\nconst ELICITATION_TIMEOUT = 300000; // 5 minutes\nconst MAX_AGENT_STEPS = 10;\n\n// Debug logging helper\nconst dbg = (...args: any[]) => {\n if (DEBUG_ENABLED) console.log(\"[mcp/chat]\", ...args);\n};\n\n// Avoid MaxListeners warnings when repeatedly creating MCP clients in dev\ntry {\n (process as any).setMaxListeners?.(50);\n} catch {}\n\n// Store for pending elicitation requests\nconst pendingElicitations = new Map<string, PendingElicitation>();\n\n// Use the context-injected MCPJamClientManager (see server/index.ts middleware)\n\nconst chat = new Hono();\n\n// Helper Functions\n\n/**\n * Creates an LLM model based on the provider and configuration\n */\nconst createLlmModel = (\n modelDefinition: ModelDefinition,\n apiKey: string,\n ollamaBaseUrl?: string,\n) => {\n if (!modelDefinition?.id || !modelDefinition?.provider) {\n throw new Error(\n `Invalid model definition: ${JSON.stringify(modelDefinition)}`,\n );\n }\n\n switch (modelDefinition.provider) {\n case \"anthropic\":\n return createAnthropic({ apiKey })(modelDefinition.id);\n case \"openai\":\n return createOpenAI({ apiKey })(modelDefinition.id);\n case \"deepseek\":\n return createOpenAI({ apiKey, baseURL: \"https://api.deepseek.com/v1\" })(\n modelDefinition.id,\n );\n case \"google\":\n return createGoogleGenerativeAI({ apiKey })(modelDefinition.id);\n case \"ollama\":\n const baseUrl = ollamaBaseUrl || \"http://localhost:11434/api\";\n return createOllama({\n baseURL: `${baseUrl}`,\n })(modelDefinition.id, {\n simulateStreaming: true,\n });\n default:\n throw new Error(\n `Unsupported provider: ${modelDefinition.provider} for model: ${modelDefinition.id}`,\n );\n }\n};\n\n// Removed unused createElicitationHandler\n\n/**\n * Wraps MCP tools to capture execution events and stream them to the client\n */\nconst wrapToolsWithStreaming = (\n tools: Record<string, any>,\n streamingContext: StreamingContext,\n) => {\n const wrappedTools: Record<string, any> = {};\n\n for (const [name, tool] of Object.entries(tools)) {\n wrappedTools[name] = {\n ...(tool as any),\n execute: async (params: any) => {\n const currentToolCallId = ++streamingContext.toolCallId;\n const startedAt = Date.now();\n\n // Stream tool call event immediately\n if (streamingContext.controller && streamingContext.encoder) {\n streamingContext.controller.enqueue(\n streamingContext.encoder.encode(\n `data: ${JSON.stringify({\n type: \"tool_call\",\n toolCall: {\n id: currentToolCallId,\n name,\n parameters: params,\n timestamp: new Date(),\n status: \"executing\",\n },\n })}\\n\\n`,\n ),\n );\n }\n\n dbg(\"Tool executing\", { name, currentToolCallId, params });\n\n try {\n const result = await (tool as any).execute(params);\n dbg(\"Tool result\", {\n name,\n currentToolCallId,\n ms: Date.now() - startedAt,\n });\n\n // Stream tool result event\n if (streamingContext.controller && streamingContext.encoder) {\n streamingContext.controller.enqueue(\n streamingContext.encoder.encode(\n `data: ${JSON.stringify({\n type: \"tool_result\",\n toolResult: {\n id: currentToolCallId,\n toolCallId: currentToolCallId,\n result,\n timestamp: new Date(),\n },\n })}\\n\\n`,\n ),\n );\n }\n\n return result;\n } catch (error) {\n dbg(\"Tool error\", {\n name,\n currentToolCallId,\n error: error instanceof Error ? error.message : String(error),\n });\n\n // Stream tool error event\n if (streamingContext.controller && streamingContext.encoder) {\n streamingContext.controller.enqueue(\n streamingContext.encoder.encode(\n `data: ${JSON.stringify({\n type: \"tool_result\",\n toolResult: {\n id: currentToolCallId,\n toolCallId: currentToolCallId,\n error:\n error instanceof Error ? error.message : String(error),\n timestamp: new Date(),\n },\n })}\\n\\n`,\n ),\n );\n }\n throw error;\n }\n },\n };\n }\n\n return wrappedTools;\n};\n\n/**\n * Handles tool call and result events from the agent's onStepFinish callback\n */\nconst handleAgentStepFinish = (\n streamingContext: StreamingContext,\n text: string,\n toolCalls: any[] | undefined,\n toolResults: any[] | undefined,\n) => {\n try {\n // Handle tool calls\n if (toolCalls && Array.isArray(toolCalls)) {\n for (const call of toolCalls) {\n const currentToolCallId = ++streamingContext.toolCallId;\n streamingContext.lastEmittedToolCallId = currentToolCallId;\n\n if (streamingContext.controller && streamingContext.encoder) {\n streamingContext.controller.enqueue(\n streamingContext.encoder.encode(\n `data: ${JSON.stringify({\n type: \"tool_call\",\n toolCall: {\n id: currentToolCallId,\n name: call.name || call.toolName,\n parameters: call.params || call.args || {},\n timestamp: new Date(),\n status: \"executing\",\n },\n })}\\n\\n`,\n ),\n );\n }\n }\n }\n\n // Handle tool results\n if (toolResults && Array.isArray(toolResults)) {\n for (const result of toolResults) {\n const currentToolCallId =\n streamingContext.lastEmittedToolCallId != null\n ? streamingContext.lastEmittedToolCallId\n : ++streamingContext.toolCallId;\n\n if (streamingContext.controller && streamingContext.encoder) {\n streamingContext.controller.enqueue(\n streamingContext.encoder.encode(\n `data: ${JSON.stringify({\n type: \"tool_result\",\n toolResult: {\n id: currentToolCallId,\n toolCallId: currentToolCallId,\n result: result.result,\n error: (result as any).error,\n timestamp: new Date(),\n },\n })}\\n\\n`,\n ),\n );\n }\n }\n }\n\n // Emit a consolidated trace step event for UI tracing panels\n streamingContext.stepIndex = (streamingContext.stepIndex || 0) + 1;\n if (streamingContext.controller && streamingContext.encoder) {\n streamingContext.controller.enqueue(\n streamingContext.encoder.encode(\n `data: ${JSON.stringify({\n type: \"trace_step\",\n step: streamingContext.stepIndex,\n text,\n toolCalls: (toolCalls || []).map((c: any) => ({\n name: c.name || c.toolName,\n params: c.params || c.args || {},\n })),\n toolResults: (toolResults || []).map((r: any) => ({\n result: r.result,\n error: (r as any).error,\n })),\n timestamp: new Date(),\n })}\\n\\n`,\n ),\n );\n }\n } catch (err) {\n dbg(\"onStepFinish error\", err);\n }\n};\n\n/**\n * Streams text content from the agent's response\n */\nconst streamAgentResponse = async (\n streamingContext: StreamingContext,\n stream: any,\n) => {\n let hasContent = false;\n let chunkCount = 0;\n\n for await (const chunk of stream.textStream) {\n if (chunk && chunk.trim()) {\n hasContent = true;\n chunkCount++;\n streamingContext.controller.enqueue(\n streamingContext.encoder!.encode(\n `data: ${JSON.stringify({ type: \"text\", content: chunk })}\\n\\n`,\n ),\n );\n }\n }\n\n dbg(\"Streaming finished\", { hasContent, chunkCount });\n return { hasContent, chunkCount };\n};\n\n/**\n * Falls back to regular completion when streaming fails\n */\nconst fallbackToCompletion = async (\n agent: Agent,\n messages: any[],\n streamingContext: StreamingContext,\n provider: ModelProvider,\n temperature?: number,\n) => {\n try {\n const result = await agent.generate(messages, {\n temperature:\n temperature == null || undefined\n ? getDefaultTemperatureByProvider(provider)\n : temperature,\n });\n if (result.text && result.text.trim()) {\n streamingContext.controller.enqueue(\n streamingContext.encoder!.encode(\n `data: ${JSON.stringify({\n type: \"text\",\n content: result.text,\n })}\\n\\n`,\n ),\n );\n }\n } catch (fallbackErr) {\n streamingContext.controller.enqueue(\n streamingContext.encoder!.encode(\n `data: ${JSON.stringify({\n type: \"text\",\n content: \"Failed to generate response. Please try again. \",\n error:\n fallbackErr instanceof Error\n ? fallbackErr.message\n : \"Unknown error\",\n })}\\n\\n`,\n ),\n );\n }\n};\n\n/**\n * Creates the streaming response for the chat\n */\nconst createStreamingResponse = async (\n agent: Agent,\n messages: any[],\n toolsets: any,\n streamingContext: StreamingContext,\n provider: ModelProvider,\n temperature?: number,\n) => {\n const stream = await agent.stream(messages, {\n maxSteps: MAX_AGENT_STEPS,\n temperature:\n temperature == null || undefined\n ? getDefaultTemperatureByProvider(provider)\n : temperature,\n toolsets,\n onStepFinish: ({ text, toolCalls, toolResults }) => {\n handleAgentStepFinish(streamingContext, text, toolCalls, toolResults);\n },\n });\n\n const { hasContent } = await streamAgentResponse(streamingContext, stream);\n\n // Fall back to completion if no content was streamed\n if (!hasContent) {\n dbg(\"No content from textStream; falling back to completion\");\n await fallbackToCompletion(\n agent,\n messages,\n streamingContext,\n provider,\n temperature,\n );\n }\n\n // Stream elicitation completion\n streamingContext.controller.enqueue(\n streamingContext.encoder!.encode(\n `data: ${JSON.stringify({\n type: \"elicitation_complete\",\n })}\\n\\n`,\n ),\n );\n\n // End stream\n streamingContext.controller.enqueue(\n streamingContext.encoder!.encode(`data: [DONE]\\n\\n`),\n );\n};\n\n// Main chat endpoint\nchat.post(\"/\", async (c) => {\n const mcpClientManager = c.mcpJamClientManager;\n try {\n const requestData: ChatRequest = await c.req.json();\n const {\n serverConfigs,\n model,\n provider,\n apiKey,\n systemPrompt,\n temperature,\n messages,\n ollamaBaseUrl,\n action,\n requestId,\n response,\n } = requestData;\n\n // Handle elicitation response\n if (action === \"elicitation_response\") {\n if (!requestId) {\n return c.json(\n {\n success: false,\n error: \"requestId is required for elicitation_response action\",\n },\n 400,\n );\n }\n\n const pending = pendingElicitations.get(requestId);\n if (!pending) {\n return c.json(\n {\n success: false,\n error: \"No pending elicitation found for this requestId\",\n },\n 404,\n );\n }\n\n pending.resolve(response);\n pendingElicitations.delete(requestId);\n return c.json({ success: true });\n }\n\n // Validate required parameters\n if (!model?.id || !apiKey || !messages) {\n return c.json(\n {\n success: false,\n error: \"model (with id), apiKey, and messages are required\",\n },\n 400,\n );\n }\n\n // Connect to servers through MCPJamClientManager\n if (!serverConfigs || Object.keys(serverConfigs).length === 0) {\n return c.json(\n {\n success: false,\n error: \"No server configs provided\",\n },\n 400,\n );\n }\n\n // Connect to each server using MCPJamClientManager\n const serverErrors: Record<string, string> = {};\n const connectedServers: string[] = [];\n\n for (const [serverName, serverConfig] of Object.entries(serverConfigs)) {\n try {\n await mcpClientManager.connectToServer(serverName, serverConfig);\n connectedServers.push(serverName);\n dbg(\"Connected to server\", { serverName });\n } catch (error) {\n const errorMessage =\n error instanceof Error ? error.message : \"Unknown error\";\n serverErrors[serverName] = errorMessage;\n dbg(\"Failed to connect to server\", { serverName, error: errorMessage });\n }\n }\n\n // Check if any servers connected successfully\n if (connectedServers.length === 0) {\n return c.json(\n {\n success: false,\n error: \"Failed to connect to any servers\",\n details: serverErrors,\n },\n 400,\n );\n }\n\n // Log warnings for failed connections but continue with successful ones\n if (Object.keys(serverErrors).length > 0) {\n dbg(\"Some servers failed to connect\", {\n connectedServers,\n failedServers: Object.keys(serverErrors),\n errors: serverErrors,\n });\n }\n\n // Create LLM model\n const llmModel = createLlmModel(model, apiKey, ollamaBaseUrl);\n\n // Create agent without tools initially - we'll add them in the streaming context\n const agent = new Agent({\n name: \"MCP Chat Agent\",\n instructions:\n systemPrompt || \"You are a helpful assistant with access to MCP tools.\",\n model: llmModel,\n tools: undefined, // Start without tools, add them in streaming context\n });\n\n const formattedMessages = messages.map((msg: ChatMessage) => ({\n role: msg.role,\n content: msg.content,\n }));\n\n // Get available tools from all connected servers\n const allTools = mcpClientManager.getAvailableTools();\n const toolsByServer: Record<string, any> = {};\n\n // Group tools by server for the agent\n for (const tool of allTools) {\n if (!toolsByServer[tool.serverId]) {\n toolsByServer[tool.serverId] = {};\n }\n toolsByServer[tool.serverId][tool.name] = {\n description: tool.description,\n inputSchema: tool.inputSchema,\n execute: async (params: any) => {\n return await mcpClientManager.executeToolDirect(\n `${tool.serverId}:${tool.name}`,\n params,\n );\n },\n };\n }\n\n dbg(\"Streaming start\", {\n connectedServers,\n toolCount: allTools.length,\n messageCount: formattedMessages.length,\n });\n\n // Create streaming response\n const encoder = new TextEncoder();\n const readableStream = new ReadableStream({\n async start(controller) {\n const streamingContext: StreamingContext = {\n controller,\n encoder,\n toolCallId: 0,\n lastEmittedToolCallId: null,\n stepIndex: 0,\n };\n\n // Flatten toolsets into a single tools object for streaming wrapper\n const flattenedTools: Record<string, any> = {};\n Object.values(toolsByServer).forEach((serverTools: any) => {\n Object.assign(flattenedTools, serverTools);\n });\n\n // Create streaming-wrapped tools\n const streamingWrappedTools = wrapToolsWithStreaming(\n flattenedTools,\n streamingContext,\n );\n\n // Create a new agent instance with streaming tools since tools property is read-only\n const streamingAgent = new Agent({\n name: agent.name,\n instructions: agent.instructions,\n model: agent.model!,\n tools:\n Object.keys(streamingWrappedTools).length > 0\n ? streamingWrappedTools\n : undefined,\n });\n\n // Register elicitation handler with MCPJamClientManager\n mcpClientManager.setElicitationCallback(async (request) => {\n // Convert MCPJamClientManager format to createElicitationHandler format\n const elicitationRequest = {\n message: request.message,\n requestedSchema: request.schema,\n };\n\n // Stream elicitation request to client using the provided requestId\n if (streamingContext.controller && streamingContext.encoder) {\n streamingContext.controller.enqueue(\n streamingContext.encoder.encode(\n `data: ${JSON.stringify({\n type: \"elicitation_request\",\n requestId: request.requestId,\n message: elicitationRequest.message,\n schema: elicitationRequest.requestedSchema,\n timestamp: new Date(),\n })}\\n\\n`,\n ),\n );\n }\n\n // Return a promise that will be resolved when user responds\n return new Promise<ElicitationResponse>((resolve, reject) => {\n pendingElicitations.set(request.requestId, { resolve, reject });\n\n // Set timeout to clean up if no response\n setTimeout(() => {\n if (pendingElicitations.has(request.requestId)) {\n pendingElicitations.delete(request.requestId);\n reject(new Error(\"Elicitation timeout\"));\n }\n }, ELICITATION_TIMEOUT);\n });\n });\n\n try {\n await createStreamingResponse(\n streamingAgent,\n formattedMessages,\n toolsByServer,\n streamingContext,\n provider,\n temperature,\n );\n } catch (error) {\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({\n type: \"error\",\n error: error instanceof Error ? error.message : \"Unknown error\",\n })}\\n\\n`,\n ),\n );\n } finally {\n // Clear elicitation callback to prevent memory leaks\n mcpClientManager.clearElicitationCallback();\n controller.close();\n }\n },\n });\n\n return new Response(readableStream, {\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n },\n });\n } catch (error) {\n console.error(\"[mcp/chat] Error in chat API:\", error);\n\n // Clear elicitation callback on error\n mcpClientManager.clearElicitationCallback();\n\n return c.json(\n {\n success: false,\n error: error instanceof Error ? error.message : \"Unknown error\",\n },\n 500,\n );\n }\n});\n\nexport default chat;\n","import { type ClassValue, clsx } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\nimport { ChatMessage } from \"./chat-types\";\nimport { ModelDefinition } from \"@/shared/types.js\";\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n\nexport function generateId(): string {\n return Math.random().toString(36).substr(2, 9);\n}\n\nexport function sanitizeText(text: string): string {\n // Basic sanitization - in production you might want more robust sanitization\n return text.trim();\n}\n\nexport function formatTimestamp(date: Date): string {\n return new Intl.DateTimeFormat(\"en-US\", {\n hour: \"numeric\",\n minute: \"2-digit\",\n hour12: true,\n }).format(date);\n}\n\nexport function formatMessageDate(date: Date): string {\n const now = new Date();\n const diffInMs = now.getTime() - date.getTime();\n const diffInDays = Math.floor(diffInMs / (1000 * 60 * 60 * 24));\n\n if (diffInDays === 0) {\n return formatTimestamp(date);\n } else if (diffInDays === 1) {\n return `Yesterday ${formatTimestamp(date)}`;\n } else if (diffInDays < 7) {\n return `${diffInDays} days ago`;\n } else {\n return new Intl.DateTimeFormat(\"en-US\", {\n month: \"short\",\n day: \"numeric\",\n year: date.getFullYear() !== now.getFullYear() ? \"numeric\" : undefined,\n }).format(date);\n }\n}\n\nexport function createMessage(\n role: \"user\" | \"assistant\",\n content: string,\n attachments?: any[],\n): ChatMessage {\n return {\n id: generateId(),\n role,\n content,\n timestamp: new Date(),\n attachments,\n metadata: {\n createdAt: new Date().toISOString(),\n },\n };\n}\n\nexport function isValidFileType(file: File): boolean {\n const allowedTypes = [\n \"text/plain\",\n \"application/pdf\",\n \"image/jpeg\",\n \"image/jpg\",\n \"image/png\",\n \"image/gif\",\n \"image/webp\",\n \"application/json\",\n \"text/csv\",\n \"application/vnd.ms-excel\",\n \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\",\n ];\n\n return allowedTypes.includes(file.type);\n}\n\nexport function isImageFile(file: File): boolean {\n return file.type.startsWith(\"image/\");\n}\n\nexport function isImageUrl(url: string): boolean {\n const imageExtensions = [\".jpg\", \".jpeg\", \".png\", \".gif\", \".webp\", \".svg\"];\n const lowerUrl = url.toLowerCase();\n return (\n imageExtensions.some((ext) => lowerUrl.includes(ext)) ||\n lowerUrl.includes(\"data:image/\") ||\n lowerUrl.includes(\"blob:\")\n );\n}\n\nexport function getImageDimensions(\n url: string,\n): Promise<{ width: number; height: number }> {\n return new Promise((resolve, reject) => {\n const img = new Image();\n img.onload = () => {\n resolve({ width: img.naturalWidth, height: img.naturalHeight });\n };\n img.onerror = reject;\n img.src = url;\n });\n}\n\nexport function formatFileSize(bytes: number): string {\n if (bytes === 0) return \"0 B\";\n\n const k = 1024;\n const sizes = [\"B\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n\n return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + \" \" + sizes[i];\n}\n\nexport function truncateText(text: string, maxLength: number): string {\n if (text.length <= maxLength) return text;\n return text.substring(0, maxLength) + \"...\";\n}\n\nexport function scrollToBottom(element?: Element | null) {\n if (element) {\n element.scrollTop = element.scrollHeight;\n } else {\n window.scrollTo(0, document.body.scrollHeight);\n }\n}\n\nexport function debounce<T extends (...args: any[]) => any>(\n func: T,\n wait: number,\n): (...args: Parameters<T>) => void {\n let timeout: NodeJS.Timeout;\n return (...args: Parameters<T>) => {\n clearTimeout(timeout);\n timeout = setTimeout(() => func(...args), wait);\n };\n}\n\nexport function getDefaultTemperatureByProvider(provider: string): number {\n switch (provider) {\n case \"openai\":\n return 1.0;\n case \"anthropic\":\n return 0;\n case \"google\":\n return 0.9; // Google's recommended default\n default:\n return 0;\n }\n}\n\nexport function getDefaultTemperatureForModel(model: ModelDefinition): number {\n return getDefaultTemperatureByProvider(model.provider);\n}\n","import { Hono } from \"hono\";\nimport { createAnthropic } from \"@ai-sdk/anthropic\";\nimport { createOpenAI } from \"@ai-sdk/openai\";\nimport { createOllama } from \"ollama-ai-provider\";\nimport { MastraMCPServerDefinition, MCPClient } from \"@mastra/mcp\";\nimport type { ModelDefinition } from \"../../../shared/types\";\nimport { Agent } from \"@mastra/core/agent\";\nimport {\n validateMultipleServerConfigs,\n createMCPClientWithMultipleConnections,\n} from \"../../utils/mcp-utils\";\n\nconst tests = new Hono();\n\nexport default tests;\n\n// Run-all (parallel orchestrated) endpoint\ntests.post(\"/run-all\", async (c) => {\n const encoder = new TextEncoder();\n try {\n const body = await c.req.json();\n const testsInput = (body?.tests || []) as Array<{\n id: string;\n title: string;\n prompt: string;\n expectedTools: string[];\n model: ModelDefinition;\n selectedServers?: string[];\n }>;\n const allServers = (body?.allServers || {}) as Record<\n string,\n MastraMCPServerDefinition\n >;\n const providerApiKeys = body?.providerApiKeys || {};\n const ollamaBaseUrl: string | undefined = body?.ollamaBaseUrl;\n const maxConcurrency: number = Math.max(\n 1,\n Math.min(8, body?.concurrency ?? 5),\n );\n\n if (!Array.isArray(testsInput) || testsInput.length === 0) {\n return c.json({ success: false, error: \"No tests provided\" }, 400);\n }\n\n function createModel(model: ModelDefinition) {\n switch (model.provider) {\n case \"anthropic\":\n return createAnthropic({\n apiKey:\n providerApiKeys?.anthropic || process.env.ANTHROPIC_API_KEY || \"\",\n })(model.id);\n case \"openai\":\n return createOpenAI({\n apiKey: providerApiKeys?.openai || process.env.OPENAI_API_KEY || \"\",\n })(model.id);\n case \"deepseek\":\n return createOpenAI({\n apiKey:\n providerApiKeys?.deepseek || process.env.DEEPSEEK_API_KEY || \"\",\n baseURL: \"https://api.deepseek.com/v1\",\n })(model.id);\n case \"ollama\":\n return createOllama({\n baseURL:\n ollamaBaseUrl ||\n process.env.OLLAMA_BASE_URL ||\n \"http://localhost:11434/api\",\n })(model.id, { simulateStreaming: true });\n default:\n throw new Error(`Unsupported provider: ${model.provider}`);\n }\n }\n\n const readableStream = new ReadableStream({\n async start(controller) {\n let active = 0;\n let index = 0;\n let failed = false;\n\n const runNext = async () => {\n if (index >= testsInput.length) {\n if (active === 0) {\n // All done\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"run_complete\", passed: !failed })}\\n\\n`,\n ),\n );\n controller.enqueue(encoder.encode(`data: [DONE]\\n\\n`));\n controller.close();\n }\n return;\n }\n const test = testsInput[index++];\n active++;\n (async () => {\n const calledTools = new Set<string>();\n const expectedSet = new Set<string>(test.expectedTools || []);\n let step = 0;\n let client: MCPClient | null = null;\n try {\n // Build servers for this test\n let serverConfigs: Record<string, MastraMCPServerDefinition> = {};\n if (test.selectedServers && test.selectedServers.length > 0) {\n for (const name of test.selectedServers) {\n if (allServers[name]) serverConfigs[name] = allServers[name];\n }\n } else {\n for (const [name, cfg] of Object.entries(allServers)) {\n serverConfigs[name] = cfg;\n }\n }\n\n // Validate and connect with multiple servers like chat endpoint to ensure headers/eventSourceInit are set\n const validation = validateMultipleServerConfigs(serverConfigs);\n let finalServers: Record<string, MastraMCPServerDefinition> = {};\n if (validation.success && validation.validConfigs) {\n finalServers = validation.validConfigs;\n } else if (\n validation.validConfigs &&\n Object.keys(validation.validConfigs).length > 0\n ) {\n finalServers = validation.validConfigs; // partial success; continue with valid ones\n } else {\n throw new Error(\"No valid MCP server configs for test\");\n }\n\n client = createMCPClientWithMultipleConnections(finalServers);\n const model = createModel(test.model);\n const agent = new Agent({\n name: `TestAgent-${test.id}`,\n instructions:\n \"You are a helpful assistant with access to MCP tools\",\n model,\n });\n const toolsets = await client.getToolsets();\n const stream = await agent.stream(\n [{ role: \"user\", content: test.prompt || \"\" }] as any,\n {\n maxSteps: 10,\n toolsets,\n onStepFinish: ({ text, toolCalls, toolResults }) => {\n step += 1;\n // Accumulate tool names\n (toolCalls || []).forEach((c: any) => {\n const toolName = c?.name || c?.toolName;\n if (toolName) {\n calledTools.add(toolName);\n }\n });\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({\n type: \"trace_step\",\n testId: test.id,\n step,\n text,\n toolCalls,\n toolResults,\n })}\\n\\n`,\n ),\n );\n },\n },\n );\n // Drain text (no need to forward text here)\n for await (const _ of stream.textStream) {\n // no-op\n }\n const called = Array.from(calledTools);\n const missing = Array.from(expectedSet).filter(\n (t) => !calledTools.has(t),\n );\n const unexpected = called.filter((t) => !expectedSet.has(t));\n const passed = missing.length === 0 && unexpected.length === 0;\n if (!passed) failed = true;\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"result\", testId: test.id, passed, calledTools: called, missingTools: missing, unexpectedTools: unexpected })}\\n\\n`,\n ),\n );\n } catch (err) {\n failed = true;\n controller.enqueue(\n encoder.encode(\n `data: ${JSON.stringify({ type: \"result\", testId: test.id, passed: false, error: (err as Error)?.message })}\\n\\n`,\n ),\n );\n } finally {\n try {\n await client?.disconnect();\n } catch {}\n active--;\n runNext();\n }\n })();\n };\n\n for (let i = 0; i < Math.min(maxConcurrency, testsInput.length); i++) {\n runNext();\n }\n },\n });\n\n return new Response(readableStream, {\n headers: {\n \"Content-Type\": \"text/event-stream\",\n \"Cache-Control\": \"no-cache\",\n Connection: \"keep-alive\",\n },\n });\n } catch (err) {\n return c.json(\n { success: false, error: (err as Error)?.message || \"Unknown error\" },\n 500,\n );\n }\n});\n","import { MastraMCPServerDefinition, MCPClient } from \"@mastra/mcp\";\n\n// Hono-compatible error response type\nexport interface HonoErrorResponse {\n message: string;\n status: number;\n}\n\nexport interface ValidationResult {\n success: boolean;\n config?: MastraMCPServerDefinition;\n error?: HonoErrorResponse;\n}\n\nexport interface MultipleValidationResult {\n success: boolean;\n validConfigs?: Record<string, MastraMCPServerDefinition>;\n errors?: Record<string, string>;\n error?: HonoErrorResponse;\n}\n\nexport function validateServerConfig(serverConfig: any): ValidationResult {\n if (!serverConfig) {\n return {\n success: false,\n error: {\n message: \"Server configuration is required\",\n status: 400,\n },\n };\n }\n\n // Validate and prepare config\n const config = { ...serverConfig };\n\n // Validate and convert URL if provided\n if (config.url) {\n try {\n // Convert string URL to URL object if needed and strip query/hash\n if (typeof config.url === \"string\") {\n const parsed = new URL(config.url);\n parsed.search = \"\";\n parsed.hash = \"\";\n config.url = parsed;\n } else if (typeof config.url === \"object\" && !config.url.href) {\n return {\n success: false,\n error: {\n message: \"Invalid URL configuration\",\n status: 400,\n },\n };\n }\n\n // Handle OAuth authentication for HTTP servers\n if (config.oauth?.access_token) {\n const authHeaders = {\n Authorization: `Bearer ${config.oauth.access_token}`,\n ...(config.requestInit?.headers || {}),\n };\n\n config.requestInit = {\n ...config.requestInit,\n headers: authHeaders,\n };\n\n // For SSE connections, add eventSourceInit with OAuth headers\n config.eventSourceInit = {\n fetch(input: Request | URL | string, init?: RequestInit) {\n const headers = new Headers(init?.headers || {});\n\n // Add OAuth authorization header\n headers.set(\n \"Authorization\",\n `Bearer ${config.oauth!.access_token}`,\n );\n\n // Copy other headers from requestInit\n if (config.requestInit?.headers) {\n const requestHeaders = new Headers(config.requestInit.headers);\n requestHeaders.forEach((value, key) => {\n if (key.toLowerCase() !== \"authorization\") {\n headers.set(key, value);\n }\n });\n }\n\n return fetch(input, {\n ...init,\n headers,\n });\n },\n };\n } else if (config.requestInit?.headers) {\n // For SSE connections without OAuth, add eventSourceInit if requestInit has custom headers\n config.eventSourceInit = {\n fetch(input: Request | URL | string, init?: RequestInit) {\n const headers = new Headers(init?.headers || {});\n\n // Copy headers from requestInit\n const requestHeaders = new Headers(config.requestInit.headers);\n requestHeaders.forEach((value, key) => {\n headers.set(key, value);\n });\n\n return fetch(input, {\n ...init,\n headers,\n });\n },\n };\n }\n } catch (error) {\n return {\n success: false,\n error: {\n message: `Invalid URL format: ${error}`,\n status: 400,\n },\n };\n }\n }\n\n return {\n success: true,\n config,\n };\n}\n\nexport function createMCPClient(\n config: MastraMCPServerDefinition,\n id: string,\n): MCPClient {\n return new MCPClient({\n id,\n servers: {\n server: config,\n },\n });\n}\n\nexport interface MultipleValidationResult {\n success: boolean;\n validConfigs?: Record<string, MastraMCPServerDefinition>;\n serverNameMapping?: Record<string, string>; // serverID -> originalName\n errors?: Record<string, string>;\n error?: HonoErrorResponse;\n}\n\n// Generate unique server ID that avoids collisions\nfunction generateUniqueServerID(serverName: string): string {\n // Use normalized name as base + timestamp + random suffix to ensure uniqueness\n const normalizedBase = normalizeServerConfigName(serverName);\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `${normalizedBase}_${timestamp}_${random}`;\n}\n\nexport const validateMultipleServerConfigs = (\n serverConfigs: Record<string, MastraMCPServerDefinition>,\n): MultipleValidationResult => {\n if (!serverConfigs || Object.keys(serverConfigs).length === 0) {\n return {\n success: false,\n error: {\n message: \"At least one server configuration is required\",\n status: 400,\n },\n };\n }\n\n const validConfigs: Record<string, MastraMCPServerDefinition> = {};\n const serverNameMapping: Record<string, string> = {};\n const errors: Record<string, string> = {};\n let hasErrors = false;\n\n // Validate each server configuration\n for (const [serverName, serverConfig] of Object.entries(serverConfigs)) {\n const validationResult = validateServerConfig(serverConfig);\n\n if (validationResult.success && validationResult.config) {\n // Generate unique server ID to avoid collisions from normalized names\n const serverID = generateUniqueServerID(serverName);\n validConfigs[serverID] = validationResult.config;\n serverNameMapping[serverID] = serverName; // Map serverID back to original name\n } else {\n hasErrors = true;\n let errorMessage = \"Configuration validation failed\";\n if (validationResult.error) {\n errorMessage = validationResult.error.message;\n }\n // Use original server name for error keys since this is for user display\n errors[serverName] = errorMessage;\n }\n }\n\n // If all configs are valid, return success\n if (!hasErrors) {\n return {\n success: true,\n validConfigs,\n serverNameMapping,\n };\n }\n\n // If some configs are valid but others failed, return partial success\n if (Object.keys(validConfigs).length > 0) {\n return {\n success: false,\n validConfigs,\n serverNameMapping,\n errors,\n };\n }\n\n // If all configs failed, return error\n return {\n success: false,\n errors,\n error: {\n message: \"All server configurations failed validation\",\n status: 400,\n },\n };\n};\n\nexport function createMCPClientWithMultipleConnections(\n serverConfigs: Record<string, MastraMCPServerDefinition>,\n): MCPClient {\n // Custom MCPClient wrapper to fix double prefixing issue\n const originalMCPClient = new MCPClient({\n id: `chat-${Date.now()}`,\n servers: serverConfigs,\n });\n\n // Override getTools method to fix double prefixing\n const originalGetTools = originalMCPClient.getTools.bind(originalMCPClient);\n originalMCPClient.getTools = async () => {\n const tools = await originalGetTools();\n const fixedTools: Record<string, any> = {};\n\n for (const [toolName, toolConfig] of Object.entries(tools)) {\n // Check if tool name has double prefix pattern (serverName_serverName_actualTool)\n const parts = toolName.split(\"_\");\n if (parts.length >= 3 && parts[0] === parts[1]) {\n // Remove the duplicate prefix: \"asana_asana_list_workspaces\" -> \"asana_list_workspaces\"\n const fixedName = parts.slice(1).join(\"_\");\n fixedTools[fixedName] = toolConfig;\n } else {\n fixedTools[toolName] = toolConfig;\n }\n }\n\n return fixedTools;\n };\n\n return originalMCPClient;\n}\n\nexport function normalizeServerConfigName(serverName: string): string {\n // Convert to lowercase and replace spaces/hyphens with underscores\n return serverName\n .toLowerCase()\n .replace(/[\\s\\-]+/g, \"_\")\n .replace(/[^a-z0-9_]/g, \"\");\n}\n\nexport function createErrorResponse(\n message: string,\n details?: string,\n status: number = 500,\n): HonoErrorResponse {\n return {\n message: details ? `${message}: ${details}` : message,\n status,\n };\n}\n","import { Hono } from \"hono\";\nimport { ContentfulStatusCode } from \"hono/utils/http-status\";\n\nconst oauth = new Hono();\n\n/**\n * Proxy OAuth metadata requests to bypass CORS restrictions\n * GET /api/mcp/oauth/metadata?url=https://mcp.asana.com/.well-known/oauth-authorization-server/sse\n */\noauth.get(\"/metadata\", async (c) => {\n try {\n const url = c.req.query(\"url\");\n\n if (!url) {\n return c.json({ error: \"Missing url parameter\" }, 400);\n }\n\n // Validate URL format and ensure it's HTTPS\n let metadataUrl: URL;\n try {\n metadataUrl = new URL(url);\n if (metadataUrl.protocol !== \"https:\") {\n return c.json({ error: \"Only HTTPS URLs are allowed\" }, 400);\n }\n } catch (error) {\n return c.json({ error: \"Invalid URL format\" }, 400);\n }\n\n // Fetch OAuth metadata from the server\n const response = await fetch(metadataUrl.toString(), {\n method: \"GET\",\n headers: {\n Accept: \"application/json\",\n \"User-Agent\": \"MCP-Inspector/1.0\",\n },\n });\n\n if (!response.ok) {\n return c.json(\n {\n error: `Failed to fetch OAuth metadata: ${response.status} ${response.statusText}`,\n },\n response.status as ContentfulStatusCode,\n );\n }\n\n const metadata = (await response.json()) as Record<string, unknown>;\n\n // Return the metadata with proper CORS headers\n return c.json(metadata);\n } catch (error) {\n console.error(\"OAuth metadata proxy error:\", error);\n return c.json(\n {\n error:\n error instanceof Error ? error.message : \"Unknown error occurred\",\n },\n 500,\n );\n }\n});\n\nexport default oauth;\n","import { MCPClient, MastraMCPServerDefinition } from \"@mastra/mcp\";\nimport { validateServerConfig } from \"../utils/mcp-utils\";\n\nexport type ConnectionStatus =\n | \"disconnected\"\n | \"connecting\"\n | \"connected\"\n | \"error\";\n\nexport interface DiscoveredTool {\n name: string;\n description?: string;\n inputSchema: any;\n outputSchema?: any;\n serverId: string;\n}\n\nexport interface DiscoveredResource {\n uri: string;\n name: string;\n description?: string;\n mimeType?: string;\n serverId: string;\n}\n\nexport interface DiscoveredPrompt {\n name: string;\n description?: string;\n arguments?: Record<string, any>;\n serverId: string;\n}\n\nexport interface ChatMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string;\n}\n\nexport interface ChatResponse {\n text?: string;\n toolCalls?: any[];\n toolResults?: any[];\n}\n\nexport interface ToolResult {\n result: any;\n}\n\nexport interface ElicitationRequest {\n message: string;\n requestedSchema: any;\n}\n\nexport interface ElicitationResponse {\n [key: string]: unknown;\n action: \"accept\" | \"decline\" | \"cancel\";\n content?: any;\n _meta?: any;\n}\n\nexport interface ResourceContent {\n contents: any[];\n}\n\nexport interface PromptResult {\n content: any;\n}\n\nfunction generateUniqueServerId(serverId: string) {\n // Generate unique server ID that avoids collisions\n const normalizedBase = serverId\n .toLowerCase()\n .replace(/[\\s\\-]+/g, \"_\")\n .replace(/[^a-z0-9_]/g, \"\");\n const timestamp = Date.now().toString(36);\n const random = Math.random().toString(36).substring(2, 8);\n return `${normalizedBase}_${timestamp}_${random}`;\n}\n\nclass MCPJamClientManager {\n private mcpClients: Map<string, MCPClient> = new Map();\n private statuses: Map<string, ConnectionStatus> = new Map();\n private configs: Map<string, MastraMCPServerDefinition> = new Map();\n\n // Map original server names to unique IDs\n private serverIdMapping: Map<string, string> = new Map();\n\n // Track in-flight connections to avoid duplicate concurrent connects\n private pendingConnections: Map<string, Promise<void>> = new Map();\n\n private toolRegistry: Map<string, DiscoveredTool> = new Map();\n private resourceRegistry: Map<string, DiscoveredResource> = new Map();\n private promptRegistry: Map<string, DiscoveredPrompt> = new Map();\n\n // Store for pending elicitation requests with Promise resolvers\n private pendingElicitations: Map<\n string,\n {\n resolve: (response: ElicitationResponse) => void;\n reject: (error: any) => void;\n }\n > = new Map();\n\n // Optional callback for handling elicitation requests\n private elicitationCallback?: (request: {\n requestId: string;\n message: string;\n schema: any;\n }) => Promise<ElicitationResponse>;\n\n // Helper method to get unique ID for a server name\n private getServerUniqueId(serverName: string): string | undefined {\n return this.serverIdMapping.get(serverName);\n }\n\n // Public method to get server ID for external use (like frontend)\n getServerIdForName(serverName: string): string | undefined {\n return this.serverIdMapping.get(serverName);\n }\n\n // Public method to get original server name from a unique server ID\n getOriginalNameForId(uniqueServerId: string): string | undefined {\n for (const [originalName, uid] of this.serverIdMapping.entries()) {\n if (uid === uniqueServerId) return originalName;\n }\n return undefined;\n }\n\n // Convenience: map an array of unique IDs to their original names (fallback to ID if not found)\n mapIdsToOriginalNames(uniqueIds: string[]): string[] {\n return uniqueIds.map((id) => this.getOriginalNameForId(id) || id);\n }\n\n async connectToServer(serverId: string, serverConfig: any): Promise<void> {\n // If a connection is already in-flight for this server name, wait for it\n const pending = this.pendingConnections.get(serverId);\n if (pending) {\n await pending;\n return;\n }\n\n const connectPromise = (async () => {\n // Reuse existing unique ID for this server name if present; otherwise generate and map one\n let id = this.serverIdMapping.get(serverId);\n if (!id) {\n id = generateUniqueServerId(serverId);\n this.serverIdMapping.set(serverId, id);\n }\n\n // If already connected, no-op\n if (this.mcpClients.has(id)) return;\n\n // Validate server configuration\n const validation = validateServerConfig(serverConfig);\n if (!validation.success) {\n this.statuses.set(id, \"error\");\n throw new Error(validation.error!.message);\n }\n\n this.configs.set(id, validation.config!);\n this.statuses.set(id, \"connecting\");\n\n const client = new MCPClient({\n id: `mcpjam-${id}`,\n servers: { [id]: validation.config! },\n });\n\n try {\n // touch the server to verify connection\n await client.getTools();\n this.mcpClients.set(id, client);\n this.statuses.set(id, \"connected\");\n\n // Register elicitation handler for this server\n if (client.elicitation?.onRequest) {\n client.elicitation.onRequest(\n id,\n async (elicitationRequest: ElicitationRequest) => {\n return await this.handleElicitationRequest(elicitationRequest);\n },\n );\n }\n\n await this.discoverServerResources(id);\n } catch (err) {\n this.statuses.set(id, \"error\");\n try {\n await client.disconnect();\n } catch {}\n this.mcpClients.delete(id);\n throw err;\n }\n })().finally(() => {\n this.pendingConnections.delete(serverId);\n });\n\n this.pendingConnections.set(serverId, connectPromise);\n await connectPromise;\n }\n\n async disconnectFromServer(serverId: string): Promise<void> {\n const id = this.getServerUniqueId(serverId);\n if (!id) return; // Server not found\n\n const client = this.mcpClients.get(id);\n if (client) {\n try {\n await client.disconnect();\n } catch {}\n }\n this.mcpClients.delete(id);\n this.statuses.set(id, \"disconnected\");\n this.serverIdMapping.delete(serverId); // Clean up the mapping\n\n // purge registries for this server\n for (const key of Array.from(this.toolRegistry.keys())) {\n const item = this.toolRegistry.get(key)!;\n if (item.serverId === id) this.toolRegistry.delete(key);\n }\n for (const key of Array.from(this.resourceRegistry.keys())) {\n const item = this.resourceRegistry.get(key)!;\n if (item.serverId === id) this.resourceRegistry.delete(key);\n }\n for (const key of Array.from(this.promptRegistry.keys())) {\n const item = this.promptRegistry.get(key)!;\n if (item.serverId === id) this.promptRegistry.delete(key);\n }\n }\n\n getConnectionStatus(serverId: string): ConnectionStatus {\n const id = this.getServerUniqueId(serverId);\n return id ? this.statuses.get(id) || \"disconnected\" : \"disconnected\";\n }\n\n getConnectedServers(): Record<\n string,\n { status: ConnectionStatus; config?: any }\n > {\n const servers: Record<string, { status: ConnectionStatus; config?: any }> =\n {};\n\n // Return data keyed by the original server names provided by callers\n for (const [originalName, uniqueId] of this.serverIdMapping.entries()) {\n servers[originalName] = {\n status: this.statuses.get(uniqueId) || \"disconnected\",\n config: this.configs.get(uniqueId),\n };\n }\n\n return servers;\n }\n\n async discoverAllResources(): Promise<void> {\n const serverIds = Array.from(this.mcpClients.keys());\n await Promise.all(serverIds.map((id) => this.discoverServerResources(id)));\n }\n\n private async discoverServerResources(serverId: string): Promise<void> {\n // serverId is already the unique ID when called from connectToServer\n const client = this.mcpClients.get(serverId);\n if (!client) return;\n\n // Tools - use toolsets instead of getTools for consistency\n const toolsets = await client.getToolsets();\n const flattenedTools: Record<string, any> = {};\n Object.values(toolsets).forEach((serverTools: any) => {\n Object.assign(flattenedTools, serverTools);\n });\n\n for (const [name, tool] of Object.entries<any>(flattenedTools)) {\n this.toolRegistry.set(`${serverId}:${name}`, {\n name,\n description: tool.description,\n inputSchema: tool.inputSchema,\n outputSchema: (tool as any).outputSchema,\n serverId: serverId,\n });\n }\n\n // Resources\n try {\n const res = await client.resources.list();\n for (const [, list] of Object.entries<any>(res)) {\n for (const r of list as any[]) {\n this.resourceRegistry.set(`${serverId}:${r.uri}`, {\n uri: r.uri,\n name: r.name,\n description: r.description,\n mimeType: r.mimeType,\n serverId: serverId,\n });\n }\n }\n } catch {}\n\n // Prompts\n try {\n const prompts = await client.prompts.list();\n for (const [, list] of Object.entries<any>(prompts)) {\n for (const p of list as any[]) {\n this.promptRegistry.set(`${serverId}:${p.name}`, {\n name: p.name,\n description: p.description,\n arguments: p.arguments,\n serverId: serverId,\n });\n }\n }\n } catch {}\n }\n\n getAvailableTools(): DiscoveredTool[] {\n return Array.from(this.toolRegistry.values());\n }\n\n async getToolsetsForServer(serverId: string): Promise<Record<string, any>> {\n const id = this.getServerUniqueId(serverId);\n if (!id) {\n throw new Error(`No MCP client available for server: ${serverId}`);\n }\n const client = this.mcpClients.get(id);\n if (!client) {\n throw new Error(`No MCP client available for server: ${serverId}`);\n }\n\n // Get toolsets like in the chat route - this gives us server-prefixed tools\n const toolsets = await client.getToolsets();\n\n // Flatten toolsets to get un-prefixed tool names like in chat route\n const flattenedTools: Record<string, any> = {};\n Object.values(toolsets).forEach((serverTools: any) => {\n Object.assign(flattenedTools, serverTools);\n });\n\n return flattenedTools;\n }\n getAvailableResources(): DiscoveredResource[] {\n return Array.from(this.resourceRegistry.values());\n }\n\n getResourcesForServer(serverId: string): DiscoveredResource[] {\n const id = this.getServerUniqueId(serverId);\n if (!id) return [];\n return Array.from(this.resourceRegistry.values()).filter(\n (r) => r.serverId === id,\n );\n }\n\n getAvailablePrompts(): DiscoveredPrompt[] {\n return Array.from(this.promptRegistry.values());\n }\n\n getPromptsForServer(serverId: string): DiscoveredPrompt[] {\n const id = this.getServerUniqueId(serverId);\n if (!id) return [];\n return Array.from(this.promptRegistry.values()).filter(\n (p) => p.serverId === id,\n );\n }\n\n async executeToolDirect(\n toolName: string,\n parameters: Record<string, any> = {},\n ): Promise<ToolResult> {\n // toolName may include server prefix \"serverId:tool\"\n let serverId = \"\";\n let name = toolName;\n\n if (toolName.includes(\":\")) {\n const [sid, n] = toolName.split(\":\", 2);\n // Resolve provided server identifier (original name or unique ID) to the unique ID\n const mappedId = this.getServerUniqueId(sid);\n serverId = mappedId || (this.mcpClients.has(sid) ? sid : \"\");\n name = n;\n } else {\n // Find which server has this tool by checking un-prefixed name\n for (const tool of this.toolRegistry.values()) {\n if (tool.name === toolName) {\n serverId = tool.serverId;\n name = toolName;\n break;\n }\n }\n }\n\n // If not found in registry, try to find it using toolsets from all connected servers\n if (!serverId) {\n for (const [clientServerId, client] of this.mcpClients.entries()) {\n try {\n const toolsets = await client.getToolsets();\n // Flatten toolsets to check for the tool\n const flattenedTools: Record<string, any> = {};\n Object.values(toolsets).forEach((serverTools: any) => {\n Object.assign(flattenedTools, serverTools);\n });\n\n if (flattenedTools[toolName]) {\n serverId = clientServerId;\n name = toolName;\n break;\n }\n } catch {\n // Continue to next server if this one fails\n }\n }\n }\n\n if (!serverId) {\n throw new Error(`Tool not found in any connected server: ${toolName}`);\n }\n\n const client = this.mcpClients.get(serverId);\n if (!client)\n throw new Error(`No MCP client available for server: ${serverId}`);\n\n // Use toolsets to get the actual tool (since tools might be prefixed in getTools())\n const toolsets = await client.getToolsets();\n const flattenedTools: Record<string, any> = {};\n Object.values(toolsets).forEach((serverTools: any) => {\n Object.assign(flattenedTools, serverTools);\n });\n\n const tool = flattenedTools[name];\n if (!tool)\n throw new Error(`Tool '${name}' not found in server '${serverId}'`);\n\n // Inspect input schema to choose the most likely argument shape, but be robust and\n // fall back to the alternate shape on invalid-arguments errors.\n const schema: any = (tool as any).inputSchema;\n const hasContextProperty =\n schema &&\n typeof schema === \"object\" &&\n (schema as any).properties &&\n Object.prototype.hasOwnProperty.call(\n (schema as any).properties,\n \"context\",\n );\n const requiresContext =\n hasContextProperty ||\n (schema &&\n Array.isArray((schema as any).required) &&\n (schema as any).required.includes(\"context\"));\n\n const contextWrapped = { context: parameters || {} };\n const direct = parameters || {};\n const attempts = requiresContext\n ? [contextWrapped, direct]\n : [direct, contextWrapped];\n\n let lastError: any = undefined;\n for (const args of attempts) {\n try {\n const result = await tool.execute(args);\n\n // Check if the result indicates an error\n if (result && result.isError) {\n const errorText =\n result.content && result.content[0] && result.content[0].text\n ? result.content[0].text\n : \"Unknown error\";\n throw new Error(errorText);\n }\n\n return { result };\n } catch (err: any) {\n lastError = err;\n }\n }\n throw lastError;\n }\n\n async getResource(\n resourceUri: string,\n serverId: string,\n ): Promise<ResourceContent> {\n // resourceUri may include server prefix\n let uri = resourceUri;\n // Resolve provided server identifier (original name or unique ID) to the unique ID\n const mappedId = this.getServerUniqueId(serverId);\n const resolvedServerId =\n mappedId || (this.mcpClients.has(serverId) ? serverId : undefined);\n\n if (!resolvedServerId) {\n throw new Error(`No MCP client available for server: ${serverId}`);\n }\n\n const client = this.mcpClients.get(resolvedServerId);\n if (!client) throw new Error(\"No MCP client available\");\n const content = await client.resources.read(resolvedServerId, uri);\n return { contents: content?.contents || [] };\n }\n\n async getPrompt(\n promptName: string,\n serverId: string,\n args?: Record<string, any>,\n ): Promise<PromptResult> {\n // Resolve provided server identifier (original name or unique ID) to the unique ID\n const mappedId = this.getServerUniqueId(serverId);\n const resolvedServerId =\n mappedId || (this.mcpClients.has(serverId) ? serverId : undefined);\n\n if (!resolvedServerId) {\n throw new Error(`No MCP client available for server: ${serverId}`);\n }\n\n const client = this.mcpClients.get(resolvedServerId);\n if (!client) throw new Error(\"No MCP client available\");\n const content = await client.prompts.get({\n serverName: resolvedServerId,\n name: promptName,\n args: args || {},\n });\n return { content };\n }\n\n /**\n * Handles elicitation requests from MCP servers during direct tool execution\n */\n private async handleElicitationRequest(\n elicitationRequest: ElicitationRequest,\n ): Promise<ElicitationResponse> {\n const requestId = `elicit_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`;\n\n // Create a promise that will be resolved when the user responds\n return new Promise<ElicitationResponse>((resolve, reject) => {\n this.pendingElicitations.set(requestId, { resolve, reject });\n\n // If there's an active elicitation callback, use it\n if (this.elicitationCallback) {\n this.elicitationCallback({\n requestId,\n message: elicitationRequest.message,\n schema: elicitationRequest.requestedSchema,\n })\n .then(resolve)\n .catch(reject);\n } else {\n // If no callback is set, reject with details for the tools route to handle\n const error = new Error(\"ELICITATION_REQUIRED\");\n (error as any).elicitationRequest = {\n requestId,\n message: elicitationRequest.message,\n schema: elicitationRequest.requestedSchema,\n };\n reject(error);\n }\n });\n }\n\n /**\n * Responds to a pending elicitation request\n */\n respondToElicitation(\n requestId: string,\n response: ElicitationResponse,\n ): boolean {\n const pending = this.pendingElicitations.get(requestId);\n if (!pending) {\n return false;\n }\n\n pending.resolve(response);\n this.pendingElicitations.delete(requestId);\n return true;\n }\n\n /**\n * Gets the pending elicitations map for external access\n */\n getPendingElicitations(): Map<\n string,\n {\n resolve: (response: ElicitationResponse) => void;\n reject: (error: any) => void;\n }\n > {\n return this.pendingElicitations;\n }\n\n /**\n * Sets a callback to handle elicitation requests\n */\n setElicitationCallback(\n callback: (request: {\n requestId: string;\n message: string;\n schema: any;\n }) => Promise<ElicitationResponse>,\n ): void {\n this.elicitationCallback = callback;\n }\n\n /**\n * Clears the elicitation callback\n */\n clearElicitationCallback(): void {\n this.elicitationCallback = undefined;\n }\n}\n\n// Export the class directly instead of singleton\nexport { MCPJamClientManager };\nexport default MCPJamClientManager;\n"],"mappings":"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","names":["Hono","Hono","Hono","Hono","mcpJamClientManager","Hono","TextEncoder","Hono","mcpJamClientManager","TextEncoder","requestId","response","Hono","Hono","Hono","Hono","mcpJamClientManager","Hono","TextEncoder","pendingElicitations","Hono","tools","TextEncoder","Hono","createAnthropic","createOpenAI","createOllama","Agent","tools","Hono","createModel","createAnthropic","createOpenAI","createOllama","Agent","c","Hono","Hono","MCPClient","MCPClient","servers","prompts","tool","client","toolsets","flattenedTools","Hono"]}