@sundaeswap/sprinkles 0.6.1 → 0.7.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.
Files changed (153) hide show
  1. package/dist/cjs/Sprinkle/__tests__/action-integration.test.js +590 -0
  2. package/dist/cjs/Sprinkle/__tests__/action-integration.test.js.map +1 -0
  3. package/dist/cjs/Sprinkle/__tests__/action-registry.test.js +193 -0
  4. package/dist/cjs/Sprinkle/__tests__/action-registry.test.js.map +1 -0
  5. package/dist/cjs/Sprinkle/__tests__/action-runner.test.js +304 -0
  6. package/dist/cjs/Sprinkle/__tests__/action-runner.test.js.map +1 -0
  7. package/dist/cjs/Sprinkle/__tests__/builtin-actions.test.js +1110 -0
  8. package/dist/cjs/Sprinkle/__tests__/builtin-actions.test.js.map +1 -0
  9. package/dist/cjs/Sprinkle/__tests__/cli-adapter.test.js +722 -0
  10. package/dist/cjs/Sprinkle/__tests__/cli-adapter.test.js.map +1 -0
  11. package/dist/cjs/Sprinkle/__tests__/mcp-adapter.test.js +713 -0
  12. package/dist/cjs/Sprinkle/__tests__/mcp-adapter.test.js.map +1 -0
  13. package/dist/cjs/Sprinkle/__tests__/tui-helpers.test.js +334 -0
  14. package/dist/cjs/Sprinkle/__tests__/tui-helpers.test.js.map +1 -0
  15. package/dist/cjs/Sprinkle/__tests__/wallet-transaction-actions.test.js +749 -0
  16. package/dist/cjs/Sprinkle/__tests__/wallet-transaction-actions.test.js.map +1 -0
  17. package/dist/cjs/Sprinkle/actions/builtin/blaze-helper.js +61 -0
  18. package/dist/cjs/Sprinkle/actions/builtin/blaze-helper.js.map +1 -0
  19. package/dist/cjs/Sprinkle/actions/builtin/index.js +117 -0
  20. package/dist/cjs/Sprinkle/actions/builtin/index.js.map +1 -0
  21. package/dist/cjs/Sprinkle/actions/builtin/profile-actions.js +202 -0
  22. package/dist/cjs/Sprinkle/actions/builtin/profile-actions.js.map +1 -0
  23. package/dist/cjs/Sprinkle/actions/builtin/settings-actions.js +87 -0
  24. package/dist/cjs/Sprinkle/actions/builtin/settings-actions.js.map +1 -0
  25. package/dist/cjs/Sprinkle/actions/builtin/transaction-actions.js +345 -0
  26. package/dist/cjs/Sprinkle/actions/builtin/transaction-actions.js.map +1 -0
  27. package/dist/cjs/Sprinkle/actions/builtin/wallet-actions.js +212 -0
  28. package/dist/cjs/Sprinkle/actions/builtin/wallet-actions.js.map +1 -0
  29. package/dist/cjs/Sprinkle/actions/cli-adapter.js +372 -0
  30. package/dist/cjs/Sprinkle/actions/cli-adapter.js.map +1 -0
  31. package/dist/cjs/Sprinkle/actions/index.js +127 -0
  32. package/dist/cjs/Sprinkle/actions/index.js.map +1 -0
  33. package/dist/cjs/Sprinkle/actions/mcp-adapter.js +415 -0
  34. package/dist/cjs/Sprinkle/actions/mcp-adapter.js.map +1 -0
  35. package/dist/cjs/Sprinkle/actions/registry.js +92 -0
  36. package/dist/cjs/Sprinkle/actions/registry.js.map +1 -0
  37. package/dist/cjs/Sprinkle/actions/runner.js +190 -0
  38. package/dist/cjs/Sprinkle/actions/runner.js.map +1 -0
  39. package/dist/cjs/Sprinkle/actions/tui-helpers.js +96 -0
  40. package/dist/cjs/Sprinkle/actions/tui-helpers.js.map +1 -0
  41. package/dist/cjs/Sprinkle/actions/types.js +68 -0
  42. package/dist/cjs/Sprinkle/actions/types.js.map +1 -0
  43. package/dist/cjs/Sprinkle/index.js +412 -1
  44. package/dist/cjs/Sprinkle/index.js.map +1 -1
  45. package/dist/cjs/Sprinkle/prompts.js +12 -7
  46. package/dist/cjs/Sprinkle/prompts.js.map +1 -1
  47. package/dist/cjs/Sprinkle/type-guards.js +7 -1
  48. package/dist/cjs/Sprinkle/type-guards.js.map +1 -1
  49. package/dist/esm/Sprinkle/__tests__/action-integration.test.js +588 -0
  50. package/dist/esm/Sprinkle/__tests__/action-integration.test.js.map +1 -0
  51. package/dist/esm/Sprinkle/__tests__/action-registry.test.js +192 -0
  52. package/dist/esm/Sprinkle/__tests__/action-registry.test.js.map +1 -0
  53. package/dist/esm/Sprinkle/__tests__/action-runner.test.js +302 -0
  54. package/dist/esm/Sprinkle/__tests__/action-runner.test.js.map +1 -0
  55. package/dist/esm/Sprinkle/__tests__/builtin-actions.test.js +1107 -0
  56. package/dist/esm/Sprinkle/__tests__/builtin-actions.test.js.map +1 -0
  57. package/dist/esm/Sprinkle/__tests__/cli-adapter.test.js +720 -0
  58. package/dist/esm/Sprinkle/__tests__/cli-adapter.test.js.map +1 -0
  59. package/dist/esm/Sprinkle/__tests__/mcp-adapter.test.js +712 -0
  60. package/dist/esm/Sprinkle/__tests__/mcp-adapter.test.js.map +1 -0
  61. package/dist/esm/Sprinkle/__tests__/tui-helpers.test.js +332 -0
  62. package/dist/esm/Sprinkle/__tests__/tui-helpers.test.js.map +1 -0
  63. package/dist/esm/Sprinkle/__tests__/wallet-transaction-actions.test.js +747 -0
  64. package/dist/esm/Sprinkle/__tests__/wallet-transaction-actions.test.js.map +1 -0
  65. package/dist/esm/Sprinkle/actions/builtin/blaze-helper.js +55 -0
  66. package/dist/esm/Sprinkle/actions/builtin/blaze-helper.js.map +1 -0
  67. package/dist/esm/Sprinkle/actions/builtin/index.js +32 -0
  68. package/dist/esm/Sprinkle/actions/builtin/index.js.map +1 -0
  69. package/dist/esm/Sprinkle/actions/builtin/profile-actions.js +197 -0
  70. package/dist/esm/Sprinkle/actions/builtin/profile-actions.js.map +1 -0
  71. package/dist/esm/Sprinkle/actions/builtin/settings-actions.js +81 -0
  72. package/dist/esm/Sprinkle/actions/builtin/settings-actions.js.map +1 -0
  73. package/dist/esm/Sprinkle/actions/builtin/transaction-actions.js +340 -0
  74. package/dist/esm/Sprinkle/actions/builtin/transaction-actions.js.map +1 -0
  75. package/dist/esm/Sprinkle/actions/builtin/wallet-actions.js +207 -0
  76. package/dist/esm/Sprinkle/actions/builtin/wallet-actions.js.map +1 -0
  77. package/dist/esm/Sprinkle/actions/cli-adapter.js +361 -0
  78. package/dist/esm/Sprinkle/actions/cli-adapter.js.map +1 -0
  79. package/dist/esm/Sprinkle/actions/index.js +12 -0
  80. package/dist/esm/Sprinkle/actions/index.js.map +1 -0
  81. package/dist/esm/Sprinkle/actions/mcp-adapter.js +407 -0
  82. package/dist/esm/Sprinkle/actions/mcp-adapter.js.map +1 -0
  83. package/dist/esm/Sprinkle/actions/registry.js +85 -0
  84. package/dist/esm/Sprinkle/actions/registry.js.map +1 -0
  85. package/dist/esm/Sprinkle/actions/runner.js +182 -0
  86. package/dist/esm/Sprinkle/actions/runner.js.map +1 -0
  87. package/dist/esm/Sprinkle/actions/tui-helpers.js +91 -0
  88. package/dist/esm/Sprinkle/actions/tui-helpers.js.map +1 -0
  89. package/dist/esm/Sprinkle/actions/types.js +61 -0
  90. package/dist/esm/Sprinkle/actions/types.js.map +1 -0
  91. package/dist/esm/Sprinkle/index.js +260 -1
  92. package/dist/esm/Sprinkle/index.js.map +1 -1
  93. package/dist/esm/Sprinkle/prompts.js +12 -7
  94. package/dist/esm/Sprinkle/prompts.js.map +1 -1
  95. package/dist/esm/Sprinkle/type-guards.js +3 -0
  96. package/dist/esm/Sprinkle/type-guards.js.map +1 -1
  97. package/dist/types/Sprinkle/actions/builtin/blaze-helper.d.ts +39 -0
  98. package/dist/types/Sprinkle/actions/builtin/blaze-helper.d.ts.map +1 -0
  99. package/dist/types/Sprinkle/actions/builtin/index.d.ts +26 -0
  100. package/dist/types/Sprinkle/actions/builtin/index.d.ts.map +1 -0
  101. package/dist/types/Sprinkle/actions/builtin/profile-actions.d.ts +55 -0
  102. package/dist/types/Sprinkle/actions/builtin/profile-actions.d.ts.map +1 -0
  103. package/dist/types/Sprinkle/actions/builtin/settings-actions.d.ts +32 -0
  104. package/dist/types/Sprinkle/actions/builtin/settings-actions.d.ts.map +1 -0
  105. package/dist/types/Sprinkle/actions/builtin/transaction-actions.d.ts +70 -0
  106. package/dist/types/Sprinkle/actions/builtin/transaction-actions.d.ts.map +1 -0
  107. package/dist/types/Sprinkle/actions/builtin/wallet-actions.d.ts +50 -0
  108. package/dist/types/Sprinkle/actions/builtin/wallet-actions.d.ts.map +1 -0
  109. package/dist/types/Sprinkle/actions/cli-adapter.d.ts +104 -0
  110. package/dist/types/Sprinkle/actions/cli-adapter.d.ts.map +1 -0
  111. package/dist/types/Sprinkle/actions/index.d.ts +12 -0
  112. package/dist/types/Sprinkle/actions/index.d.ts.map +1 -0
  113. package/dist/types/Sprinkle/actions/mcp-adapter.d.ts +92 -0
  114. package/dist/types/Sprinkle/actions/mcp-adapter.d.ts.map +1 -0
  115. package/dist/types/Sprinkle/actions/registry.d.ts +42 -0
  116. package/dist/types/Sprinkle/actions/registry.d.ts.map +1 -0
  117. package/dist/types/Sprinkle/actions/runner.d.ts +45 -0
  118. package/dist/types/Sprinkle/actions/runner.d.ts.map +1 -0
  119. package/dist/types/Sprinkle/actions/tui-helpers.d.ts +53 -0
  120. package/dist/types/Sprinkle/actions/tui-helpers.d.ts.map +1 -0
  121. package/dist/types/Sprinkle/actions/types.d.ts +76 -0
  122. package/dist/types/Sprinkle/actions/types.d.ts.map +1 -0
  123. package/dist/types/Sprinkle/index.d.ts +81 -1
  124. package/dist/types/Sprinkle/index.d.ts.map +1 -1
  125. package/dist/types/Sprinkle/prompts.d.ts.map +1 -1
  126. package/dist/types/Sprinkle/type-guards.d.ts +4 -1
  127. package/dist/types/Sprinkle/type-guards.d.ts.map +1 -1
  128. package/dist/types/tsconfig.build.tsbuildinfo +1 -1
  129. package/package.json +9 -2
  130. package/src/Sprinkle/__tests__/action-integration.test.ts +558 -0
  131. package/src/Sprinkle/__tests__/action-registry.test.ts +187 -0
  132. package/src/Sprinkle/__tests__/action-runner.test.ts +324 -0
  133. package/src/Sprinkle/__tests__/builtin-actions.test.ts +1022 -0
  134. package/src/Sprinkle/__tests__/cli-adapter.test.ts +715 -0
  135. package/src/Sprinkle/__tests__/mcp-adapter.test.ts +718 -0
  136. package/src/Sprinkle/__tests__/tui-helpers.test.ts +325 -0
  137. package/src/Sprinkle/__tests__/wallet-transaction-actions.test.ts +695 -0
  138. package/src/Sprinkle/actions/builtin/blaze-helper.ts +89 -0
  139. package/src/Sprinkle/actions/builtin/index.ts +86 -0
  140. package/src/Sprinkle/actions/builtin/profile-actions.ts +229 -0
  141. package/src/Sprinkle/actions/builtin/settings-actions.ts +99 -0
  142. package/src/Sprinkle/actions/builtin/transaction-actions.ts +381 -0
  143. package/src/Sprinkle/actions/builtin/wallet-actions.ts +233 -0
  144. package/src/Sprinkle/actions/cli-adapter.ts +430 -0
  145. package/src/Sprinkle/actions/index.ts +32 -0
  146. package/src/Sprinkle/actions/mcp-adapter.ts +463 -0
  147. package/src/Sprinkle/actions/registry.ts +97 -0
  148. package/src/Sprinkle/actions/runner.ts +200 -0
  149. package/src/Sprinkle/actions/tui-helpers.ts +114 -0
  150. package/src/Sprinkle/actions/types.ts +91 -0
  151. package/src/Sprinkle/index.ts +351 -0
  152. package/src/Sprinkle/prompts.ts +118 -72
  153. package/src/Sprinkle/type-guards.ts +9 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet-transaction-actions.test.js","names":["describe","expect","test","mock","beforeEach","ActionError","makeAddress","bech32","toBech32","makeAssetId","policyId","assetName","makeUtxo","opts","tokenEntries","tokens","map","t","quantity","input","transactionId","toString","txHash","index","BigInt","output","amount","coin","lovelace","multiasset","length","entries","undefined","mockBlaze","mockIsHot","mockBlazeError","module","getBlazeFromContext","isHotWallet","Core","AssetId","getPolicyId","assetId","slice","getAssetName","Transaction","fromCbor","cbor","mockTxFromCbor","TxCBOR","s","Blaze","HotWallet","body","hash","inputs","values","outputs","address","fee","requiredSigners","witnessSet","vkeys","toCbor","getWalletAddress","getWalletBalance","getWalletUtxos","signTransaction","submitTransaction","signAndSubmit","decodeTransaction","makeContext","settingsOverrides","sprinkle","settings","network","provider","type","apiKey","wallet","mnemonic","getChangeAddress","ctx","result","execute","toBe","missingFields","rejects","toMatchObject","code","Error","name","category","inputSchema","toBeDefined","outputSchema","getUnspentOutputs","ada","toEqual","repeat","toHaveLength","total","utxos","outputIndex","Array","from","_","i","limit","size","txCbor","signedTxCbor","signatureCount","submitted","waitForConfirmation","confirmed","toBeUndefined","err","details","toBytes"],"sources":["../../../../src/Sprinkle/__tests__/wallet-transaction-actions.test.ts"],"sourcesContent":["import { describe, expect, test, mock, beforeEach } from \"bun:test\";\nimport { Type } from \"@sinclair/typebox\";\nimport { ActionError } from \"../actions/types.js\";\n\n// ---------------------------------------------------------------------------\n// Mocks\n// ---------------------------------------------------------------------------\n\n// Mock wallet/UTxO data factories\nfunction makeAddress(bech32 = \"addr_test1qz...mock\") {\n return { toBech32: () => bech32 };\n}\n\nfunction makeAssetId(policyId: string, assetName: string) {\n return `${policyId}${assetName}`;\n}\n\nfunction makeUtxo(opts: {\n txHash: string;\n index: number;\n lovelace: bigint;\n tokens?: Array<{ policyId: string; assetName: string; quantity: bigint }>;\n}) {\n const tokenEntries = (opts.tokens ?? []).map((t) => [\n makeAssetId(t.policyId, t.assetName),\n t.quantity,\n ]);\n\n return {\n input: () => ({\n transactionId: () => ({ toString: () => opts.txHash }),\n index: () => BigInt(opts.index),\n }),\n output: () => ({\n amount: () => ({\n coin: () => opts.lovelace,\n multiasset: () =>\n tokenEntries.length > 0\n ? { entries: () => tokenEntries }\n : undefined,\n }),\n }),\n };\n}\n\n// Controllable mock state\nlet mockBlaze: any = {};\nlet mockIsHot = true;\nlet mockBlazeError: Error | null = null;\n\nmock.module(\"../actions/builtin/blaze-helper.js\", () => ({\n getBlazeFromContext: async () => {\n if (mockBlazeError) throw mockBlazeError;\n return mockBlaze;\n },\n isHotWallet: () => mockIsHot,\n}));\n\n// Mock Core.AssetId static methods used by wallet/transaction actions\nmock.module(\"@blaze-cardano/sdk\", () => ({\n Core: {\n AssetId: {\n getPolicyId: (assetId: string) => assetId.slice(0, 56),\n getAssetName: (assetId: string) => assetId.slice(56),\n },\n Transaction: {\n fromCbor: (cbor: string) => mockTxFromCbor(cbor),\n },\n TxCBOR: (s: string) => s,\n },\n Blaze: class {},\n HotWallet: class {},\n}));\n\n// Controllable mock transaction from CBOR\n// These mock objects are compatible with the real countSignatures/getRequiredSigners\n// from tx-dialog.ts, so we don't need to mock that module (which would leak globally).\nlet mockTxFromCbor: (cbor: string) => any = () => ({\n body: () => ({\n hash: () => ({ toString: () => \"abc123txhash\" }),\n inputs: () => ({\n values: () => [\n {\n transactionId: () => ({ toString: () => \"input-tx-hash-1\" }),\n index: () => 0n,\n },\n ],\n }),\n outputs: () => [\n {\n address: () => ({ toBech32: () => \"addr_test1output...\" }),\n amount: () => ({\n coin: () => 2_000_000n,\n multiasset: () => undefined,\n }),\n },\n ],\n fee: () => 200_000n,\n requiredSigners: () => null,\n }),\n witnessSet: () => ({\n vkeys: () => null,\n }),\n toCbor: () => \"signed-cbor-hex\",\n});\n\n// Now import the actions (after mocks are set up)\nconst { getWalletAddress, getWalletBalance, getWalletUtxos } = await import(\n \"../actions/builtin/wallet-actions.js\"\n);\nconst {\n signTransaction,\n submitTransaction,\n signAndSubmit,\n decodeTransaction,\n} = await import(\"../actions/builtin/transaction-actions.js\");\n\n// Minimal context factory\nfunction makeContext(settingsOverrides: Record<string, unknown> = {}) {\n return {\n sprinkle: {} as any,\n settings: {\n network: \"preview\",\n provider: { type: \"blockfrost\", apiKey: \"test\" },\n wallet: { type: \"hot\", mnemonic: \"test words\" },\n ...settingsOverrides,\n } as any,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Wallet Actions\n// ---------------------------------------------------------------------------\n\ndescribe(\"get-wallet-address\", () => {\n beforeEach(() => {\n mockBlazeError = null;\n mockIsHot = true;\n });\n\n test(\"returns bech32 address and network\", async () => {\n mockBlaze = {\n wallet: {\n getChangeAddress: async () => makeAddress(\"addr_test1qzabc123\"),\n },\n };\n const ctx = makeContext();\n const result = await getWalletAddress.execute({}, ctx);\n expect(result.address).toBe(\"addr_test1qzabc123\");\n expect(result.network).toBe(\"preview\");\n });\n\n test(\"returns 'unknown' network when not in settings\", async () => {\n mockBlaze = {\n wallet: {\n getChangeAddress: async () => makeAddress(\"addr1mainnet\"),\n },\n };\n const ctx = makeContext({ network: undefined });\n const result = await getWalletAddress.execute({}, ctx);\n expect(result.network).toBe(\"unknown\");\n });\n\n test(\"throws WALLET_NOT_CONFIGURED when getBlazeFromContext fails\", async () => {\n mockBlazeError = new ActionError(\"Missing settings\", \"WALLET_NOT_CONFIGURED\", {\n missingFields: [\"wallet\"],\n });\n const ctx = makeContext();\n await expect(getWalletAddress.execute({}, ctx)).rejects.toMatchObject({\n code: \"WALLET_NOT_CONFIGURED\",\n });\n });\n\n test(\"throws NO_ADDRESS when wallet returns no address\", async () => {\n mockBlaze = {\n wallet: {\n getChangeAddress: async () => {\n throw new Error(\"no address available\");\n },\n },\n };\n const ctx = makeContext();\n await expect(getWalletAddress.execute({}, ctx)).rejects.toMatchObject({\n code: \"NO_ADDRESS\",\n });\n });\n\n test(\"has correct metadata\", () => {\n expect(getWalletAddress.name).toBe(\"get-wallet-address\");\n expect(getWalletAddress.category).toBe(\"wallet\");\n expect(getWalletAddress.inputSchema).toBeDefined();\n expect(getWalletAddress.outputSchema).toBeDefined();\n });\n});\n\ndescribe(\"get-wallet-balance\", () => {\n beforeEach(() => {\n mockBlazeError = null;\n });\n\n test(\"returns lovelace, ada, and empty tokens for ADA-only wallet\", async () => {\n mockBlaze = {\n wallet: {\n getUnspentOutputs: async () => [\n makeUtxo({ txHash: \"tx1\", index: 0, lovelace: 5_000_000n }),\n makeUtxo({ txHash: \"tx2\", index: 1, lovelace: 3_000_000n }),\n ],\n },\n };\n const result = await getWalletBalance.execute({}, makeContext());\n expect(result.lovelace).toBe(\"8000000\");\n expect(result.ada).toBe(\"8.000000\");\n expect(result.tokens).toEqual([]);\n });\n\n test(\"aggregates tokens across UTxOs\", async () => {\n const policyId = \"a\".repeat(56);\n const assetName = \"token1\";\n mockBlaze = {\n wallet: {\n getUnspentOutputs: async () => [\n makeUtxo({\n txHash: \"tx1\",\n index: 0,\n lovelace: 2_000_000n,\n tokens: [{ policyId, assetName, quantity: 100n }],\n }),\n makeUtxo({\n txHash: \"tx2\",\n index: 0,\n lovelace: 1_000_000n,\n tokens: [{ policyId, assetName, quantity: 50n }],\n }),\n ],\n },\n };\n const result = await getWalletBalance.execute({}, makeContext());\n expect(result.lovelace).toBe(\"3000000\");\n expect(result.tokens).toHaveLength(1);\n expect(result.tokens[0].quantity).toBe(\"150\");\n expect(result.tokens[0].policyId).toBe(policyId);\n });\n\n test(\"handles fractional ADA correctly\", async () => {\n mockBlaze = {\n wallet: {\n getUnspentOutputs: async () => [\n makeUtxo({ txHash: \"tx1\", index: 0, lovelace: 1_500_123n }),\n ],\n },\n };\n const result = await getWalletBalance.execute({}, makeContext());\n expect(result.ada).toBe(\"1.500123\");\n });\n\n test(\"handles zero balance\", async () => {\n mockBlaze = {\n wallet: { getUnspentOutputs: async () => [] },\n };\n const result = await getWalletBalance.execute({}, makeContext());\n expect(result.lovelace).toBe(\"0\");\n expect(result.ada).toBe(\"0.000000\");\n expect(result.tokens).toEqual([]);\n });\n\n test(\"throws PROVIDER_ERROR on UTxO fetch failure\", async () => {\n mockBlaze = {\n wallet: {\n getUnspentOutputs: async () => {\n throw new Error(\"connection timeout\");\n },\n },\n };\n await expect(getWalletBalance.execute({}, makeContext())).rejects.toMatchObject({\n code: \"PROVIDER_ERROR\",\n });\n });\n});\n\ndescribe(\"get-wallet-utxos\", () => {\n beforeEach(() => {\n mockBlazeError = null;\n });\n\n test(\"returns UTxOs with correct structure\", async () => {\n mockBlaze = {\n wallet: {\n getUnspentOutputs: async () => [\n makeUtxo({ txHash: \"txhash1\", index: 0, lovelace: 5_000_000n }),\n makeUtxo({ txHash: \"txhash2\", index: 1, lovelace: 3_000_000n }),\n ],\n },\n };\n const result = await getWalletUtxos.execute({}, makeContext());\n expect(result.total).toBe(2);\n expect(result.utxos).toHaveLength(2);\n expect(result.utxos[0].txHash).toBe(\"txhash1\");\n expect(result.utxos[0].outputIndex).toBe(0);\n expect(result.utxos[0].lovelace).toBe(\"5000000\");\n expect(result.utxos[0].tokens).toEqual([]);\n });\n\n test(\"respects limit parameter\", async () => {\n mockBlaze = {\n wallet: {\n getUnspentOutputs: async () =>\n Array.from({ length: 10 }, (_, i) =>\n makeUtxo({ txHash: `tx${i}`, index: 0, lovelace: 1_000_000n }),\n ),\n },\n };\n const result = await getWalletUtxos.execute({ limit: 3 }, makeContext());\n expect(result.utxos).toHaveLength(3);\n expect(result.total).toBe(10);\n });\n\n test(\"defaults to limit of 100\", async () => {\n mockBlaze = {\n wallet: {\n getUnspentOutputs: async () =>\n Array.from({ length: 150 }, (_, i) =>\n makeUtxo({ txHash: `tx${i}`, index: 0, lovelace: 1_000_000n }),\n ),\n },\n };\n const result = await getWalletUtxos.execute({}, makeContext());\n expect(result.utxos).toHaveLength(100);\n expect(result.total).toBe(150);\n });\n\n test(\"includes tokens on UTxOs\", async () => {\n const policyId = \"b\".repeat(56);\n mockBlaze = {\n wallet: {\n getUnspentOutputs: async () => [\n makeUtxo({\n txHash: \"tx1\",\n index: 0,\n lovelace: 2_000_000n,\n tokens: [{ policyId, assetName: \"mytoken\", quantity: 42n }],\n }),\n ],\n },\n };\n const result = await getWalletUtxos.execute({}, makeContext());\n expect(result.utxos[0].tokens).toHaveLength(1);\n expect(result.utxos[0].tokens[0].quantity).toBe(\"42\");\n });\n\n test(\"throws PROVIDER_ERROR on fetch failure\", async () => {\n mockBlaze = {\n wallet: {\n getUnspentOutputs: async () => {\n throw new Error(\"provider down\");\n },\n },\n };\n await expect(getWalletUtxos.execute({}, makeContext())).rejects.toMatchObject({\n code: \"PROVIDER_ERROR\",\n });\n });\n});\n\n// ---------------------------------------------------------------------------\n// Transaction Actions\n// ---------------------------------------------------------------------------\n\ndescribe(\"sign-transaction\", () => {\n beforeEach(() => {\n mockBlazeError = null;\n mockIsHot = true;\n });\n\n test(\"signs a transaction and returns signed CBOR, hash, and signature count\", async () => {\n mockBlaze = {\n wallet: {},\n signTransaction: async () => ({\n toCbor: () => \"signed-tx-cbor\",\n body: () => ({\n hash: () => ({ toString: () => \"signed-tx-hash\" }),\n }),\n witnessSet: () => ({ vkeys: () => ({ size: () => 1 }) }),\n }),\n };\n const result = await signTransaction.execute(\n { txCbor: \"valid-cbor\" },\n makeContext(),\n );\n expect(result.signedTxCbor).toBe(\"signed-tx-cbor\");\n expect(result.txHash).toBe(\"signed-tx-hash\");\n expect(result.signatureCount).toBe(1);\n });\n\n test(\"throws COLD_WALLET for cold wallets\", async () => {\n mockIsHot = false;\n mockBlaze = { wallet: {} };\n await expect(\n signTransaction.execute({ txCbor: \"some-cbor\" }, makeContext()),\n ).rejects.toMatchObject({ code: \"COLD_WALLET\" });\n });\n\n test(\"throws INVALID_CBOR for bad CBOR input\", async () => {\n mockTxFromCbor = () => {\n throw new Error(\"invalid cbor\");\n };\n mockBlaze = { wallet: {} };\n await expect(\n signTransaction.execute({ txCbor: \"bad-cbor\" }, makeContext()),\n ).rejects.toMatchObject({ code: \"INVALID_CBOR\" });\n\n // Restore default mock\n mockTxFromCbor = () => ({\n body: () => ({\n hash: () => ({ toString: () => \"abc123txhash\" }),\n inputs: () => ({ values: () => [] }),\n outputs: () => [],\n fee: () => 200_000n,\n requiredSigners: () => null,\n }),\n witnessSet: () => ({ vkeys: () => null }),\n toCbor: () => \"signed-cbor-hex\",\n });\n });\n\n test(\"throws SIGN_ERROR when signing fails\", async () => {\n mockBlaze = {\n wallet: {},\n signTransaction: async () => {\n throw new Error(\"hardware wallet disconnected\");\n },\n };\n await expect(\n signTransaction.execute({ txCbor: \"valid-cbor\" }, makeContext()),\n ).rejects.toMatchObject({ code: \"SIGN_ERROR\" });\n });\n\n test(\"has correct metadata\", () => {\n expect(signTransaction.name).toBe(\"sign-transaction\");\n expect(signTransaction.category).toBe(\"wallet\");\n });\n});\n\ndescribe(\"submit-transaction\", () => {\n beforeEach(() => {\n mockBlazeError = null;\n });\n\n test(\"submits a transaction and returns hash\", async () => {\n mockBlaze = {\n wallet: {},\n submitTransaction: async () => ({\n toString: () => \"submitted-tx-hash\",\n }),\n };\n const result = await submitTransaction.execute(\n { txCbor: \"valid-signed-cbor\" },\n makeContext(),\n );\n expect(result.txHash).toBe(\"submitted-tx-hash\");\n expect(result.submitted).toBe(true);\n });\n\n test(\"throws SUBMISSION_ERROR on failure\", async () => {\n mockBlaze = {\n wallet: {},\n submitTransaction: async () => {\n throw new Error(\"tx already submitted\");\n },\n };\n await expect(\n submitTransaction.execute({ txCbor: \"some-cbor\" }, makeContext()),\n ).rejects.toMatchObject({ code: \"SUBMISSION_ERROR\" });\n });\n\n test(\"has correct metadata\", () => {\n expect(submitTransaction.name).toBe(\"submit-transaction\");\n expect(submitTransaction.category).toBe(\"wallet\");\n });\n});\n\ndescribe(\"sign-and-submit\", () => {\n beforeEach(() => {\n mockBlazeError = null;\n mockIsHot = true;\n });\n\n test(\"signs and submits without waiting for confirmation\", async () => {\n mockBlaze = {\n wallet: {},\n signTransaction: async () => ({\n toCbor: () => \"signed-cbor\",\n body: () => ({\n hash: () => ({ toString: () => \"tx-hash\" }),\n }),\n witnessSet: () => ({ vkeys: () => ({ size: () => 1 }) }),\n }),\n submitTransaction: async () => ({\n toString: () => \"tx-hash\",\n }),\n };\n const result = await signAndSubmit.execute(\n { txCbor: \"valid-cbor\", waitForConfirmation: false },\n makeContext(),\n );\n expect(result.txHash).toBe(\"tx-hash\");\n expect(result.submitted).toBe(true);\n expect(result.signedTxCbor).toBe(\"signed-cbor\");\n expect(result.confirmed).toBeUndefined();\n });\n\n test(\"throws COLD_WALLET for cold wallets\", async () => {\n mockIsHot = false;\n mockBlaze = { wallet: {} };\n await expect(\n signAndSubmit.execute({ txCbor: \"cbor\" }, makeContext()),\n ).rejects.toMatchObject({ code: \"COLD_WALLET\" });\n });\n\n test(\"throws SUBMISSION_ERROR when submit fails (includes signedTxCbor in details)\", async () => {\n mockBlaze = {\n wallet: {},\n signTransaction: async () => ({\n toCbor: () => \"signed-but-failed\",\n body: () => ({\n hash: () => ({ toString: () => \"hash\" }),\n }),\n witnessSet: () => ({ vkeys: () => null }),\n }),\n submitTransaction: async () => {\n throw new Error(\"node rejected\");\n },\n };\n try {\n await signAndSubmit.execute({ txCbor: \"valid-cbor\" }, makeContext());\n expect(true).toBe(false); // should not reach\n } catch (err: any) {\n expect(err.code).toBe(\"SUBMISSION_ERROR\");\n expect(err.details.signedTxCbor).toBe(\"signed-but-failed\");\n }\n });\n\n test(\"has correct metadata\", () => {\n expect(signAndSubmit.name).toBe(\"sign-and-submit\");\n expect(signAndSubmit.category).toBe(\"wallet\");\n });\n});\n\ndescribe(\"decode-transaction\", () => {\n beforeEach(() => {\n mockBlazeError = null;\n\n // Set up a rich mock transaction for decode tests\n mockTxFromCbor = () => ({\n body: () => ({\n hash: () => ({ toString: () => \"decoded-tx-hash\" }),\n inputs: () => ({\n values: () => [\n {\n transactionId: () => ({ toString: () => \"input-hash-1\" }),\n index: () => 0n,\n },\n {\n transactionId: () => ({ toString: () => \"input-hash-2\" }),\n index: () => 1n,\n },\n ],\n }),\n outputs: () => [\n {\n address: () => ({ toBech32: () => \"addr_test1output1\" }),\n amount: () => ({\n coin: () => 5_000_000n,\n multiasset: () => undefined,\n }),\n },\n {\n address: () => ({ toBech32: () => \"addr_test1output2\" }),\n amount: () => ({\n coin: () => 2_000_000n,\n multiasset: () => undefined,\n }),\n },\n ],\n fee: () => 180_000n,\n requiredSigners: () => ({\n values: () => [\n { toString: () => \"signer-hash-1\" },\n { toString: () => \"signer-hash-2\" },\n ],\n }),\n }),\n witnessSet: () => ({\n vkeys: () => ({ size: () => 2 }),\n }),\n });\n });\n\n test(\"decodes a transaction and returns all fields\", async () => {\n const result = await decodeTransaction.execute(\n { txCbor: \"valid-cbor-hex\" },\n makeContext(),\n );\n expect(result.txHash).toBe(\"decoded-tx-hash\");\n expect(result.inputs).toHaveLength(2);\n expect(result.inputs[0]).toEqual({ txHash: \"input-hash-1\", outputIndex: 0 });\n expect(result.inputs[1]).toEqual({ txHash: \"input-hash-2\", outputIndex: 1 });\n expect(result.outputs).toHaveLength(2);\n expect(result.outputs[0].address).toBe(\"addr_test1output1\");\n expect(result.outputs[0].lovelace).toBe(\"5000000\");\n expect(result.fee).toBe(\"180000\");\n expect(result.signatureCount).toBe(2);\n expect(result.requiredSigners).toEqual([\"signer-hash-1\", \"signer-hash-2\"]);\n });\n\n test(\"falls back to hex address when bech32 fails\", async () => {\n mockTxFromCbor = () => ({\n body: () => ({\n hash: () => ({ toString: () => \"tx-hash\" }),\n inputs: () => ({ values: () => [] }),\n outputs: () => [\n {\n address: () => ({\n toBech32: () => {\n throw new Error(\"cannot convert to bech32\");\n },\n toBytes: () => \"deadbeef\",\n }),\n amount: () => ({\n coin: () => 1_000_000n,\n multiasset: () => undefined,\n }),\n },\n ],\n fee: () => 100_000n,\n requiredSigners: () => null,\n }),\n witnessSet: () => ({ vkeys: () => null }),\n });\n\n const result = await decodeTransaction.execute(\n { txCbor: \"cbor-with-script-address\" },\n makeContext(),\n );\n expect(result.outputs[0].address).toBe(\"deadbeef\");\n });\n\n test(\"handles transaction with tokens in outputs\", async () => {\n const policyId = \"c\".repeat(56);\n const assetName = \"mytoken\";\n const assetId = `${policyId}${assetName}`;\n\n mockTxFromCbor = () => ({\n body: () => ({\n hash: () => ({ toString: () => \"tx-hash\" }),\n inputs: () => ({ values: () => [] }),\n outputs: () => [\n {\n address: () => ({ toBech32: () => \"addr_test1...\" }),\n amount: () => ({\n coin: () => 2_000_000n,\n multiasset: () => ({\n entries: () => [[assetId, 500n]],\n }),\n }),\n },\n ],\n fee: () => 200_000n,\n requiredSigners: () => null,\n }),\n witnessSet: () => ({ vkeys: () => null }),\n });\n\n const result = await decodeTransaction.execute(\n { txCbor: \"cbor-with-tokens\" },\n makeContext(),\n );\n expect(result.outputs[0].tokens).toHaveLength(1);\n expect(result.outputs[0].tokens[0].policyId).toBe(policyId);\n expect(result.outputs[0].tokens[0].quantity).toBe(\"500\");\n });\n\n test(\"throws INVALID_CBOR for bad input\", async () => {\n mockTxFromCbor = () => {\n throw new Error(\"bad cbor\");\n };\n await expect(\n decodeTransaction.execute({ txCbor: \"garbage\" }, makeContext()),\n ).rejects.toMatchObject({ code: \"INVALID_CBOR\" });\n });\n\n test(\"does not require a wallet (category is 'transaction')\", () => {\n expect(decodeTransaction.name).toBe(\"decode-transaction\");\n expect(decodeTransaction.category).toBe(\"transaction\");\n });\n});\n"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,IAAI,EAAEC,IAAI,EAAEC,UAAU,QAAQ,UAAU;AAEnE,SAASC,WAAW,QAAQ,qBAAqB;;AAEjD;AACA;AACA;;AAEA;AACA,SAASC,WAAWA,CAACC,MAAM,GAAG,qBAAqB,EAAE;EACnD,OAAO;IAAEC,QAAQ,EAAEA,CAAA,KAAMD;EAAO,CAAC;AACnC;AAEA,SAASE,WAAWA,CAACC,QAAgB,EAAEC,SAAiB,EAAE;EACxD,OAAO,GAAGD,QAAQ,GAAGC,SAAS,EAAE;AAClC;AAEA,SAASC,QAAQA,CAACC,IAKjB,EAAE;EACD,MAAMC,YAAY,GAAG,CAACD,IAAI,CAACE,MAAM,IAAI,EAAE,EAAEC,GAAG,CAAEC,CAAC,IAAK,CAClDR,WAAW,CAACQ,CAAC,CAACP,QAAQ,EAAEO,CAAC,CAACN,SAAS,CAAC,EACpCM,CAAC,CAACC,QAAQ,CACX,CAAC;EAEF,OAAO;IACLC,KAAK,EAAEA,CAAA,MAAO;MACZC,aAAa,EAAEA,CAAA,MAAO;QAAEC,QAAQ,EAAEA,CAAA,KAAMR,IAAI,CAACS;MAAO,CAAC,CAAC;MACtDC,KAAK,EAAEA,CAAA,KAAMC,MAAM,CAACX,IAAI,CAACU,KAAK;IAChC,CAAC,CAAC;IACFE,MAAM,EAAEA,CAAA,MAAO;MACbC,MAAM,EAAEA,CAAA,MAAO;QACbC,IAAI,EAAEA,CAAA,KAAMd,IAAI,CAACe,QAAQ;QACzBC,UAAU,EAAEA,CAAA,KACVf,YAAY,CAACgB,MAAM,GAAG,CAAC,GACnB;UAAEC,OAAO,EAAEA,CAAA,KAAMjB;QAAa,CAAC,GAC/BkB;MACR,CAAC;IACH,CAAC;EACH,CAAC;AACH;;AAEA;AACA,IAAIC,SAAc,GAAG,CAAC,CAAC;AACvB,IAAIC,SAAS,GAAG,IAAI;AACpB,IAAIC,cAA4B,GAAG,IAAI;AAEvChC,IAAI,CAACiC,MAAM,CAAC,oCAAoC,EAAE,OAAO;EACvDC,mBAAmB,EAAE,MAAAA,CAAA,KAAY;IAC/B,IAAIF,cAAc,EAAE,MAAMA,cAAc;IACxC,OAAOF,SAAS;EAClB,CAAC;EACDK,WAAW,EAAEA,CAAA,KAAMJ;AACrB,CAAC,CAAC,CAAC;;AAEH;AACA/B,IAAI,CAACiC,MAAM,CAAC,oBAAoB,EAAE,OAAO;EACvCG,IAAI,EAAE;IACJC,OAAO,EAAE;MACPC,WAAW,EAAGC,OAAe,IAAKA,OAAO,CAACC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;MACtDC,YAAY,EAAGF,OAAe,IAAKA,OAAO,CAACC,KAAK,CAAC,EAAE;IACrD,CAAC;IACDE,WAAW,EAAE;MACXC,QAAQ,EAAGC,IAAY,IAAKC,cAAc,CAACD,IAAI;IACjD,CAAC;IACDE,MAAM,EAAGC,CAAS,IAAKA;EACzB,CAAC;EACDC,KAAK,EAAE,MAAM,EAAE;EACfC,SAAS,EAAE,MAAM;AACnB,CAAC,CAAC,CAAC;;AAEH;AACA;AACA;AACA,IAAIJ,cAAqC,GAAGA,CAAA,MAAO;EACjDK,IAAI,EAAEA,CAAA,MAAO;IACXC,IAAI,EAAEA,CAAA,MAAO;MAAEjC,QAAQ,EAAEA,CAAA,KAAM;IAAe,CAAC,CAAC;IAChDkC,MAAM,EAAEA,CAAA,MAAO;MACbC,MAAM,EAAEA,CAAA,KAAM,CACZ;QACEpC,aAAa,EAAEA,CAAA,MAAO;UAAEC,QAAQ,EAAEA,CAAA,KAAM;QAAkB,CAAC,CAAC;QAC5DE,KAAK,EAAEA,CAAA,KAAM;MACf,CAAC;IAEL,CAAC,CAAC;IACFkC,OAAO,EAAEA,CAAA,KAAM,CACb;MACEC,OAAO,EAAEA,CAAA,MAAO;QAAElD,QAAQ,EAAEA,CAAA,KAAM;MAAsB,CAAC,CAAC;MAC1DkB,MAAM,EAAEA,CAAA,MAAO;QACbC,IAAI,EAAEA,CAAA,KAAM,UAAU;QACtBE,UAAU,EAAEA,CAAA,KAAMG;MACpB,CAAC;IACH,CAAC,CACF;IACD2B,GAAG,EAAEA,CAAA,KAAM,QAAQ;IACnBC,eAAe,EAAEA,CAAA,KAAM;EACzB,CAAC,CAAC;EACFC,UAAU,EAAEA,CAAA,MAAO;IACjBC,KAAK,EAAEA,CAAA,KAAM;EACf,CAAC,CAAC;EACFC,MAAM,EAAEA,CAAA,KAAM;AAChB,CAAC,CAAC;;AAEF;AACA,MAAM;EAAEC,gBAAgB;EAAEC,gBAAgB;EAAEC;AAAe,CAAC,GAAG,MAAM,MAAM,CACzE,sCACF,CAAC;AACD,MAAM;EACJC,eAAe;EACfC,iBAAiB;EACjBC,aAAa;EACbC;AACF,CAAC,GAAG,MAAM,MAAM,CAAC,2CAA2C,CAAC;;AAE7D;AACA,SAASC,WAAWA,CAACC,iBAA0C,GAAG,CAAC,CAAC,EAAE;EACpE,OAAO;IACLC,QAAQ,EAAE,CAAC,CAAQ;IACnBC,QAAQ,EAAE;MACRC,OAAO,EAAE,SAAS;MAClBC,QAAQ,EAAE;QAAEC,IAAI,EAAE,YAAY;QAAEC,MAAM,EAAE;MAAO,CAAC;MAChDC,MAAM,EAAE;QAAEF,IAAI,EAAE,KAAK;QAAEG,QAAQ,EAAE;MAAa,CAAC;MAC/C,GAAGR;IACL;EACF,CAAC;AACH;;AAEA;AACA;AACA;;AAEAxE,QAAQ,CAAC,oBAAoB,EAAE,MAAM;EACnCI,UAAU,CAAC,MAAM;IACf+B,cAAc,GAAG,IAAI;IACrBD,SAAS,GAAG,IAAI;EAClB,CAAC,CAAC;EAEFhC,IAAI,CAAC,oCAAoC,EAAE,YAAY;IACrD+B,SAAS,GAAG;MACV8C,MAAM,EAAE;QACNE,gBAAgB,EAAE,MAAAA,CAAA,KAAY3E,WAAW,CAAC,oBAAoB;MAChE;IACF,CAAC;IACD,MAAM4E,GAAG,GAAGX,WAAW,CAAC,CAAC;IACzB,MAAMY,MAAM,GAAG,MAAMnB,gBAAgB,CAACoB,OAAO,CAAC,CAAC,CAAC,EAAEF,GAAG,CAAC;IACtDjF,MAAM,CAACkF,MAAM,CAACzB,OAAO,CAAC,CAAC2B,IAAI,CAAC,oBAAoB,CAAC;IACjDpF,MAAM,CAACkF,MAAM,CAACR,OAAO,CAAC,CAACU,IAAI,CAAC,SAAS,CAAC;EACxC,CAAC,CAAC;EAEFnF,IAAI,CAAC,gDAAgD,EAAE,YAAY;IACjE+B,SAAS,GAAG;MACV8C,MAAM,EAAE;QACNE,gBAAgB,EAAE,MAAAA,CAAA,KAAY3E,WAAW,CAAC,cAAc;MAC1D;IACF,CAAC;IACD,MAAM4E,GAAG,GAAGX,WAAW,CAAC;MAAEI,OAAO,EAAE3C;IAAU,CAAC,CAAC;IAC/C,MAAMmD,MAAM,GAAG,MAAMnB,gBAAgB,CAACoB,OAAO,CAAC,CAAC,CAAC,EAAEF,GAAG,CAAC;IACtDjF,MAAM,CAACkF,MAAM,CAACR,OAAO,CAAC,CAACU,IAAI,CAAC,SAAS,CAAC;EACxC,CAAC,CAAC;EAEFnF,IAAI,CAAC,6DAA6D,EAAE,YAAY;IAC9EiC,cAAc,GAAG,IAAI9B,WAAW,CAAC,kBAAkB,EAAE,uBAAuB,EAAE;MAC5EiF,aAAa,EAAE,CAAC,QAAQ;IAC1B,CAAC,CAAC;IACF,MAAMJ,GAAG,GAAGX,WAAW,CAAC,CAAC;IACzB,MAAMtE,MAAM,CAAC+D,gBAAgB,CAACoB,OAAO,CAAC,CAAC,CAAC,EAAEF,GAAG,CAAC,CAAC,CAACK,OAAO,CAACC,aAAa,CAAC;MACpEC,IAAI,EAAE;IACR,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFvF,IAAI,CAAC,kDAAkD,EAAE,YAAY;IACnE+B,SAAS,GAAG;MACV8C,MAAM,EAAE;QACNE,gBAAgB,EAAE,MAAAA,CAAA,KAAY;UAC5B,MAAM,IAAIS,KAAK,CAAC,sBAAsB,CAAC;QACzC;MACF;IACF,CAAC;IACD,MAAMR,GAAG,GAAGX,WAAW,CAAC,CAAC;IACzB,MAAMtE,MAAM,CAAC+D,gBAAgB,CAACoB,OAAO,CAAC,CAAC,CAAC,EAAEF,GAAG,CAAC,CAAC,CAACK,OAAO,CAACC,aAAa,CAAC;MACpEC,IAAI,EAAE;IACR,CAAC,CAAC;EACJ,CAAC,CAAC;EAEFvF,IAAI,CAAC,sBAAsB,EAAE,MAAM;IACjCD,MAAM,CAAC+D,gBAAgB,CAAC2B,IAAI,CAAC,CAACN,IAAI,CAAC,oBAAoB,CAAC;IACxDpF,MAAM,CAAC+D,gBAAgB,CAAC4B,QAAQ,CAAC,CAACP,IAAI,CAAC,QAAQ,CAAC;IAChDpF,MAAM,CAAC+D,gBAAgB,CAAC6B,WAAW,CAAC,CAACC,WAAW,CAAC,CAAC;IAClD7F,MAAM,CAAC+D,gBAAgB,CAAC+B,YAAY,CAAC,CAACD,WAAW,CAAC,CAAC;EACrD,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF9F,QAAQ,CAAC,oBAAoB,EAAE,MAAM;EACnCI,UAAU,CAAC,MAAM;IACf+B,cAAc,GAAG,IAAI;EACvB,CAAC,CAAC;EAEFjC,IAAI,CAAC,6DAA6D,EAAE,YAAY;IAC9E+B,SAAS,GAAG;MACV8C,MAAM,EAAE;QACNiB,iBAAiB,EAAE,MAAAA,CAAA,KAAY,CAC7BpF,QAAQ,CAAC;UAAEU,MAAM,EAAE,KAAK;UAAEC,KAAK,EAAE,CAAC;UAAEK,QAAQ,EAAE;QAAW,CAAC,CAAC,EAC3DhB,QAAQ,CAAC;UAAEU,MAAM,EAAE,KAAK;UAAEC,KAAK,EAAE,CAAC;UAAEK,QAAQ,EAAE;QAAW,CAAC,CAAC;MAE/D;IACF,CAAC;IACD,MAAMuD,MAAM,GAAG,MAAMlB,gBAAgB,CAACmB,OAAO,CAAC,CAAC,CAAC,EAAEb,WAAW,CAAC,CAAC,CAAC;IAChEtE,MAAM,CAACkF,MAAM,CAACvD,QAAQ,CAAC,CAACyD,IAAI,CAAC,SAAS,CAAC;IACvCpF,MAAM,CAACkF,MAAM,CAACc,GAAG,CAAC,CAACZ,IAAI,CAAC,UAAU,CAAC;IACnCpF,MAAM,CAACkF,MAAM,CAACpE,MAAM,CAAC,CAACmF,OAAO,CAAC,EAAE,CAAC;EACnC,CAAC,CAAC;EAEFhG,IAAI,CAAC,gCAAgC,EAAE,YAAY;IACjD,MAAMQ,QAAQ,GAAG,GAAG,CAACyF,MAAM,CAAC,EAAE,CAAC;IAC/B,MAAMxF,SAAS,GAAG,QAAQ;IAC1BsB,SAAS,GAAG;MACV8C,MAAM,EAAE;QACNiB,iBAAiB,EAAE,MAAAA,CAAA,KAAY,CAC7BpF,QAAQ,CAAC;UACPU,MAAM,EAAE,KAAK;UACbC,KAAK,EAAE,CAAC;UACRK,QAAQ,EAAE,UAAU;UACpBb,MAAM,EAAE,CAAC;YAAEL,QAAQ;YAAEC,SAAS;YAAEO,QAAQ,EAAE;UAAK,CAAC;QAClD,CAAC,CAAC,EACFN,QAAQ,CAAC;UACPU,MAAM,EAAE,KAAK;UACbC,KAAK,EAAE,CAAC;UACRK,QAAQ,EAAE,UAAU;UACpBb,MAAM,EAAE,CAAC;YAAEL,QAAQ;YAAEC,SAAS;YAAEO,QAAQ,EAAE;UAAI,CAAC;QACjD,CAAC,CAAC;MAEN;IACF,CAAC;IACD,MAAMiE,MAAM,GAAG,MAAMlB,gBAAgB,CAACmB,OAAO,CAAC,CAAC,CAAC,EAAEb,WAAW,CAAC,CAAC,CAAC;IAChEtE,MAAM,CAACkF,MAAM,CAACvD,QAAQ,CAAC,CAACyD,IAAI,CAAC,SAAS,CAAC;IACvCpF,MAAM,CAACkF,MAAM,CAACpE,MAAM,CAAC,CAACqF,YAAY,CAAC,CAAC,CAAC;IACrCnG,MAAM,CAACkF,MAAM,CAACpE,MAAM,CAAC,CAAC,CAAC,CAACG,QAAQ,CAAC,CAACmE,IAAI,CAAC,KAAK,CAAC;IAC7CpF,MAAM,CAACkF,MAAM,CAACpE,MAAM,CAAC,CAAC,CAAC,CAACL,QAAQ,CAAC,CAAC2E,IAAI,CAAC3E,QAAQ,CAAC;EAClD,CAAC,CAAC;EAEFR,IAAI,CAAC,kCAAkC,EAAE,YAAY;IACnD+B,SAAS,GAAG;MACV8C,MAAM,EAAE;QACNiB,iBAAiB,EAAE,MAAAA,CAAA,KAAY,CAC7BpF,QAAQ,CAAC;UAAEU,MAAM,EAAE,KAAK;UAAEC,KAAK,EAAE,CAAC;UAAEK,QAAQ,EAAE;QAAW,CAAC,CAAC;MAE/D;IACF,CAAC;IACD,MAAMuD,MAAM,GAAG,MAAMlB,gBAAgB,CAACmB,OAAO,CAAC,CAAC,CAAC,EAAEb,WAAW,CAAC,CAAC,CAAC;IAChEtE,MAAM,CAACkF,MAAM,CAACc,GAAG,CAAC,CAACZ,IAAI,CAAC,UAAU,CAAC;EACrC,CAAC,CAAC;EAEFnF,IAAI,CAAC,sBAAsB,EAAE,YAAY;IACvC+B,SAAS,GAAG;MACV8C,MAAM,EAAE;QAAEiB,iBAAiB,EAAE,MAAAA,CAAA,KAAY;MAAG;IAC9C,CAAC;IACD,MAAMb,MAAM,GAAG,MAAMlB,gBAAgB,CAACmB,OAAO,CAAC,CAAC,CAAC,EAAEb,WAAW,CAAC,CAAC,CAAC;IAChEtE,MAAM,CAACkF,MAAM,CAACvD,QAAQ,CAAC,CAACyD,IAAI,CAAC,GAAG,CAAC;IACjCpF,MAAM,CAACkF,MAAM,CAACc,GAAG,CAAC,CAACZ,IAAI,CAAC,UAAU,CAAC;IACnCpF,MAAM,CAACkF,MAAM,CAACpE,MAAM,CAAC,CAACmF,OAAO,CAAC,EAAE,CAAC;EACnC,CAAC,CAAC;EAEFhG,IAAI,CAAC,6CAA6C,EAAE,YAAY;IAC9D+B,SAAS,GAAG;MACV8C,MAAM,EAAE;QACNiB,iBAAiB,EAAE,MAAAA,CAAA,KAAY;UAC7B,MAAM,IAAIN,KAAK,CAAC,oBAAoB,CAAC;QACvC;MACF;IACF,CAAC;IACD,MAAMzF,MAAM,CAACgE,gBAAgB,CAACmB,OAAO,CAAC,CAAC,CAAC,EAAEb,WAAW,CAAC,CAAC,CAAC,CAAC,CAACgB,OAAO,CAACC,aAAa,CAAC;MAC9EC,IAAI,EAAE;IACR,CAAC,CAAC;EACJ,CAAC,CAAC;AACJ,CAAC,CAAC;AAEFzF,QAAQ,CAAC,kBAAkB,EAAE,MAAM;EACjCI,UAAU,CAAC,MAAM;IACf+B,cAAc,GAAG,IAAI;EACvB,CAAC,CAAC;EAEFjC,IAAI,CAAC,sCAAsC,EAAE,YAAY;IACvD+B,SAAS,GAAG;MACV8C,MAAM,EAAE;QACNiB,iBAAiB,EAAE,MAAAA,CAAA,KAAY,CAC7BpF,QAAQ,CAAC;UAAEU,MAAM,EAAE,SAAS;UAAEC,KAAK,EAAE,CAAC;UAAEK,QAAQ,EAAE;QAAW,CAAC,CAAC,EAC/DhB,QAAQ,CAAC;UAAEU,MAAM,EAAE,SAAS;UAAEC,KAAK,EAAE,CAAC;UAAEK,QAAQ,EAAE;QAAW,CAAC,CAAC;MAEnE;IACF,CAAC;IACD,MAAMuD,MAAM,GAAG,MAAMjB,cAAc,CAACkB,OAAO,CAAC,CAAC,CAAC,EAAEb,WAAW,CAAC,CAAC,CAAC;IAC9DtE,MAAM,CAACkF,MAAM,CAACkB,KAAK,CAAC,CAAChB,IAAI,CAAC,CAAC,CAAC;IAC5BpF,MAAM,CAACkF,MAAM,CAACmB,KAAK,CAAC,CAACF,YAAY,CAAC,CAAC,CAAC;IACpCnG,MAAM,CAACkF,MAAM,CAACmB,KAAK,CAAC,CAAC,CAAC,CAAChF,MAAM,CAAC,CAAC+D,IAAI,CAAC,SAAS,CAAC;IAC9CpF,MAAM,CAACkF,MAAM,CAACmB,KAAK,CAAC,CAAC,CAAC,CAACC,WAAW,CAAC,CAAClB,IAAI,CAAC,CAAC,CAAC;IAC3CpF,MAAM,CAACkF,MAAM,CAACmB,KAAK,CAAC,CAAC,CAAC,CAAC1E,QAAQ,CAAC,CAACyD,IAAI,CAAC,SAAS,CAAC;IAChDpF,MAAM,CAACkF,MAAM,CAACmB,KAAK,CAAC,CAAC,CAAC,CAACvF,MAAM,CAAC,CAACmF,OAAO,CAAC,EAAE,CAAC;EAC5C,CAAC,CAAC;EAEFhG,IAAI,CAAC,0BAA0B,EAAE,YAAY;IAC3C+B,SAAS,GAAG;MACV8C,MAAM,EAAE;QACNiB,iBAAiB,EAAE,MAAAA,CAAA,KACjBQ,KAAK,CAACC,IAAI,CAAC;UAAE3E,MAAM,EAAE;QAAG,CAAC,EAAE,CAAC4E,CAAC,EAAEC,CAAC,KAC9B/F,QAAQ,CAAC;UAAEU,MAAM,EAAE,KAAKqF,CAAC,EAAE;UAAEpF,KAAK,EAAE,CAAC;UAAEK,QAAQ,EAAE;QAAW,CAAC,CAC/D;MACJ;IACF,CAAC;IACD,MAAMuD,MAAM,GAAG,MAAMjB,cAAc,CAACkB,OAAO,CAAC;MAAEwB,KAAK,EAAE;IAAE,CAAC,EAAErC,WAAW,CAAC,CAAC,CAAC;IACxEtE,MAAM,CAACkF,MAAM,CAACmB,KAAK,CAAC,CAACF,YAAY,CAAC,CAAC,CAAC;IACpCnG,MAAM,CAACkF,MAAM,CAACkB,KAAK,CAAC,CAAChB,IAAI,CAAC,EAAE,CAAC;EAC/B,CAAC,CAAC;EAEFnF,IAAI,CAAC,0BAA0B,EAAE,YAAY;IAC3C+B,SAAS,GAAG;MACV8C,MAAM,EAAE;QACNiB,iBAAiB,EAAE,MAAAA,CAAA,KACjBQ,KAAK,CAACC,IAAI,CAAC;UAAE3E,MAAM,EAAE;QAAI,CAAC,EAAE,CAAC4E,CAAC,EAAEC,CAAC,KAC/B/F,QAAQ,CAAC;UAAEU,MAAM,EAAE,KAAKqF,CAAC,EAAE;UAAEpF,KAAK,EAAE,CAAC;UAAEK,QAAQ,EAAE;QAAW,CAAC,CAC/D;MACJ;IACF,CAAC;IACD,MAAMuD,MAAM,GAAG,MAAMjB,cAAc,CAACkB,OAAO,CAAC,CAAC,CAAC,EAAEb,WAAW,CAAC,CAAC,CAAC;IAC9DtE,MAAM,CAACkF,MAAM,CAACmB,KAAK,CAAC,CAACF,YAAY,CAAC,GAAG,CAAC;IACtCnG,MAAM,CAACkF,MAAM,CAACkB,KAAK,CAAC,CAAChB,IAAI,CAAC,GAAG,CAAC;EAChC,CAAC,CAAC;EAEFnF,IAAI,CAAC,0BAA0B,EAAE,YAAY;IAC3C,MAAMQ,QAAQ,GAAG,GAAG,CAACyF,MAAM,CAAC,EAAE,CAAC;IAC/BlE,SAAS,GAAG;MACV8C,MAAM,EAAE;QACNiB,iBAAiB,EAAE,MAAAA,CAAA,KAAY,CAC7BpF,QAAQ,CAAC;UACPU,MAAM,EAAE,KAAK;UACbC,KAAK,EAAE,CAAC;UACRK,QAAQ,EAAE,UAAU;UACpBb,MAAM,EAAE,CAAC;YAAEL,QAAQ;YAAEC,SAAS,EAAE,SAAS;YAAEO,QAAQ,EAAE;UAAI,CAAC;QAC5D,CAAC,CAAC;MAEN;IACF,CAAC;IACD,MAAMiE,MAAM,GAAG,MAAMjB,cAAc,CAACkB,OAAO,CAAC,CAAC,CAAC,EAAEb,WAAW,CAAC,CAAC,CAAC;IAC9DtE,MAAM,CAACkF,MAAM,CAACmB,KAAK,CAAC,CAAC,CAAC,CAACvF,MAAM,CAAC,CAACqF,YAAY,CAAC,CAAC,CAAC;IAC9CnG,MAAM,CAACkF,MAAM,CAACmB,KAAK,CAAC,CAAC,CAAC,CAACvF,MAAM,CAAC,CAAC,CAAC,CAACG,QAAQ,CAAC,CAACmE,IAAI,CAAC,IAAI,CAAC;EACvD,CAAC,CAAC;EAEFnF,IAAI,CAAC,wCAAwC,EAAE,YAAY;IACzD+B,SAAS,GAAG;MACV8C,MAAM,EAAE;QACNiB,iBAAiB,EAAE,MAAAA,CAAA,KAAY;UAC7B,MAAM,IAAIN,KAAK,CAAC,eAAe,CAAC;QAClC;MACF;IACF,CAAC;IACD,MAAMzF,MAAM,CAACiE,cAAc,CAACkB,OAAO,CAAC,CAAC,CAAC,EAAEb,WAAW,CAAC,CAAC,CAAC,CAAC,CAACgB,OAAO,CAACC,aAAa,CAAC;MAC5EC,IAAI,EAAE;IACR,CAAC,CAAC;EACJ,CAAC,CAAC;AACJ,CAAC,CAAC;;AAEF;AACA;AACA;;AAEAzF,QAAQ,CAAC,kBAAkB,EAAE,MAAM;EACjCI,UAAU,CAAC,MAAM;IACf+B,cAAc,GAAG,IAAI;IACrBD,SAAS,GAAG,IAAI;EAClB,CAAC,CAAC;EAEFhC,IAAI,CAAC,wEAAwE,EAAE,YAAY;IACzF+B,SAAS,GAAG;MACV8C,MAAM,EAAE,CAAC,CAAC;MACVZ,eAAe,EAAE,MAAAA,CAAA,MAAa;QAC5BJ,MAAM,EAAEA,CAAA,KAAM,gBAAgB;QAC9BV,IAAI,EAAEA,CAAA,MAAO;UACXC,IAAI,EAAEA,CAAA,MAAO;YAAEjC,QAAQ,EAAEA,CAAA,KAAM;UAAiB,CAAC;QACnD,CAAC,CAAC;QACFwC,UAAU,EAAEA,CAAA,MAAO;UAAEC,KAAK,EAAEA,CAAA,MAAO;YAAE+C,IAAI,EAAEA,CAAA,KAAM;UAAE,CAAC;QAAE,CAAC;MACzD,CAAC;IACH,CAAC;IACD,MAAM1B,MAAM,GAAG,MAAMhB,eAAe,CAACiB,OAAO,CAC1C;MAAE0B,MAAM,EAAE;IAAa,CAAC,EACxBvC,WAAW,CAAC,CACd,CAAC;IACDtE,MAAM,CAACkF,MAAM,CAAC4B,YAAY,CAAC,CAAC1B,IAAI,CAAC,gBAAgB,CAAC;IAClDpF,MAAM,CAACkF,MAAM,CAAC7D,MAAM,CAAC,CAAC+D,IAAI,CAAC,gBAAgB,CAAC;IAC5CpF,MAAM,CAACkF,MAAM,CAAC6B,cAAc,CAAC,CAAC3B,IAAI,CAAC,CAAC,CAAC;EACvC,CAAC,CAAC;EAEFnF,IAAI,CAAC,qCAAqC,EAAE,YAAY;IACtDgC,SAAS,GAAG,KAAK;IACjBD,SAAS,GAAG;MAAE8C,MAAM,EAAE,CAAC;IAAE,CAAC;IAC1B,MAAM9E,MAAM,CACVkE,eAAe,CAACiB,OAAO,CAAC;MAAE0B,MAAM,EAAE;IAAY,CAAC,EAAEvC,WAAW,CAAC,CAAC,CAChE,CAAC,CAACgB,OAAO,CAACC,aAAa,CAAC;MAAEC,IAAI,EAAE;IAAc,CAAC,CAAC;EAClD,CAAC,CAAC;EAEFvF,IAAI,CAAC,wCAAwC,EAAE,YAAY;IACzD8C,cAAc,GAAGA,CAAA,KAAM;MACrB,MAAM,IAAI0C,KAAK,CAAC,cAAc,CAAC;IACjC,CAAC;IACDzD,SAAS,GAAG;MAAE8C,MAAM,EAAE,CAAC;IAAE,CAAC;IAC1B,MAAM9E,MAAM,CACVkE,eAAe,CAACiB,OAAO,CAAC;MAAE0B,MAAM,EAAE;IAAW,CAAC,EAAEvC,WAAW,CAAC,CAAC,CAC/D,CAAC,CAACgB,OAAO,CAACC,aAAa,CAAC;MAAEC,IAAI,EAAE;IAAe,CAAC,CAAC;;IAEjD;IACAzC,cAAc,GAAGA,CAAA,MAAO;MACtBK,IAAI,EAAEA,CAAA,MAAO;QACXC,IAAI,EAAEA,CAAA,MAAO;UAAEjC,QAAQ,EAAEA,CAAA,KAAM;QAAe,CAAC,CAAC;QAChDkC,MAAM,EAAEA,CAAA,MAAO;UAAEC,MAAM,EAAEA,CAAA,KAAM;QAAG,CAAC,CAAC;QACpCC,OAAO,EAAEA,CAAA,KAAM,EAAE;QACjBE,GAAG,EAAEA,CAAA,KAAM,QAAQ;QACnBC,eAAe,EAAEA,CAAA,KAAM;MACzB,CAAC,CAAC;MACFC,UAAU,EAAEA,CAAA,MAAO;QAAEC,KAAK,EAAEA,CAAA,KAAM;MAAK,CAAC,CAAC;MACzCC,MAAM,EAAEA,CAAA,KAAM;IAChB,CAAC,CAAC;EACJ,CAAC,CAAC;EAEF7D,IAAI,CAAC,sCAAsC,EAAE,YAAY;IACvD+B,SAAS,GAAG;MACV8C,MAAM,EAAE,CAAC,CAAC;MACVZ,eAAe,EAAE,MAAAA,CAAA,KAAY;QAC3B,MAAM,IAAIuB,KAAK,CAAC,8BAA8B,CAAC;MACjD;IACF,CAAC;IACD,MAAMzF,MAAM,CACVkE,eAAe,CAACiB,OAAO,CAAC;MAAE0B,MAAM,EAAE;IAAa,CAAC,EAAEvC,WAAW,CAAC,CAAC,CACjE,CAAC,CAACgB,OAAO,CAACC,aAAa,CAAC;MAAEC,IAAI,EAAE;IAAa,CAAC,CAAC;EACjD,CAAC,CAAC;EAEFvF,IAAI,CAAC,sBAAsB,EAAE,MAAM;IACjCD,MAAM,CAACkE,eAAe,CAACwB,IAAI,CAAC,CAACN,IAAI,CAAC,kBAAkB,CAAC;IACrDpF,MAAM,CAACkE,eAAe,CAACyB,QAAQ,CAAC,CAACP,IAAI,CAAC,QAAQ,CAAC;EACjD,CAAC,CAAC;AACJ,CAAC,CAAC;AAEFrF,QAAQ,CAAC,oBAAoB,EAAE,MAAM;EACnCI,UAAU,CAAC,MAAM;IACf+B,cAAc,GAAG,IAAI;EACvB,CAAC,CAAC;EAEFjC,IAAI,CAAC,wCAAwC,EAAE,YAAY;IACzD+B,SAAS,GAAG;MACV8C,MAAM,EAAE,CAAC,CAAC;MACVX,iBAAiB,EAAE,MAAAA,CAAA,MAAa;QAC9B/C,QAAQ,EAAEA,CAAA,KAAM;MAClB,CAAC;IACH,CAAC;IACD,MAAM8D,MAAM,GAAG,MAAMf,iBAAiB,CAACgB,OAAO,CAC5C;MAAE0B,MAAM,EAAE;IAAoB,CAAC,EAC/BvC,WAAW,CAAC,CACd,CAAC;IACDtE,MAAM,CAACkF,MAAM,CAAC7D,MAAM,CAAC,CAAC+D,IAAI,CAAC,mBAAmB,CAAC;IAC/CpF,MAAM,CAACkF,MAAM,CAAC8B,SAAS,CAAC,CAAC5B,IAAI,CAAC,IAAI,CAAC;EACrC,CAAC,CAAC;EAEFnF,IAAI,CAAC,oCAAoC,EAAE,YAAY;IACrD+B,SAAS,GAAG;MACV8C,MAAM,EAAE,CAAC,CAAC;MACVX,iBAAiB,EAAE,MAAAA,CAAA,KAAY;QAC7B,MAAM,IAAIsB,KAAK,CAAC,sBAAsB,CAAC;MACzC;IACF,CAAC;IACD,MAAMzF,MAAM,CACVmE,iBAAiB,CAACgB,OAAO,CAAC;MAAE0B,MAAM,EAAE;IAAY,CAAC,EAAEvC,WAAW,CAAC,CAAC,CAClE,CAAC,CAACgB,OAAO,CAACC,aAAa,CAAC;MAAEC,IAAI,EAAE;IAAmB,CAAC,CAAC;EACvD,CAAC,CAAC;EAEFvF,IAAI,CAAC,sBAAsB,EAAE,MAAM;IACjCD,MAAM,CAACmE,iBAAiB,CAACuB,IAAI,CAAC,CAACN,IAAI,CAAC,oBAAoB,CAAC;IACzDpF,MAAM,CAACmE,iBAAiB,CAACwB,QAAQ,CAAC,CAACP,IAAI,CAAC,QAAQ,CAAC;EACnD,CAAC,CAAC;AACJ,CAAC,CAAC;AAEFrF,QAAQ,CAAC,iBAAiB,EAAE,MAAM;EAChCI,UAAU,CAAC,MAAM;IACf+B,cAAc,GAAG,IAAI;IACrBD,SAAS,GAAG,IAAI;EAClB,CAAC,CAAC;EAEFhC,IAAI,CAAC,oDAAoD,EAAE,YAAY;IACrE+B,SAAS,GAAG;MACV8C,MAAM,EAAE,CAAC,CAAC;MACVZ,eAAe,EAAE,MAAAA,CAAA,MAAa;QAC5BJ,MAAM,EAAEA,CAAA,KAAM,aAAa;QAC3BV,IAAI,EAAEA,CAAA,MAAO;UACXC,IAAI,EAAEA,CAAA,MAAO;YAAEjC,QAAQ,EAAEA,CAAA,KAAM;UAAU,CAAC;QAC5C,CAAC,CAAC;QACFwC,UAAU,EAAEA,CAAA,MAAO;UAAEC,KAAK,EAAEA,CAAA,MAAO;YAAE+C,IAAI,EAAEA,CAAA,KAAM;UAAE,CAAC;QAAE,CAAC;MACzD,CAAC,CAAC;MACFzC,iBAAiB,EAAE,MAAAA,CAAA,MAAa;QAC9B/C,QAAQ,EAAEA,CAAA,KAAM;MAClB,CAAC;IACH,CAAC;IACD,MAAM8D,MAAM,GAAG,MAAMd,aAAa,CAACe,OAAO,CACxC;MAAE0B,MAAM,EAAE,YAAY;MAAEI,mBAAmB,EAAE;IAAM,CAAC,EACpD3C,WAAW,CAAC,CACd,CAAC;IACDtE,MAAM,CAACkF,MAAM,CAAC7D,MAAM,CAAC,CAAC+D,IAAI,CAAC,SAAS,CAAC;IACrCpF,MAAM,CAACkF,MAAM,CAAC8B,SAAS,CAAC,CAAC5B,IAAI,CAAC,IAAI,CAAC;IACnCpF,MAAM,CAACkF,MAAM,CAAC4B,YAAY,CAAC,CAAC1B,IAAI,CAAC,aAAa,CAAC;IAC/CpF,MAAM,CAACkF,MAAM,CAACgC,SAAS,CAAC,CAACC,aAAa,CAAC,CAAC;EAC1C,CAAC,CAAC;EAEFlH,IAAI,CAAC,qCAAqC,EAAE,YAAY;IACtDgC,SAAS,GAAG,KAAK;IACjBD,SAAS,GAAG;MAAE8C,MAAM,EAAE,CAAC;IAAE,CAAC;IAC1B,MAAM9E,MAAM,CACVoE,aAAa,CAACe,OAAO,CAAC;MAAE0B,MAAM,EAAE;IAAO,CAAC,EAAEvC,WAAW,CAAC,CAAC,CACzD,CAAC,CAACgB,OAAO,CAACC,aAAa,CAAC;MAAEC,IAAI,EAAE;IAAc,CAAC,CAAC;EAClD,CAAC,CAAC;EAEFvF,IAAI,CAAC,8EAA8E,EAAE,YAAY;IAC/F+B,SAAS,GAAG;MACV8C,MAAM,EAAE,CAAC,CAAC;MACVZ,eAAe,EAAE,MAAAA,CAAA,MAAa;QAC5BJ,MAAM,EAAEA,CAAA,KAAM,mBAAmB;QACjCV,IAAI,EAAEA,CAAA,MAAO;UACXC,IAAI,EAAEA,CAAA,MAAO;YAAEjC,QAAQ,EAAEA,CAAA,KAAM;UAAO,CAAC;QACzC,CAAC,CAAC;QACFwC,UAAU,EAAEA,CAAA,MAAO;UAAEC,KAAK,EAAEA,CAAA,KAAM;QAAK,CAAC;MAC1C,CAAC,CAAC;MACFM,iBAAiB,EAAE,MAAAA,CAAA,KAAY;QAC7B,MAAM,IAAIsB,KAAK,CAAC,eAAe,CAAC;MAClC;IACF,CAAC;IACD,IAAI;MACF,MAAMrB,aAAa,CAACe,OAAO,CAAC;QAAE0B,MAAM,EAAE;MAAa,CAAC,EAAEvC,WAAW,CAAC,CAAC,CAAC;MACpEtE,MAAM,CAAC,IAAI,CAAC,CAACoF,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5B,CAAC,CAAC,OAAOgC,GAAQ,EAAE;MACjBpH,MAAM,CAACoH,GAAG,CAAC5B,IAAI,CAAC,CAACJ,IAAI,CAAC,kBAAkB,CAAC;MACzCpF,MAAM,CAACoH,GAAG,CAACC,OAAO,CAACP,YAAY,CAAC,CAAC1B,IAAI,CAAC,mBAAmB,CAAC;IAC5D;EACF,CAAC,CAAC;EAEFnF,IAAI,CAAC,sBAAsB,EAAE,MAAM;IACjCD,MAAM,CAACoE,aAAa,CAACsB,IAAI,CAAC,CAACN,IAAI,CAAC,iBAAiB,CAAC;IAClDpF,MAAM,CAACoE,aAAa,CAACuB,QAAQ,CAAC,CAACP,IAAI,CAAC,QAAQ,CAAC;EAC/C,CAAC,CAAC;AACJ,CAAC,CAAC;AAEFrF,QAAQ,CAAC,oBAAoB,EAAE,MAAM;EACnCI,UAAU,CAAC,MAAM;IACf+B,cAAc,GAAG,IAAI;;IAErB;IACAa,cAAc,GAAGA,CAAA,MAAO;MACtBK,IAAI,EAAEA,CAAA,MAAO;QACXC,IAAI,EAAEA,CAAA,MAAO;UAAEjC,QAAQ,EAAEA,CAAA,KAAM;QAAkB,CAAC,CAAC;QACnDkC,MAAM,EAAEA,CAAA,MAAO;UACbC,MAAM,EAAEA,CAAA,KAAM,CACZ;YACEpC,aAAa,EAAEA,CAAA,MAAO;cAAEC,QAAQ,EAAEA,CAAA,KAAM;YAAe,CAAC,CAAC;YACzDE,KAAK,EAAEA,CAAA,KAAM;UACf,CAAC,EACD;YACEH,aAAa,EAAEA,CAAA,MAAO;cAAEC,QAAQ,EAAEA,CAAA,KAAM;YAAe,CAAC,CAAC;YACzDE,KAAK,EAAEA,CAAA,KAAM;UACf,CAAC;QAEL,CAAC,CAAC;QACFkC,OAAO,EAAEA,CAAA,KAAM,CACb;UACEC,OAAO,EAAEA,CAAA,MAAO;YAAElD,QAAQ,EAAEA,CAAA,KAAM;UAAoB,CAAC,CAAC;UACxDkB,MAAM,EAAEA,CAAA,MAAO;YACbC,IAAI,EAAEA,CAAA,KAAM,UAAU;YACtBE,UAAU,EAAEA,CAAA,KAAMG;UACpB,CAAC;QACH,CAAC,EACD;UACE0B,OAAO,EAAEA,CAAA,MAAO;YAAElD,QAAQ,EAAEA,CAAA,KAAM;UAAoB,CAAC,CAAC;UACxDkB,MAAM,EAAEA,CAAA,MAAO;YACbC,IAAI,EAAEA,CAAA,KAAM,UAAU;YACtBE,UAAU,EAAEA,CAAA,KAAMG;UACpB,CAAC;QACH,CAAC,CACF;QACD2B,GAAG,EAAEA,CAAA,KAAM,QAAQ;QACnBC,eAAe,EAAEA,CAAA,MAAO;UACtBJ,MAAM,EAAEA,CAAA,KAAM,CACZ;YAAEnC,QAAQ,EAAEA,CAAA,KAAM;UAAgB,CAAC,EACnC;YAAEA,QAAQ,EAAEA,CAAA,KAAM;UAAgB,CAAC;QAEvC,CAAC;MACH,CAAC,CAAC;MACFwC,UAAU,EAAEA,CAAA,MAAO;QACjBC,KAAK,EAAEA,CAAA,MAAO;UAAE+C,IAAI,EAAEA,CAAA,KAAM;QAAE,CAAC;MACjC,CAAC;IACH,CAAC,CAAC;EACJ,CAAC,CAAC;EAEF3G,IAAI,CAAC,8CAA8C,EAAE,YAAY;IAC/D,MAAMiF,MAAM,GAAG,MAAMb,iBAAiB,CAACc,OAAO,CAC5C;MAAE0B,MAAM,EAAE;IAAiB,CAAC,EAC5BvC,WAAW,CAAC,CACd,CAAC;IACDtE,MAAM,CAACkF,MAAM,CAAC7D,MAAM,CAAC,CAAC+D,IAAI,CAAC,iBAAiB,CAAC;IAC7CpF,MAAM,CAACkF,MAAM,CAAC5B,MAAM,CAAC,CAAC6C,YAAY,CAAC,CAAC,CAAC;IACrCnG,MAAM,CAACkF,MAAM,CAAC5B,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC2C,OAAO,CAAC;MAAE5E,MAAM,EAAE,cAAc;MAAEiF,WAAW,EAAE;IAAE,CAAC,CAAC;IAC5EtG,MAAM,CAACkF,MAAM,CAAC5B,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC2C,OAAO,CAAC;MAAE5E,MAAM,EAAE,cAAc;MAAEiF,WAAW,EAAE;IAAE,CAAC,CAAC;IAC5EtG,MAAM,CAACkF,MAAM,CAAC1B,OAAO,CAAC,CAAC2C,YAAY,CAAC,CAAC,CAAC;IACtCnG,MAAM,CAACkF,MAAM,CAAC1B,OAAO,CAAC,CAAC,CAAC,CAACC,OAAO,CAAC,CAAC2B,IAAI,CAAC,mBAAmB,CAAC;IAC3DpF,MAAM,CAACkF,MAAM,CAAC1B,OAAO,CAAC,CAAC,CAAC,CAAC7B,QAAQ,CAAC,CAACyD,IAAI,CAAC,SAAS,CAAC;IAClDpF,MAAM,CAACkF,MAAM,CAACxB,GAAG,CAAC,CAAC0B,IAAI,CAAC,QAAQ,CAAC;IACjCpF,MAAM,CAACkF,MAAM,CAAC6B,cAAc,CAAC,CAAC3B,IAAI,CAAC,CAAC,CAAC;IACrCpF,MAAM,CAACkF,MAAM,CAACvB,eAAe,CAAC,CAACsC,OAAO,CAAC,CAAC,eAAe,EAAE,eAAe,CAAC,CAAC;EAC5E,CAAC,CAAC;EAEFhG,IAAI,CAAC,6CAA6C,EAAE,YAAY;IAC9D8C,cAAc,GAAGA,CAAA,MAAO;MACtBK,IAAI,EAAEA,CAAA,MAAO;QACXC,IAAI,EAAEA,CAAA,MAAO;UAAEjC,QAAQ,EAAEA,CAAA,KAAM;QAAU,CAAC,CAAC;QAC3CkC,MAAM,EAAEA,CAAA,MAAO;UAAEC,MAAM,EAAEA,CAAA,KAAM;QAAG,CAAC,CAAC;QACpCC,OAAO,EAAEA,CAAA,KAAM,CACb;UACEC,OAAO,EAAEA,CAAA,MAAO;YACdlD,QAAQ,EAAEA,CAAA,KAAM;cACd,MAAM,IAAIkF,KAAK,CAAC,0BAA0B,CAAC;YAC7C,CAAC;YACD6B,OAAO,EAAEA,CAAA,KAAM;UACjB,CAAC,CAAC;UACF7F,MAAM,EAAEA,CAAA,MAAO;YACbC,IAAI,EAAEA,CAAA,KAAM,UAAU;YACtBE,UAAU,EAAEA,CAAA,KAAMG;UACpB,CAAC;QACH,CAAC,CACF;QACD2B,GAAG,EAAEA,CAAA,KAAM,QAAQ;QACnBC,eAAe,EAAEA,CAAA,KAAM;MACzB,CAAC,CAAC;MACFC,UAAU,EAAEA,CAAA,MAAO;QAAEC,KAAK,EAAEA,CAAA,KAAM;MAAK,CAAC;IAC1C,CAAC,CAAC;IAEF,MAAMqB,MAAM,GAAG,MAAMb,iBAAiB,CAACc,OAAO,CAC5C;MAAE0B,MAAM,EAAE;IAA2B,CAAC,EACtCvC,WAAW,CAAC,CACd,CAAC;IACDtE,MAAM,CAACkF,MAAM,CAAC1B,OAAO,CAAC,CAAC,CAAC,CAACC,OAAO,CAAC,CAAC2B,IAAI,CAAC,UAAU,CAAC;EACpD,CAAC,CAAC;EAEFnF,IAAI,CAAC,4CAA4C,EAAE,YAAY;IAC7D,MAAMQ,QAAQ,GAAG,GAAG,CAACyF,MAAM,CAAC,EAAE,CAAC;IAC/B,MAAMxF,SAAS,GAAG,SAAS;IAC3B,MAAM+B,OAAO,GAAG,GAAGhC,QAAQ,GAAGC,SAAS,EAAE;IAEzCqC,cAAc,GAAGA,CAAA,MAAO;MACtBK,IAAI,EAAEA,CAAA,MAAO;QACXC,IAAI,EAAEA,CAAA,MAAO;UAAEjC,QAAQ,EAAEA,CAAA,KAAM;QAAU,CAAC,CAAC;QAC3CkC,MAAM,EAAEA,CAAA,MAAO;UAAEC,MAAM,EAAEA,CAAA,KAAM;QAAG,CAAC,CAAC;QACpCC,OAAO,EAAEA,CAAA,KAAM,CACb;UACEC,OAAO,EAAEA,CAAA,MAAO;YAAElD,QAAQ,EAAEA,CAAA,KAAM;UAAgB,CAAC,CAAC;UACpDkB,MAAM,EAAEA,CAAA,MAAO;YACbC,IAAI,EAAEA,CAAA,KAAM,UAAU;YACtBE,UAAU,EAAEA,CAAA,MAAO;cACjBE,OAAO,EAAEA,CAAA,KAAM,CAAC,CAACW,OAAO,EAAE,IAAI,CAAC;YACjC,CAAC;UACH,CAAC;QACH,CAAC,CACF;QACDiB,GAAG,EAAEA,CAAA,KAAM,QAAQ;QACnBC,eAAe,EAAEA,CAAA,KAAM;MACzB,CAAC,CAAC;MACFC,UAAU,EAAEA,CAAA,MAAO;QAAEC,KAAK,EAAEA,CAAA,KAAM;MAAK,CAAC;IAC1C,CAAC,CAAC;IAEF,MAAMqB,MAAM,GAAG,MAAMb,iBAAiB,CAACc,OAAO,CAC5C;MAAE0B,MAAM,EAAE;IAAmB,CAAC,EAC9BvC,WAAW,CAAC,CACd,CAAC;IACDtE,MAAM,CAACkF,MAAM,CAAC1B,OAAO,CAAC,CAAC,CAAC,CAAC1C,MAAM,CAAC,CAACqF,YAAY,CAAC,CAAC,CAAC;IAChDnG,MAAM,CAACkF,MAAM,CAAC1B,OAAO,CAAC,CAAC,CAAC,CAAC1C,MAAM,CAAC,CAAC,CAAC,CAACL,QAAQ,CAAC,CAAC2E,IAAI,CAAC3E,QAAQ,CAAC;IAC3DT,MAAM,CAACkF,MAAM,CAAC1B,OAAO,CAAC,CAAC,CAAC,CAAC1C,MAAM,CAAC,CAAC,CAAC,CAACG,QAAQ,CAAC,CAACmE,IAAI,CAAC,KAAK,CAAC;EAC1D,CAAC,CAAC;EAEFnF,IAAI,CAAC,mCAAmC,EAAE,YAAY;IACpD8C,cAAc,GAAGA,CAAA,KAAM;MACrB,MAAM,IAAI0C,KAAK,CAAC,UAAU,CAAC;IAC7B,CAAC;IACD,MAAMzF,MAAM,CACVqE,iBAAiB,CAACc,OAAO,CAAC;MAAE0B,MAAM,EAAE;IAAU,CAAC,EAAEvC,WAAW,CAAC,CAAC,CAChE,CAAC,CAACgB,OAAO,CAACC,aAAa,CAAC;MAAEC,IAAI,EAAE;IAAe,CAAC,CAAC;EACnD,CAAC,CAAC;EAEFvF,IAAI,CAAC,uDAAuD,EAAE,MAAM;IAClED,MAAM,CAACqE,iBAAiB,CAACqB,IAAI,CAAC,CAACN,IAAI,CAAC,oBAAoB,CAAC;IACzDpF,MAAM,CAACqE,iBAAiB,CAACsB,QAAQ,CAAC,CAACP,IAAI,CAAC,aAAa,CAAC;EACxD,CAAC,CAAC;AACJ,CAAC,CAAC","ignoreList":[]}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Shared helper utilities for wallet and transaction actions.
