@borgresearch/odin-mcp 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -62,7 +62,7 @@ Each call sends `Authorization: Bearer ${ODIN_API_KEY}`. Keys belong to one orga
62
62
 
63
63
  ## Tools
64
64
 
65
- All tools accept one JSON object and return both a Markdown summary and a structured payload. Read tools are annotated `readOnlyHint: true`; every Read & Write tool is annotated `destructiveHint: true`, so clients ask before running it.
65
+ All tools accept one JSON object and return both a Markdown summary and a structured payload. The same payload is also returned as JSON text for clients that only read text content. Read tools are annotated `readOnlyHint: true`; every Read & Write tool is annotated `destructiveHint: true`, so clients ask before running it.
66
66
 
67
67
  | Name | Permission | Description |
68
68
  |------|------------|-------------|
@@ -16,7 +16,7 @@ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
16
16
  import { z } from "zod";
17
17
 
18
18
  // package.json
19
- var version = "0.3.0";
19
+ var version = "0.3.1";
20
20
 
21
21
  // src/server.ts
22
22
  var PACKAGE_VERSION = version;
@@ -74,14 +74,21 @@ function createOdinMcpServer(client, options = {}) {
74
74
  title: tool.title,
75
75
  description: tool.description,
76
76
  inputSchema: tool.inputSchema,
77
- annotations: tool.annotations
77
+ annotations: { ...tool.annotations, title: tool.title }
78
78
  },
