@sundaeswap/sprinkles 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +178 -181
- package/dist/cjs/Sprinkle/__tests__/builtin-actions.test.js +4 -4
- package/dist/cjs/Sprinkle/__tests__/builtin-actions.test.js.map +1 -1
- package/dist/cjs/Sprinkle/__tests__/cli-adapter.test.js +25 -3
- package/dist/cjs/Sprinkle/__tests__/cli-adapter.test.js.map +1 -1
- package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js +15 -1
- package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -1
- package/dist/cjs/Sprinkle/__tests__/mcp-adapter.test.js +7 -9
- package/dist/cjs/Sprinkle/__tests__/mcp-adapter.test.js.map +1 -1
- package/dist/cjs/Sprinkle/__tests__/native-script.test.js +390 -0
- package/dist/cjs/Sprinkle/__tests__/native-script.test.js.map +1 -0
- package/dist/cjs/Sprinkle/__tests__/utility-actions.test.js +367 -0
- package/dist/cjs/Sprinkle/__tests__/utility-actions.test.js.map +1 -0
- package/dist/cjs/Sprinkle/actions/builtin/addressbook-actions.js +164 -0
- package/dist/cjs/Sprinkle/actions/builtin/addressbook-actions.js.map +1 -0
- package/dist/cjs/Sprinkle/actions/builtin/index.js +60 -3
- package/dist/cjs/Sprinkle/actions/builtin/index.js.map +1 -1
- package/dist/cjs/Sprinkle/actions/builtin/native-script.js +139 -0
- package/dist/cjs/Sprinkle/actions/builtin/native-script.js.map +1 -0
- package/dist/cjs/Sprinkle/actions/builtin/utility-actions.js +218 -0
- package/dist/cjs/Sprinkle/actions/builtin/utility-actions.js.map +1 -0
- package/dist/cjs/Sprinkle/actions/cli-adapter.js +20 -2
- package/dist/cjs/Sprinkle/actions/cli-adapter.js.map +1 -1
- package/dist/cjs/Sprinkle/actions/index.js +12 -0
- package/dist/cjs/Sprinkle/actions/index.js.map +1 -1
- package/dist/cjs/Sprinkle/actions/mcp-adapter.js +146 -4
- package/dist/cjs/Sprinkle/actions/mcp-adapter.js.map +1 -1
- package/dist/cjs/Sprinkle/index.js +267 -5
- package/dist/cjs/Sprinkle/index.js.map +1 -1
- package/dist/cjs/Sprinkle/schemas.js +17 -1
- package/dist/cjs/Sprinkle/schemas.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/builtin-actions.test.js +4 -4
- package/dist/esm/Sprinkle/__tests__/builtin-actions.test.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/cli-adapter.test.js +25 -3
- package/dist/esm/Sprinkle/__tests__/cli-adapter.test.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js +15 -1
- package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/mcp-adapter.test.js +7 -9
- package/dist/esm/Sprinkle/__tests__/mcp-adapter.test.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/native-script.test.js +388 -0
- package/dist/esm/Sprinkle/__tests__/native-script.test.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/utility-actions.test.js +365 -0
- package/dist/esm/Sprinkle/__tests__/utility-actions.test.js.map +1 -0
- package/dist/esm/Sprinkle/actions/builtin/addressbook-actions.js +159 -0
- package/dist/esm/Sprinkle/actions/builtin/addressbook-actions.js.map +1 -0
- package/dist/esm/Sprinkle/actions/builtin/index.js +8 -3
- package/dist/esm/Sprinkle/actions/builtin/index.js.map +1 -1
- package/dist/esm/Sprinkle/actions/builtin/native-script.js +133 -0
- package/dist/esm/Sprinkle/actions/builtin/native-script.js.map +1 -0
- package/dist/esm/Sprinkle/actions/builtin/utility-actions.js +213 -0
- package/dist/esm/Sprinkle/actions/builtin/utility-actions.js.map +1 -0
- package/dist/esm/Sprinkle/actions/cli-adapter.js +20 -2
- package/dist/esm/Sprinkle/actions/cli-adapter.js.map +1 -1
- package/dist/esm/Sprinkle/actions/index.js +1 -1
- package/dist/esm/Sprinkle/actions/index.js.map +1 -1
- package/dist/esm/Sprinkle/actions/mcp-adapter.js +145 -5
- package/dist/esm/Sprinkle/actions/mcp-adapter.js.map +1 -1
- package/dist/esm/Sprinkle/index.js +259 -8
- package/dist/esm/Sprinkle/index.js.map +1 -1
- package/dist/esm/Sprinkle/schemas.js +16 -0
- package/dist/esm/Sprinkle/schemas.js.map +1 -1
- package/dist/types/Sprinkle/actions/builtin/addressbook-actions.d.ts +50 -0
- package/dist/types/Sprinkle/actions/builtin/addressbook-actions.d.ts.map +1 -0
- package/dist/types/Sprinkle/actions/builtin/index.d.ts +6 -2
- package/dist/types/Sprinkle/actions/builtin/index.d.ts.map +1 -1
- package/dist/types/Sprinkle/actions/builtin/native-script.d.ts +27 -0
- package/dist/types/Sprinkle/actions/builtin/native-script.d.ts.map +1 -0
- package/dist/types/Sprinkle/actions/builtin/utility-actions.d.ts +48 -0
- package/dist/types/Sprinkle/actions/builtin/utility-actions.d.ts.map +1 -0
- package/dist/types/Sprinkle/actions/cli-adapter.d.ts.map +1 -1
- package/dist/types/Sprinkle/actions/index.d.ts +2 -1
- package/dist/types/Sprinkle/actions/index.d.ts.map +1 -1
- package/dist/types/Sprinkle/actions/mcp-adapter.d.ts +24 -0
- package/dist/types/Sprinkle/actions/mcp-adapter.d.ts.map +1 -1
- package/dist/types/Sprinkle/index.d.ts +3 -1
- package/dist/types/Sprinkle/index.d.ts.map +1 -1
- package/dist/types/Sprinkle/schemas.d.ts +72 -0
- package/dist/types/Sprinkle/schemas.d.ts.map +1 -1
- package/dist/types/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/Sprinkle/__tests__/builtin-actions.test.ts +4 -4
- package/src/Sprinkle/__tests__/cli-adapter.test.ts +24 -3
- package/src/Sprinkle/__tests__/fill-in-struct.test.ts +23 -1
- package/src/Sprinkle/__tests__/mcp-adapter.test.ts +7 -5
- package/src/Sprinkle/__tests__/native-script.test.ts +341 -0
- package/src/Sprinkle/__tests__/utility-actions.test.ts +348 -0
- package/src/Sprinkle/actions/builtin/addressbook-actions.ts +168 -0
- package/src/Sprinkle/actions/builtin/index.ts +41 -2
- package/src/Sprinkle/actions/builtin/native-script.ts +165 -0
- package/src/Sprinkle/actions/builtin/utility-actions.ts +285 -0
- package/src/Sprinkle/actions/cli-adapter.ts +18 -2
- package/src/Sprinkle/actions/index.ts +2 -1
- package/src/Sprinkle/actions/mcp-adapter.ts +179 -4
- package/src/Sprinkle/index.ts +261 -3
- package/src/Sprinkle/schemas.ts +20 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"mcp-adapter.test.js","names":["describe","expect","test","mock","beforeEach","spyOn","Type","typeboxToJsonSchema","coerceMcpInput","getMcpSdk","createMcpServer","String","toEqual","type","Number","Integer","Boolean","Null","result","BigInt","pattern","description","schema","sensitive","toBe","writeOnly","Array","items","Object","name","count","properties","required","arrayContaining","outer","inner","x","props","optional","Optional","toContain","not","a","b","length","Union","anyOf","bigIntMember","find","m","toBeDefined","Literal","const","title","examples","default","minimum","maximum","keys","every","k","startsWith","$id","warnSpy","console","mockImplementation","unknownSchema","Symbol","for","toHaveBeenCalled","mockRestore","toBeNull","undefined","toBeUndefined","amount","label","input","stake","fee","memo","sdk","McpServer","registeredTools","mockMcpServer","MockMcpServerClass","tool","handler","push","module","makeMockSprinkle","actions","actionMap","Map","map","listActions","getAction","get","settings","sprinkle","inputSchema","who","outputSchema","greeting","execute","toHaveLength","balance","names","t","message","response","content","data","JSON","parse","text","ok","isError","Error","errorData","error","capturedInput","value"],"sources":["../../../../src/Sprinkle/__tests__/mcp-adapter.test.ts"],"sourcesContent":["import { describe, expect, test, mock, beforeEach, spyOn } from \"bun:test\";\nimport { Type } from \"@sinclair/typebox\";\nimport {\n typeboxToJsonSchema,\n coerceMcpInput,\n getMcpSdk,\n createMcpServer,\n} from \"../actions/index.js\";\n\n// ---------------------------------------------------------------------------\n// typeboxToJsonSchema\n// ---------------------------------------------------------------------------\n\ndescribe(\"typeboxToJsonSchema\", () => {\n // --- Primitive types ---\n\n test(\"String schema -> { type: 'string' }\", () => {\n expect(typeboxToJsonSchema(Type.String())).toEqual({ type: \"string\" });\n });\n\n test(\"Number schema -> { type: 'number' }\", () => {\n expect(typeboxToJsonSchema(Type.Number())).toEqual({ type: \"number\" });\n });\n\n test(\"Integer schema -> { type: 'integer' }\", () => {\n expect(typeboxToJsonSchema(Type.Integer())).toEqual({ type: \"integer\" });\n });\n\n test(\"Boolean schema -> { type: 'boolean' }\", () => {\n expect(typeboxToJsonSchema(Type.Boolean())).toEqual({ type: \"boolean\" });\n });\n\n test(\"Null schema -> { type: 'null' }\", () => {\n expect(typeboxToJsonSchema(Type.Null())).toEqual({ type: \"null\" });\n });\n\n // --- BigInt ---\n\n test(\"BigInt schema -> { type: 'string', pattern: '^-?[0-9]+$' } with description\", () => {\n const result = typeboxToJsonSchema(Type.BigInt());\n expect(result).toEqual({\n type: \"string\",\n pattern: \"^-?[0-9]+$\",\n description: \"BigInt value as string\",\n });\n });\n\n // --- Sensitive string ---\n\n test(\"Sensitive string schema includes writeOnly: true\", () => {\n const schema = Type.String({ sensitive: true } as any);\n const result = typeboxToJsonSchema(schema);\n expect(result.type).toBe(\"string\");\n expect(result.writeOnly).toBe(true);\n });\n\n test(\"Non-sensitive string does not include writeOnly\", () => {\n const result = typeboxToJsonSchema(Type.String());\n expect(\"writeOnly\" in result).toBe(false);\n });\n\n // --- Array ---\n\n test(\"Array of strings -> { type: 'array', items: { type: 'string' } }\", () => {\n const result = typeboxToJsonSchema(Type.Array(Type.String()));\n expect(result).toEqual({\n type: \"array\",\n items: { type: \"string\" },\n });\n });\n\n test(\"Array of integers -> { type: 'array', items: { type: 'integer' } }\", () => {\n const result = typeboxToJsonSchema(Type.Array(Type.Integer()));\n expect(result).toEqual({\n type: \"array\",\n items: { type: \"integer\" },\n });\n });\n\n test(\"Array of BigInt -> items maps BigInt to string pattern\", () => {\n const result = typeboxToJsonSchema(Type.Array(Type.BigInt()));\n expect(result).toEqual({\n type: \"array\",\n items: {\n type: \"string\",\n pattern: \"^-?[0-9]+$\",\n description: \"BigInt value as string\",\n },\n });\n });\n\n // --- Object ---\n\n test(\"Nested object -> recursive properties with required array\", () => {\n const schema = Type.Object({\n name: Type.String(),\n count: Type.Integer(),\n });\n const result = typeboxToJsonSchema(schema);\n expect(result.type).toBe(\"object\");\n expect(result.properties).toEqual({\n name: { type: \"string\" },\n count: { type: \"integer\" },\n });\n expect(result.required).toEqual(expect.arrayContaining([\"name\", \"count\"]));\n });\n\n test(\"Nested object with nested object property converts recursively\", () => {\n const schema = Type.Object({\n outer: Type.String(),\n inner: Type.Object({ x: Type.Number() }),\n });\n const result = typeboxToJsonSchema(schema);\n const props = result.properties as Record<string, unknown>;\n expect(props.inner).toEqual({\n type: \"object\",\n properties: { x: { type: \"number\" } },\n required: [\"x\"],\n });\n });\n\n // --- Optional fields ---\n\n test(\"Optional field is not listed in required array\", () => {\n const schema = Type.Object({\n required: Type.String(),\n optional: Type.Optional(Type.String()),\n });\n const result = typeboxToJsonSchema(schema);\n const required = result.required as string[];\n expect(required).toContain(\"required\");\n expect(required).not.toContain(\"optional\");\n });\n\n test(\"Object with all optional fields has no required array (or empty)\", () => {\n const schema = Type.Object({\n a: Type.Optional(Type.String()),\n b: Type.Optional(Type.Number()),\n });\n const result = typeboxToJsonSchema(schema);\n // Either no 'required' key or empty array\n const required = result.required as string[] | undefined;\n expect(!required || required.length === 0).toBe(true);\n });\n\n // --- Union types ---\n\n test(\"Union of string and number -> { anyOf: [...] }\", () => {\n const schema = Type.Union([Type.String(), Type.Number()]);\n const result = typeboxToJsonSchema(schema);\n expect(result.anyOf).toEqual([{ type: \"string\" }, { type: \"number\" }]);\n });\n\n test(\"Union containing BigInt -> BigInt member maps to string pattern\", () => {\n const schema = Type.Union([Type.String(), Type.BigInt()]);\n const result = typeboxToJsonSchema(schema);\n const anyOf = result.anyOf as Record<string, unknown>[];\n const bigIntMember = anyOf.find((m) => m.pattern === \"^-?[0-9]+$\");\n expect(bigIntMember).toBeDefined();\n });\n\n // --- Literal types ---\n\n test(\"String literal -> { type: 'string', const: value }\", () => {\n const result = typeboxToJsonSchema(Type.Literal(\"hello\"));\n expect(result).toEqual({ type: \"string\", const: \"hello\" });\n });\n\n test(\"Number literal -> { type: 'number', const: value }\", () => {\n const result = typeboxToJsonSchema(Type.Literal(42));\n expect(result).toEqual({ type: \"number\", const: 42 });\n });\n\n test(\"Boolean literal -> { type: 'boolean', const: value }\", () => {\n const result = typeboxToJsonSchema(Type.Literal(true));\n expect(result).toEqual({ type: \"boolean\", const: true });\n });\n\n // --- Annotations: description, title, examples, default ---\n\n test(\"String schema preserves description annotation\", () => {\n const result = typeboxToJsonSchema(Type.String({ description: \"A name\" }));\n expect(result.description).toBe(\"A name\");\n });\n\n test(\"String schema preserves title annotation\", () => {\n const result = typeboxToJsonSchema(Type.String({ title: \"My Title\" }));\n expect(result.title).toBe(\"My Title\");\n });\n\n test(\"String schema preserves examples annotation\", () => {\n const result = typeboxToJsonSchema(Type.String({ examples: [\"foo\", \"bar\"] }));\n expect(result.examples).toEqual([\"foo\", \"bar\"]);\n });\n\n test(\"String schema preserves default annotation\", () => {\n const result = typeboxToJsonSchema(Type.String({ default: \"fallback\" }));\n expect(result.default).toBe(\"fallback\");\n });\n\n test(\"Number schema preserves description annotation\", () => {\n const result = typeboxToJsonSchema(Type.Number({ description: \"A count\" }));\n expect(result.description).toBe(\"A count\");\n });\n\n test(\"Number schema preserves minimum and maximum\", () => {\n const result = typeboxToJsonSchema(Type.Number({ minimum: 0, maximum: 100 }));\n expect(result.minimum).toBe(0);\n expect(result.maximum).toBe(100);\n });\n\n test(\"Integer schema preserves minimum and maximum\", () => {\n const result = typeboxToJsonSchema(Type.Integer({ minimum: 1, maximum: 10 }));\n expect(result.minimum).toBe(1);\n expect(result.maximum).toBe(10);\n });\n\n test(\"Boolean schema preserves default annotation\", () => {\n const result = typeboxToJsonSchema(Type.Boolean({ default: false }));\n expect(result.default).toBe(false);\n });\n\n // --- TypeBox internals stripped ---\n\n test(\"Output does not contain [Kind] symbol key\", () => {\n const result = typeboxToJsonSchema(Type.String());\n const keys = Object.keys(result);\n expect(keys.every((k) => !k.startsWith(\"[\"))).toBe(true);\n });\n\n test(\"Output does not contain $id key\", () => {\n const schema = Type.String();\n // Force-add a $id to confirm it is not emitted\n (schema as any).$id = \"some-id\";\n const result = typeboxToJsonSchema(schema);\n expect(\"$id\" in result).toBe(false);\n });\n\n // --- Unknown / empty schema fallback ---\n\n test(\"Unknown TypeBox kind emits empty schema {} with console.warn\", () => {\n const warnSpy = spyOn(console, \"warn\").mockImplementation(() => {});\n const unknownSchema = { [Symbol.for(\"TypeBox.Kind\")]: \"UnknownKind\" } as any;\n const result = typeboxToJsonSchema(unknownSchema);\n expect(result).toEqual({});\n expect(warnSpy).toHaveBeenCalled();\n warnSpy.mockRestore();\n });\n});\n\n// ---------------------------------------------------------------------------\n// coerceMcpInput\n// ---------------------------------------------------------------------------\n\ndescribe(\"coerceMcpInput\", () => {\n // --- BigInt coercion ---\n\n test(\"coerces BigInt string to BigInt when schema expects BigInt\", () => {\n const result = coerceMcpInput(\"12345\", Type.BigInt());\n expect(result).toBe(BigInt(\"12345\"));\n });\n\n test(\"coerces negative BigInt string to BigInt\", () => {\n const result = coerceMcpInput(\"-9876543210\", Type.BigInt());\n expect(result).toBe(BigInt(\"-9876543210\"));\n });\n\n test(\"coerces numeric input to BigInt via Math.trunc\", () => {\n const result = coerceMcpInput(99.9, Type.BigInt());\n expect(result).toBe(BigInt(99));\n });\n\n test(\"passes through already-BigInt value unchanged\", () => {\n const result = coerceMcpInput(BigInt(42), Type.BigInt());\n expect(result).toBe(BigInt(42));\n });\n\n test(\"non-numeric string left as-is for BigInt schema\", () => {\n const result = coerceMcpInput(\"not-a-number\", Type.BigInt());\n expect(result).toBe(\"not-a-number\");\n });\n\n // --- Non-BigInt types passed through ---\n\n test(\"string value passes through unchanged for String schema\", () => {\n const result = coerceMcpInput(\"hello\", Type.String());\n expect(result).toBe(\"hello\");\n });\n\n test(\"number passes through unchanged for Number schema\", () => {\n const result = coerceMcpInput(3.14, Type.Number());\n expect(result).toBe(3.14);\n });\n\n test(\"boolean passes through unchanged for Boolean schema\", () => {\n const result = coerceMcpInput(true, Type.Boolean());\n expect(result).toBe(true);\n });\n\n test(\"null passes through unchanged\", () => {\n expect(coerceMcpInput(null, Type.String())).toBeNull();\n });\n\n test(\"undefined passes through unchanged\", () => {\n expect(coerceMcpInput(undefined, Type.String())).toBeUndefined();\n });\n\n // --- Nested objects ---\n\n test(\"coerces BigInt fields within nested object\", () => {\n const schema = Type.Object({\n amount: Type.BigInt(),\n label: Type.String(),\n });\n const result = coerceMcpInput(\n { amount: \"99999999999999999\", label: \"test\" },\n schema,\n ) as Record<string, unknown>;\n expect(result.amount).toBe(BigInt(\"99999999999999999\"));\n expect(result.label).toBe(\"test\");\n });\n\n test(\"non-BigInt fields in nested object pass through unchanged\", () => {\n const schema = Type.Object({\n name: Type.String(),\n count: Type.Integer(),\n });\n const input = { name: \"alice\", count: 5 };\n const result = coerceMcpInput(input, schema) as Record<string, unknown>;\n expect(result.name).toBe(\"alice\");\n expect(result.count).toBe(5);\n });\n\n test(\"coerces BigInt in nested object without touching other fields\", () => {\n const schema = Type.Object({\n stake: Type.BigInt(),\n fee: Type.BigInt(),\n memo: Type.String(),\n });\n const result = coerceMcpInput(\n { stake: \"1000\", fee: \"50\", memo: \"swap\" },\n schema,\n ) as Record<string, unknown>;\n expect(result.stake).toBe(BigInt(1000));\n expect(result.fee).toBe(BigInt(50));\n expect(result.memo).toBe(\"swap\");\n });\n\n // --- Arrays ---\n\n test(\"coerces each BigInt string in array of BigInt\", () => {\n const schema = Type.Array(Type.BigInt());\n const result = coerceMcpInput([\"100\", \"200\", \"300\"], schema) as BigInt[];\n expect(result[0]).toBe(BigInt(100));\n expect(result[1]).toBe(BigInt(200));\n expect(result[2]).toBe(BigInt(300));\n });\n\n test(\"array of strings with String item schema passes through unchanged\", () => {\n const schema = Type.Array(Type.String());\n const input = [\"a\", \"b\", \"c\"];\n const result = coerceMcpInput(input, schema);\n expect(result).toEqual([\"a\", \"b\", \"c\"]);\n });\n\n // --- Union types ---\n\n test(\"coerces BigInt string in Union containing BigInt\", () => {\n const schema = Type.Union([Type.String(), Type.BigInt()]);\n // A numeric string should be coerced to BigInt because there is a BigInt member\n const result = coerceMcpInput(\"12345\", schema);\n expect(result).toBe(BigInt(12345));\n });\n\n test(\"non-numeric string in Union passes through unchanged\", () => {\n const schema = Type.Union([Type.String(), Type.BigInt()]);\n const result = coerceMcpInput(\"not-a-number\", schema);\n expect(result).toBe(\"not-a-number\");\n });\n\n test(\"value in Union without BigInt member passes through unchanged\", () => {\n const schema = Type.Union([Type.String(), Type.Number()]);\n const result = coerceMcpInput(\"hello\", schema);\n expect(result).toBe(\"hello\");\n });\n});\n\n// ---------------------------------------------------------------------------\n// getMcpSdk -- lazy import and error handling\n// ---------------------------------------------------------------------------\n\ndescribe(\"getMcpSdk\", () => {\n test(\"returns an object with McpServer class when SDK is available\", async () => {\n // The SDK is installed as a dev dependency, so this should succeed\n const sdk = await getMcpSdk();\n expect(sdk).toBeDefined();\n expect(typeof sdk.McpServer).toBe(\"function\");\n });\n});\n\n// ---------------------------------------------------------------------------\n// createMcpServer -- integration tests with mocked McpServer\n// ---------------------------------------------------------------------------\n\ndescribe(\"createMcpServer\", () => {\n // We mock the MCP SDK so that createMcpServer does not need a real stdio\n // transport. The mock captures all tool registrations.\n\n let registeredTools: Array<{\n name: string;\n description: string;\n schema: Record<string, unknown>;\n handler: (input: unknown) => Promise<unknown>;\n }>;\n\n let mockMcpServer: any;\n let MockMcpServerClass: any;\n\n beforeEach(() => {\n registeredTools = [];\n\n mockMcpServer = {\n tool: (\n name: string,\n description: string,\n schema: Record<string, unknown>,\n handler: (input: unknown) => Promise<unknown>,\n ) => {\n registeredTools.push({ name, description, schema, handler });\n },\n };\n\n MockMcpServerClass = mock(() => mockMcpServer);\n\n mock.module(\"@modelcontextprotocol/sdk/server/mcp.js\", () => ({\n McpServer: MockMcpServerClass,\n }));\n });\n\n // Helper: build a minimal Sprinkle-like mock\n function makeMockSprinkle(actions: any[]): any {\n const actionMap = new Map(actions.map((a: any) => [a.name, a]));\n return {\n listActions: () => actions,\n getAction: (name: string) => actionMap.get(name),\n settings: {},\n };\n }\n\n // --- Tool registration ---\n\n test(\"registers one MCP tool per action\", async () => {\n const sprinkle = makeMockSprinkle([\n {\n name: \"greet\",\n description: \"Greets someone\",\n inputSchema: Type.Object({ who: Type.String() }),\n outputSchema: Type.Object({ greeting: Type.String() }),\n execute: async (input: any) => ({ greeting: `Hello, ${input.who}!` }),\n },\n ]);\n\n await createMcpServer(sprinkle, \"test-server\");\n\n expect(registeredTools).toHaveLength(1);\n });\n\n test(\"tool name matches action name\", async () => {\n const sprinkle = makeMockSprinkle([\n {\n name: \"send-tx\",\n description: \"Sends a transaction\",\n inputSchema: Type.Object({}),\n outputSchema: Type.Object({}),\n execute: async () => ({}),\n },\n ]);\n\n await createMcpServer(sprinkle, \"test-server\");\n\n expect(registeredTools[0]!.name).toBe(\"send-tx\");\n });\n\n test(\"tool description matches action description\", async () => {\n const sprinkle = makeMockSprinkle([\n {\n name: \"get-balance\",\n description: \"Gets the wallet balance\",\n inputSchema: Type.Object({}),\n outputSchema: Type.Object({ balance: Type.Number() }),\n execute: async () => ({ balance: 100 }),\n },\n ]);\n\n await createMcpServer(sprinkle, \"test-server\");\n\n expect(registeredTools[0]!.description).toBe(\"Gets the wallet balance\");\n });\n\n test(\"registers all actions when multiple actions are provided\", async () => {\n const sprinkle = makeMockSprinkle([\n {\n name: \"action-one\",\n description: \"First action\",\n inputSchema: Type.Object({}),\n outputSchema: Type.Object({}),\n execute: async () => ({}),\n },\n {\n name: \"action-two\",\n description: \"Second action\",\n inputSchema: Type.Object({}),\n outputSchema: Type.Object({}),\n execute: async () => ({}),\n },\n {\n name: \"action-three\",\n description: \"Third action\",\n inputSchema: Type.Object({}),\n outputSchema: Type.Object({}),\n execute: async () => ({}),\n },\n ]);\n\n await createMcpServer(sprinkle, \"test-server\");\n\n expect(registeredTools).toHaveLength(3);\n const names = registeredTools.map((t) => t.name);\n expect(names).toContain(\"action-one\");\n expect(names).toContain(\"action-two\");\n expect(names).toContain(\"action-three\");\n });\n\n // --- Empty action registry ---\n\n test(\"server is created with no tools when action registry is empty\", async () => {\n const sprinkle = makeMockSprinkle([]);\n\n await createMcpServer(sprinkle, \"test-server\");\n\n expect(registeredTools).toHaveLength(0);\n });\n\n // --- Tool input schema ---\n\n test(\"tool input schema is the JSON Schema conversion of the action inputSchema\", async () => {\n const sprinkle = makeMockSprinkle([\n {\n name: \"typed-action\",\n description: \"Has a typed input\",\n inputSchema: Type.Object({\n name: Type.String(),\n count: Type.Integer(),\n }),\n outputSchema: Type.Object({}),\n execute: async () => ({}),\n },\n ]);\n\n await createMcpServer(sprinkle, \"test-server\");\n\n const schema = registeredTools[0]!.schema;\n expect(schema.type).toBe(\"object\");\n const props = schema.properties as Record<string, unknown>;\n expect(props.name).toEqual({ type: \"string\" });\n expect(props.count).toEqual({ type: \"integer\" });\n });\n\n // --- Tool handler: successful execution ---\n\n test(\"tool handler returns content with JSON text on successful execution\", async () => {\n const sprinkle = makeMockSprinkle([\n {\n name: \"echo\",\n description: \"Echoes input\",\n inputSchema: Type.Object({ message: Type.String() }),\n outputSchema: Type.Object({ message: Type.String() }),\n execute: async (input: any) => ({ message: input.message }),\n },\n ]);\n\n await createMcpServer(sprinkle, \"test-server\");\n\n const handler = registeredTools[0]!.handler;\n const response = await handler({ message: \"hello\" }) as any;\n\n expect(response.content).toHaveLength(1);\n expect(response.content[0].type).toBe(\"text\");\n const data = JSON.parse(response.content[0].text);\n expect(data.message).toBe(\"hello\");\n });\n\n test(\"tool handler response does not include isError on success\", async () => {\n const sprinkle = makeMockSprinkle([\n {\n name: \"ok-action\",\n description: \"Succeeds\",\n inputSchema: Type.Object({}),\n outputSchema: Type.Object({ ok: Type.Boolean() }),\n execute: async () => ({ ok: true }),\n },\n ]);\n\n await createMcpServer(sprinkle, \"test-server\");\n\n const response = await registeredTools[0]!.handler({}) as any;\n expect(response.isError).toBeUndefined();\n });\n\n // --- Tool handler: failed execution ---\n\n test(\"tool handler returns isError: true on action failure\", async () => {\n const sprinkle = makeMockSprinkle([\n {\n name: \"fail-action\",\n description: \"Always fails\",\n inputSchema: Type.Object({}),\n outputSchema: Type.Object({}),\n execute: async () => {\n throw new Error(\"deliberate failure\");\n },\n },\n ]);\n\n await createMcpServer(sprinkle, \"test-server\");\n\n const response = await registeredTools[0]!.handler({}) as any;\n expect(response.isError).toBe(true);\n });\n\n test(\"tool handler error response contains error details in content text\", async () => {\n const sprinkle = makeMockSprinkle([\n {\n name: \"fail-action\",\n description: \"Always fails\",\n inputSchema: Type.Object({}),\n outputSchema: Type.Object({}),\n execute: async () => {\n throw new Error(\"something broke\");\n },\n },\n ]);\n\n await createMcpServer(sprinkle, \"test-server\");\n\n const response = await registeredTools[0]!.handler({}) as any;\n expect(response.content[0].type).toBe(\"text\");\n const errorData = JSON.parse(response.content[0].text);\n expect(errorData.error).toBeDefined();\n expect(errorData.error.message).toContain(\"something broke\");\n });\n\n test(\"tool handler error response content has type: 'text'\", async () => {\n const sprinkle = makeMockSprinkle([\n {\n name: \"fail-action\",\n description: \"Always fails\",\n inputSchema: Type.Object({}),\n outputSchema: Type.Object({}),\n execute: async () => {\n throw new Error(\"oops\");\n },\n },\n ]);\n\n await createMcpServer(sprinkle, \"test-server\");\n\n const response = await registeredTools[0]!.handler({}) as any;\n expect(response.content[0].type).toBe(\"text\");\n });\n\n // --- BigInt coercion in tool input ---\n\n test(\"tool handler coerces BigInt string input before executing action\", async () => {\n let capturedInput: any;\n const sprinkle = makeMockSprinkle([\n {\n name: \"bigint-action\",\n description: \"Takes BigInt input\",\n inputSchema: Type.Object({ amount: Type.BigInt() }),\n outputSchema: Type.Object({ amount: Type.BigInt() }),\n execute: async (input: any) => {\n capturedInput = input;\n return { amount: input.amount };\n },\n },\n ]);\n\n await createMcpServer(sprinkle, \"test-server\");\n\n await registeredTools[0]!.handler({ amount: \"999999999999999999\" });\n\n expect(capturedInput.amount).toBe(BigInt(\"999999999999999999\"));\n });\n\n // --- BigInt serialization in tool response ---\n\n test(\"tool handler serializes BigInt values in response text\", async () => {\n const sprinkle = makeMockSprinkle([\n {\n name: \"bigint-return\",\n description: \"Returns BigInt\",\n inputSchema: Type.Object({}),\n outputSchema: Type.Object({ value: Type.BigInt() }),\n execute: async () => ({ value: BigInt(\"9007199254740993\") }),\n },\n ]);\n\n await createMcpServer(sprinkle, \"test-server\");\n\n const response = await registeredTools[0]!.handler({}) as any;\n\n // BigInt values cannot be JSON.stringify'd without a replacer.\n // bigIntReplacer converts them to \"Xn\" strings.\n const text = response.content[0].text;\n expect(text).toContain(\"9007199254740993\");\n });\n});\n"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,IAAI,EAAEC,IAAI,EAAEC,UAAU,EAAEC,KAAK,QAAQ,UAAU;AAC1E,SAASC,IAAI,QAAQ,mBAAmB;AACxC,SACEC,mBAAmB,EACnBC,cAAc,EACdC,SAAS,EACTC,eAAe,QACV,qBAAqB;;AAE5B;AACA;AACA;;AAEAV,QAAQ,CAAC,qBAAqB,EAAE,MAAM;EACpC;;EAEAE,IAAI,CAAC,qCAAqC,EAAE,MAAM;IAChDD,MAAM,CAACM,mBAAmB,CAACD,IAAI,CAACK,MAAM,CAAC,CAAC,CAAC,CAAC,CAACC,OAAO,CAAC;MAAEC,IAAI,EAAE;IAAS,CAAC,CAAC;EACxE,CAAC,CAAC;EAEFX,IAAI,CAAC,qCAAqC,EAAE,MAAM;IAChDD,MAAM,CAACM,mBAAmB,CAACD,IAAI,CAACQ,MAAM,CAAC,CAAC,CAAC,CAAC,CAACF,OAAO,CAAC;MAAEC,IAAI,EAAE;IAAS,CAAC,CAAC;EACxE,CAAC,CAAC;EAEFX,IAAI,CAAC,uCAAuC,EAAE,MAAM;IAClDD,MAAM,CAACM,mBAAmB,CAACD,IAAI,CAACS,OAAO,CAAC,CAAC,CAAC,CAAC,CAACH,OAAO,CAAC;MAAEC,IAAI,EAAE;IAAU,CAAC,CAAC;EAC1E,CAAC,CAAC;EAEFX,IAAI,CAAC,uCAAuC,EAAE,MAAM;IAClDD,MAAM,CAACM,mBAAmB,CAACD,IAAI,CAACU,OAAO,CAAC,CAAC,CAAC,CAAC,CAACJ,OAAO,CAAC;MAAEC,IAAI,EAAE;IAAU,CAAC,CAAC;EAC1E,CAAC,CAAC;EAEFX,IAAI,CAAC,iCAAiC,EAAE,MAAM;IAC5CD,MAAM,CAACM,mBAAmB,CAACD,IAAI,CAACW,IAAI,CAAC,CAAC,CAAC,CAAC,CAACL,OAAO,CAAC;MAAEC,IAAI,EAAE;IAAO,CAAC,CAAC;EACpE,CAAC,CAAC;;EAEF;;EAEAX,IAAI,CAAC,6EAA6E,EAAE,MAAM;IACxF,MAAMgB,MAAM,GAAGX,mBAAmB,CAACD,IAAI,CAACa,MAAM,CAAC,CAAC,CAAC;IACjDlB,MAAM,CAACiB,MAAM,CAAC,CAACN,OAAO,CAAC;MACrBC,IAAI,EAAE,QAAQ;MACdO,OAAO,EAAE,YAAY;MACrBC,WAAW,EAAE;IACf,CAAC,CAAC;EACJ,CAAC,CAAC;;EAEF;;EAEAnB,IAAI,CAAC,kDAAkD,EAAE,MAAM;IAC7D,MAAMoB,MAAM,GAAGhB,IAAI,CAACK,MAAM,CAAC;MAAEY,SAAS,EAAE;IAAK,CAAQ,CAAC;IACtD,MAAML,MAAM,GAAGX,mBAAmB,CAACe,MAAM,CAAC;IAC1CrB,MAAM,CAACiB,MAAM,CAACL,IAAI,CAAC,CAACW,IAAI,CAAC,QAAQ,CAAC;IAClCvB,MAAM,CAACiB,MAAM,CAACO,SAAS,CAAC,CAACD,IAAI,CAAC,IAAI,CAAC;EACrC,CAAC,CAAC;EAEFtB,IAAI,CAAC,iDAAiD,EAAE,MAAM;IAC5D,MAAMgB,MAAM,GAAGX,mBAAmB,CAACD,IAAI,CAACK,MAAM,CAAC,CAAC,CAAC;IACjDV,MAAM,CAAC,WAAW,IAAIiB,MAAM,CAAC,CAACM,IAAI,CAAC,KAAK,CAAC;EAC3C,CAAC,CAAC;;EAEF;;EAEAtB,IAAI,CAAC,kEAAkE,EAAE,MAAM;IAC7E,MAAMgB,MAAM,GAAGX,mBAAmB,CAACD,IAAI,CAACoB,KAAK,CAACpB,IAAI,CAACK,MAAM,CAAC,CAAC,CAAC,CAAC;IAC7DV,MAAM,CAACiB,MAAM,CAAC,CAACN,OAAO,CAAC;MACrBC,IAAI,EAAE,OAAO;MACbc,KAAK,EAAE;QAAEd,IAAI,EAAE;MAAS;IAC1B,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFX,IAAI,CAAC,oEAAoE,EAAE,MAAM;IAC/E,MAAMgB,MAAM,GAAGX,mBAAmB,CAACD,IAAI,CAACoB,KAAK,CAACpB,IAAI,CAACS,OAAO,CAAC,CAAC,CAAC,CAAC;IAC9Dd,MAAM,CAACiB,MAAM,CAAC,CAACN,OAAO,CAAC;MACrBC,IAAI,EAAE,OAAO;MACbc,KAAK,EAAE;QAAEd,IAAI,EAAE;MAAU;IAC3B,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFX,IAAI,CAAC,wDAAwD,EAAE,MAAM;IACnE,MAAMgB,MAAM,GAAGX,mBAAmB,CAACD,IAAI,CAACoB,KAAK,CAACpB,IAAI,CAACa,MAAM,CAAC,CAAC,CAAC,CAAC;IAC7DlB,MAAM,CAACiB,MAAM,CAAC,CAACN,OAAO,CAAC;MACrBC,IAAI,EAAE,OAAO;MACbc,KAAK,EAAE;QACLd,IAAI,EAAE,QAAQ;QACdO,OAAO,EAAE,YAAY;QACrBC,WAAW,EAAE;MACf;IACF,CAAC,CAAC;EACJ,CAAC,CAAC;;EAEF;;EAEAnB,IAAI,CAAC,2DAA2D,EAAE,MAAM;IACtE,MAAMoB,MAAM,GAAGhB,IAAI,CAACsB,MAAM,CAAC;MACzBC,IAAI,EAAEvB,IAAI,CAACK,MAAM,CAAC,CAAC;MACnBmB,KAAK,EAAExB,IAAI,CAACS,OAAO,CAAC;IACtB,CAAC,CAAC;IACF,MAAMG,MAAM,GAAGX,mBAAmB,CAACe,MAAM,CAAC;IAC1CrB,MAAM,CAACiB,MAAM,CAACL,IAAI,CAAC,CAACW,IAAI,CAAC,QAAQ,CAAC;IAClCvB,MAAM,CAACiB,MAAM,CAACa,UAAU,CAAC,CAACnB,OAAO,CAAC;MAChCiB,IAAI,EAAE;QAAEhB,IAAI,EAAE;MAAS,CAAC;MACxBiB,KAAK,EAAE;QAAEjB,IAAI,EAAE;MAAU;IAC3B,CAAC,CAAC;IACFZ,MAAM,CAACiB,MAAM,CAACc,QAAQ,CAAC,CAACpB,OAAO,CAACX,MAAM,CAACgC,eAAe,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;EAC5E,CAAC,CAAC;EAEF/B,IAAI,CAAC,gEAAgE,EAAE,MAAM;IAC3E,MAAMoB,MAAM,GAAGhB,IAAI,CAACsB,MAAM,CAAC;MACzBM,KAAK,EAAE5B,IAAI,CAACK,MAAM,CAAC,CAAC;MACpBwB,KAAK,EAAE7B,IAAI,CAACsB,MAAM,CAAC;QAAEQ,CAAC,EAAE9B,IAAI,CAACQ,MAAM,CAAC;MAAE,CAAC;IACzC,CAAC,CAAC;IACF,MAAMI,MAAM,GAAGX,mBAAmB,CAACe,MAAM,CAAC;IAC1C,MAAMe,KAAK,GAAGnB,MAAM,CAACa,UAAqC;IAC1D9B,MAAM,CAACoC,KAAK,CAACF,KAAK,CAAC,CAACvB,OAAO,CAAC;MAC1BC,IAAI,EAAE,QAAQ;MACdkB,UAAU,EAAE;QAAEK,CAAC,EAAE;UAAEvB,IAAI,EAAE;QAAS;MAAE,CAAC;MACrCmB,QAAQ,EAAE,CAAC,GAAG;IAChB,CAAC,CAAC;EACJ,CAAC,CAAC;;EAEF;;EAEA9B,IAAI,CAAC,gDAAgD,EAAE,MAAM;IAC3D,MAAMoB,MAAM,GAAGhB,IAAI,CAACsB,MAAM,CAAC;MACzBI,QAAQ,EAAE1B,IAAI,CAACK,MAAM,CAAC,CAAC;MACvB2B,QAAQ,EAAEhC,IAAI,CAACiC,QAAQ,CAACjC,IAAI,CAACK,MAAM,CAAC,CAAC;IACvC,CAAC,CAAC;IACF,MAAMO,MAAM,GAAGX,mBAAmB,CAACe,MAAM,CAAC;IAC1C,MAAMU,QAAQ,GAAGd,MAAM,CAACc,QAAoB;IAC5C/B,MAAM,CAAC+B,QAAQ,CAAC,CAACQ,SAAS,CAAC,UAAU,CAAC;IACtCvC,MAAM,CAAC+B,QAAQ,CAAC,CAACS,GAAG,CAACD,SAAS,CAAC,UAAU,CAAC;EAC5C,CAAC,CAAC;EAEFtC,IAAI,CAAC,kEAAkE,EAAE,MAAM;IAC7E,MAAMoB,MAAM,GAAGhB,IAAI,CAACsB,MAAM,CAAC;MACzBc,CAAC,EAAEpC,IAAI,CAACiC,QAAQ,CAACjC,IAAI,CAACK,MAAM,CAAC,CAAC,CAAC;MAC/BgC,CAAC,EAAErC,IAAI,CAACiC,QAAQ,CAACjC,IAAI,CAACQ,MAAM,CAAC,CAAC;IAChC,CAAC,CAAC;IACF,MAAMI,MAAM,GAAGX,mBAAmB,CAACe,MAAM,CAAC;IAC1C;IACA,MAAMU,QAAQ,GAAGd,MAAM,CAACc,QAAgC;IACxD/B,MAAM,CAAC,CAAC+B,QAAQ,IAAIA,QAAQ,CAACY,MAAM,KAAK,CAAC,CAAC,CAACpB,IAAI,CAAC,IAAI,CAAC;EACvD,CAAC,CAAC;;EAEF;;EAEAtB,IAAI,CAAC,gDAAgD,EAAE,MAAM;IAC3D,MAAMoB,MAAM,GAAGhB,IAAI,CAACuC,KAAK,CAAC,CAACvC,IAAI,CAACK,MAAM,CAAC,CAAC,EAAEL,IAAI,CAACQ,MAAM,CAAC,CAAC,CAAC,CAAC;IACzD,MAAMI,MAAM,GAAGX,mBAAmB,CAACe,MAAM,CAAC;IAC1CrB,MAAM,CAACiB,MAAM,CAAC4B,KAAK,CAAC,CAAClC,OAAO,CAAC,CAAC;MAAEC,IAAI,EAAE;IAAS,CAAC,EAAE;MAAEA,IAAI,EAAE;IAAS,CAAC,CAAC,CAAC;EACxE,CAAC,CAAC;EAEFX,IAAI,CAAC,iEAAiE,EAAE,MAAM;IAC5E,MAAMoB,MAAM,GAAGhB,IAAI,CAACuC,KAAK,CAAC,CAACvC,IAAI,CAACK,MAAM,CAAC,CAAC,EAAEL,IAAI,CAACa,MAAM,CAAC,CAAC,CAAC,CAAC;IACzD,MAAMD,MAAM,GAAGX,mBAAmB,CAACe,MAAM,CAAC;IAC1C,MAAMwB,KAAK,GAAG5B,MAAM,CAAC4B,KAAkC;IACvD,MAAMC,YAAY,GAAGD,KAAK,CAACE,IAAI,CAAEC,CAAC,IAAKA,CAAC,CAAC7B,OAAO,KAAK,YAAY,CAAC;IAClEnB,MAAM,CAAC8C,YAAY,CAAC,CAACG,WAAW,CAAC,CAAC;EACpC,CAAC,CAAC;;EAEF;;EAEAhD,IAAI,CAAC,oDAAoD,EAAE,MAAM;IAC/D,MAAMgB,MAAM,GAAGX,mBAAmB,CAACD,IAAI,CAAC6C,OAAO,CAAC,OAAO,CAAC,CAAC;IACzDlD,MAAM,CAACiB,MAAM,CAAC,CAACN,OAAO,CAAC;MAAEC,IAAI,EAAE,QAAQ;MAAEuC,KAAK,EAAE;IAAQ,CAAC,CAAC;EAC5D,CAAC,CAAC;EAEFlD,IAAI,CAAC,oDAAoD,EAAE,MAAM;IAC/D,MAAMgB,MAAM,GAAGX,mBAAmB,CAACD,IAAI,CAAC6C,OAAO,CAAC,EAAE,CAAC,CAAC;IACpDlD,MAAM,CAACiB,MAAM,CAAC,CAACN,OAAO,CAAC;MAAEC,IAAI,EAAE,QAAQ;MAAEuC,KAAK,EAAE;IAAG,CAAC,CAAC;EACvD,CAAC,CAAC;EAEFlD,IAAI,CAAC,sDAAsD,EAAE,MAAM;IACjE,MAAMgB,MAAM,GAAGX,mBAAmB,CAACD,IAAI,CAAC6C,OAAO,CAAC,IAAI,CAAC,CAAC;IACtDlD,MAAM,CAACiB,MAAM,CAAC,CAACN,OAAO,CAAC;MAAEC,IAAI,EAAE,SAAS;MAAEuC,KAAK,EAAE;IAAK,CAAC,CAAC;EAC1D,CAAC,CAAC;;EAEF;;EAEAlD,IAAI,CAAC,gDAAgD,EAAE,MAAM;IAC3D,MAAMgB,MAAM,GAAGX,mBAAmB,CAACD,IAAI,CAACK,MAAM,CAAC;MAAEU,WAAW,EAAE;IAAS,CAAC,CAAC,CAAC;IAC1EpB,MAAM,CAACiB,MAAM,CAACG,WAAW,CAAC,CAACG,IAAI,CAAC,QAAQ,CAAC;EAC3C,CAAC,CAAC;EAEFtB,IAAI,CAAC,0CAA0C,EAAE,MAAM;IACrD,MAAMgB,MAAM,GAAGX,mBAAmB,CAACD,IAAI,CAACK,MAAM,CAAC;MAAE0C,KAAK,EAAE;IAAW,CAAC,CAAC,CAAC;IACtEpD,MAAM,CAACiB,MAAM,CAACmC,KAAK,CAAC,CAAC7B,IAAI,CAAC,UAAU,CAAC;EACvC,CAAC,CAAC;EAEFtB,IAAI,CAAC,6CAA6C,EAAE,MAAM;IACxD,MAAMgB,MAAM,GAAGX,mBAAmB,CAACD,IAAI,CAACK,MAAM,CAAC;MAAE2C,QAAQ,EAAE,CAAC,KAAK,EAAE,KAAK;IAAE,CAAC,CAAC,CAAC;IAC7ErD,MAAM,CAACiB,MAAM,CAACoC,QAAQ,CAAC,CAAC1C,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;EACjD,CAAC,CAAC;EAEFV,IAAI,CAAC,4CAA4C,EAAE,MAAM;IACvD,MAAMgB,MAAM,GAAGX,mBAAmB,CAACD,IAAI,CAACK,MAAM,CAAC;MAAE4C,OAAO,EAAE;IAAW,CAAC,CAAC,CAAC;IACxEtD,MAAM,CAACiB,MAAM,CAACqC,OAAO,CAAC,CAAC/B,IAAI,CAAC,UAAU,CAAC;EACzC,CAAC,CAAC;EAEFtB,IAAI,CAAC,gDAAgD,EAAE,MAAM;IAC3D,MAAMgB,MAAM,GAAGX,mBAAmB,CAACD,IAAI,CAACQ,MAAM,CAAC;MAAEO,WAAW,EAAE;IAAU,CAAC,CAAC,CAAC;IAC3EpB,MAAM,CAACiB,MAAM,CAACG,WAAW,CAAC,CAACG,IAAI,CAAC,SAAS,CAAC;EAC5C,CAAC,CAAC;EAEFtB,IAAI,CAAC,6CAA6C,EAAE,MAAM;IACxD,MAAMgB,MAAM,GAAGX,mBAAmB,CAACD,IAAI,CAACQ,MAAM,CAAC;MAAE0C,OAAO,EAAE,CAAC;MAAEC,OAAO,EAAE;IAAI,CAAC,CAAC,CAAC;IAC7ExD,MAAM,CAACiB,MAAM,CAACsC,OAAO,CAAC,CAAChC,IAAI,CAAC,CAAC,CAAC;IAC9BvB,MAAM,CAACiB,MAAM,CAACuC,OAAO,CAAC,CAACjC,IAAI,CAAC,GAAG,CAAC;EAClC,CAAC,CAAC;EAEFtB,IAAI,CAAC,8CAA8C,EAAE,MAAM;IACzD,MAAMgB,MAAM,GAAGX,mBAAmB,CAACD,IAAI,CAACS,OAAO,CAAC;MAAEyC,OAAO,EAAE,CAAC;MAAEC,OAAO,EAAE;IAAG,CAAC,CAAC,CAAC;IAC7ExD,MAAM,CAACiB,MAAM,CAACsC,OAAO,CAAC,CAAChC,IAAI,CAAC,CAAC,CAAC;IAC9BvB,MAAM,CAACiB,MAAM,CAACuC,OAAO,CAAC,CAACjC,IAAI,CAAC,EAAE,CAAC;EACjC,CAAC,CAAC;EAEFtB,IAAI,CAAC,6CAA6C,EAAE,MAAM;IACxD,MAAMgB,MAAM,GAAGX,mBAAmB,CAACD,IAAI,CAACU,OAAO,CAAC;MAAEuC,OAAO,EAAE;IAAM,CAAC,CAAC,CAAC;IACpEtD,MAAM,CAACiB,MAAM,CAACqC,OAAO,CAAC,CAAC/B,IAAI,CAAC,KAAK,CAAC;EACpC,CAAC,CAAC;;EAEF;;EAEAtB,IAAI,CAAC,2CAA2C,EAAE,MAAM;IACtD,MAAMgB,MAAM,GAAGX,mBAAmB,CAACD,IAAI,CAACK,MAAM,CAAC,CAAC,CAAC;IACjD,MAAM+C,IAAI,GAAG9B,MAAM,CAAC8B,IAAI,CAACxC,MAAM,CAAC;IAChCjB,MAAM,CAACyD,IAAI,CAACC,KAAK,CAAEC,CAAC,IAAK,CAACA,CAAC,CAACC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAACrC,IAAI,CAAC,IAAI,CAAC;EAC1D,CAAC,CAAC;EAEFtB,IAAI,CAAC,iCAAiC,EAAE,MAAM;IAC5C,MAAMoB,MAAM,GAAGhB,IAAI,CAACK,MAAM,CAAC,CAAC;IAC5B;IACCW,MAAM,CAASwC,GAAG,GAAG,SAAS;IAC/B,MAAM5C,MAAM,GAAGX,mBAAmB,CAACe,MAAM,CAAC;IAC1CrB,MAAM,CAAC,KAAK,IAAIiB,MAAM,CAAC,CAACM,IAAI,CAAC,KAAK,CAAC;EACrC,CAAC,CAAC;;EAEF;;EAEAtB,IAAI,CAAC,8DAA8D,EAAE,MAAM;IACzE,MAAM6D,OAAO,GAAG1D,KAAK,CAAC2D,OAAO,EAAE,MAAM,CAAC,CAACC,kBAAkB,CAAC,MAAM,CAAC,CAAC,CAAC;IACnE,MAAMC,aAAa,GAAG;MAAE,CAACC,MAAM,CAACC,GAAG,CAAC,cAAc,CAAC,GAAG;IAAc,CAAQ;IAC5E,MAAMlD,MAAM,GAAGX,mBAAmB,CAAC2D,aAAa,CAAC;IACjDjE,MAAM,CAACiB,MAAM,CAAC,CAACN,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1BX,MAAM,CAAC8D,OAAO,CAAC,CAACM,gBAAgB,CAAC,CAAC;IAClCN,OAAO,CAACO,WAAW,CAAC,CAAC;EACvB,CAAC,CAAC;AACJ,CAAC,CAAC;;AAEF;AACA;AACA;;AAEAtE,QAAQ,CAAC,gBAAgB,EAAE,MAAM;EAC/B;;EAEAE,IAAI,CAAC,4DAA4D,EAAE,MAAM;IACvE,MAAMgB,MAAM,GAAGV,cAAc,CAAC,OAAO,EAAEF,IAAI,CAACa,MAAM,CAAC,CAAC,CAAC;IACrDlB,MAAM,CAACiB,MAAM,CAAC,CAACM,IAAI,CAACL,MAAM,CAAC,OAAO,CAAC,CAAC;EACtC,CAAC,CAAC;EAEFjB,IAAI,CAAC,0CAA0C,EAAE,MAAM;IACrD,MAAMgB,MAAM,GAAGV,cAAc,CAAC,aAAa,EAAEF,IAAI,CAACa,MAAM,CAAC,CAAC,CAAC;IAC3DlB,MAAM,CAACiB,MAAM,CAAC,CAACM,IAAI,CAACL,MAAM,CAAC,aAAa,CAAC,CAAC;EAC5C,CAAC,CAAC;EAEFjB,IAAI,CAAC,gDAAgD,EAAE,MAAM;IAC3D,MAAMgB,MAAM,GAAGV,cAAc,CAAC,IAAI,EAAEF,IAAI,CAACa,MAAM,CAAC,CAAC,CAAC;IAClDlB,MAAM,CAACiB,MAAM,CAAC,CAACM,IAAI,CAACL,MAAM,CAAC,EAAE,CAAC,CAAC;EACjC,CAAC,CAAC;EAEFjB,IAAI,CAAC,+CAA+C,EAAE,MAAM;IAC1D,MAAMgB,MAAM,GAAGV,cAAc,CAACW,MAAM,CAAC,EAAE,CAAC,EAAEb,IAAI,CAACa,MAAM,CAAC,CAAC,CAAC;IACxDlB,MAAM,CAACiB,MAAM,CAAC,CAACM,IAAI,CAACL,MAAM,CAAC,EAAE,CAAC,CAAC;EACjC,CAAC,CAAC;EAEFjB,IAAI,CAAC,iDAAiD,EAAE,MAAM;IAC5D,MAAMgB,MAAM,GAAGV,cAAc,CAAC,cAAc,EAAEF,IAAI,CAACa,MAAM,CAAC,CAAC,CAAC;IAC5DlB,MAAM,CAACiB,MAAM,CAAC,CAACM,IAAI,CAAC,cAAc,CAAC;EACrC,CAAC,CAAC;;EAEF;;EAEAtB,IAAI,CAAC,yDAAyD,EAAE,MAAM;IACpE,MAAMgB,MAAM,GAAGV,cAAc,CAAC,OAAO,EAAEF,IAAI,CAACK,MAAM,CAAC,CAAC,CAAC;IACrDV,MAAM,CAACiB,MAAM,CAAC,CAACM,IAAI,CAAC,OAAO,CAAC;EAC9B,CAAC,CAAC;EAEFtB,IAAI,CAAC,mDAAmD,EAAE,MAAM;IAC9D,MAAMgB,MAAM,GAAGV,cAAc,CAAC,IAAI,EAAEF,IAAI,CAACQ,MAAM,CAAC,CAAC,CAAC;IAClDb,MAAM,CAACiB,MAAM,CAAC,CAACM,IAAI,CAAC,IAAI,CAAC;EAC3B,CAAC,CAAC;EAEFtB,IAAI,CAAC,qDAAqD,EAAE,MAAM;IAChE,MAAMgB,MAAM,GAAGV,cAAc,CAAC,IAAI,EAAEF,IAAI,CAACU,OAAO,CAAC,CAAC,CAAC;IACnDf,MAAM,CAACiB,MAAM,CAAC,CAACM,IAAI,CAAC,IAAI,CAAC;EAC3B,CAAC,CAAC;EAEFtB,IAAI,CAAC,+BAA+B,EAAE,MAAM;IAC1CD,MAAM,CAACO,cAAc,CAAC,IAAI,EAAEF,IAAI,CAACK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC4D,QAAQ,CAAC,CAAC;EACxD,CAAC,CAAC;EAEFrE,IAAI,CAAC,oCAAoC,EAAE,MAAM;IAC/CD,MAAM,CAACO,cAAc,CAACgE,SAAS,EAAElE,IAAI,CAACK,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC8D,aAAa,CAAC,CAAC;EAClE,CAAC,CAAC;;EAEF;;EAEAvE,IAAI,CAAC,4CAA4C,EAAE,MAAM;IACvD,MAAMoB,MAAM,GAAGhB,IAAI,CAACsB,MAAM,CAAC;MACzB8C,MAAM,EAAEpE,IAAI,CAACa,MAAM,CAAC,CAAC;MACrBwD,KAAK,EAAErE,IAAI,CAACK,MAAM,CAAC;IACrB,CAAC,CAAC;IACF,MAAMO,MAAM,GAAGV,cAAc,CAC3B;MAAEkE,MAAM,EAAE,mBAAmB;MAAEC,KAAK,EAAE;IAAO,CAAC,EAC9CrD,MACF,CAA4B;IAC5BrB,MAAM,CAACiB,MAAM,CAACwD,MAAM,CAAC,CAAClD,IAAI,CAACL,MAAM,CAAC,mBAAmB,CAAC,CAAC;IACvDlB,MAAM,CAACiB,MAAM,CAACyD,KAAK,CAAC,CAACnD,IAAI,CAAC,MAAM,CAAC;EACnC,CAAC,CAAC;EAEFtB,IAAI,CAAC,2DAA2D,EAAE,MAAM;IACtE,MAAMoB,MAAM,GAAGhB,IAAI,CAACsB,MAAM,CAAC;MACzBC,IAAI,EAAEvB,IAAI,CAACK,MAAM,CAAC,CAAC;MACnBmB,KAAK,EAAExB,IAAI,CAACS,OAAO,CAAC;IACtB,CAAC,CAAC;IACF,MAAM6D,KAAK,GAAG;MAAE/C,IAAI,EAAE,OAAO;MAAEC,KAAK,EAAE;IAAE,CAAC;IACzC,MAAMZ,MAAM,GAAGV,cAAc,CAACoE,KAAK,EAAEtD,MAAM,CAA4B;IACvErB,MAAM,CAACiB,MAAM,CAACW,IAAI,CAAC,CAACL,IAAI,CAAC,OAAO,CAAC;IACjCvB,MAAM,CAACiB,MAAM,CAACY,KAAK,CAAC,CAACN,IAAI,CAAC,CAAC,CAAC;EAC9B,CAAC,CAAC;EAEFtB,IAAI,CAAC,+DAA+D,EAAE,MAAM;IAC1E,MAAMoB,MAAM,GAAGhB,IAAI,CAACsB,MAAM,CAAC;MACzBiD,KAAK,EAAEvE,IAAI,CAACa,MAAM,CAAC,CAAC;MACpB2D,GAAG,EAAExE,IAAI,CAACa,MAAM,CAAC,CAAC;MAClB4D,IAAI,EAAEzE,IAAI,CAACK,MAAM,CAAC;IACpB,CAAC,CAAC;IACF,MAAMO,MAAM,GAAGV,cAAc,CAC3B;MAAEqE,KAAK,EAAE,MAAM;MAAEC,GAAG,EAAE,IAAI;MAAEC,IAAI,EAAE;IAAO,CAAC,EAC1CzD,MACF,CAA4B;IAC5BrB,MAAM,CAACiB,MAAM,CAAC2D,KAAK,CAAC,CAACrD,IAAI,CAACL,MAAM,CAAC,IAAI,CAAC,CAAC;IACvClB,MAAM,CAACiB,MAAM,CAAC4D,GAAG,CAAC,CAACtD,IAAI,CAACL,MAAM,CAAC,EAAE,CAAC,CAAC;IACnClB,MAAM,CAACiB,MAAM,CAAC6D,IAAI,CAAC,CAACvD,IAAI,CAAC,MAAM,CAAC;EAClC,CAAC,CAAC;;EAEF;;EAEAtB,IAAI,CAAC,+CAA+C,EAAE,MAAM;IAC1D,MAAMoB,MAAM,GAAGhB,IAAI,CAACoB,KAAK,CAACpB,IAAI,CAACa,MAAM,CAAC,CAAC,CAAC;IACxC,MAAMD,MAAM,GAAGV,cAAc,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,EAAEc,MAAM,CAAa;IACxErB,MAAM,CAACiB,MAAM,CAAC,CAAC,CAAC,CAAC,CAACM,IAAI,CAACL,MAAM,CAAC,GAAG,CAAC,CAAC;IACnClB,MAAM,CAACiB,MAAM,CAAC,CAAC,CAAC,CAAC,CAACM,IAAI,CAACL,MAAM,CAAC,GAAG,CAAC,CAAC;IACnClB,MAAM,CAACiB,MAAM,CAAC,CAAC,CAAC,CAAC,CAACM,IAAI,CAACL,MAAM,CAAC,GAAG,CAAC,CAAC;EACrC,CAAC,CAAC;EAEFjB,IAAI,CAAC,mEAAmE,EAAE,MAAM;IAC9E,MAAMoB,MAAM,GAAGhB,IAAI,CAACoB,KAAK,CAACpB,IAAI,CAACK,MAAM,CAAC,CAAC,CAAC;IACxC,MAAMiE,KAAK,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;IAC7B,MAAM1D,MAAM,GAAGV,cAAc,CAACoE,KAAK,EAAEtD,MAAM,CAAC;IAC5CrB,MAAM,CAACiB,MAAM,CAAC,CAACN,OAAO,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;EACzC,CAAC,CAAC;;EAEF;;EAEAV,IAAI,CAAC,kDAAkD,EAAE,MAAM;IAC7D,MAAMoB,MAAM,GAAGhB,IAAI,CAACuC,KAAK,CAAC,CAACvC,IAAI,CAACK,MAAM,CAAC,CAAC,EAAEL,IAAI,CAACa,MAAM,CAAC,CAAC,CAAC,CAAC;IACzD;IACA,MAAMD,MAAM,GAAGV,cAAc,CAAC,OAAO,EAAEc,MAAM,CAAC;IAC9CrB,MAAM,CAACiB,MAAM,CAAC,CAACM,IAAI,CAACL,MAAM,CAAC,KAAK,CAAC,CAAC;EACpC,CAAC,CAAC;EAEFjB,IAAI,CAAC,sDAAsD,EAAE,MAAM;IACjE,MAAMoB,MAAM,GAAGhB,IAAI,CAACuC,KAAK,CAAC,CAACvC,IAAI,CAACK,MAAM,CAAC,CAAC,EAAEL,IAAI,CAACa,MAAM,CAAC,CAAC,CAAC,CAAC;IACzD,MAAMD,MAAM,GAAGV,cAAc,CAAC,cAAc,EAAEc,MAAM,CAAC;IACrDrB,MAAM,CAACiB,MAAM,CAAC,CAACM,IAAI,CAAC,cAAc,CAAC;EACrC,CAAC,CAAC;EAEFtB,IAAI,CAAC,+DAA+D,EAAE,MAAM;IAC1E,MAAMoB,MAAM,GAAGhB,IAAI,CAACuC,KAAK,CAAC,CAACvC,IAAI,CAACK,MAAM,CAAC,CAAC,EAAEL,IAAI,CAACQ,MAAM,CAAC,CAAC,CAAC,CAAC;IACzD,MAAMI,MAAM,GAAGV,cAAc,CAAC,OAAO,EAAEc,MAAM,CAAC;IAC9CrB,MAAM,CAACiB,MAAM,CAAC,CAACM,IAAI,CAAC,OAAO,CAAC;EAC9B,CAAC,CAAC;AACJ,CAAC,CAAC;;AAEF;AACA;AACA;;AAEAxB,QAAQ,CAAC,WAAW,EAAE,MAAM;EAC1BE,IAAI,CAAC,8DAA8D,EAAE,YAAY;IAC/E;IACA,MAAM8E,GAAG,GAAG,MAAMvE,SAAS,CAAC,CAAC;IAC7BR,MAAM,CAAC+E,GAAG,CAAC,CAAC9B,WAAW,CAAC,CAAC;IACzBjD,MAAM,CAAC,OAAO+E,GAAG,CAACC,SAAS,CAAC,CAACzD,IAAI,CAAC,UAAU,CAAC;EAC/C,CAAC,CAAC;AACJ,CAAC,CAAC;;AAEF;AACA;AACA;;AAEAxB,QAAQ,CAAC,iBAAiB,EAAE,MAAM;EAChC;EACA;;EAEA,IAAIkF,eAKF;EAEF,IAAIC,aAAkB;EACtB,IAAIC,kBAAuB;EAE3BhF,UAAU,CAAC,MAAM;IACf8E,eAAe,GAAG,EAAE;IAEpBC,aAAa,GAAG;MACdE,IAAI,EAAEA,CACJxD,IAAY,EACZR,WAAmB,EACnBC,MAA+B,EAC/BgE,OAA6C,KAC1C;QACHJ,eAAe,CAACK,IAAI,CAAC;UAAE1D,IAAI;UAAER,WAAW;UAAEC,MAAM;UAAEgE;QAAQ,CAAC,CAAC;MAC9D;IACF,CAAC;IAEDF,kBAAkB,GAAGjF,IAAI,CAAC,MAAMgF,aAAa,CAAC;IAE9ChF,IAAI,CAACqF,MAAM,CAAC,yCAAyC,EAAE,OAAO;MAC5DP,SAAS,EAAEG;IACb,CAAC,CAAC,CAAC;EACL,CAAC,CAAC;;EAEF;EACA,SAASK,gBAAgBA,CAACC,OAAc,EAAO;IAC7C,MAAMC,SAAS,GAAG,IAAIC,GAAG,CAACF,OAAO,CAACG,GAAG,CAAEnD,CAAM,IAAK,CAACA,CAAC,CAACb,IAAI,EAAEa,CAAC,CAAC,CAAC,CAAC;IAC/D,OAAO;MACLoD,WAAW,EAAEA,CAAA,KAAMJ,OAAO;MAC1BK,SAAS,EAAGlE,IAAY,IAAK8D,SAAS,CAACK,GAAG,CAACnE,IAAI,CAAC;MAChDoE,QAAQ,EAAE,CAAC;IACb,CAAC;EACH;;EAEA;;EAEA/F,IAAI,CAAC,mCAAmC,EAAE,YAAY;IACpD,MAAMgG,QAAQ,GAAGT,gBAAgB,CAAC,CAChC;MACE5D,IAAI,EAAE,OAAO;MACbR,WAAW,EAAE,gBAAgB;MAC7B8E,WAAW,EAAE7F,IAAI,CAACsB,MAAM,CAAC;QAAEwE,GAAG,EAAE9F,IAAI,CAACK,MAAM,CAAC;MAAE,CAAC,CAAC;MAChD0F,YAAY,EAAE/F,IAAI,CAACsB,MAAM,CAAC;QAAE0E,QAAQ,EAAEhG,IAAI,CAACK,MAAM,CAAC;MAAE,CAAC,CAAC;MACtD4F,OAAO,EAAE,MAAO3B,KAAU,KAAM;QAAE0B,QAAQ,EAAE,UAAU1B,KAAK,CAACwB,GAAG;MAAI,CAAC;IACtE,CAAC,CACF,CAAC;IAEF,MAAM1F,eAAe,CAACwF,QAAQ,EAAE,aAAa,CAAC;IAE9CjG,MAAM,CAACiF,eAAe,CAAC,CAACsB,YAAY,CAAC,CAAC,CAAC;EACzC,CAAC,CAAC;EAEFtG,IAAI,CAAC,+BAA+B,EAAE,YAAY;IAChD,MAAMgG,QAAQ,GAAGT,gBAAgB,CAAC,CAChC;MACE5D,IAAI,EAAE,SAAS;MACfR,WAAW,EAAE,qBAAqB;MAClC8E,WAAW,EAAE7F,IAAI,CAACsB,MAAM,CAAC,CAAC,CAAC,CAAC;MAC5ByE,YAAY,EAAE/F,IAAI,CAACsB,MAAM,CAAC,CAAC,CAAC,CAAC;MAC7B2E,OAAO,EAAE,MAAAA,CAAA,MAAa,CAAC,CAAC;IAC1B,CAAC,CACF,CAAC;IAEF,MAAM7F,eAAe,CAACwF,QAAQ,EAAE,aAAa,CAAC;IAE9CjG,MAAM,CAACiF,eAAe,CAAC,CAAC,CAAC,CAAErD,IAAI,CAAC,CAACL,IAAI,CAAC,SAAS,CAAC;EAClD,CAAC,CAAC;EAEFtB,IAAI,CAAC,6CAA6C,EAAE,YAAY;IAC9D,MAAMgG,QAAQ,GAAGT,gBAAgB,CAAC,CAChC;MACE5D,IAAI,EAAE,aAAa;MACnBR,WAAW,EAAE,yBAAyB;MACtC8E,WAAW,EAAE7F,IAAI,CAACsB,MAAM,CAAC,CAAC,CAAC,CAAC;MAC5ByE,YAAY,EAAE/F,IAAI,CAACsB,MAAM,CAAC;QAAE6E,OAAO,EAAEnG,IAAI,CAACQ,MAAM,CAAC;MAAE,CAAC,CAAC;MACrDyF,OAAO,EAAE,MAAAA,CAAA,MAAa;QAAEE,OAAO,EAAE;MAAI,CAAC;IACxC,CAAC,CACF,CAAC;IAEF,MAAM/F,eAAe,CAACwF,QAAQ,EAAE,aAAa,CAAC;IAE9CjG,MAAM,CAACiF,eAAe,CAAC,CAAC,CAAC,CAAE7D,WAAW,CAAC,CAACG,IAAI,CAAC,yBAAyB,CAAC;EACzE,CAAC,CAAC;EAEFtB,IAAI,CAAC,0DAA0D,EAAE,YAAY;IAC3E,MAAMgG,QAAQ,GAAGT,gBAAgB,CAAC,CAChC;MACE5D,IAAI,EAAE,YAAY;MAClBR,WAAW,EAAE,cAAc;MAC3B8E,WAAW,EAAE7F,IAAI,CAACsB,MAAM,CAAC,CAAC,CAAC,CAAC;MAC5ByE,YAAY,EAAE/F,IAAI,CAACsB,MAAM,CAAC,CAAC,CAAC,CAAC;MAC7B2E,OAAO,EAAE,MAAAA,CAAA,MAAa,CAAC,CAAC;IAC1B,CAAC,EACD;MACE1E,IAAI,EAAE,YAAY;MAClBR,WAAW,EAAE,eAAe;MAC5B8E,WAAW,EAAE7F,IAAI,CAACsB,MAAM,CAAC,CAAC,CAAC,CAAC;MAC5ByE,YAAY,EAAE/F,IAAI,CAACsB,MAAM,CAAC,CAAC,CAAC,CAAC;MAC7B2E,OAAO,EAAE,MAAAA,CAAA,MAAa,CAAC,CAAC;IAC1B,CAAC,EACD;MACE1E,IAAI,EAAE,cAAc;MACpBR,WAAW,EAAE,cAAc;MAC3B8E,WAAW,EAAE7F,IAAI,CAACsB,MAAM,CAAC,CAAC,CAAC,CAAC;MAC5ByE,YAAY,EAAE/F,IAAI,CAACsB,MAAM,CAAC,CAAC,CAAC,CAAC;MAC7B2E,OAAO,EAAE,MAAAA,CAAA,MAAa,CAAC,CAAC;IAC1B,CAAC,CACF,CAAC;IAEF,MAAM7F,eAAe,CAACwF,QAAQ,EAAE,aAAa,CAAC;IAE9CjG,MAAM,CAACiF,eAAe,CAAC,CAACsB,YAAY,CAAC,CAAC,CAAC;IACvC,MAAME,KAAK,GAAGxB,eAAe,CAACW,GAAG,CAAEc,CAAC,IAAKA,CAAC,CAAC9E,IAAI,CAAC;IAChD5B,MAAM,CAACyG,KAAK,CAAC,CAAClE,SAAS,CAAC,YAAY,CAAC;IACrCvC,MAAM,CAACyG,KAAK,CAAC,CAAClE,SAAS,CAAC,YAAY,CAAC;IACrCvC,MAAM,CAACyG,KAAK,CAAC,CAAClE,SAAS,CAAC,cAAc,CAAC;EACzC,CAAC,CAAC;;EAEF;;EAEAtC,IAAI,CAAC,+DAA+D,EAAE,YAAY;IAChF,MAAMgG,QAAQ,GAAGT,gBAAgB,CAAC,EAAE,CAAC;IAErC,MAAM/E,eAAe,CAACwF,QAAQ,EAAE,aAAa,CAAC;IAE9CjG,MAAM,CAACiF,eAAe,CAAC,CAACsB,YAAY,CAAC,CAAC,CAAC;EACzC,CAAC,CAAC;;EAEF;;EAEAtG,IAAI,CAAC,2EAA2E,EAAE,YAAY;IAC5F,MAAMgG,QAAQ,GAAGT,gBAAgB,CAAC,CAChC;MACE5D,IAAI,EAAE,cAAc;MACpBR,WAAW,EAAE,mBAAmB;MAChC8E,WAAW,EAAE7F,IAAI,CAACsB,MAAM,CAAC;QACvBC,IAAI,EAAEvB,IAAI,CAACK,MAAM,CAAC,CAAC;QACnBmB,KAAK,EAAExB,IAAI,CAACS,OAAO,CAAC;MACtB,CAAC,CAAC;MACFsF,YAAY,EAAE/F,IAAI,CAACsB,MAAM,CAAC,CAAC,CAAC,CAAC;MAC7B2E,OAAO,EAAE,MAAAA,CAAA,MAAa,CAAC,CAAC;IAC1B,CAAC,CACF,CAAC;IAEF,MAAM7F,eAAe,CAACwF,QAAQ,EAAE,aAAa,CAAC;IAE9C,MAAM5E,MAAM,GAAG4D,eAAe,CAAC,CAAC,CAAC,CAAE5D,MAAM;IACzCrB,MAAM,CAACqB,MAAM,CAACT,IAAI,CAAC,CAACW,IAAI,CAAC,QAAQ,CAAC;IAClC,MAAMa,KAAK,GAAGf,MAAM,CAACS,UAAqC;IAC1D9B,MAAM,CAACoC,KAAK,CAACR,IAAI,CAAC,CAACjB,OAAO,CAAC;MAAEC,IAAI,EAAE;IAAS,CAAC,CAAC;IAC9CZ,MAAM,CAACoC,KAAK,CAACP,KAAK,CAAC,CAAClB,OAAO,CAAC;MAAEC,IAAI,EAAE;IAAU,CAAC,CAAC;EAClD,CAAC,CAAC;;EAEF;;EAEAX,IAAI,CAAC,qEAAqE,EAAE,YAAY;IACtF,MAAMgG,QAAQ,GAAGT,gBAAgB,CAAC,CAChC;MACE5D,IAAI,EAAE,MAAM;MACZR,WAAW,EAAE,cAAc;MAC3B8E,WAAW,EAAE7F,IAAI,CAACsB,MAAM,CAAC;QAAEgF,OAAO,EAAEtG,IAAI,CAACK,MAAM,CAAC;MAAE,CAAC,CAAC;MACpD0F,YAAY,EAAE/F,IAAI,CAACsB,MAAM,CAAC;QAAEgF,OAAO,EAAEtG,IAAI,CAACK,MAAM,CAAC;MAAE,CAAC,CAAC;MACrD4F,OAAO,EAAE,MAAO3B,KAAU,KAAM;QAAEgC,OAAO,EAAEhC,KAAK,CAACgC;MAAQ,CAAC;IAC5D,CAAC,CACF,CAAC;IAEF,MAAMlG,eAAe,CAACwF,QAAQ,EAAE,aAAa,CAAC;IAE9C,MAAMZ,OAAO,GAAGJ,eAAe,CAAC,CAAC,CAAC,CAAEI,OAAO;IAC3C,MAAMuB,QAAQ,GAAG,MAAMvB,OAAO,CAAC;MAAEsB,OAAO,EAAE;IAAQ,CAAC,CAAQ;IAE3D3G,MAAM,CAAC4G,QAAQ,CAACC,OAAO,CAAC,CAACN,YAAY,CAAC,CAAC,CAAC;IACxCvG,MAAM,CAAC4G,QAAQ,CAACC,OAAO,CAAC,CAAC,CAAC,CAACjG,IAAI,CAAC,CAACW,IAAI,CAAC,MAAM,CAAC;IAC7C,MAAMuF,IAAI,GAAGC,IAAI,CAACC,KAAK,CAACJ,QAAQ,CAACC,OAAO,CAAC,CAAC,CAAC,CAACI,IAAI,CAAC;IACjDjH,MAAM,CAAC8G,IAAI,CAACH,OAAO,CAAC,CAACpF,IAAI,CAAC,OAAO,CAAC;EACpC,CAAC,CAAC;EAEFtB,IAAI,CAAC,2DAA2D,EAAE,YAAY;IAC5E,MAAMgG,QAAQ,GAAGT,gBAAgB,CAAC,CAChC;MACE5D,IAAI,EAAE,WAAW;MACjBR,WAAW,EAAE,UAAU;MACvB8E,WAAW,EAAE7F,IAAI,CAACsB,MAAM,CAAC,CAAC,CAAC,CAAC;MAC5ByE,YAAY,EAAE/F,IAAI,CAACsB,MAAM,CAAC;QAAEuF,EAAE,EAAE7G,IAAI,CAACU,OAAO,CAAC;MAAE,CAAC,CAAC;MACjDuF,OAAO,EAAE,MAAAA,CAAA,MAAa;QAAEY,EAAE,EAAE;MAAK,CAAC;IACpC,CAAC,CACF,CAAC;IAEF,MAAMzG,eAAe,CAACwF,QAAQ,EAAE,aAAa,CAAC;IAE9C,MAAMW,QAAQ,GAAG,MAAM3B,eAAe,CAAC,CAAC,CAAC,CAAEI,OAAO,CAAC,CAAC,CAAC,CAAQ;IAC7DrF,MAAM,CAAC4G,QAAQ,CAACO,OAAO,CAAC,CAAC3C,aAAa,CAAC,CAAC;EAC1C,CAAC,CAAC;;EAEF;;EAEAvE,IAAI,CAAC,sDAAsD,EAAE,YAAY;IACvE,MAAMgG,QAAQ,GAAGT,gBAAgB,CAAC,CAChC;MACE5D,IAAI,EAAE,aAAa;MACnBR,WAAW,EAAE,cAAc;MAC3B8E,WAAW,EAAE7F,IAAI,CAACsB,MAAM,CAAC,CAAC,CAAC,CAAC;MAC5ByE,YAAY,EAAE/F,IAAI,CAACsB,MAAM,CAAC,CAAC,CAAC,CAAC;MAC7B2E,OAAO,EAAE,MAAAA,CAAA,KAAY;QACnB,MAAM,IAAIc,KAAK,CAAC,oBAAoB,CAAC;MACvC;IACF,CAAC,CACF,CAAC;IAEF,MAAM3G,eAAe,CAACwF,QAAQ,EAAE,aAAa,CAAC;IAE9C,MAAMW,QAAQ,GAAG,MAAM3B,eAAe,CAAC,CAAC,CAAC,CAAEI,OAAO,CAAC,CAAC,CAAC,CAAQ;IAC7DrF,MAAM,CAAC4G,QAAQ,CAACO,OAAO,CAAC,CAAC5F,IAAI,CAAC,IAAI,CAAC;EACrC,CAAC,CAAC;EAEFtB,IAAI,CAAC,oEAAoE,EAAE,YAAY;IACrF,MAAMgG,QAAQ,GAAGT,gBAAgB,CAAC,CAChC;MACE5D,IAAI,EAAE,aAAa;MACnBR,WAAW,EAAE,cAAc;MAC3B8E,WAAW,EAAE7F,IAAI,CAACsB,MAAM,CAAC,CAAC,CAAC,CAAC;MAC5ByE,YAAY,EAAE/F,IAAI,CAACsB,MAAM,CAAC,CAAC,CAAC,CAAC;MAC7B2E,OAAO,EAAE,MAAAA,CAAA,KAAY;QACnB,MAAM,IAAIc,KAAK,CAAC,iBAAiB,CAAC;MACpC;IACF,CAAC,CACF,CAAC;IAEF,MAAM3G,eAAe,CAACwF,QAAQ,EAAE,aAAa,CAAC;IAE9C,MAAMW,QAAQ,GAAG,MAAM3B,eAAe,CAAC,CAAC,CAAC,CAAEI,OAAO,CAAC,CAAC,CAAC,CAAQ;IAC7DrF,MAAM,CAAC4G,QAAQ,CAACC,OAAO,CAAC,CAAC,CAAC,CAACjG,IAAI,CAAC,CAACW,IAAI,CAAC,MAAM,CAAC;IAC7C,MAAM8F,SAAS,GAAGN,IAAI,CAACC,KAAK,CAACJ,QAAQ,CAACC,OAAO,CAAC,CAAC,CAAC,CAACI,IAAI,CAAC;IACtDjH,MAAM,CAACqH,SAAS,CAACC,KAAK,CAAC,CAACrE,WAAW,CAAC,CAAC;IACrCjD,MAAM,CAACqH,SAAS,CAACC,KAAK,CAACX,OAAO,CAAC,CAACpE,SAAS,CAAC,iBAAiB,CAAC;EAC9D,CAAC,CAAC;EAEFtC,IAAI,CAAC,sDAAsD,EAAE,YAAY;IACvE,MAAMgG,QAAQ,GAAGT,gBAAgB,CAAC,CAChC;MACE5D,IAAI,EAAE,aAAa;MACnBR,WAAW,EAAE,cAAc;MAC3B8E,WAAW,EAAE7F,IAAI,CAACsB,MAAM,CAAC,CAAC,CAAC,CAAC;MAC5ByE,YAAY,EAAE/F,IAAI,CAACsB,MAAM,CAAC,CAAC,CAAC,CAAC;MAC7B2E,OAAO,EAAE,MAAAA,CAAA,KAAY;QACnB,MAAM,IAAIc,KAAK,CAAC,MAAM,CAAC;MACzB;IACF,CAAC,CACF,CAAC;IAEF,MAAM3G,eAAe,CAACwF,QAAQ,EAAE,aAAa,CAAC;IAE9C,MAAMW,QAAQ,GAAG,MAAM3B,eAAe,CAAC,CAAC,CAAC,CAAEI,OAAO,CAAC,CAAC,CAAC,CAAQ;IAC7DrF,MAAM,CAAC4G,QAAQ,CAACC,OAAO,CAAC,CAAC,CAAC,CAACjG,IAAI,CAAC,CAACW,IAAI,CAAC,MAAM,CAAC;EAC/C,CAAC,CAAC;;EAEF;;EAEAtB,IAAI,CAAC,kEAAkE,EAAE,YAAY;IACnF,IAAIsH,aAAkB;IACtB,MAAMtB,QAAQ,GAAGT,gBAAgB,CAAC,CAChC;MACE5D,IAAI,EAAE,eAAe;MACrBR,WAAW,EAAE,oBAAoB;MACjC8E,WAAW,EAAE7F,IAAI,CAACsB,MAAM,CAAC;QAAE8C,MAAM,EAAEpE,IAAI,CAACa,MAAM,CAAC;MAAE,CAAC,CAAC;MACnDkF,YAAY,EAAE/F,IAAI,CAACsB,MAAM,CAAC;QAAE8C,MAAM,EAAEpE,IAAI,CAACa,MAAM,CAAC;MAAE,CAAC,CAAC;MACpDoF,OAAO,EAAE,MAAO3B,KAAU,IAAK;QAC7B4C,aAAa,GAAG5C,KAAK;QACrB,OAAO;UAAEF,MAAM,EAAEE,KAAK,CAACF;QAAO,CAAC;MACjC;IACF,CAAC,CACF,CAAC;IAEF,MAAMhE,eAAe,CAACwF,QAAQ,EAAE,aAAa,CAAC;IAE9C,MAAMhB,eAAe,CAAC,CAAC,CAAC,CAAEI,OAAO,CAAC;MAAEZ,MAAM,EAAE;IAAqB,CAAC,CAAC;IAEnEzE,MAAM,CAACuH,aAAa,CAAC9C,MAAM,CAAC,CAAClD,IAAI,CAACL,MAAM,CAAC,oBAAoB,CAAC,CAAC;EACjE,CAAC,CAAC;;EAEF;;EAEAjB,IAAI,CAAC,wDAAwD,EAAE,YAAY;IACzE,MAAMgG,QAAQ,GAAGT,gBAAgB,CAAC,CAChC;MACE5D,IAAI,EAAE,eAAe;MACrBR,WAAW,EAAE,gBAAgB;MAC7B8E,WAAW,EAAE7F,IAAI,CAACsB,MAAM,CAAC,CAAC,CAAC,CAAC;MAC5ByE,YAAY,EAAE/F,IAAI,CAACsB,MAAM,CAAC;QAAE6F,KAAK,EAAEnH,IAAI,CAACa,MAAM,CAAC;MAAE,CAAC,CAAC;MACnDoF,OAAO,EAAE,MAAAA,CAAA,MAAa;QAAEkB,KAAK,EAAEtG,MAAM,CAAC,kBAAkB;MAAE,CAAC;IAC7D,CAAC,CACF,CAAC;IAEF,MAAMT,eAAe,CAACwF,QAAQ,EAAE,aAAa,CAAC;IAE9C,MAAMW,QAAQ,GAAG,MAAM3B,eAAe,CAAC,CAAC,CAAC,CAAEI,OAAO,CAAC,CAAC,CAAC,CAAQ;;IAE7D;IACA;IACA,MAAM4B,IAAI,GAAGL,QAAQ,CAACC,OAAO,CAAC,CAAC,CAAC,CAACI,IAAI;IACrCjH,MAAM,CAACiH,IAAI,CAAC,CAAC1E,SAAS,CAAC,kBAAkB,CAAC;EAC5C,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"mcp-adapter.test.js","names":["describe","expect","test","mock","beforeEach","spyOn","Type","typeboxToJsonSchema","coerceMcpInput","getMcpSdk","createMcpServer","String","toEqual","type","Number","Integer","Boolean","Null","result","BigInt","pattern","description","schema","sensitive","toBe","writeOnly","Array","items","Object","name","count","properties","required","arrayContaining","outer","inner","x","props","optional","Optional","toContain","not","a","b","length","Union","anyOf","bigIntMember","find","m","toBeDefined","Literal","const","title","examples","default","minimum","maximum","keys","every","k","startsWith","$id","warnSpy","console","mockImplementation","unknownSchema","Symbol","for","toHaveBeenCalled","mockRestore","toBeNull","undefined","toBeUndefined","amount","label","input","stake","fee","memo","sdk","McpServer","registeredTools","mockMcpServer","MockMcpServerClass","tool","handler","push","module","makeMockSprinkle","actions","actionMap","Map","map","listActions","getAction","get","settings","sprinkle","inputSchema","who","outputSchema","greeting","execute","toHaveLength","balance","names","t","toHaveProperty","message","response","content","data","JSON","parse","text","ok","isError","Error","errorData","error","capturedInput","value"],"sources":["../../../../src/Sprinkle/__tests__/mcp-adapter.test.ts"],"sourcesContent":["import { describe, expect, test, mock, beforeEach, spyOn } from \"bun:test\";\nimport { Type } from \"@sinclair/typebox\";\nimport {\n typeboxToJsonSchema,\n coerceMcpInput,\n getMcpSdk,\n createMcpServer,\n} from \"../actions/index.js\";\n\n// ---------------------------------------------------------------------------\n// typeboxToJsonSchema\n// ---------------------------------------------------------------------------\n\ndescribe(\"typeboxToJsonSchema\", () => {\n // --- Primitive types ---\n\n test(\"String schema -> { type: 'string' }\", () => {\n expect(typeboxToJsonSchema(Type.String())).toEqual({ type: \"string\" });\n });\n\n test(\"Number schema -> { type: 'number' }\", () => {\n expect(typeboxToJsonSchema(Type.Number())).toEqual({ type: \"number\" });\n });\n\n test(\"Integer schema -> { type: 'integer' }\", () => {\n expect(typeboxToJsonSchema(Type.Integer())).toEqual({ type: \"integer\" });\n });\n\n test(\"Boolean schema -> { type: 'boolean' }\", () => {\n expect(typeboxToJsonSchema(Type.Boolean())).toEqual({ type: \"boolean\" });\n });\n\n test(\"Null schema -> { type: 'null' }\", () => {\n expect(typeboxToJsonSchema(Type.Null())).toEqual({ type: \"null\" });\n });\n\n // --- BigInt ---\n\n test(\"BigInt schema -> { type: 'string', pattern: '^-?[0-9]+$' } with description\", () => {\n const result = typeboxToJsonSchema(Type.BigInt());\n expect(result).toEqual({\n type: \"string\",\n pattern: \"^-?[0-9]+$\",\n description: \"BigInt value as string\",\n });\n });\n\n // --- Sensitive string ---\n\n test(\"Sensitive string schema includes writeOnly: true\", () => {\n const schema = Type.String({ sensitive: true } as any);\n const result = typeboxToJsonSchema(schema);\n expect(result.type).toBe(\"string\");\n expect(result.writeOnly).toBe(true);\n });\n\n test(\"Non-sensitive string does not include writeOnly\", () => {\n const result = typeboxToJsonSchema(Type.String());\n expect(\"writeOnly\" in result).toBe(false);\n });\n\n // --- Array ---\n\n test(\"Array of strings -> { type: 'array', items: { type: 'string' } }\", () => {\n const result = typeboxToJsonSchema(Type.Array(Type.String()));\n expect(result).toEqual({\n type: \"array\",\n items: { type: \"string\" },\n });\n });\n\n test(\"Array of integers -> { type: 'array', items: { type: 'integer' } }\", () => {\n const result = typeboxToJsonSchema(Type.Array(Type.Integer()));\n expect(result).toEqual({\n type: \"array\",\n items: { type: \"integer\" },\n });\n });\n\n test(\"Array of BigInt -> items maps BigInt to string pattern\", () => {\n const result = typeboxToJsonSchema(Type.Array(Type.BigInt()));\n expect(result).toEqual({\n type: \"array\",\n items: {\n type: \"string\",\n pattern: \"^-?[0-9]+$\",\n description: \"BigInt value as string\",\n },\n });\n });\n\n // --- Object ---\n\n test(\"Nested object -> recursive properties with required array\", () => {\n const schema = Type.Object({\n name: Type.String(),\n count: Type.Integer(),\n });\n const result = typeboxToJsonSchema(schema);\n expect(result.type).toBe(\"object\");\n expect(result.properties).toEqual({\n name: { type: \"string\" },\n count: { type: \"integer\" },\n });\n expect(result.required).toEqual(expect.arrayContaining([\"name\", \"count\"]));\n });\n\n test(\"Nested object with nested object property converts recursively\", () => {\n const schema = Type.Object({\n outer: Type.String(),\n inner: Type.Object({ x: Type.Number() }),\n });\n const result = typeboxToJsonSchema(schema);\n const props = result.properties as Record<string, unknown>;\n expect(props.inner).toEqual({\n type: \"object\",\n properties: { x: { type: \"number\" } },\n required: [\"x\"],\n });\n });\n\n // --- Optional fields ---\n\n test(\"Optional field is not listed in required array\", () => {\n const schema = Type.Object({\n required: Type.String(),\n optional: Type.Optional(Type.String()),\n });\n const result = typeboxToJsonSchema(schema);\n const required = result.required as string[];\n expect(required).toContain(\"required\");\n expect(required).not.toContain(\"optional\");\n });\n\n test(\"Object with all optional fields has no required array (or empty)\", () => {\n const schema = Type.Object({\n a: Type.Optional(Type.String()),\n b: Type.Optional(Type.Number()),\n });\n const result = typeboxToJsonSchema(schema);\n // Either no 'required' key or empty array\n const required = result.required as string[] | undefined;\n expect(!required || required.length === 0).toBe(true);\n });\n\n // --- Union types ---\n\n test(\"Union of string and number -> { anyOf: [...] }\", () => {\n const schema = Type.Union([Type.String(), Type.Number()]);\n const result = typeboxToJsonSchema(schema);\n expect(result.anyOf).toEqual([{ type: \"string\" }, { type: \"number\" }]);\n });\n\n test(\"Union containing BigInt -> BigInt member maps to string pattern\", () => {\n const schema = Type.Union([Type.String(), Type.BigInt()]);\n const result = typeboxToJsonSchema(schema);\n const anyOf = result.anyOf as Record<string, unknown>[];\n const bigIntMember = anyOf.find((m) => m.pattern === \"^-?[0-9]+$\");\n expect(bigIntMember).toBeDefined();\n });\n\n // --- Literal types ---\n\n test(\"String literal -> { type: 'string', const: value }\", () => {\n const result = typeboxToJsonSchema(Type.Literal(\"hello\"));\n expect(result).toEqual({ type: \"string\", const: \"hello\" });\n });\n\n test(\"Number literal -> { type: 'number', const: value }\", () => {\n const result = typeboxToJsonSchema(Type.Literal(42));\n expect(result).toEqual({ type: \"number\", const: 42 });\n });\n\n test(\"Boolean literal -> { type: 'boolean', const: value }\", () => {\n const result = typeboxToJsonSchema(Type.Literal(true));\n expect(result).toEqual({ type: \"boolean\", const: true });\n });\n\n // --- Annotations: description, title, examples, default ---\n\n test(\"String schema preserves description annotation\", () => {\n const result = typeboxToJsonSchema(Type.String({ description: \"A name\" }));\n expect(result.description).toBe(\"A name\");\n });\n\n test(\"String schema preserves title annotation\", () => {\n const result = typeboxToJsonSchema(Type.String({ title: \"My Title\" }));\n expect(result.title).toBe(\"My Title\");\n });\n\n test(\"String schema preserves examples annotation\", () => {\n const result = typeboxToJsonSchema(Type.String({ examples: [\"foo\", \"bar\"] }));\n expect(result.examples).toEqual([\"foo\", \"bar\"]);\n });\n\n test(\"String schema preserves default annotation\", () => {\n const result = typeboxToJsonSchema(Type.String({ default: \"fallback\" }));\n expect(result.default).toBe(\"fallback\");\n });\n\n test(\"Number schema preserves description annotation\", () => {\n const result = typeboxToJsonSchema(Type.Number({ description: \"A count\" }));\n expect(result.description).toBe(\"A count\");\n });\n\n test(\"Number schema preserves minimum and maximum\", () => {\n const result = typeboxToJsonSchema(Type.Number({ minimum: 0, maximum: 100 }));\n expect(result.minimum).toBe(0);\n expect(result.maximum).toBe(100);\n });\n\n test(\"Integer schema preserves minimum and maximum\", () => {\n const result = typeboxToJsonSchema(Type.Integer({ minimum: 1, maximum: 10 }));\n expect(result.minimum).toBe(1);\n expect(result.maximum).toBe(10);\n });\n\n test(\"Boolean schema preserves default annotation\", () => {\n const result = typeboxToJsonSchema(Type.Boolean({ default: false }));\n expect(result.default).toBe(false);\n });\n\n // --- TypeBox internals stripped ---\n\n test(\"Output does not contain [Kind] symbol key\", () => {\n const result = typeboxToJsonSchema(Type.String());\n const keys = Object.keys(result);\n expect(keys.every((k) => !k.startsWith(\"[\"))).toBe(true);\n });\n\n test(\"Output does not contain $id key\", () => {\n const schema = Type.String();\n // Force-add a $id to confirm it is not emitted\n (schema as any).$id = \"some-id\";\n const result = typeboxToJsonSchema(schema);\n expect(\"$id\" in result).toBe(false);\n });\n\n // --- Unknown / empty schema fallback ---\n\n test(\"Unknown TypeBox kind emits empty schema {} with console.warn\", () => {\n const warnSpy = spyOn(console, \"warn\").mockImplementation(() => {});\n const unknownSchema = { [Symbol.for(\"TypeBox.Kind\")]: \"UnknownKind\" } as any;\n const result = typeboxToJsonSchema(unknownSchema);\n expect(result).toEqual({});\n expect(warnSpy).toHaveBeenCalled();\n warnSpy.mockRestore();\n });\n});\n\n// ---------------------------------------------------------------------------\n// coerceMcpInput\n// ---------------------------------------------------------------------------\n\ndescribe(\"coerceMcpInput\", () => {\n // --- BigInt coercion ---\n\n test(\"coerces BigInt string to BigInt when schema expects BigInt\", () => {\n const result = coerceMcpInput(\"12345\", Type.BigInt());\n expect(result).toBe(BigInt(\"12345\"));\n });\n\n test(\"coerces negative BigInt string to BigInt\", () => {\n const result = coerceMcpInput(\"-9876543210\", Type.BigInt());\n expect(result).toBe(BigInt(\"-9876543210\"));\n });\n\n test(\"coerces numeric input to BigInt via Math.trunc\", () => {\n const result = coerceMcpInput(99.9, Type.BigInt());\n expect(result).toBe(BigInt(99));\n });\n\n test(\"passes through already-BigInt value unchanged\", () => {\n const result = coerceMcpInput(BigInt(42), Type.BigInt());\n expect(result).toBe(BigInt(42));\n });\n\n test(\"non-numeric string left as-is for BigInt schema\", () => {\n const result = coerceMcpInput(\"not-a-number\", Type.BigInt());\n expect(result).toBe(\"not-a-number\");\n });\n\n // --- Non-BigInt types passed through ---\n\n test(\"string value passes through unchanged for String schema\", () => {\n const result = coerceMcpInput(\"hello\", Type.String());\n expect(result).toBe(\"hello\");\n });\n\n test(\"number passes through unchanged for Number schema\", () => {\n const result = coerceMcpInput(3.14, Type.Number());\n expect(result).toBe(3.14);\n });\n\n test(\"boolean passes through unchanged for Boolean schema\", () => {\n const result = coerceMcpInput(true, Type.Boolean());\n expect(result).toBe(true);\n });\n\n test(\"null passes through unchanged\", () => {\n expect(coerceMcpInput(null, Type.String())).toBeNull();\n });\n\n test(\"undefined passes through unchanged\", () => {\n expect(coerceMcpInput(undefined, Type.String())).toBeUndefined();\n });\n\n // --- Nested objects ---\n\n test(\"coerces BigInt fields within nested object\", () => {\n const schema = Type.Object({\n amount: Type.BigInt(),\n label: Type.String(),\n });\n const result = coerceMcpInput(\n { amount: \"99999999999999999\", label: \"test\" },\n schema,\n ) as Record<string, unknown>;\n expect(result.amount).toBe(BigInt(\"99999999999999999\"));\n expect(result.label).toBe(\"test\");\n });\n\n test(\"non-BigInt fields in nested object pass through unchanged\", () => {\n const schema = Type.Object({\n name: Type.String(),\n count: Type.Integer(),\n });\n const input = { name: \"alice\", count: 5 };\n const result = coerceMcpInput(input, schema) as Record<string, unknown>;\n expect(result.name).toBe(\"alice\");\n expect(result.count).toBe(5);\n });\n\n test(\"coerces BigInt in nested object without touching other fields\", () => {\n const schema = Type.Object({\n stake: Type.BigInt(),\n fee: Type.BigInt(),\n memo: Type.String(),\n });\n const result = coerceMcpInput(\n { stake: \"1000\", fee: \"50\", memo: \"swap\" },\n schema,\n ) as Record<string, unknown>;\n expect(result.stake).toBe(BigInt(1000));\n expect(result.fee).toBe(BigInt(50));\n expect(result.memo).toBe(\"swap\");\n });\n\n // --- Arrays ---\n\n test(\"coerces each BigInt string in array of BigInt\", () => {\n const schema = Type.Array(Type.BigInt());\n const result = coerceMcpInput([\"100\", \"200\", \"300\"], schema) as BigInt[];\n expect(result[0]).toBe(BigInt(100));\n expect(result[1]).toBe(BigInt(200));\n expect(result[2]).toBe(BigInt(300));\n });\n\n test(\"array of strings with String item schema passes through unchanged\", () => {\n const schema = Type.Array(Type.String());\n const input = [\"a\", \"b\", \"c\"];\n const result = coerceMcpInput(input, schema);\n expect(result).toEqual([\"a\", \"b\", \"c\"]);\n });\n\n // --- Union types ---\n\n test(\"coerces BigInt string in Union containing BigInt\", () => {\n const schema = Type.Union([Type.String(), Type.BigInt()]);\n // A numeric string should be coerced to BigInt because there is a BigInt member\n const result = coerceMcpInput(\"12345\", schema);\n expect(result).toBe(BigInt(12345));\n });\n\n test(\"non-numeric string in Union passes through unchanged\", () => {\n const schema = Type.Union([Type.String(), Type.BigInt()]);\n const result = coerceMcpInput(\"not-a-number\", schema);\n expect(result).toBe(\"not-a-number\");\n });\n\n test(\"value in Union without BigInt member passes through unchanged\", () => {\n const schema = Type.Union([Type.String(), Type.Number()]);\n const result = coerceMcpInput(\"hello\", schema);\n expect(result).toBe(\"hello\");\n });\n});\n\n// ---------------------------------------------------------------------------\n// getMcpSdk -- lazy import and error handling\n// ---------------------------------------------------------------------------\n\ndescribe(\"getMcpSdk\", () => {\n test(\"returns an object with McpServer class when SDK is available\", async () => {\n // The SDK is installed as a dev dependency, so this should succeed\n const sdk = await getMcpSdk();\n expect(sdk).toBeDefined();\n expect(typeof sdk.McpServer).toBe(\"function\");\n });\n});\n\n// ---------------------------------------------------------------------------\n// createMcpServer -- integration tests with mocked McpServer\n// ---------------------------------------------------------------------------\n\ndescribe(\"createMcpServer\", () => {\n // We mock the MCP SDK so that createMcpServer does not need a real stdio\n // transport. The mock captures all tool registrations.\n\n let registeredTools: Array<{\n name: string;\n description: string;\n schema: Record<string, unknown>;\n handler: (input: unknown) => Promise<unknown>;\n }>;\n\n let mockMcpServer: any;\n let MockMcpServerClass: any;\n\n beforeEach(() => {\n registeredTools = [];\n\n mockMcpServer = {\n tool: (\n name: string,\n description: string,\n schema: Record<string, unknown>,\n handler: (input: unknown) => Promise<unknown>,\n ) => {\n registeredTools.push({ name, description, schema, handler });\n },\n };\n\n MockMcpServerClass = mock(() => mockMcpServer);\n\n mock.module(\"@modelcontextprotocol/sdk/server/mcp.js\", () => ({\n McpServer: MockMcpServerClass,\n }));\n });\n\n // Helper: build a minimal Sprinkle-like mock\n function makeMockSprinkle(actions: any[]): any {\n const actionMap = new Map(actions.map((a: any) => [a.name, a]));\n return {\n listActions: () => actions,\n getAction: (name: string) => actionMap.get(name),\n settings: {},\n };\n }\n\n // --- Tool registration ---\n\n test(\"registers one MCP tool per action\", async () => {\n const sprinkle = makeMockSprinkle([\n {\n name: \"greet\",\n description: \"Greets someone\",\n inputSchema: Type.Object({ who: Type.String() }),\n outputSchema: Type.Object({ greeting: Type.String() }),\n execute: async (input: any) => ({ greeting: `Hello, ${input.who}!` }),\n },\n ]);\n\n await createMcpServer(sprinkle, \"test-server\");\n\n expect(registeredTools).toHaveLength(1);\n });\n\n test(\"tool name matches action name\", async () => {\n const sprinkle = makeMockSprinkle([\n {\n name: \"send-tx\",\n description: \"Sends a transaction\",\n inputSchema: Type.Object({}),\n outputSchema: Type.Object({}),\n execute: async () => ({}),\n },\n ]);\n\n await createMcpServer(sprinkle, \"test-server\");\n\n expect(registeredTools[0]!.name).toBe(\"send-tx\");\n });\n\n test(\"tool description matches action description\", async () => {\n const sprinkle = makeMockSprinkle([\n {\n name: \"get-balance\",\n description: \"Gets the wallet balance\",\n inputSchema: Type.Object({}),\n outputSchema: Type.Object({ balance: Type.Number() }),\n execute: async () => ({ balance: 100 }),\n },\n ]);\n\n await createMcpServer(sprinkle, \"test-server\");\n\n expect(registeredTools[0]!.description).toBe(\"Gets the wallet balance\");\n });\n\n test(\"registers all actions when multiple actions are provided\", async () => {\n const sprinkle = makeMockSprinkle([\n {\n name: \"action-one\",\n description: \"First action\",\n inputSchema: Type.Object({}),\n outputSchema: Type.Object({}),\n execute: async () => ({}),\n },\n {\n name: \"action-two\",\n description: \"Second action\",\n inputSchema: Type.Object({}),\n outputSchema: Type.Object({}),\n execute: async () => ({}),\n },\n {\n name: \"action-three\",\n description: \"Third action\",\n inputSchema: Type.Object({}),\n outputSchema: Type.Object({}),\n execute: async () => ({}),\n },\n ]);\n\n await createMcpServer(sprinkle, \"test-server\");\n\n expect(registeredTools).toHaveLength(3);\n const names = registeredTools.map((t) => t.name);\n expect(names).toContain(\"action-one\");\n expect(names).toContain(\"action-two\");\n expect(names).toContain(\"action-three\");\n });\n\n // --- Empty action registry ---\n\n test(\"server is created with no tools when action registry is empty\", async () => {\n const sprinkle = makeMockSprinkle([]);\n\n await createMcpServer(sprinkle, \"test-server\");\n\n expect(registeredTools).toHaveLength(0);\n });\n\n // --- Tool input schema ---\n\n test(\"tool input schema is a Zod raw shape matching the action inputSchema\", async () => {\n const sprinkle = makeMockSprinkle([\n {\n name: \"typed-action\",\n description: \"Has a typed input\",\n inputSchema: Type.Object({\n name: Type.String(),\n count: Type.Integer(),\n }),\n outputSchema: Type.Object({}),\n execute: async () => ({}),\n },\n ]);\n\n await createMcpServer(sprinkle, \"test-server\");\n\n const schema = registeredTools[0]!.schema;\n // Schema is now a Zod raw shape (Record<string, ZodType>)\n expect(schema).toHaveProperty(\"name\");\n expect(schema).toHaveProperty(\"count\");\n // Verify they are Zod schema instances (have _zod internal property)\n expect((schema as Record<string, unknown>).name).toHaveProperty(\"_zod\");\n expect((schema as Record<string, unknown>).count).toHaveProperty(\"_zod\");\n });\n\n // --- Tool handler: successful execution ---\n\n test(\"tool handler returns content with JSON text on successful execution\", async () => {\n const sprinkle = makeMockSprinkle([\n {\n name: \"echo\",\n description: \"Echoes input\",\n inputSchema: Type.Object({ message: Type.String() }),\n outputSchema: Type.Object({ message: Type.String() }),\n execute: async (input: any) => ({ message: input.message }),\n },\n ]);\n\n await createMcpServer(sprinkle, \"test-server\");\n\n const handler = registeredTools[0]!.handler;\n const response = await handler({ message: \"hello\" }) as any;\n\n expect(response.content).toHaveLength(1);\n expect(response.content[0].type).toBe(\"text\");\n const data = JSON.parse(response.content[0].text);\n expect(data.message).toBe(\"hello\");\n });\n\n test(\"tool handler response does not include isError on success\", async () => {\n const sprinkle = makeMockSprinkle([\n {\n name: \"ok-action\",\n description: \"Succeeds\",\n inputSchema: Type.Object({}),\n outputSchema: Type.Object({ ok: Type.Boolean() }),\n execute: async () => ({ ok: true }),\n },\n ]);\n\n await createMcpServer(sprinkle, \"test-server\");\n\n const response = await registeredTools[0]!.handler({}) as any;\n expect(response.isError).toBeUndefined();\n });\n\n // --- Tool handler: failed execution ---\n\n test(\"tool handler returns isError: true on action failure\", async () => {\n const sprinkle = makeMockSprinkle([\n {\n name: \"fail-action\",\n description: \"Always fails\",\n inputSchema: Type.Object({}),\n outputSchema: Type.Object({}),\n execute: async () => {\n throw new Error(\"deliberate failure\");\n },\n },\n ]);\n\n await createMcpServer(sprinkle, \"test-server\");\n\n const response = await registeredTools[0]!.handler({}) as any;\n expect(response.isError).toBe(true);\n });\n\n test(\"tool handler error response contains error details in content text\", async () => {\n const sprinkle = makeMockSprinkle([\n {\n name: \"fail-action\",\n description: \"Always fails\",\n inputSchema: Type.Object({}),\n outputSchema: Type.Object({}),\n execute: async () => {\n throw new Error(\"something broke\");\n },\n },\n ]);\n\n await createMcpServer(sprinkle, \"test-server\");\n\n const response = await registeredTools[0]!.handler({}) as any;\n expect(response.content[0].type).toBe(\"text\");\n const errorData = JSON.parse(response.content[0].text);\n expect(errorData.error).toBeDefined();\n expect(errorData.error.message).toContain(\"something broke\");\n });\n\n test(\"tool handler error response content has type: 'text'\", async () => {\n const sprinkle = makeMockSprinkle([\n {\n name: \"fail-action\",\n description: \"Always fails\",\n inputSchema: Type.Object({}),\n outputSchema: Type.Object({}),\n execute: async () => {\n throw new Error(\"oops\");\n },\n },\n ]);\n\n await createMcpServer(sprinkle, \"test-server\");\n\n const response = await registeredTools[0]!.handler({}) as any;\n expect(response.content[0].type).toBe(\"text\");\n });\n\n // --- BigInt coercion in tool input ---\n\n test(\"tool handler coerces BigInt string input before executing action\", async () => {\n let capturedInput: any;\n const sprinkle = makeMockSprinkle([\n {\n name: \"bigint-action\",\n description: \"Takes BigInt input\",\n inputSchema: Type.Object({ amount: Type.BigInt() }),\n outputSchema: Type.Object({ amount: Type.BigInt() }),\n execute: async (input: any) => {\n capturedInput = input;\n return { amount: input.amount };\n },\n },\n ]);\n\n await createMcpServer(sprinkle, \"test-server\");\n\n await registeredTools[0]!.handler({ amount: \"999999999999999999\" });\n\n expect(capturedInput.amount).toBe(BigInt(\"999999999999999999\"));\n });\n\n // --- BigInt serialization in tool response ---\n\n test(\"tool handler serializes BigInt values in response text\", async () => {\n const sprinkle = makeMockSprinkle([\n {\n name: \"bigint-return\",\n description: \"Returns BigInt\",\n inputSchema: Type.Object({}),\n outputSchema: Type.Object({ value: Type.BigInt() }),\n execute: async () => ({ value: BigInt(\"9007199254740993\") }),\n },\n ]);\n\n await createMcpServer(sprinkle, \"test-server\");\n\n const response = await registeredTools[0]!.handler({}) as any;\n\n // BigInt values cannot be JSON.stringify'd without a replacer.\n // bigIntReplacer converts them to \"Xn\" strings.\n const text = response.content[0].text;\n expect(text).toContain(\"9007199254740993\");\n });\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,388 @@
|
|
|
1
|
+
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
2
|
+
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
3
|
+
function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
4
|
+
import { describe, expect, test, mock } from "bun:test";
|
|
5
|
+
import { ActionError } from "../actions/types.js";
|
|
6
|
+
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Mocks — mirror the Blaze SDK surface used by native-script.ts
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
|
|
11
|
+
let provideScriptCalls = [];
|
|
12
|
+
const mockCompletedTx = {
|
|
13
|
+
toCbor: () => "mock-tx-cbor"
|
|
14
|
+
};
|
|
15
|
+
mock.module("@blaze-cardano/sdk", () => ({
|
|
16
|
+
Core: {
|
|
17
|
+
Ed25519KeyHashHex: h => h,
|
|
18
|
+
Slot: n => n,
|
|
19
|
+
HexBlob: s => s,
|
|
20
|
+
ScriptPubkey: class ScriptPubkey {
|
|
21
|
+
constructor(h) {
|
|
22
|
+
_defineProperty(this, "hash", void 0);
|
|
23
|
+
this.hash = h;
|
|
24
|
+
}
|
|
25
|
+
},
|
|
26
|
+
ScriptAll: class ScriptAll {
|
|
27
|
+
constructor(s) {
|
|
28
|
+
_defineProperty(this, "scripts", void 0);
|
|
29
|
+
this.scripts = s;
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
ScriptAny: class ScriptAny {
|
|
33
|
+
constructor(s) {
|
|
34
|
+
_defineProperty(this, "scripts", void 0);
|
|
35
|
+
this.scripts = s;
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
ScriptNOfK: class ScriptNOfK {
|
|
39
|
+
constructor(s, n) {
|
|
40
|
+
_defineProperty(this, "scripts", void 0);
|
|
41
|
+
_defineProperty(this, "n", void 0);
|
|
42
|
+
this.scripts = s;
|
|
43
|
+
this.n = n;
|
|
44
|
+
}
|
|
45
|
+
},
|
|
46
|
+
TimelockExpiry: class TimelockExpiry {
|
|
47
|
+
constructor(s) {
|
|
48
|
+
_defineProperty(this, "slot", void 0);
|
|
49
|
+
this.slot = s;
|
|
50
|
+
}
|
|
51
|
+
},
|
|
52
|
+
TimelockStart: class TimelockStart {
|
|
53
|
+
constructor(s) {
|
|
54
|
+
_defineProperty(this, "slot", void 0);
|
|
55
|
+
this.slot = s;
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
NativeScript: {
|
|
59
|
+
fromCbor: hex => {
|
|
60
|
+
if (hex === "invalid") throw new Error("Invalid CBOR");
|
|
61
|
+
return {
|
|
62
|
+
__fromCbor: hex
|
|
63
|
+
};
|
|
64
|
+
},
|
|
65
|
+
newScriptPubkey: sp => ({
|
|
66
|
+
__type: "pubkey",
|
|
67
|
+
value: sp
|
|
68
|
+
}),
|
|
69
|
+
newScriptAll: sa => ({
|
|
70
|
+
__type: "all",
|
|
71
|
+
value: sa
|
|
72
|
+
}),
|
|
73
|
+
newScriptAny: sa => ({
|
|
74
|
+
__type: "any",
|
|
75
|
+
value: sa
|
|
76
|
+
}),
|
|
77
|
+
newScriptNOfK: sn => ({
|
|
78
|
+
__type: "nofk",
|
|
79
|
+
value: sn
|
|
80
|
+
}),
|
|
81
|
+
newTimelockExpiry: te => ({
|
|
82
|
+
__type: "timelockExpiry",
|
|
83
|
+
value: te
|
|
84
|
+
}),
|
|
85
|
+
newTimelockStart: ts => ({
|
|
86
|
+
__type: "timelockStart",
|
|
87
|
+
value: ts
|
|
88
|
+
})
|
|
89
|
+
},
|
|
90
|
+
Script: {
|
|
91
|
+
newNativeScript: ns => ({
|
|
92
|
+
__nativeScript: ns,
|
|
93
|
+
hash: () => {
|
|
94
|
+
// Produce a deterministic hex hash from the native script content
|
|
95
|
+
if (ns?.__type === "pubkey") return ns.value.hash;
|
|
96
|
+
if (ns?.__fromCbor) return "cbor" + ns.__fromCbor;
|
|
97
|
+
return "0".repeat(56);
|
|
98
|
+
}
|
|
99
|
+
})
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}));
|
|
103
|
+
const {
|
|
104
|
+
toNativeScript,
|
|
105
|
+
completeWithScripts
|
|
106
|
+
} = await import("../actions/builtin/native-script.js");
|
|
107
|
+
|
|
108
|
+
// ---------------------------------------------------------------------------
|
|
109
|
+
// toNativeScript — CBOR hex input
|
|
110
|
+
// ---------------------------------------------------------------------------
|
|
111
|
+
|
|
112
|
+
describe("toNativeScript — CBOR hex", () => {
|
|
113
|
+
test("converts valid CBOR hex string", () => {
|
|
114
|
+
const result = toNativeScript("82018200");
|
|
115
|
+
expect(result.__nativeScript).toEqual({
|
|
116
|
+
__fromCbor: "82018200"
|
|
117
|
+
});
|
|
118
|
+
expect(typeof result.hash).toBe("function");
|
|
119
|
+
});
|
|
120
|
+
test("throws INVALID_NATIVE_SCRIPT for invalid CBOR", () => {
|
|
121
|
+
expect(() => toNativeScript("invalid")).toThrow(ActionError);
|
|
122
|
+
try {
|
|
123
|
+
toNativeScript("invalid");
|
|
124
|
+
} catch (err) {
|
|
125
|
+
expect(err.code).toBe("INVALID_NATIVE_SCRIPT");
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
});
|
|
129
|
+
|
|
130
|
+
// ---------------------------------------------------------------------------
|
|
131
|
+
// toNativeScript — MultisigScript JSON input
|
|
132
|
+
// ---------------------------------------------------------------------------
|
|
133
|
+
|
|
134
|
+
describe("toNativeScript — MultisigScript JSON", () => {
|
|
135
|
+
const keyHash = "a".repeat(56);
|
|
136
|
+
test("converts Signature", () => {
|
|
137
|
+
const result = toNativeScript({
|
|
138
|
+
Signature: {
|
|
139
|
+
key_hash: keyHash
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
expect(result.__nativeScript.__type).toBe("pubkey");
|
|
143
|
+
expect(result.__nativeScript.value.hash).toBe(keyHash);
|
|
144
|
+
});
|
|
145
|
+
test("converts AllOf with nested scripts", () => {
|
|
146
|
+
const result = toNativeScript({
|
|
147
|
+
AllOf: {
|
|
148
|
+
scripts: [{
|
|
149
|
+
Signature: {
|
|
150
|
+
key_hash: keyHash
|
|
151
|
+
}
|
|
152
|
+
}, {
|
|
153
|
+
Signature: {
|
|
154
|
+
key_hash: "b".repeat(56)
|
|
155
|
+
}
|
|
156
|
+
}]
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
expect(result.__nativeScript.__type).toBe("all");
|
|
160
|
+
expect(result.__nativeScript.value.scripts).toHaveLength(2);
|
|
161
|
+
});
|
|
162
|
+
test("converts AnyOf", () => {
|
|
163
|
+
const result = toNativeScript({
|
|
164
|
+
AnyOf: {
|
|
165
|
+
scripts: [{
|
|
166
|
+
Signature: {
|
|
167
|
+
key_hash: keyHash
|
|
168
|
+
}
|
|
169
|
+
}]
|
|
170
|
+
}
|
|
171
|
+
});
|
|
172
|
+
expect(result.__nativeScript.__type).toBe("any");
|
|
173
|
+
});
|
|
174
|
+
test("converts AtLeast", () => {
|
|
175
|
+
const result = toNativeScript({
|
|
176
|
+
AtLeast: {
|
|
177
|
+
required: 2n,
|
|
178
|
+
scripts: [{
|
|
179
|
+
Signature: {
|
|
180
|
+
key_hash: keyHash
|
|
181
|
+
}
|
|
182
|
+
}, {
|
|
183
|
+
Signature: {
|
|
184
|
+
key_hash: "b".repeat(56)
|
|
185
|
+
}
|
|
186
|
+
}, {
|
|
187
|
+
Signature: {
|
|
188
|
+
key_hash: "c".repeat(56)
|
|
189
|
+
}
|
|
190
|
+
}]
|
|
191
|
+
}
|
|
192
|
+
});
|
|
193
|
+
expect(result.__nativeScript.__type).toBe("nofk");
|
|
194
|
+
expect(result.__nativeScript.value.n).toBe(2);
|
|
195
|
+
expect(result.__nativeScript.value.scripts).toHaveLength(3);
|
|
196
|
+
});
|
|
197
|
+
test("converts Before (TimelockExpiry)", () => {
|
|
198
|
+
const result = toNativeScript({
|
|
199
|
+
Before: {
|
|
200
|
+
time: 1000n
|
|
201
|
+
}
|
|
202
|
+
});
|
|
203
|
+
expect(result.__nativeScript.__type).toBe("timelockExpiry");
|
|
204
|
+
expect(result.__nativeScript.value.slot).toBe(1000);
|
|
205
|
+
});
|
|
206
|
+
test("converts After (TimelockStart)", () => {
|
|
207
|
+
const result = toNativeScript({
|
|
208
|
+
After: {
|
|
209
|
+
time: 500n
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
expect(result.__nativeScript.__type).toBe("timelockStart");
|
|
213
|
+
expect(result.__nativeScript.value.slot).toBe(500);
|
|
214
|
+
});
|
|
215
|
+
test("converts Script (script hash reference)", () => {
|
|
216
|
+
const result = toNativeScript({
|
|
217
|
+
Script: {
|
|
218
|
+
script_hash: keyHash
|
|
219
|
+
}
|
|
220
|
+
});
|
|
221
|
+
expect(result.__nativeScript.__type).toBe("pubkey");
|
|
222
|
+
expect(result.__nativeScript.value.hash).toBe(keyHash);
|
|
223
|
+
});
|
|
224
|
+
test("handles deeply nested structures", () => {
|
|
225
|
+
const result = toNativeScript({
|
|
226
|
+
AllOf: {
|
|
227
|
+
scripts: [{
|
|
228
|
+
AtLeast: {
|
|
229
|
+
required: 1n,
|
|
230
|
+
scripts: [{
|
|
231
|
+
Signature: {
|
|
232
|
+
key_hash: keyHash
|
|
233
|
+
}
|
|
234
|
+
}, {
|
|
235
|
+
AnyOf: {
|
|
236
|
+
scripts: [{
|
|
237
|
+
Signature: {
|
|
238
|
+
key_hash: "b".repeat(56)
|
|
239
|
+
}
|
|
240
|
+
}]
|
|
241
|
+
}
|
|
242
|
+
}]
|
|
243
|
+
}
|
|
244
|
+
}, {
|
|
245
|
+
After: {
|
|
246
|
+
time: 100n
|
|
247
|
+
}
|
|
248
|
+
}]
|
|
249
|
+
}
|
|
250
|
+
});
|
|
251
|
+
expect(result.__nativeScript.__type).toBe("all");
|
|
252
|
+
expect(result.__nativeScript.value.scripts).toHaveLength(2);
|
|
253
|
+
});
|
|
254
|
+
});
|
|
255
|
+
|
|
256
|
+
// ---------------------------------------------------------------------------
|
|
257
|
+
// completeWithScripts
|
|
258
|
+
// ---------------------------------------------------------------------------
|
|
259
|
+
|
|
260
|
+
describe("completeWithScripts", () => {
|
|
261
|
+
function makeTxBuilder() {
|
|
262
|
+
provideScriptCalls = [];
|
|
263
|
+
const builder = {
|
|
264
|
+
provideScript: script => {
|
|
265
|
+
provideScriptCalls.push(script);
|
|
266
|
+
return builder;
|
|
267
|
+
},
|
|
268
|
+
complete: async () => mockCompletedTx
|
|
269
|
+
};
|
|
270
|
+
return builder;
|
|
271
|
+
}
|
|
272
|
+
test("completes without scripts when none provided", async () => {
|
|
273
|
+
const builder = makeTxBuilder();
|
|
274
|
+
const tx = await completeWithScripts(builder);
|
|
275
|
+
expect(tx).toBe(mockCompletedTx);
|
|
276
|
+
expect(provideScriptCalls).toHaveLength(0);
|
|
277
|
+
});
|
|
278
|
+
test("completes without scripts when empty array provided", async () => {
|
|
279
|
+
const builder = makeTxBuilder();
|
|
280
|
+
const tx = await completeWithScripts(builder, []);
|
|
281
|
+
expect(tx).toBe(mockCompletedTx);
|
|
282
|
+
expect(provideScriptCalls).toHaveLength(0);
|
|
283
|
+
});
|
|
284
|
+
test("attaches scripts before completing", async () => {
|
|
285
|
+
const builder = makeTxBuilder();
|
|
286
|
+
const keyHash = "a".repeat(56);
|
|
287
|
+
const tx = await completeWithScripts(builder, [{
|
|
288
|
+
Signature: {
|
|
289
|
+
key_hash: keyHash
|
|
290
|
+
}
|
|
291
|
+
}, "82018200"]);
|
|
292
|
+
expect(tx).toBe(mockCompletedTx);
|
|
293
|
+
expect(provideScriptCalls).toHaveLength(2);
|
|
294
|
+
});
|
|
295
|
+
test("propagates ActionError from invalid script input", async () => {
|
|
296
|
+
const builder = makeTxBuilder();
|
|
297
|
+
await expect(completeWithScripts(builder, ["invalid"])).rejects.toMatchObject({
|
|
298
|
+
code: "INVALID_NATIVE_SCRIPT"
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
test("retries with addressbook script on missing script hash error", async () => {
|
|
302
|
+
const keyHash = "a".repeat(56);
|
|
303
|
+
const expectedScriptHash = keyHash;
|
|
304
|
+
let attempt = 0;
|
|
305
|
+
provideScriptCalls = [];
|
|
306
|
+
const builder = {
|
|
307
|
+
provideScript: script => {
|
|
308
|
+
provideScriptCalls.push(script);
|
|
309
|
+
return builder;
|
|
310
|
+
},
|
|
311
|
+
complete: async () => {
|
|
312
|
+
attempt++;
|
|
313
|
+
if (attempt === 1) {
|
|
314
|
+
throw new Error(`complete: Could not resolve script hash ${expectedScriptHash}`);
|
|
315
|
+
}
|
|
316
|
+
return mockCompletedTx;
|
|
317
|
+
}
|
|
318
|
+
};
|
|
319
|
+
const context = {
|
|
320
|
+
sprinkle: {
|
|
321
|
+
addressbook: {
|
|
322
|
+
"my-multisig": {
|
|
323
|
+
Signature: {
|
|
324
|
+
key_hash: keyHash
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
},
|
|
329
|
+
settings: {}
|
|
330
|
+
};
|
|
331
|
+
const tx = await completeWithScripts(builder, undefined, context);
|
|
332
|
+
expect(tx).toBe(mockCompletedTx);
|
|
333
|
+
expect(attempt).toBe(2);
|
|
334
|
+
expect(provideScriptCalls).toHaveLength(1);
|
|
335
|
+
});
|
|
336
|
+
test("throws original error when script hash not in addressbook", async () => {
|
|
337
|
+
const builder = {
|
|
338
|
+
provideScript: () => builder,
|
|
339
|
+
complete: async () => {
|
|
340
|
+
throw new Error("complete: Could not resolve script hash deadbeef1234");
|
|
341
|
+
}
|
|
342
|
+
};
|
|
343
|
+
const context = {
|
|
344
|
+
sprinkle: {
|
|
345
|
+
addressbook: {
|
|
346
|
+
"unrelated": {
|
|
347
|
+
Signature: {
|
|
348
|
+
key_hash: "b".repeat(56)
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
}
|
|
352
|
+
},
|
|
353
|
+
settings: {}
|
|
354
|
+
};
|
|
355
|
+
await expect(completeWithScripts(builder, undefined, context)).rejects.toThrow("Could not resolve script hash deadbeef1234");
|
|
356
|
+
});
|
|
357
|
+
test("throws original error when no addressbook in context", async () => {
|
|
358
|
+
const builder = {
|
|
359
|
+
provideScript: () => builder,
|
|
360
|
+
complete: async () => {
|
|
361
|
+
throw new Error("complete: Could not resolve script hash deadbeef1234");
|
|
362
|
+
}
|
|
363
|
+
};
|
|
364
|
+
await expect(completeWithScripts(builder, undefined, undefined)).rejects.toThrow("Could not resolve script hash deadbeef1234");
|
|
365
|
+
});
|
|
366
|
+
test("throws non-script errors without retry", async () => {
|
|
367
|
+
const builder = {
|
|
368
|
+
provideScript: () => builder,
|
|
369
|
+
complete: async () => {
|
|
370
|
+
throw new Error("some other error");
|
|
371
|
+
}
|
|
372
|
+
};
|
|
373
|
+
const context = {
|
|
374
|
+
sprinkle: {
|
|
375
|
+
addressbook: {
|
|
376
|
+
"my-sig": {
|
|
377
|
+
Signature: {
|
|
378
|
+
key_hash: "a".repeat(56)
|
|
379
|
+
}
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
},
|
|
383
|
+
settings: {}
|
|
384
|
+
};
|
|
385
|
+
await expect(completeWithScripts(builder, undefined, context)).rejects.toThrow("some other error");
|
|
386
|
+
});
|
|
387
|
+
});
|
|
388
|
+
//# sourceMappingURL=native-script.test.js.map
|