3
+ * Provides Blaze instance creation from action context settings.
4
+ */
5
+
6
+ import { HotWallet } from "@blaze-cardano/sdk";
7
+ import { GetBlaze } from "../../wallet.js";
8
+ import { ActionError } from "../types.js";
9
+
10
+ /** Settings shape expected on context.settings for wallet access */
11
+
12
+ /** Optional overrides for Blaze initialization, in case field names differ */
13
+
14
+ /**
15
+ * Creates a Blaze instance from action context settings.
16
+ *
17
+ * Falls back to `context.settings.network`, `context.settings.provider`,
18
+ * and `context.settings.wallet` when overrides are not provided.
19
+ *
20
+ * @throws `ActionError("WALLET_NOT_CONFIGURED")` if required settings are missing
21
+ * @throws `ActionError("BLAZE_INIT_ERROR")` if Blaze fails to initialize
22
+ */
23
+ export async function getBlazeFromContext(context, overrides) {
24
+ const settings = context.settings;
25
+ const network = overrides?.network ?? settings.network;
26
+ const provider = overrides?.provider ?? settings.provider;
27
+ const wallet = overrides?.wallet ?? settings.wallet;
28
+
29
+ // Validate required fields and collect missing ones for a helpful error message
30
+ const missing = [];
31
+ if (!network) missing.push("network");
32
+ if (!provider) missing.push("provider");
33
+ if (!wallet) missing.push("wallet");
34
+ if (missing.length > 0) {
35
+ throw new ActionError(`Wallet is not configured. Missing settings: ${missing.join(", ")}. ` + `Set these fields in your profile settings before using wallet actions.`, "WALLET_NOT_CONFIGURED", {
36
+ missingFields: missing
37
+ });
38
+ }
39
+ try {
40
+ return await GetBlaze(network, provider, wallet);
41
+ } catch (err) {
42
+ throw new ActionError(`Failed to initialize Blaze wallet: ${err instanceof Error ? err.message : String(err)}`, "BLAZE_INIT_ERROR", {
43
+ error: err instanceof Error ? err.message : String(err)
44
+ });
45
+ }
46
+ }
47
+
48
+ /**
49
+ * Checks whether the wallet in a Blaze instance is a hot wallet.
50
+ * Cold wallets cannot sign transactions.
51
+ */
52
+ export function isHotWallet(blaze) {
53
+ return blaze.wallet instanceof HotWallet;
54
+ }
55
+ //# sourceMappingURL=blaze-helper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blaze-helper.js","names":["HotWallet","GetBlaze","ActionError","getBlazeFromContext","context","overrides","settings","network","provider","wallet","missing","push","length","join","missingFields","err","Error","message","String","error","isHotWallet","blaze"],"sources":["../../../../../src/Sprinkle/actions/builtin/blaze-helper.ts"],"sourcesContent":["/**\n * Shared helper utilities for wallet and transaction actions.\n * Provides Blaze instance creation from action context settings.\n */\n\nimport type { TSchema } from \"@sinclair/typebox\";\nimport { Blaze, HotWallet } from \"@blaze-cardano/sdk\";\nimport type { Provider } from \"@blaze-cardano/query\";\nimport type { Wallet } from \"@blaze-cardano/sdk\";\nimport { GetBlaze } from \"../../wallet.js\";\nimport { ActionError } from \"../types.js\";\nimport type { IActionContext } from \"../types.js\";\nimport type {\n NetworkSchema,\n ProviderSettingsSchema,\n WalletSettingsSchema,\n} from \"../../schemas.js\";\nimport type { TExact } from \"../../types.js\";\n\n/** Settings shape expected on context.settings for wallet access */\nexport interface IWalletSettings {\n network?: TExact<typeof NetworkSchema>;\n provider?: TExact<typeof ProviderSettingsSchema>;\n wallet?: TExact<typeof WalletSettingsSchema>;\n}\n\n/** Optional overrides for Blaze initialization, in case field names differ */\nexport interface IBlazeOverrides {\n network?: TExact<typeof NetworkSchema>;\n provider?: TExact<typeof ProviderSettingsSchema>;\n wallet?: TExact<typeof WalletSettingsSchema>;\n}\n\n/**\n * Creates a Blaze instance from action context settings.\n *\n * Falls back to `context.settings.network`, `context.settings.provider`,\n * and `context.settings.wallet` when overrides are not provided.\n *\n * @throws `ActionError(\"WALLET_NOT_CONFIGURED\")` if required settings are missing\n * @throws `ActionError(\"BLAZE_INIT_ERROR\")` if Blaze fails to initialize\n */\nexport async function getBlazeFromContext<S extends TSchema>(\n context: IActionContext<S>,\n overrides?: IBlazeOverrides,\n): Promise<Blaze<Provider, Wallet>> {\n const settings = context.settings as unknown as IWalletSettings;\n\n const network = overrides?.network ?? settings.network;\n const provider = overrides?.provider ?? settings.provider;\n const wallet = overrides?.wallet ?? settings.wallet;\n\n // Validate required fields and collect missing ones for a helpful error message\n const missing: string[] = [];\n if (!network) missing.push(\"network\");\n if (!provider) missing.push(\"provider\");\n if (!wallet) missing.push(\"wallet\");\n\n if (missing.length > 0) {\n throw new ActionError(\n `Wallet is not configured. Missing settings: ${missing.join(\", \")}. ` +\n `Set these fields in your profile settings before using wallet actions.`,\n \"WALLET_NOT_CONFIGURED\",\n { missingFields: missing },\n );\n }\n\n try {\n return await GetBlaze(\n network as TExact<typeof NetworkSchema>,\n provider as TExact<typeof ProviderSettingsSchema>,\n wallet as TExact<typeof WalletSettingsSchema>,\n );\n } catch (err) {\n throw new ActionError(\n `Failed to initialize Blaze wallet: ${err instanceof Error ? err.message : String(err)}`,\n \"BLAZE_INIT_ERROR\",\n { error: err instanceof Error ? err.message : String(err) },\n );\n }\n}\n\n/**\n * Checks whether the wallet in a Blaze instance is a hot wallet.\n * Cold wallets cannot sign transactions.\n */\nexport function isHotWallet(blaze: Blaze<Provider, Wallet>): boolean {\n return blaze.wallet instanceof HotWallet;\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;;AAGA,SAAgBA,SAAS,QAAQ,oBAAoB;AAGrD,SAASC,QAAQ,QAAQ,iBAAiB;AAC1C,SAASC,WAAW,QAAQ,aAAa;;AASzC;;AAOA;;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,eAAeC,mBAAmBA,CACvCC,OAA0B,EAC1BC,SAA2B,EACO;EAClC,MAAMC,QAAQ,GAAGF,OAAO,CAACE,QAAsC;EAE/D,MAAMC,OAAO,GAAGF,SAAS,EAAEE,OAAO,IAAID,QAAQ,CAACC,OAAO;EACtD,MAAMC,QAAQ,GAAGH,SAAS,EAAEG,QAAQ,IAAIF,QAAQ,CAACE,QAAQ;EACzD,MAAMC,MAAM,GAAGJ,SAAS,EAAEI,MAAM,IAAIH,QAAQ,CAACG,MAAM;;EAEnD;EACA,MAAMC,OAAiB,GAAG,EAAE;EAC5B,IAAI,CAACH,OAAO,EAAEG,OAAO,CAACC,IAAI,CAAC,SAAS,CAAC;EACrC,IAAI,CAACH,QAAQ,EAAEE,OAAO,CAACC,IAAI,CAAC,UAAU,CAAC;EACvC,IAAI,CAACF,MAAM,EAAEC,OAAO,CAACC,IAAI,CAAC,QAAQ,CAAC;EAEnC,IAAID,OAAO,CAACE,MAAM,GAAG,CAAC,EAAE;IACtB,MAAM,IAAIV,WAAW,CACnB,+CAA+CQ,OAAO,CAACG,IAAI,CAAC,IAAI,CAAC,IAAI,GACnE,wEAAwE,EAC1E,uBAAuB,EACvB;MAAEC,aAAa,EAAEJ;IAAQ,CAC3B,CAAC;EACH;EAEA,IAAI;IACF,OAAO,MAAMT,QAAQ,CACnBM,OAAO,EACPC,QAAQ,EACRC,MACF,CAAC;EACH,CAAC,CAAC,OAAOM,GAAG,EAAE;IACZ,MAAM,IAAIb,WAAW,CACnB,sCAAsCa,GAAG,YAAYC,KAAK,GAAGD,GAAG,CAACE,OAAO,GAAGC,MAAM,CAACH,GAAG,CAAC,EAAE,EACxF,kBAAkB,EAClB;MAAEI,KAAK,EAAEJ,GAAG,YAAYC,KAAK,GAAGD,GAAG,CAACE,OAAO,GAAGC,MAAM,CAACH,GAAG;IAAE,CAC5D,CAAC;EACH;AACF;;AAEA;AACA;AACA;AACA;AACA,OAAO,SAASK,WAAWA,CAACC,KAA8B,EAAW;EACnE,OAAOA,KAAK,CAACZ,MAAM,YAAYT,SAAS;AAC1C","ignoreList":[]}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Barrel export for built-in Sprinkle actions.
3
+ *
4
+ * Provides a `getBuiltinActions()` factory that returns all 14 built-in actions
5
+ * ready for registration on an ActionRegistry.
6
+ */
7
+
8
+ export { listProfiles, getProfile, setProfile, createProfile, deleteProfile } from "./profile-actions.js";
9
+ export { getSettings, updateSettings } from "./settings-actions.js";
10
+ export { getWalletAddress, getWalletBalance, getWalletUtxos } from "./wallet-actions.js";
11
+ export { signTransaction, submitTransaction, signAndSubmit, decodeTransaction } from "./transaction-actions.js";
12
+ import { listProfiles, getProfile, setProfile, createProfile, deleteProfile } from "./profile-actions.js";
13
+ import { getSettings, updateSettings } from "./settings-actions.js";
14
+ import { getWalletAddress, getWalletBalance, getWalletUtxos } from "./wallet-actions.js";
15
+ import { signTransaction, submitTransaction, signAndSubmit, decodeTransaction } from "./transaction-actions.js";
16
+
17
+ /**
18
+ * Returns an array of all 14 built-in Sprinkle actions.
19
+ * Register them on your ActionRegistry or pass them to `Sprinkle.run()`.
20
+ *
21
+ * @example
22
+ * ```ts
23
+ * const sprinkle = new Sprinkle(MySchema, storagePath);
24
+ * for (const action of getBuiltinActions()) {
25
+ * sprinkle.registerAction(action);
26
+ * }
27
+ * ```
28
+ */
29
+ export function getBuiltinActions() {
30
+ return [listProfiles, getProfile, setProfile, createProfile, deleteProfile, getSettings, updateSettings, getWalletAddress, getWalletBalance, getWalletUtxos, signTransaction, submitTransaction, signAndSubmit, decodeTransaction];
31
+ }
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":["listProfiles","getProfile","setProfile","createProfile","deleteProfile","getSettings","updateSettings","getWalletAddress","getWalletBalance","getWalletUtxos","signTransaction","submitTransaction","signAndSubmit","decodeTransaction","getBuiltinActions"],"sources":["../../../../../src/Sprinkle/actions/builtin/index.ts"],"sourcesContent":["/**\n * Barrel export for built-in Sprinkle actions.\n *\n * Provides a `getBuiltinActions()` factory that returns all 14 built-in actions\n * ready for registration on an ActionRegistry.\n */\n\nimport type { TSchema } from \"@sinclair/typebox\";\nimport type { AnyAction } from \"../types.js\";\n\nexport {\n listProfiles,\n getProfile,\n setProfile,\n createProfile,\n deleteProfile,\n} from \"./profile-actions.js\";\n\nexport { getSettings, updateSettings } from \"./settings-actions.js\";\n\nexport {\n getWalletAddress,\n getWalletBalance,\n getWalletUtxos,\n} from \"./wallet-actions.js\";\n\nexport {\n signTransaction,\n submitTransaction,\n signAndSubmit,\n decodeTransaction,\n} from \"./transaction-actions.js\";\n\nimport {\n listProfiles,\n getProfile,\n setProfile,\n createProfile,\n deleteProfile,\n} from \"./profile-actions.js\";\n\nimport { getSettings, updateSettings } from \"./settings-actions.js\";\n\nimport {\n getWalletAddress,\n getWalletBalance,\n getWalletUtxos,\n} from \"./wallet-actions.js\";\n\nimport {\n signTransaction,\n submitTransaction,\n signAndSubmit,\n decodeTransaction,\n} from \"./transaction-actions.js\";\n\n/**\n * Returns an array of all 14 built-in Sprinkle actions.\n * Register them on your ActionRegistry or pass them to `Sprinkle.run()`.\n *\n * @example\n * ```ts\n * const sprinkle = new Sprinkle(MySchema, storagePath);\n * for (const action of getBuiltinActions()) {\n * sprinkle.registerAction(action);\n * }\n * ```\n */\nexport function getBuiltinActions<S extends TSchema>(): AnyAction<S>[] {\n return [\n listProfiles,\n getProfile,\n setProfile,\n createProfile,\n deleteProfile,\n getSettings,\n updateSettings,\n getWalletAddress,\n getWalletBalance,\n getWalletUtxos,\n signTransaction,\n submitTransaction,\n signAndSubmit,\n decodeTransaction,\n ] as unknown as AnyAction<S>[];\n}\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;;AAKA,SACEA,YAAY,EACZC,UAAU,EACVC,UAAU,EACVC,aAAa,EACbC,aAAa,QACR,sBAAsB;AAE7B,SAASC,WAAW,EAAEC,cAAc,QAAQ,uBAAuB;AAEnE,SACEC,gBAAgB,EAChBC,gBAAgB,EAChBC,cAAc,QACT,qBAAqB;AAE5B,SACEC,eAAe,EACfC,iBAAiB,EACjBC,aAAa,EACbC,iBAAiB,QACZ,0BAA0B;AAEjC,SACEb,YAAY,EACZC,UAAU,EACVC,UAAU,EACVC,aAAa,EACbC,aAAa,QACR,sBAAsB;AAE7B,SAASC,WAAW,EAAEC,cAAc,QAAQ,uBAAuB;AAEnE,SACEC,gBAAgB,EAChBC,gBAAgB,EAChBC,cAAc,QACT,qBAAqB;AAE5B,SACEC,eAAe,EACfC,iBAAiB,EACjBC,aAAa,EACbC,iBAAiB,QACZ,0BAA0B;;AAEjC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASC,iBAAiBA,CAAA,EAAsC;EACrE,OAAO,CACLd,YAAY,EACZC,UAAU,EACVC,UAAU,EACVC,aAAa,EACbC,aAAa,EACbC,WAAW,EACXC,cAAc,EACdC,gBAAgB,EAChBC,gBAAgB,EAChBC,cAAc,EACdC,eAAe,EACfC,iBAAiB,EACjBC,aAAa,EACbC,iBAAiB,CAClB;AACH","ignoreList":[]}
@@ -0,0 +1,197 @@
1
+ /**
2
+ * Built-in profile management actions for the Sprinkle action system.
3
+ * These actions expose profile CRUD operations as non-interactive actions
4
+ * available in CLI and MCP modes.
5
+ *
6
+ * All actions use category "sprinkles".
7
+ */
8
+
9
+ import { Type } from "@sinclair/typebox";
10
+ import { ActionError } from "../types.js";
11
+ /** Shape of a profile entry as returned by profile actions */
12
+ const ProfileEntrySchema = Type.Object({
13
+ id: Type.String(),
14
+ name: Type.String(),
15
+ description: Type.Optional(Type.String()),
16
+ createdAt: Type.String(),
17
+ updatedAt: Type.String()
18
+ });
19
+
20
+ /**
21
+ * `list-profiles` -- Returns all profiles and the active profile ID.
22
+ */
23
+ export const listProfiles = {
24
+ name: "list-profiles",
25
+ description: "List all profiles and indicate which one is currently active.",
26
+ category: "sprinkles",
27
+ inputSchema: Type.Object({}),
28
+ outputSchema: Type.Object({
29
+ profiles: Type.Array(ProfileEntrySchema),
30
+ activeProfileId: Type.Optional(Type.String())
31
+ }),
32
+ execute: async (_input, context) => {
33
+ const entries = context.sprinkle.scanProfiles();
34
+ const profiles = entries.map(e => ({
35
+ id: e.id,
36
+ name: e.meta.name,
37
+ description: e.meta.description,
38
+ createdAt: e.meta.createdAt,
39
+ updatedAt: e.meta.updatedAt
40
+ }));
41
+ return {
42
+ profiles,
43
+ activeProfileId: context.sprinkle.currentProfile?.id
44
+ };
45
+ }
46
+ };
47
+
48
+ /**
49
+ * `get-profile` -- Returns metadata and settings for a specific profile.
50
+ * Settings are masked by default; pass `includeSensitive: true` to get raw values.
51
+ */
52
+ export const getProfile = {
53
+ name: "get-profile",
54
+ description: "Get metadata and settings for a profile. Sensitive fields are masked by default.",
55
+ category: "sprinkles",
56
+ inputSchema: Type.Object({
57
+ id: Type.String(),
58
+ includeSensitive: Type.Optional(Type.Boolean({
59
+ default: false
60
+ }))
61
+ }),
62
+ outputSchema: Type.Object({
63
+ id: Type.String(),
64
+ name: Type.String(),
65
+ description: Type.Optional(Type.String()),
66
+ createdAt: Type.String(),
67
+ updatedAt: Type.String(),
68
+ settings: Type.Any()
69
+ }),
70
+ execute: async (input, context) => {
71
+ // Validate ID to prevent path traversal (defense in depth)
72
+ if (input.id.includes("/") || input.id.includes("\\") || input.id.includes("..")) {
73
+ throw new ActionError(`Invalid profile ID "${input.id}".`, "INVALID_PROFILE_ID", {
74
+ id: input.id
75
+ });
76
+ }
77
+ const profile = context.sprinkle.getProfileById(input.id);
78
+ if (!profile) {
79
+ throw new ActionError(`Profile "${input.id}" not found.`, "PROFILE_NOT_FOUND", {
80
+ id: input.id
81
+ });
82
+ }
83
+
84
+ // Read the profile file to get settings
85
+ const fs = await import("fs");
86
+ const path = await import("path");
87
+ const storagePath = context.sprinkle.storagePath;
88
+ const profilePath = path.join(storagePath, "profiles", `${input.id}.json`);
89
+ let settings = {};
90
+ try {
91
+ const content = fs.readFileSync(profilePath, "utf-8");
92
+ const parsed = JSON.parse(content);
93
+ settings = parsed.settings ?? {};
94
+ } catch (err) {
95
+ // Throw an error so the caller knows the profile file couldn't be read
96
+ throw new ActionError(`Failed to read profile "${input.id}": ${err instanceof Error ? err.message : String(err)}`, "PROFILE_READ_ERROR", {
97
+ id: input.id,
98
+ error: err instanceof Error ? err.message : String(err)
99
+ });
100
+ }
101
+
102
+ // Mask sensitive fields unless includeSensitive is true
103
+ if (!input.includeSensitive) {
104
+ const {
105
+ maskSensitiveFields
106
+ } = await import("../../encryption.js");
107
+ settings = maskSensitiveFields(settings, context.sprinkle.type);
108
+ }
109
+ return {
110
+ id: profile.id,
111
+ name: profile.meta.name,
112
+ description: profile.meta.description,
113
+ createdAt: profile.meta.createdAt,
114
+ updatedAt: profile.meta.updatedAt,
115
+ settings
116
+ };
117
+ }
118
+ };
119
+
120
+ /**
121
+ * `set-profile` -- Switch the active profile.
122
+ */
123
+ export const setProfile = {
124
+ name: "set-profile",
125
+ description: "Switch the active profile.",
126
+ category: "sprinkles",
127
+ inputSchema: Type.Object({
128
+ id: Type.String()
129
+ }),
130
+ outputSchema: Type.Object({
131
+ id: Type.String(),
132
+ name: Type.String()
133
+ }),
134
+ execute: async (input, context) => {
135
+ const profile = context.sprinkle.getProfileById(input.id);
136
+ if (!profile) {
137
+ throw new ActionError(`Profile "${input.id}" not found.`, "PROFILE_NOT_FOUND", {
138
+ id: input.id
139
+ });
140
+ }
141
+ await context.sprinkle.loadProfile(input.id);
142
+ return {
143
+ id: input.id,
144
+ name: profile.meta.name
145
+ };
146
+ }
147
+ };
148
+
149
+ /**
150
+ * `create-profile` -- Create a new profile without prompts.
151
+ */
152
+ export const createProfile = {
153
+ name: "create-profile",
154
+ description: "Create a new profile.",
155
+ category: "sprinkles",
156
+ inputSchema: Type.Object({
157
+ name: Type.String(),
158
+ description: Type.Optional(Type.String()),
159
+ settings: Type.Optional(Type.Any())
160
+ }),
161
+ outputSchema: Type.Object({
162
+ id: Type.String(),
163
+ name: Type.String()
164
+ }),
165
+ execute: async (input, context) => {
166
+ const entry = await context.sprinkle.createProfileNonInteractive(input.name, input.description, input.settings);
167
+ return {
168
+ id: entry.id,
169
+ name: entry.meta.name
170
+ };
171
+ }
172
+ };
173
+
174
+ /**
175
+ * `delete-profile` -- Delete a profile by ID.
176
+ * Cannot delete the only profile or the currently active profile.
177
+ */
178
+ export const deleteProfile = {
179
+ name: "delete-profile",
180
+ description: "Delete a profile. Cannot delete the only profile or the active profile.",
181
+ category: "sprinkles",
182
+ inputSchema: Type.Object({
183
+ id: Type.String()
184
+ }),
185
+ outputSchema: Type.Object({
186
+ deleted: Type.Boolean(),
187
+ id: Type.String()
188
+ }),
189
+ execute: async (input, context) => {
190
+ context.sprinkle.deleteProfileById(input.id);
191
+ return {
192
+ deleted: true,
193
+ id: input.id
194
+ };
195
+ }
196
+ };
197
+ //# sourceMappingURL=profile-actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-actions.js","names":["Type","ActionError","ProfileEntrySchema","Object","id","String","name","description","Optional","createdAt","updatedAt","listProfiles","category","inputSchema","outputSchema","profiles","Array","activeProfileId","execute","_input","context","entries","sprinkle","scanProfiles","map","e","meta","currentProfile","getProfile","includeSensitive","Boolean","default","settings","Any","input","includes","profile","getProfileById","fs","path","storagePath","profilePath","join","content","readFileSync","parsed","JSON","parse","err","Error","message","error","maskSensitiveFields","type","setProfile","loadProfile","createProfile","entry","createProfileNonInteractive","deleteProfile","deleted","deleteProfileById"],"sources":["../../../../../src/Sprinkle/actions/builtin/profile-actions.ts"],"sourcesContent":["/**\n * Built-in profile management actions for the Sprinkle action system.\n * These actions expose profile CRUD operations as non-interactive actions\n * available in CLI and MCP modes.\n *\n * All actions use category \"sprinkles\".\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport type { TSchema } from \"@sinclair/typebox\";\nimport { ActionError } from \"../types.js\";\nimport type { IAction } from \"../types.js\";\n\n/** Shape of a profile entry as returned by profile actions */\nconst ProfileEntrySchema = Type.Object({\n id: Type.String(),\n name: Type.String(),\n description: Type.Optional(Type.String()),\n createdAt: Type.String(),\n updatedAt: Type.String(),\n});\n\n/**\n * `list-profiles` -- Returns all profiles and the active profile ID.\n */\nexport const listProfiles: IAction<\n Record<string, never>,\n { profiles: unknown[]; activeProfileId: string | undefined },\n TSchema\n> = {\n name: \"list-profiles\",\n description: \"List all profiles and indicate which one is currently active.\",\n category: \"sprinkles\",\n inputSchema: Type.Object({}),\n outputSchema: Type.Object({\n profiles: Type.Array(ProfileEntrySchema),\n activeProfileId: Type.Optional(Type.String()),\n }),\n execute: async (_input, context) => {\n const entries = context.sprinkle.scanProfiles();\n const profiles = entries.map((e) => ({\n id: e.id,\n name: e.meta.name,\n description: e.meta.description,\n createdAt: e.meta.createdAt,\n updatedAt: e.meta.updatedAt,\n }));\n return {\n profiles,\n activeProfileId: context.sprinkle.currentProfile?.id,\n };\n },\n};\n\n/**\n * `get-profile` -- Returns metadata and settings for a specific profile.\n * Settings are masked by default; pass `includeSensitive: true` to get raw values.\n */\nexport const getProfile: IAction<\n { id: string; includeSensitive?: boolean },\n unknown,\n TSchema\n> = {\n name: \"get-profile\",\n description:\n \"Get metadata and settings for a profile. Sensitive fields are masked by default.\",\n category: \"sprinkles\",\n inputSchema: Type.Object({\n id: Type.String(),\n includeSensitive: Type.Optional(Type.Boolean({ default: false })),\n }),\n outputSchema: Type.Object({\n id: Type.String(),\n name: Type.String(),\n description: Type.Optional(Type.String()),\n createdAt: Type.String(),\n updatedAt: Type.String(),\n settings: Type.Any(),\n }),\n execute: async (input, context) => {\n // Validate ID to prevent path traversal (defense in depth)\n if (input.id.includes(\"/\") || input.id.includes(\"\\\\\") || input.id.includes(\"..\")) {\n throw new ActionError(\n `Invalid profile ID \"${input.id}\".`,\n \"INVALID_PROFILE_ID\",\n { id: input.id },\n );\n }\n\n const profile = context.sprinkle.getProfileById(input.id);\n if (!profile) {\n throw new ActionError(\n `Profile \"${input.id}\" not found.`,\n \"PROFILE_NOT_FOUND\",\n { id: input.id },\n );\n }\n\n // Read the profile file to get settings\n const fs = await import(\"fs\");\n const path = await import(\"path\");\n const storagePath = context.sprinkle.storagePath;\n\n const profilePath = path.join(storagePath, \"profiles\", `${input.id}.json`);\n let settings: unknown = {};\n try {\n const content = fs.readFileSync(profilePath, \"utf-8\");\n const parsed = JSON.parse(content);\n settings = parsed.settings ?? {};\n } catch (err) {\n // Throw an error so the caller knows the profile file couldn't be read\n throw new ActionError(\n `Failed to read profile \"${input.id}\": ${err instanceof Error ? err.message : String(err)}`,\n \"PROFILE_READ_ERROR\",\n { id: input.id, error: err instanceof Error ? err.message : String(err) },\n );\n }\n\n // Mask sensitive fields unless includeSensitive is true\n if (!input.includeSensitive) {\n const { maskSensitiveFields } = await import(\"../../encryption.js\");\n settings = maskSensitiveFields(settings, context.sprinkle.type);\n }\n\n return {\n id: profile.id,\n name: profile.meta.name,\n description: profile.meta.description,\n createdAt: profile.meta.createdAt,\n updatedAt: profile.meta.updatedAt,\n settings,\n };\n },\n};\n\n/**\n * `set-profile` -- Switch the active profile.\n */\nexport const setProfile: IAction<\n { id: string },\n { id: string; name: string },\n TSchema\n> = {\n name: \"set-profile\",\n description: \"Switch the active profile.\",\n category: \"sprinkles\",\n inputSchema: Type.Object({\n id: Type.String(),\n }),\n outputSchema: Type.Object({\n id: Type.String(),\n name: Type.String(),\n }),\n execute: async (input, context) => {\n const profile = context.sprinkle.getProfileById(input.id);\n if (!profile) {\n throw new ActionError(\n `Profile \"${input.id}\" not found.`,\n \"PROFILE_NOT_FOUND\",\n { id: input.id },\n );\n }\n\n await context.sprinkle.loadProfile(input.id);\n return {\n id: input.id,\n name: profile.meta.name,\n };\n },\n};\n\n/**\n * `create-profile` -- Create a new profile without prompts.\n */\nexport const createProfile: IAction<\n { name: string; description?: string; settings?: unknown },\n { id: string; name: string },\n TSchema\n> = {\n name: \"create-profile\",\n description: \"Create a new profile.\",\n category: \"sprinkles\",\n inputSchema: Type.Object({\n name: Type.String(),\n description: Type.Optional(Type.String()),\n settings: Type.Optional(Type.Any()),\n }),\n outputSchema: Type.Object({\n id: Type.String(),\n name: Type.String(),\n }),\n execute: async (input, context) => {\n const entry = await context.sprinkle.createProfileNonInteractive(\n input.name,\n input.description,\n input.settings as never,\n );\n return {\n id: entry.id,\n name: entry.meta.name,\n };\n },\n};\n\n/**\n * `delete-profile` -- Delete a profile by ID.\n * Cannot delete the only profile or the currently active profile.\n */\nexport const deleteProfile: IAction<\n { id: string },\n { deleted: boolean; id: string },\n TSchema\n> = {\n name: \"delete-profile\",\n description:\n \"Delete a profile. Cannot delete the only profile or the active profile.\",\n category: \"sprinkles\",\n inputSchema: Type.Object({\n id: Type.String(),\n }),\n outputSchema: Type.Object({\n deleted: Type.Boolean(),\n id: Type.String(),\n }),\n execute: async (input, context) => {\n context.sprinkle.deleteProfileById(input.id);\n return { deleted: true, id: input.id };\n },\n};\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,81 @@
1
+ /**
2
+ * Built-in settings actions for the Sprinkle action system.
3
+ * These actions expose settings read and update operations as non-interactive
4
+ * actions available in CLI and MCP modes.
5
+ *
6
+ * All actions use category "sprinkles".
7
+ */
8
+
9
+ import { Type } from "@sinclair/typebox";
10
+ import { Value } from "@sinclair/typebox/value";
11
+ import { ActionError } from "../types.js";
12
+ /**
13
+ * `get-settings` -- Returns the current profile settings.
14
+ * Sensitive fields are masked by default; pass `includeSensitive: true` for raw values.
15
+ */
16
+ export const getSettings = {
17
+ name: "get-settings",
18
+ description: "Get the current profile settings. Sensitive fields are masked by default.",
19
+ category: "sprinkles",
20
+ inputSchema: Type.Object({
21
+ includeSensitive: Type.Optional(Type.Boolean({
22
+ default: false
23
+ }))
24
+ }),
25
+ outputSchema: Type.Object({
26
+ settings: Type.Any(),
27
+ profileId: Type.String(),
28
+ profileName: Type.String()
29
+ }),
30
+ execute: async (input, context) => {
31
+ const settings = input.includeSensitive ? context.sprinkle.settings : context.sprinkle.getDisplaySettings();
32
+ return {
33
+ settings,
34
+ profileId: context.sprinkle.profileId,
35
+ profileName: context.sprinkle.profileMeta.name
36
+ };
37
+ }
38
+ };
39
+
40
+ /**
41
+ * `update-settings` -- Shallow-merges settings onto the current profile and persists.
42
+ * Validates the merged result against the Sprinkle schema before saving.
43
+ * Returns masked settings.
44
+ */
45
+ export const updateSettings = {
46
+ name: "update-settings",
47
+ description: "Merge partial settings onto the current profile and save. Returns masked settings.",
48
+ category: "sprinkles",
49
+ inputSchema: Type.Object({
50
+ settings: Type.Record(Type.String(), Type.Any())
51
+ }),
52
+ outputSchema: Type.Object({
53
+ settings: Type.Any(),
54
+ profileId: Type.String()
55
+ }),
56
+ execute: async (input, context) => {
57
+ // Shallow merge the incoming settings onto the current settings
58
+ const merged = {
59
+ ...context.sprinkle.settings,
60
+ ...input.settings
61
+ };
62
+
63
+ // Validate the merged result against the Sprinkle schema
64
+ if (!Value.Check(context.sprinkle.type, merged)) {
65
+ const errors = [...Value.Errors(context.sprinkle.type, merged)];
66
+ const message = errors.map(e => `${e.path}: ${e.message}`).join("; ");
67
+ throw new ActionError(`Settings validation failed: ${message}`, "VALIDATION_ERROR", {
68
+ errors
69
+ });
70
+ }
71
+
72
+ // Apply and persist
73
+ context.sprinkle.settings = merged;
74
+ context.sprinkle.saveSettings();
75
+ return {
76
+ settings: context.sprinkle.getDisplaySettings(),
77
+ profileId: context.sprinkle.profileId
78
+ };
79
+ }
80
+ };
81
+ //# sourceMappingURL=settings-actions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-actions.js","names":["Type","Value","ActionError","getSettings","name","description","category","inputSchema","Object","includeSensitive","Optional","Boolean","default","outputSchema","settings","Any","profileId","String","profileName","execute","input","context","sprinkle","getDisplaySettings","profileMeta","updateSettings","Record","merged","Check","type","errors","Errors","message","map","e","path","join","saveSettings"],"sources":["../../../../../src/Sprinkle/actions/builtin/settings-actions.ts"],"sourcesContent":["/**\n * Built-in settings actions for the Sprinkle action system.\n * These actions expose settings read and update operations as non-interactive\n * actions available in CLI and MCP modes.\n *\n * All actions use category \"sprinkles\".\n */\n\nimport { Type } from \"@sinclair/typebox\";\nimport { Value } from \"@sinclair/typebox/value\";\nimport type { TSchema } from \"@sinclair/typebox\";\nimport { ActionError } from \"../types.js\";\nimport type { IAction } from \"../types.js\";\n\n/**\n * `get-settings` -- Returns the current profile settings.\n * Sensitive fields are masked by default; pass `includeSensitive: true` for raw values.\n */\nexport const getSettings: IAction<\n { includeSensitive?: boolean },\n { settings: unknown; profileId: string; profileName: string },\n TSchema\n> = {\n name: \"get-settings\",\n description:\n \"Get the current profile settings. Sensitive fields are masked by default.\",\n category: \"sprinkles\",\n inputSchema: Type.Object({\n includeSensitive: Type.Optional(Type.Boolean({ default: false })),\n }),\n outputSchema: Type.Object({\n settings: Type.Any(),\n profileId: Type.String(),\n profileName: Type.String(),\n }),\n execute: async (input, context) => {\n const settings = input.includeSensitive\n ? context.sprinkle.settings\n : context.sprinkle.getDisplaySettings();\n\n return {\n settings,\n profileId: context.sprinkle.profileId,\n profileName: context.sprinkle.profileMeta.name,\n };\n },\n};\n\n/**\n * `update-settings` -- Shallow-merges settings onto the current profile and persists.\n * Validates the merged result against the Sprinkle schema before saving.\n * Returns masked settings.\n */\nexport const updateSettings: IAction<\n { settings: Record<string, unknown> },\n { settings: unknown; profileId: string },\n TSchema\n> = {\n name: \"update-settings\",\n description:\n \"Merge partial settings onto the current profile and save. Returns masked settings.\",\n category: \"sprinkles\",\n inputSchema: Type.Object({\n settings: Type.Record(Type.String(), Type.Any()),\n }),\n outputSchema: Type.Object({\n settings: Type.Any(),\n profileId: Type.String(),\n }),\n execute: async (input, context) => {\n // Shallow merge the incoming settings onto the current settings\n const merged = {\n ...(context.sprinkle.settings as Record<string, unknown>),\n ...input.settings,\n };\n\n // Validate the merged result against the Sprinkle schema\n if (!Value.Check(context.sprinkle.type, merged)) {\n const errors = [...Value.Errors(context.sprinkle.type, merged)];\n const message = errors\n .map((e) => `${e.path}: ${e.message}`)\n .join(\"; \");\n throw new ActionError(\n `Settings validation failed: ${message}`,\n \"VALIDATION_ERROR\",\n { errors },\n );\n }\n\n // Apply and persist\n context.sprinkle.settings = merged as typeof context.sprinkle.settings;\n context.sprinkle.saveSettings();\n\n return {\n settings: context.sprinkle.getDisplaySettings(),\n profileId: context.sprinkle.profileId,\n };\n },\n};\n"],"mappings":"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","ignoreList":[]}