79
79
  async (params) => {
80
80
  try {
81
81
  const { markdown, structured } = await tool.run(client, params);
82
+ const structuredContent = { markdown, ...toObject(structured) };
82
83
  return {
83
- content: [{ type: "text", text: markdown }],
84
- structuredContent: { markdown, ...toObject(structured) }
84
+ content: [
85
+ { type: "text", text: markdown },
86
+ {
87
+ type: "text",
88
+ text: JSON.stringify(structuredContent)
89
+ }
90
+ ],
91
+ structuredContent
85
92
  };
86
93
  } catch (error) {
87
94
  return {
@@ -110,4 +117,4 @@ export {
110
117
  PACKAGE_VERSION,
111
118
  createOdinMcpServer
112
119
  };
113
- //# sourceMappingURL=chunk-ODZB3YP2.js.map
120
+ //# sourceMappingURL=chunk-MHMO7K4D.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/server.ts","../package.json"],"sourcesContent":["import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { version } from \"../package.json\";\nimport { OdinApiError, type OdinClient } from \"./client.js\";\nimport {\n buildFixFindingPrompt,\n buildServerInstructions,\n buildSetupPrompt,\n} from \"./guidance.js\";\nimport { ODIN_TOOLS } from \"./tools.js\";\n\nexport const PACKAGE_VERSION = version;\n\nexport interface OdinMcpServerOptions {\n /** Public Odin origin for links in guidance. Defaults to production. */\n appUrl?: string;\n}\n\nexport function createOdinMcpServer(\n client: OdinClient,\n options: OdinMcpServerOptions = {},\n) {\n const { appUrl } = options;\n const server = new McpServer(\n { name: \"@borgresearch/odin-mcp\", version: PACKAGE_VERSION },\n { instructions: buildServerInstructions({ appUrl }) },\n );\n\n server.registerPrompt(\n \"setup\",\n {\n title: \"Set up Odin\",\n description:\n \"Learn what Odin does, check what is set up, get recommendations for this repository and reach a first result.\",\n },\n () => ({\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: buildSetupPrompt({ appUrl }),\n },\n },\n ],\n }),\n );\n\n server.registerPrompt(\n \"fix_finding\",\n {\n title: \"Fix an Odin finding\",\n description:\n \"Fix one finding in this repository, open a pull request and link it so Odin can retest the fix.\",\n argsSchema: {\n finding: z\n .string()\n .max(100)\n .optional()\n .describe(\n \"Finding ID such as ODI-12. Leave empty to pick the most severe open finding.\",\n ),\n },\n },\n ({ finding }) => ({\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: buildFixFindingPrompt({ appUrl, finding }),\n },\n },\n ],\n }),\n );\n\n for (const tool of ODIN_TOOLS) {\n server.registerTool(\n tool.name,\n {\n title: tool.title,\n description: tool.description,\n inputSchema: tool.inputSchema,\n annotations: { ...tool.annotations, title: tool.title },\n },\n async (params: unknown) => {\n try {\n const { markdown, structured } = await tool.run(client, params);\n const structuredContent = { markdown, ...toObject(structured) };\n return {\n content: [\n { type: \"text\" as const, text: markdown },\n {\n type: \"text\" as const,\n text: JSON.stringify(structuredContent),\n },\n ],\n structuredContent,\n };\n } catch (error) {\n return {\n isError: true,\n content: [{ type: \"text\" as const, text: toErrorMessage(error) }],\n };\n }\n },\n );\n }\n\n return server;\n}\n\nfunction toObject(value: unknown): Record<string, unknown> {\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n return { data: value };\n}\n\nfunction toErrorMessage(error: unknown): string {\n if (error instanceof OdinApiError) return error.message;\n if (error instanceof Error) return `Unexpected error: ${error.message}`;\n return `Unexpected error: ${String(error)}`;\n}\n","{\n \"name\": \"@borgresearch/odin-mcp\",\n \"version\": \"0.3.1\",\n \"mcpName\": \"io.github.BorgDevelopment/odin-mcp\",\n \"description\": \"MCP server for the Odin security API\",\n \"keywords\": [\n \"mcp\",\n \"model-context-protocol\",\n \"odin\",\n \"security\"\n ],\n \"homepage\": \"https://docs.borghq.io/platform/odin-mcp\",\n \"bugs\": {\n \"email\": \"mail@borghq.io\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/BorgDevelopment/borg-platform.git\",\n \"directory\": \"frontend/packages/odin-mcp\"\n },\n \"license\": \"MIT\",\n \"author\": \"Borg Research\",\n \"type\": \"module\",\n \"bin\": {\n \"odin-mcp\": \"./dist/index.js\"\n },\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n },\n \"./server\": {\n \"types\": \"./dist/server.d.ts\",\n \"import\": \"./dist/server.js\"\n },\n \"./http\": {\n \"types\": \"./dist/http.d.ts\",\n \"import\": \"./dist/http.js\"\n },\n \"./client\": {\n \"types\": \"./dist/client.d.ts\",\n \"import\": \"./dist/client.js\"\n },\n \"./guidance\": {\n \"types\": \"./dist/guidance.d.ts\",\n \"import\": \"./dist/guidance.js\"\n },\n \"./tools\": {\n \"types\": \"./dist/tools.d.ts\",\n \"import\": \"./dist/tools.js\"\n }\n },\n \"files\": [\n \"dist\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org/\"\n },\n \"engines\": {\n \"node\": \">=24.0.0\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"test:run\": \"vitest run\",\n \"lint\": \"biome check .\",\n \"format\": \"biome format --write .\",\n \"inspect\": \"mcp-inspector node dist/index.js\",\n \"inspect:dev\": \"pnpm build && pnpm inspect\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.31.0\",\n \"zod\": \"^4.3.6\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"2.3.14\",\n \"@modelcontextprotocol/inspector\": \"^0.21.2\",\n \"@types/node\": \"^24.10.1\",\n \"tsup\": \"^8.3.5\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.1.11\"\n },\n \"packageManager\": \"pnpm@11.2.2\"\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,iBAAiB;AAC1B,SAAS,SAAS;;;ACChB,cAAW;;;ADSN,IAAM,kBAAkB;AAOxB,SAAS,oBACd,QACA,UAAgC,CAAC,GACjC;AACA,QAAM,EAAE,OAAO,IAAI;AACnB,QAAM,SAAS,IAAI;AAAA,IACjB,EAAE,MAAM,0BAA0B,SAAS,gBAAgB;AAAA,IAC3D,EAAE,cAAc,wBAAwB,EAAE,OAAO,CAAC,EAAE;AAAA,EACtD;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,IACJ;AAAA,IACA,OAAO;AAAA,MACL,UAAU;AAAA,QACR;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,YACP,MAAM;AAAA,YACN,MAAM,iBAAiB,EAAE,OAAO,CAAC;AAAA,UACnC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MACF,YAAY;AAAA,QACV,SAAS,EACN,OAAO,EACP,IAAI,GAAG,EACP,SAAS,EACT;AAAA,UACC;AAAA,QACF;AAAA,MACJ;AAAA,IACF;AAAA,IACA,CAAC,EAAE,QAAQ,OAAO;AAAA,MAChB,UAAU;AAAA,QACR;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,YACP,MAAM;AAAA,YACN,MAAM,sBAAsB,EAAE,QAAQ,QAAQ,CAAC;AAAA,UACjD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,aAAW,QAAQ,YAAY;AAC7B,WAAO;AAAA,MACL,KAAK;AAAA,MACL;AAAA,QACE,OAAO,KAAK;AAAA,QACZ,aAAa,KAAK;AAAA,QAClB,aAAa,KAAK;AAAA,QAClB,aAAa,EAAE,GAAG,KAAK,aAAa,OAAO,KAAK,MAAM;AAAA,MACxD;AAAA,MACA,OAAO,WAAoB;AACzB,YAAI;AACF,gBAAM,EAAE,UAAU,WAAW,IAAI,MAAM,KAAK,IAAI,QAAQ,MAAM;AAC9D,gBAAM,oBAAoB,EAAE,UAAU,GAAG,SAAS,UAAU,EAAE;AAC9D,iBAAO;AAAA,YACL,SAAS;AAAA,cACP,EAAE,MAAM,QAAiB,MAAM,SAAS;AAAA,cACxC;AAAA,gBACE,MAAM;AAAA,gBACN,MAAM,KAAK,UAAU,iBAAiB;AAAA,cACxC;AAAA,YACF;AAAA,YACA;AAAA,UACF;AAAA,QACF,SAAS,OAAO;AACd,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,eAAe,KAAK,EAAE,CAAC;AAAA,UAClE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,SAAS,OAAyC;AACzD,MAAI,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG;AAC/D,WAAO;AAAA,EACT;AACA,SAAO,EAAE,MAAM,MAAM;AACvB;AAEA,SAAS,eAAe,OAAwB;AAC9C,MAAI,iBAAiB,aAAc,QAAO,MAAM;AAChD,MAAI,iBAAiB,MAAO,QAAO,qBAAqB,MAAM,OAAO;AACrE,SAAO,qBAAqB,OAAO,KAAK,CAAC;AAC3C;","names":[]}
package/dist/http.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  createOdinMcpServer
4
- } from "./chunk-ODZB3YP2.js";
4
+ } from "./chunk-MHMO7K4D.js";
5
5
  import "./chunk-4LCKW236.js";
6
6
  import "./chunk-D5FYYTYV.js";
7
7
  import "./chunk-XHJYVUHG.js";
package/dist/index.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  PACKAGE_VERSION,
4
4
  createOdinMcpServer
5
- } from "./chunk-ODZB3YP2.js";
5
+ } from "./chunk-MHMO7K4D.js";
6
6
  import "./chunk-4LCKW236.js";
7
7
  import "./chunk-D5FYYTYV.js";
8
8
  import {
package/dist/server.js CHANGED
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  PACKAGE_VERSION,
4
4
  createOdinMcpServer
5
- } from "./chunk-ODZB3YP2.js";
5
+ } from "./chunk-MHMO7K4D.js";
6
6
  import "./chunk-4LCKW236.js";
7
7
  import "./chunk-D5FYYTYV.js";
8
8
  import "./chunk-XHJYVUHG.js";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@borgresearch/odin-mcp",
3
- "version": "0.3.0",
3
+ "version": "0.3.1",
4
4
  "mcpName": "io.github.BorgDevelopment/odin-mcp",
5
5
  "description": "MCP server for the Odin security API",
6
6
  "keywords": [
@@ -9,9 +9,9 @@
9
9
  "odin",
10
10
  "security"
11
11
  ],
12
- "homepage": "https://github.com/BorgDevelopment/borg-platform/tree/develop/frontend/packages/odin-mcp",
12
+ "homepage": "https://docs.borghq.io/platform/odin-mcp",
13
13
  "bugs": {
14
- "url": "https://github.com/BorgDevelopment/borg-platform/issues"
14
+ "email": "mail@borghq.io"
15
15
  },
16
16
  "repository": {
17
17
  "type": "git",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/server.ts","../package.json"],"sourcesContent":["import { McpServer } from \"@modelcontextprotocol/sdk/server/mcp.js\";\nimport { z } from \"zod\";\nimport { version } from \"../package.json\";\nimport { OdinApiError, type OdinClient } from \"./client.js\";\nimport {\n buildFixFindingPrompt,\n buildServerInstructions,\n buildSetupPrompt,\n} from \"./guidance.js\";\nimport { ODIN_TOOLS } from \"./tools.js\";\n\nexport const PACKAGE_VERSION = version;\n\nexport interface OdinMcpServerOptions {\n /** Public Odin origin for links in guidance. Defaults to production. */\n appUrl?: string;\n}\n\nexport function createOdinMcpServer(\n client: OdinClient,\n options: OdinMcpServerOptions = {},\n) {\n const { appUrl } = options;\n const server = new McpServer(\n { name: \"@borgresearch/odin-mcp\", version: PACKAGE_VERSION },\n { instructions: buildServerInstructions({ appUrl }) },\n );\n\n server.registerPrompt(\n \"setup\",\n {\n title: \"Set up Odin\",\n description:\n \"Learn what Odin does, check what is set up, get recommendations for this repository and reach a first result.\",\n },\n () => ({\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: buildSetupPrompt({ appUrl }),\n },\n },\n ],\n }),\n );\n\n server.registerPrompt(\n \"fix_finding\",\n {\n title: \"Fix an Odin finding\",\n description:\n \"Fix one finding in this repository, open a pull request and link it so Odin can retest the fix.\",\n argsSchema: {\n finding: z\n .string()\n .max(100)\n .optional()\n .describe(\n \"Finding ID such as ODI-12. Leave empty to pick the most severe open finding.\",\n ),\n },\n },\n ({ finding }) => ({\n messages: [\n {\n role: \"user\" as const,\n content: {\n type: \"text\" as const,\n text: buildFixFindingPrompt({ appUrl, finding }),\n },\n },\n ],\n }),\n );\n\n for (const tool of ODIN_TOOLS) {\n server.registerTool(\n tool.name,\n {\n title: tool.title,\n description: tool.description,\n inputSchema: tool.inputSchema,\n annotations: tool.annotations,\n },\n async (params: unknown) => {\n try {\n const { markdown, structured } = await tool.run(client, params);\n return {\n content: [{ type: \"text\" as const, text: markdown }],\n structuredContent: { markdown, ...toObject(structured) },\n };\n } catch (error) {\n return {\n isError: true,\n content: [{ type: \"text\" as const, text: toErrorMessage(error) }],\n };\n }\n },\n );\n }\n\n return server;\n}\n\nfunction toObject(value: unknown): Record<string, unknown> {\n if (value && typeof value === \"object\" && !Array.isArray(value)) {\n return value as Record<string, unknown>;\n }\n return { data: value };\n}\n\nfunction toErrorMessage(error: unknown): string {\n if (error instanceof OdinApiError) return error.message;\n if (error instanceof Error) return `Unexpected error: ${error.message}`;\n return `Unexpected error: ${String(error)}`;\n}\n","{\n \"name\": \"@borgresearch/odin-mcp\",\n \"version\": \"0.3.0\",\n \"mcpName\": \"io.github.BorgDevelopment/odin-mcp\",\n \"description\": \"MCP server for the Odin security API\",\n \"keywords\": [\n \"mcp\",\n \"model-context-protocol\",\n \"odin\",\n \"security\"\n ],\n \"homepage\": \"https://github.com/BorgDevelopment/borg-platform/tree/develop/frontend/packages/odin-mcp\",\n \"bugs\": {\n \"url\": \"https://github.com/BorgDevelopment/borg-platform/issues\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/BorgDevelopment/borg-platform.git\",\n \"directory\": \"frontend/packages/odin-mcp\"\n },\n \"license\": \"MIT\",\n \"author\": \"Borg Research\",\n \"type\": \"module\",\n \"bin\": {\n \"odin-mcp\": \"./dist/index.js\"\n },\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index.js\"\n },\n \"./server\": {\n \"types\": \"./dist/server.d.ts\",\n \"import\": \"./dist/server.js\"\n },\n \"./http\": {\n \"types\": \"./dist/http.d.ts\",\n \"import\": \"./dist/http.js\"\n },\n \"./client\": {\n \"types\": \"./dist/client.d.ts\",\n \"import\": \"./dist/client.js\"\n },\n \"./guidance\": {\n \"types\": \"./dist/guidance.d.ts\",\n \"import\": \"./dist/guidance.js\"\n },\n \"./tools\": {\n \"types\": \"./dist/tools.d.ts\",\n \"import\": \"./dist/tools.js\"\n }\n },\n \"files\": [\n \"dist\",\n \"README.md\",\n \"LICENSE\"\n ],\n \"publishConfig\": {\n \"access\": \"public\",\n \"registry\": \"https://registry.npmjs.org/\"\n },\n \"engines\": {\n \"node\": \">=24.0.0\"\n },\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\",\n \"typecheck\": \"tsc --noEmit\",\n \"test\": \"vitest run\",\n \"test:run\": \"vitest run\",\n \"lint\": \"biome check .\",\n \"format\": \"biome format --write .\",\n \"inspect\": \"mcp-inspector node dist/index.js\",\n \"inspect:dev\": \"pnpm build && pnpm inspect\"\n },\n \"dependencies\": {\n \"@modelcontextprotocol/sdk\": \"^1.31.0\",\n \"zod\": \"^4.3.6\"\n },\n \"devDependencies\": {\n \"@biomejs/biome\": \"2.3.14\",\n \"@modelcontextprotocol/inspector\": \"^0.21.2\",\n \"@types/node\": \"^24.10.1\",\n \"tsup\": \"^8.3.5\",\n \"typescript\": \"^5.9.3\",\n \"vitest\": \"^4.1.11\"\n },\n \"packageManager\": \"pnpm@11.2.2\"\n}\n"],"mappings":";;;;;;;;;;;;;;AAAA,SAAS,iBAAiB;AAC1B,SAAS,SAAS;;;ACChB,cAAW;;;ADSN,IAAM,kBAAkB;AAOxB,SAAS,oBACd,QACA,UAAgC,CAAC,GACjC;AACA,QAAM,EAAE,OAAO,IAAI;AACnB,QAAM,SAAS,IAAI;AAAA,IACjB,EAAE,MAAM,0BAA0B,SAAS,gBAAgB;AAAA,IAC3D,EAAE,cAAc,wBAAwB,EAAE,OAAO,CAAC,EAAE;AAAA,EACtD;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,IACJ;AAAA,IACA,OAAO;AAAA,MACL,UAAU;AAAA,QACR;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,YACP,MAAM;AAAA,YACN,MAAM,iBAAiB,EAAE,OAAO,CAAC;AAAA,UACnC;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MACE,OAAO;AAAA,MACP,aACE;AAAA,MACF,YAAY;AAAA,QACV,SAAS,EACN,OAAO,EACP,IAAI,GAAG,EACP,SAAS,EACT;AAAA,UACC;AAAA,QACF;AAAA,MACJ;AAAA,IACF;AAAA,IACA,CAAC,EAAE,QAAQ,OAAO;AAAA,MAChB,UAAU;AAAA,QACR;AAAA,UACE,MAAM;AAAA,UACN,SAAS;AAAA,YACP,MAAM;AAAA,YACN,MAAM,sBAAsB,EAAE,QAAQ,QAAQ,CAAC;AAAA,UACjD;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,aAAW,QAAQ,YAAY;AAC7B,WAAO;AAAA,MACL,KAAK;AAAA,MACL;AAAA,QACE,OAAO,KAAK;AAAA,QACZ,aAAa,KAAK;AAAA,QAClB,aAAa,KAAK;AAAA,QAClB,aAAa,KAAK;AAAA,MACpB;AAAA,MACA,OAAO,WAAoB;AACzB,YAAI;AACF,gBAAM,EAAE,UAAU,WAAW,IAAI,MAAM,KAAK,IAAI,QAAQ,MAAM;AAC9D,iBAAO;AAAA,YACL,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,SAAS,CAAC;AAAA,YACnD,mBAAmB,EAAE,UAAU,GAAG,SAAS,UAAU,EAAE;AAAA,UACzD;AAAA,QACF,SAAS,OAAO;AACd,iBAAO;AAAA,YACL,SAAS;AAAA,YACT,SAAS,CAAC,EAAE,MAAM,QAAiB,MAAM,eAAe,KAAK,EAAE,CAAC;AAAA,UAClE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,SAAS,OAAyC;AACzD,MAAI,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK,GAAG;AAC/D,WAAO;AAAA,EACT;AACA,SAAO,EAAE,MAAM,MAAM;AACvB;AAEA,SAAS,eAAe,OAAwB;AAC9C,MAAI,iBAAiB,aAAc,QAAO,MAAM;AAChD,MAAI,iBAAiB,MAAO,QAAO,qBAAqB,MAAM,OAAO;AACrE,SAAO,qBAAqB,OAAO,KAAK,CAAC;AAC3C;","names":[]}