@sundaeswap/sprinkles 0.6.0 → 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.
- package/dist/cjs/Sprinkle/__tests__/action-integration.test.js +590 -0
- package/dist/cjs/Sprinkle/__tests__/action-integration.test.js.map +1 -0
- package/dist/cjs/Sprinkle/__tests__/action-registry.test.js +193 -0
- package/dist/cjs/Sprinkle/__tests__/action-registry.test.js.map +1 -0
- package/dist/cjs/Sprinkle/__tests__/action-runner.test.js +304 -0
- package/dist/cjs/Sprinkle/__tests__/action-runner.test.js.map +1 -0
- package/dist/cjs/Sprinkle/__tests__/builtin-actions.test.js +1110 -0
- package/dist/cjs/Sprinkle/__tests__/builtin-actions.test.js.map +1 -0
- package/dist/cjs/Sprinkle/__tests__/cli-adapter.test.js +722 -0
- package/dist/cjs/Sprinkle/__tests__/cli-adapter.test.js.map +1 -0
- package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js +138 -0
- package/dist/cjs/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -1
- package/dist/cjs/Sprinkle/__tests__/mcp-adapter.test.js +713 -0
- package/dist/cjs/Sprinkle/__tests__/mcp-adapter.test.js.map +1 -0
- package/dist/cjs/Sprinkle/__tests__/tui-helpers.test.js +334 -0
- package/dist/cjs/Sprinkle/__tests__/tui-helpers.test.js.map +1 -0
- package/dist/cjs/Sprinkle/__tests__/wallet-transaction-actions.test.js +749 -0
- package/dist/cjs/Sprinkle/__tests__/wallet-transaction-actions.test.js.map +1 -0
- package/dist/cjs/Sprinkle/actions/builtin/blaze-helper.js +61 -0
- package/dist/cjs/Sprinkle/actions/builtin/blaze-helper.js.map +1 -0
- package/dist/cjs/Sprinkle/actions/builtin/index.js +117 -0
- package/dist/cjs/Sprinkle/actions/builtin/index.js.map +1 -0
- package/dist/cjs/Sprinkle/actions/builtin/profile-actions.js +202 -0
- package/dist/cjs/Sprinkle/actions/builtin/profile-actions.js.map +1 -0
- package/dist/cjs/Sprinkle/actions/builtin/settings-actions.js +87 -0
- package/dist/cjs/Sprinkle/actions/builtin/settings-actions.js.map +1 -0
- package/dist/cjs/Sprinkle/actions/builtin/transaction-actions.js +345 -0
- package/dist/cjs/Sprinkle/actions/builtin/transaction-actions.js.map +1 -0
- package/dist/cjs/Sprinkle/actions/builtin/wallet-actions.js +212 -0
- package/dist/cjs/Sprinkle/actions/builtin/wallet-actions.js.map +1 -0
- package/dist/cjs/Sprinkle/actions/cli-adapter.js +372 -0
- package/dist/cjs/Sprinkle/actions/cli-adapter.js.map +1 -0
- package/dist/cjs/Sprinkle/actions/index.js +127 -0
- package/dist/cjs/Sprinkle/actions/index.js.map +1 -0
- package/dist/cjs/Sprinkle/actions/mcp-adapter.js +415 -0
- package/dist/cjs/Sprinkle/actions/mcp-adapter.js.map +1 -0
- package/dist/cjs/Sprinkle/actions/registry.js +92 -0
- package/dist/cjs/Sprinkle/actions/registry.js.map +1 -0
- package/dist/cjs/Sprinkle/actions/runner.js +190 -0
- package/dist/cjs/Sprinkle/actions/runner.js.map +1 -0
- package/dist/cjs/Sprinkle/actions/tui-helpers.js +96 -0
- package/dist/cjs/Sprinkle/actions/tui-helpers.js.map +1 -0
- package/dist/cjs/Sprinkle/actions/types.js +68 -0
- package/dist/cjs/Sprinkle/actions/types.js.map +1 -0
- package/dist/cjs/Sprinkle/index.js +451 -4
- package/dist/cjs/Sprinkle/index.js.map +1 -1
- package/dist/cjs/Sprinkle/prompts.js +12 -7
- package/dist/cjs/Sprinkle/prompts.js.map +1 -1
- package/dist/cjs/Sprinkle/type-guards.js +7 -1
- package/dist/cjs/Sprinkle/type-guards.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/action-integration.test.js +588 -0
- package/dist/esm/Sprinkle/__tests__/action-integration.test.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/action-registry.test.js +192 -0
- package/dist/esm/Sprinkle/__tests__/action-registry.test.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/action-runner.test.js +302 -0
- package/dist/esm/Sprinkle/__tests__/action-runner.test.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/builtin-actions.test.js +1107 -0
- package/dist/esm/Sprinkle/__tests__/builtin-actions.test.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/cli-adapter.test.js +720 -0
- package/dist/esm/Sprinkle/__tests__/cli-adapter.test.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js +138 -0
- package/dist/esm/Sprinkle/__tests__/fill-in-struct.test.js.map +1 -1
- package/dist/esm/Sprinkle/__tests__/mcp-adapter.test.js +712 -0
- package/dist/esm/Sprinkle/__tests__/mcp-adapter.test.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/tui-helpers.test.js +332 -0
- package/dist/esm/Sprinkle/__tests__/tui-helpers.test.js.map +1 -0
- package/dist/esm/Sprinkle/__tests__/wallet-transaction-actions.test.js +747 -0
- package/dist/esm/Sprinkle/__tests__/wallet-transaction-actions.test.js.map +1 -0
- package/dist/esm/Sprinkle/actions/builtin/blaze-helper.js +55 -0
- package/dist/esm/Sprinkle/actions/builtin/blaze-helper.js.map +1 -0
- package/dist/esm/Sprinkle/actions/builtin/index.js +32 -0
- package/dist/esm/Sprinkle/actions/builtin/index.js.map +1 -0
- package/dist/esm/Sprinkle/actions/builtin/profile-actions.js +197 -0
- package/dist/esm/Sprinkle/actions/builtin/profile-actions.js.map +1 -0
- package/dist/esm/Sprinkle/actions/builtin/settings-actions.js +81 -0
- package/dist/esm/Sprinkle/actions/builtin/settings-actions.js.map +1 -0
- package/dist/esm/Sprinkle/actions/builtin/transaction-actions.js +340 -0
- package/dist/esm/Sprinkle/actions/builtin/transaction-actions.js.map +1 -0
- package/dist/esm/Sprinkle/actions/builtin/wallet-actions.js +207 -0
- package/dist/esm/Sprinkle/actions/builtin/wallet-actions.js.map +1 -0
- package/dist/esm/Sprinkle/actions/cli-adapter.js +361 -0
- package/dist/esm/Sprinkle/actions/cli-adapter.js.map +1 -0
- package/dist/esm/Sprinkle/actions/index.js +12 -0
- package/dist/esm/Sprinkle/actions/index.js.map +1 -0
- package/dist/esm/Sprinkle/actions/mcp-adapter.js +407 -0
- package/dist/esm/Sprinkle/actions/mcp-adapter.js.map +1 -0
- package/dist/esm/Sprinkle/actions/registry.js +85 -0
- package/dist/esm/Sprinkle/actions/registry.js.map +1 -0
- package/dist/esm/Sprinkle/actions/runner.js +182 -0
- package/dist/esm/Sprinkle/actions/runner.js.map +1 -0
- package/dist/esm/Sprinkle/actions/tui-helpers.js +91 -0
- package/dist/esm/Sprinkle/actions/tui-helpers.js.map +1 -0
- package/dist/esm/Sprinkle/actions/types.js +61 -0
- package/dist/esm/Sprinkle/actions/types.js.map +1 -0
- package/dist/esm/Sprinkle/index.js +299 -4
- package/dist/esm/Sprinkle/index.js.map +1 -1
- package/dist/esm/Sprinkle/prompts.js +12 -7
- package/dist/esm/Sprinkle/prompts.js.map +1 -1
- package/dist/esm/Sprinkle/type-guards.js +3 -0
- package/dist/esm/Sprinkle/type-guards.js.map +1 -1
- package/dist/types/Sprinkle/actions/builtin/blaze-helper.d.ts +39 -0
- package/dist/types/Sprinkle/actions/builtin/blaze-helper.d.ts.map +1 -0
- package/dist/types/Sprinkle/actions/builtin/index.d.ts +26 -0
- package/dist/types/Sprinkle/actions/builtin/index.d.ts.map +1 -0
- package/dist/types/Sprinkle/actions/builtin/profile-actions.d.ts +55 -0
- package/dist/types/Sprinkle/actions/builtin/profile-actions.d.ts.map +1 -0
- package/dist/types/Sprinkle/actions/builtin/settings-actions.d.ts +32 -0
- package/dist/types/Sprinkle/actions/builtin/settings-actions.d.ts.map +1 -0
- package/dist/types/Sprinkle/actions/builtin/transaction-actions.d.ts +70 -0
- package/dist/types/Sprinkle/actions/builtin/transaction-actions.d.ts.map +1 -0
- package/dist/types/Sprinkle/actions/builtin/wallet-actions.d.ts +50 -0
- package/dist/types/Sprinkle/actions/builtin/wallet-actions.d.ts.map +1 -0
- package/dist/types/Sprinkle/actions/cli-adapter.d.ts +104 -0
- package/dist/types/Sprinkle/actions/cli-adapter.d.ts.map +1 -0
- package/dist/types/Sprinkle/actions/index.d.ts +12 -0
- package/dist/types/Sprinkle/actions/index.d.ts.map +1 -0
- package/dist/types/Sprinkle/actions/mcp-adapter.d.ts +92 -0
- package/dist/types/Sprinkle/actions/mcp-adapter.d.ts.map +1 -0
- package/dist/types/Sprinkle/actions/registry.d.ts +42 -0
- package/dist/types/Sprinkle/actions/registry.d.ts.map +1 -0
- package/dist/types/Sprinkle/actions/runner.d.ts +45 -0
- package/dist/types/Sprinkle/actions/runner.d.ts.map +1 -0
- package/dist/types/Sprinkle/actions/tui-helpers.d.ts +53 -0
- package/dist/types/Sprinkle/actions/tui-helpers.d.ts.map +1 -0
- package/dist/types/Sprinkle/actions/types.d.ts +76 -0
- package/dist/types/Sprinkle/actions/types.d.ts.map +1 -0
- package/dist/types/Sprinkle/index.d.ts +81 -1
- package/dist/types/Sprinkle/index.d.ts.map +1 -1
- package/dist/types/Sprinkle/prompts.d.ts.map +1 -1
- package/dist/types/Sprinkle/type-guards.d.ts +4 -1
- package/dist/types/Sprinkle/type-guards.d.ts.map +1 -1
- package/dist/types/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +9 -2
- package/src/Sprinkle/__tests__/action-integration.test.ts +558 -0
- package/src/Sprinkle/__tests__/action-registry.test.ts +187 -0
- package/src/Sprinkle/__tests__/action-runner.test.ts +324 -0
- package/src/Sprinkle/__tests__/builtin-actions.test.ts +1022 -0
- package/src/Sprinkle/__tests__/cli-adapter.test.ts +715 -0
- package/src/Sprinkle/__tests__/fill-in-struct.test.ts +144 -0
- package/src/Sprinkle/__tests__/mcp-adapter.test.ts +718 -0
- package/src/Sprinkle/__tests__/tui-helpers.test.ts +325 -0
- package/src/Sprinkle/__tests__/wallet-transaction-actions.test.ts +695 -0
- package/src/Sprinkle/actions/builtin/blaze-helper.ts +89 -0
- package/src/Sprinkle/actions/builtin/index.ts +86 -0
- package/src/Sprinkle/actions/builtin/profile-actions.ts +229 -0
- package/src/Sprinkle/actions/builtin/settings-actions.ts +99 -0
- package/src/Sprinkle/actions/builtin/transaction-actions.ts +381 -0
- package/src/Sprinkle/actions/builtin/wallet-actions.ts +233 -0
- package/src/Sprinkle/actions/cli-adapter.ts +430 -0
- package/src/Sprinkle/actions/index.ts +32 -0
- package/src/Sprinkle/actions/mcp-adapter.ts +463 -0
- package/src/Sprinkle/actions/registry.ts +97 -0
- package/src/Sprinkle/actions/runner.ts +200 -0
- package/src/Sprinkle/actions/tui-helpers.ts +114 -0
- package/src/Sprinkle/actions/types.ts +91 -0
- package/src/Sprinkle/index.ts +395 -3
- package/src/Sprinkle/prompts.ts +118 -72
- package/src/Sprinkle/type-guards.ts +9 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wallet-transaction-actions.test.js","names":["_bunTest","require","_types","_interopRequireWildcard","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","makeAddress","bech32","toBech32","makeAssetId","policyId","assetName","makeUtxo","opts","tokenEntries","tokens","map","quantity","input","transactionId","toString","txHash","index","BigInt","output","amount","coin","lovelace","multiasset","length","entries","undefined","mockBlaze","mockIsHot","mockBlazeError","mock","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","Promise","resolve","then","signTransaction","submitTransaction","signAndSubmit","decodeTransaction","makeContext","settingsOverrides","sprinkle","settings","network","provider","type","apiKey","wallet","mnemonic","describe","beforeEach","test","getChangeAddress","ctx","result","execute","expect","toBe","ActionError","missingFields","rejects","toMatchObject","code","Error","name","category","inputSchema","toBeDefined","outputSchema","getUnspentOutputs","ada","toEqual","repeat","toHaveLength","total","utxos","outputIndex","Array","from","_","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":"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","ignoreList":[]}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getBlazeFromContext = getBlazeFromContext;
|
|
7
|
+
exports.isHotWallet = isHotWallet;
|
|
8
|
+
var _sdk = require("@blaze-cardano/sdk");
|
|
9
|
+
var _wallet = require("../../wallet.js");
|
|
10
|
+
var _types = require("../types.js");
|
|
11
|
+
/**
|
|
12
|
+
* Shared helper utilities for wallet and transaction actions.
|
|
13
|
+
* Provides Blaze instance creation from action context settings.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
/** Settings shape expected on context.settings for wallet access */
|
|
17
|
+
|
|
18
|
+
/** Optional overrides for Blaze initialization, in case field names differ */
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Creates a Blaze instance from action context settings.
|
|
22
|
+
*
|
|
23
|
+
* Falls back to `context.settings.network`, `context.settings.provider`,
|
|
24
|
+
* and `context.settings.wallet` when overrides are not provided.
|
|
25
|
+
*
|
|
26
|
+
* @throws `ActionError("WALLET_NOT_CONFIGURED")` if required settings are missing
|
|
27
|
+
* @throws `ActionError("BLAZE_INIT_ERROR")` if Blaze fails to initialize
|
|
28
|
+
*/
|
|
29
|
+
async function getBlazeFromContext(context, overrides) {
|
|
30
|
+
const settings = context.settings;
|
|
31
|
+
const network = overrides?.network ?? settings.network;
|
|
32
|
+
const provider = overrides?.provider ?? settings.provider;
|
|
33
|
+
const wallet = overrides?.wallet ?? settings.wallet;
|
|
34
|
+
|
|
35
|
+
// Validate required fields and collect missing ones for a helpful error message
|
|
36
|
+
const missing = [];
|
|
37
|
+
if (!network) missing.push("network");
|
|
38
|
+
if (!provider) missing.push("provider");
|
|
39
|
+
if (!wallet) missing.push("wallet");
|
|
40
|
+
if (missing.length > 0) {
|
|
41
|
+
throw new _types.ActionError(`Wallet is not configured. Missing settings: ${missing.join(", ")}. ` + `Set these fields in your profile settings before using wallet actions.`, "WALLET_NOT_CONFIGURED", {
|
|
42
|
+
missingFields: missing
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
try {
|
|
46
|
+
return await (0, _wallet.GetBlaze)(network, provider, wallet);
|
|
47
|
+
} catch (err) {
|
|
48
|
+
throw new _types.ActionError(`Failed to initialize Blaze wallet: ${err instanceof Error ? err.message : String(err)}`, "BLAZE_INIT_ERROR", {
|
|
49
|
+
error: err instanceof Error ? err.message : String(err)
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Checks whether the wallet in a Blaze instance is a hot wallet.
|
|
56
|
+
* Cold wallets cannot sign transactions.
|
|
57
|
+
*/
|
|
58
|
+
function isHotWallet(blaze) {
|
|
59
|
+
return blaze.wallet instanceof _sdk.HotWallet;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=blaze-helper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blaze-helper.js","names":["_sdk","require","_wallet","_types","getBlazeFromContext","context","overrides","settings","network","provider","wallet","missing","push","length","ActionError","join","missingFields","GetBlaze","err","Error","message","String","error","isHotWallet","blaze","HotWallet"],"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":";;;;;;;AAMA,IAAAA,IAAA,GAAAC,OAAA;AAGA,IAAAC,OAAA,GAAAD,OAAA;AACA,IAAAE,MAAA,GAAAF,OAAA;AAVA;AACA;AACA;AACA;;AAgBA;;AAOA;;AAOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,eAAeG,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,IAAIC,kBAAW,CACnB,+CAA+CH,OAAO,CAACI,IAAI,CAAC,IAAI,CAAC,IAAI,GACnE,wEAAwE,EAC1E,uBAAuB,EACvB;MAAEC,aAAa,EAAEL;IAAQ,CAC3B,CAAC;EACH;EAEA,IAAI;IACF,OAAO,MAAM,IAAAM,gBAAQ,EACnBT,OAAO,EACPC,QAAQ,EACRC,MACF,CAAC;EACH,CAAC,CAAC,OAAOQ,GAAG,EAAE;IACZ,MAAM,IAAIJ,kBAAW,CACnB,sCAAsCI,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;AACO,SAASK,WAAWA,CAACC,KAA8B,EAAW;EACnE,OAAOA,KAAK,CAACd,MAAM,YAAYe,cAAS;AAC1C","ignoreList":[]}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "createProfile", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _profileActions.createProfile;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
Object.defineProperty(exports, "decodeTransaction", {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function () {
|
|
15
|
+
return _transactionActions.decodeTransaction;
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
Object.defineProperty(exports, "deleteProfile", {
|
|
19
|
+
enumerable: true,
|
|
20
|
+
get: function () {
|
|
21
|
+
return _profileActions.deleteProfile;
|
|
22
|
+
}
|
|
23
|
+
});
|
|
24
|
+
exports.getBuiltinActions = getBuiltinActions;
|
|
25
|
+
Object.defineProperty(exports, "getProfile", {
|
|
26
|
+
enumerable: true,
|
|
27
|
+
get: function () {
|
|
28
|
+
return _profileActions.getProfile;
|
|
29
|
+
}
|
|
30
|
+
});
|
|
31
|
+
Object.defineProperty(exports, "getSettings", {
|
|
32
|
+
enumerable: true,
|
|
33
|
+
get: function () {
|
|
34
|
+
return _settingsActions.getSettings;
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
Object.defineProperty(exports, "getWalletAddress", {
|
|
38
|
+
enumerable: true,
|
|
39
|
+
get: function () {
|
|
40
|
+
return _walletActions.getWalletAddress;
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
Object.defineProperty(exports, "getWalletBalance", {
|
|
44
|
+
enumerable: true,
|
|
45
|
+
get: function () {
|
|
46
|
+
return _walletActions.getWalletBalance;
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
Object.defineProperty(exports, "getWalletUtxos", {
|
|
50
|
+
enumerable: true,
|
|
51
|
+
get: function () {
|
|
52
|
+
return _walletActions.getWalletUtxos;
|
|
53
|
+
}
|
|
54
|
+
});
|
|
55
|
+
Object.defineProperty(exports, "listProfiles", {
|
|
56
|
+
enumerable: true,
|
|
57
|
+
get: function () {
|
|
58
|
+
return _profileActions.listProfiles;
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
Object.defineProperty(exports, "setProfile", {
|
|
62
|
+
enumerable: true,
|
|
63
|
+
get: function () {
|
|
64
|
+
return _profileActions.setProfile;
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
Object.defineProperty(exports, "signAndSubmit", {
|
|
68
|
+
enumerable: true,
|
|
69
|
+
get: function () {
|
|
70
|
+
return _transactionActions.signAndSubmit;
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
Object.defineProperty(exports, "signTransaction", {
|
|
74
|
+
enumerable: true,
|
|
75
|
+
get: function () {
|
|
76
|
+
return _transactionActions.signTransaction;
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
Object.defineProperty(exports, "submitTransaction", {
|
|
80
|
+
enumerable: true,
|
|
81
|
+
get: function () {
|
|
82
|
+
return _transactionActions.submitTransaction;
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
Object.defineProperty(exports, "updateSettings", {
|
|
86
|
+
enumerable: true,
|
|
87
|
+
get: function () {
|
|
88
|
+
return _settingsActions.updateSettings;
|
|
89
|
+
}
|
|
90
|
+
});
|
|
91
|
+
var _profileActions = require("./profile-actions.js");
|
|
92
|
+
var _settingsActions = require("./settings-actions.js");
|
|
93
|
+
var _walletActions = require("./wallet-actions.js");
|
|
94
|
+
var _transactionActions = require("./transaction-actions.js");
|
|
95
|
+
/**
|
|
96
|
+
* Barrel export for built-in Sprinkle actions.
|
|
97
|
+
*
|
|
98
|
+
* Provides a `getBuiltinActions()` factory that returns all 14 built-in actions
|
|
99
|
+
* ready for registration on an ActionRegistry.
|
|
100
|
+
*/
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Returns an array of all 14 built-in Sprinkle actions.
|
|
104
|
+
* Register them on your ActionRegistry or pass them to `Sprinkle.run()`.
|
|
105
|
+
*
|
|
106
|
+
* @example
|
|
107
|
+
* ```ts
|
|
108
|
+
* const sprinkle = new Sprinkle(MySchema, storagePath);
|
|
109
|
+
* for (const action of getBuiltinActions()) {
|
|
110
|
+
* sprinkle.registerAction(action);
|
|
111
|
+
* }
|
|
112
|
+
* ```
|
|
113
|
+
*/
|
|
114
|
+
function getBuiltinActions() {
|
|
115
|
+
return [_profileActions.listProfiles, _profileActions.getProfile, _profileActions.setProfile, _profileActions.createProfile, _profileActions.deleteProfile, _settingsActions.getSettings, _settingsActions.updateSettings, _walletActions.getWalletAddress, _walletActions.getWalletBalance, _walletActions.getWalletUtxos, _transactionActions.signTransaction, _transactionActions.submitTransaction, _transactionActions.signAndSubmit, _transactionActions.decodeTransaction];
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["_profileActions","require","_settingsActions","_walletActions","_transactionActions","getBuiltinActions","listProfiles","getProfile","setProfile","createProfile","deleteProfile","getSettings","updateSettings","getWalletAddress","getWalletBalance","getWalletUtxos","signTransaction","submitTransaction","signAndSubmit","decodeTransaction"],"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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAUA,IAAAA,eAAA,GAAAC,OAAA;AAQA,IAAAC,gBAAA,GAAAD,OAAA;AAEA,IAAAE,cAAA,GAAAF,OAAA;AAMA,IAAAG,mBAAA,GAAAH,OAAA;AA1BA;AACA;AACA;AACA;AACA;AACA;;AAmDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASI,iBAAiBA,CAAA,EAAsC;EACrE,OAAO,CACLC,4BAAY,EACZC,0BAAU,EACVC,0BAAU,EACVC,6BAAa,EACbC,6BAAa,EACbC,4BAAW,EACXC,+BAAc,EACdC,+BAAgB,EAChBC,+BAAgB,EAChBC,6BAAc,EACdC,mCAAe,EACfC,qCAAiB,EACjBC,iCAAa,EACbC,qCAAiB,CAClB;AACH","ignoreList":[]}
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.setProfile = exports.listProfiles = exports.getProfile = exports.deleteProfile = exports.createProfile = void 0;
|
|
7
|
+
var _typebox = require("@sinclair/typebox");
|
|
8
|
+
var _types = require("../types.js");
|
|
9
|
+
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); } /**
|
|
10
|
+
* Built-in profile management actions for the Sprinkle action system.
|
|
11
|
+
* These actions expose profile CRUD operations as non-interactive actions
|
|
12
|
+
* available in CLI and MCP modes.
|
|
13
|
+
*
|
|
14
|
+
* All actions use category "sprinkles".
|
|
15
|
+
*/
|
|
16
|
+
/** Shape of a profile entry as returned by profile actions */
|
|
17
|
+
const ProfileEntrySchema = _typebox.Type.Object({
|
|
18
|
+
id: _typebox.Type.String(),
|
|
19
|
+
name: _typebox.Type.String(),
|
|
20
|
+
description: _typebox.Type.Optional(_typebox.Type.String()),
|
|
21
|
+
createdAt: _typebox.Type.String(),
|
|
22
|
+
updatedAt: _typebox.Type.String()
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* `list-profiles` -- Returns all profiles and the active profile ID.
|
|
27
|
+
*/
|
|
28
|
+
const listProfiles = exports.listProfiles = {
|
|
29
|
+
name: "list-profiles",
|
|
30
|
+
description: "List all profiles and indicate which one is currently active.",
|
|
31
|
+
category: "sprinkles",
|
|
32
|
+
inputSchema: _typebox.Type.Object({}),
|
|
33
|
+
outputSchema: _typebox.Type.Object({
|
|
34
|
+
profiles: _typebox.Type.Array(ProfileEntrySchema),
|
|
35
|
+
activeProfileId: _typebox.Type.Optional(_typebox.Type.String())
|
|
36
|
+
}),
|
|
37
|
+
execute: async (_input, context) => {
|
|
38
|
+
const entries = context.sprinkle.scanProfiles();
|
|
39
|
+
const profiles = entries.map(e => ({
|
|
40
|
+
id: e.id,
|
|
41
|
+
name: e.meta.name,
|
|
42
|
+
description: e.meta.description,
|
|
43
|
+
createdAt: e.meta.createdAt,
|
|
44
|
+
updatedAt: e.meta.updatedAt
|
|
45
|
+
}));
|
|
46
|
+
return {
|
|
47
|
+
profiles,
|
|
48
|
+
activeProfileId: context.sprinkle.currentProfile?.id
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* `get-profile` -- Returns metadata and settings for a specific profile.
|
|
55
|
+
* Settings are masked by default; pass `includeSensitive: true` to get raw values.
|
|
56
|
+
*/
|
|
57
|
+
const getProfile = exports.getProfile = {
|
|
58
|
+
name: "get-profile",
|
|
59
|
+
description: "Get metadata and settings for a profile. Sensitive fields are masked by default.",
|
|
60
|
+
category: "sprinkles",
|
|
61
|
+
inputSchema: _typebox.Type.Object({
|
|
62
|
+
id: _typebox.Type.String(),
|
|
63
|
+
includeSensitive: _typebox.Type.Optional(_typebox.Type.Boolean({
|
|
64
|
+
default: false
|
|
65
|
+
}))
|
|
66
|
+
}),
|
|
67
|
+
outputSchema: _typebox.Type.Object({
|
|
68
|
+
id: _typebox.Type.String(),
|
|
69
|
+
name: _typebox.Type.String(),
|
|
70
|
+
description: _typebox.Type.Optional(_typebox.Type.String()),
|
|
71
|
+
createdAt: _typebox.Type.String(),
|
|
72
|
+
updatedAt: _typebox.Type.String(),
|
|
73
|
+
settings: _typebox.Type.Any()
|
|
74
|
+
}),
|
|
75
|
+
execute: async (input, context) => {
|
|
76
|
+
// Validate ID to prevent path traversal (defense in depth)
|
|
77
|
+
if (input.id.includes("/") || input.id.includes("\\") || input.id.includes("..")) {
|
|
78
|
+
throw new _types.ActionError(`Invalid profile ID "${input.id}".`, "INVALID_PROFILE_ID", {
|
|
79
|
+
id: input.id
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
const profile = context.sprinkle.getProfileById(input.id);
|
|
83
|
+
if (!profile) {
|
|
84
|
+
throw new _types.ActionError(`Profile "${input.id}" not found.`, "PROFILE_NOT_FOUND", {
|
|
85
|
+
id: input.id
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
// Read the profile file to get settings
|
|
90
|
+
const fs = await Promise.resolve().then(() => _interopRequireWildcard(require("fs")));
|
|
91
|
+
const path = await Promise.resolve().then(() => _interopRequireWildcard(require("path")));
|
|
92
|
+
const storagePath = context.sprinkle.storagePath;
|
|
93
|
+
const profilePath = path.join(storagePath, "profiles", `${input.id}.json`);
|
|
94
|
+
let settings = {};
|
|
95
|
+
try {
|
|
96
|
+
const content = fs.readFileSync(profilePath, "utf-8");
|
|
97
|
+
const parsed = JSON.parse(content);
|
|
98
|
+
settings = parsed.settings ?? {};
|
|
99
|
+
} catch (err) {
|
|
100
|
+
// Throw an error so the caller knows the profile file couldn't be read
|
|
101
|
+
throw new _types.ActionError(`Failed to read profile "${input.id}": ${err instanceof Error ? err.message : String(err)}`, "PROFILE_READ_ERROR", {
|
|
102
|
+
id: input.id,
|
|
103
|
+
error: err instanceof Error ? err.message : String(err)
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Mask sensitive fields unless includeSensitive is true
|
|
108
|
+
if (!input.includeSensitive) {
|
|
109
|
+
const {
|
|
110
|
+
maskSensitiveFields
|
|
111
|
+
} = await Promise.resolve().then(() => _interopRequireWildcard(require("../../encryption.js")));
|
|
112
|
+
settings = maskSensitiveFields(settings, context.sprinkle.type);
|
|
113
|
+
}
|
|
114
|
+
return {
|
|
115
|
+
id: profile.id,
|
|
116
|
+
name: profile.meta.name,
|
|
117
|
+
description: profile.meta.description,
|
|
118
|
+
createdAt: profile.meta.createdAt,
|
|
119
|
+
updatedAt: profile.meta.updatedAt,
|
|
120
|
+
settings
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* `set-profile` -- Switch the active profile.
|
|
127
|
+
*/
|
|
128
|
+
const setProfile = exports.setProfile = {
|
|
129
|
+
name: "set-profile",
|
|
130
|
+
description: "Switch the active profile.",
|
|
131
|
+
category: "sprinkles",
|
|
132
|
+
inputSchema: _typebox.Type.Object({
|
|
133
|
+
id: _typebox.Type.String()
|
|
134
|
+
}),
|
|
135
|
+
outputSchema: _typebox.Type.Object({
|
|
136
|
+
id: _typebox.Type.String(),
|
|
137
|
+
name: _typebox.Type.String()
|
|
138
|
+
}),
|
|
139
|
+
execute: async (input, context) => {
|
|
140
|
+
const profile = context.sprinkle.getProfileById(input.id);
|
|
141
|
+
if (!profile) {
|
|
142
|
+
throw new _types.ActionError(`Profile "${input.id}" not found.`, "PROFILE_NOT_FOUND", {
|
|
143
|
+
id: input.id
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
await context.sprinkle.loadProfile(input.id);
|
|
147
|
+
return {
|
|
148
|
+
id: input.id,
|
|
149
|
+
name: profile.meta.name
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
};
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* `create-profile` -- Create a new profile without prompts.
|
|
156
|
+
*/
|
|
157
|
+
const createProfile = exports.createProfile = {
|
|
158
|
+
name: "create-profile",
|
|
159
|
+
description: "Create a new profile.",
|
|
160
|
+
category: "sprinkles",
|
|
161
|
+
inputSchema: _typebox.Type.Object({
|
|
162
|
+
name: _typebox.Type.String(),
|
|
163
|
+
description: _typebox.Type.Optional(_typebox.Type.String()),
|
|
164
|
+
settings: _typebox.Type.Optional(_typebox.Type.Any())
|
|
165
|
+
}),
|
|
166
|
+
outputSchema: _typebox.Type.Object({
|
|
167
|
+
id: _typebox.Type.String(),
|
|
168
|
+
name: _typebox.Type.String()
|
|
169
|
+
}),
|
|
170
|
+
execute: async (input, context) => {
|
|
171
|
+
const entry = await context.sprinkle.createProfileNonInteractive(input.name, input.description, input.settings);
|
|
172
|
+
return {
|
|
173
|
+
id: entry.id,
|
|
174
|
+
name: entry.meta.name
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
/**
|
|
180
|
+
* `delete-profile` -- Delete a profile by ID.
|
|
181
|
+
* Cannot delete the only profile or the currently active profile.
|
|
182
|
+
*/
|
|
183
|
+
const deleteProfile = exports.deleteProfile = {
|
|
184
|
+
name: "delete-profile",
|
|
185
|
+
description: "Delete a profile. Cannot delete the only profile or the active profile.",
|
|
186
|
+
category: "sprinkles",
|
|
187
|
+
inputSchema: _typebox.Type.Object({
|
|
188
|
+
id: _typebox.Type.String()
|
|
189
|
+
}),
|
|
190
|
+
outputSchema: _typebox.Type.Object({
|
|
191
|
+
deleted: _typebox.Type.Boolean(),
|
|
192
|
+
id: _typebox.Type.String()
|
|
193
|
+
}),
|
|
194
|
+
execute: async (input, context) => {
|
|
195
|
+
context.sprinkle.deleteProfileById(input.id);
|
|
196
|
+
return {
|
|
197
|
+
deleted: true,
|
|
198
|
+
id: input.id
|
|
199
|
+
};
|
|
200
|
+
}
|
|
201
|
+
};
|
|
202
|
+
//# sourceMappingURL=profile-actions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"profile-actions.js","names":["_typebox","require","_types","_interopRequireWildcard","e","t","WeakMap","r","n","__esModule","o","i","f","__proto__","default","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","ProfileEntrySchema","Type","id","String","name","description","Optional","createdAt","updatedAt","listProfiles","exports","category","inputSchema","outputSchema","profiles","Array","activeProfileId","execute","_input","context","entries","sprinkle","scanProfiles","map","meta","currentProfile","getProfile","includeSensitive","Boolean","settings","Any","input","includes","ActionError","profile","getProfileById","fs","Promise","resolve","then","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,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.updateSettings = exports.getSettings = void 0;
|
|
7
|
+
var _typebox = require("@sinclair/typebox");
|
|
8
|
+
var _value = require("@sinclair/typebox/value");
|
|
9
|
+
var _types = require("../types.js");
|
|
10
|
+
/**
|
|
11
|
+
* Built-in settings actions for the Sprinkle action system.
|
|
12
|
+
* These actions expose settings read and update operations as non-interactive
|
|
13
|
+
* actions available in CLI and MCP modes.
|
|
14
|
+
*
|
|
15
|
+
* All actions use category "sprinkles".
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* `get-settings` -- Returns the current profile settings.
|
|
20
|
+
* Sensitive fields are masked by default; pass `includeSensitive: true` for raw values.
|
|
21
|
+
*/
|
|
22
|
+
const getSettings = exports.getSettings = {
|
|
23
|
+
name: "get-settings",
|
|
24
|
+
description: "Get the current profile settings. Sensitive fields are masked by default.",
|
|
25
|
+
category: "sprinkles",
|
|
26
|
+
inputSchema: _typebox.Type.Object({
|
|
27
|
+
includeSensitive: _typebox.Type.Optional(_typebox.Type.Boolean({
|
|
28
|
+
default: false
|
|
29
|
+
}))
|
|
30
|
+
}),
|
|
31
|
+
outputSchema: _typebox.Type.Object({
|
|
32
|
+
settings: _typebox.Type.Any(),
|
|
33
|
+
profileId: _typebox.Type.String(),
|
|
34
|
+
profileName: _typebox.Type.String()
|
|
35
|
+
}),
|
|
36
|
+
execute: async (input, context) => {
|
|
37
|
+
const settings = input.includeSensitive ? context.sprinkle.settings : context.sprinkle.getDisplaySettings();
|
|
38
|
+
return {
|
|
39
|
+
settings,
|
|
40
|
+
profileId: context.sprinkle.profileId,
|
|
41
|
+
profileName: context.sprinkle.profileMeta.name
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* `update-settings` -- Shallow-merges settings onto the current profile and persists.
|
|
48
|
+
* Validates the merged result against the Sprinkle schema before saving.
|
|
49
|
+
* Returns masked settings.
|
|
50
|
+
*/
|
|
51
|
+
const updateSettings = exports.updateSettings = {
|
|
52
|
+
name: "update-settings",
|
|
53
|
+
description: "Merge partial settings onto the current profile and save. Returns masked settings.",
|
|
54
|
+
category: "sprinkles",
|
|
55
|
+
inputSchema: _typebox.Type.Object({
|
|
56
|
+
settings: _typebox.Type.Record(_typebox.Type.String(), _typebox.Type.Any())
|
|
57
|
+
}),
|
|
58
|
+
outputSchema: _typebox.Type.Object({
|
|
59
|
+
settings: _typebox.Type.Any(),
|
|
60
|
+
profileId: _typebox.Type.String()
|
|
61
|
+
}),
|
|
62
|
+
execute: async (input, context) => {
|
|
63
|
+
// Shallow merge the incoming settings onto the current settings
|
|
64
|
+
const merged = {
|
|
65
|
+
...context.sprinkle.settings,
|
|
66
|
+
...input.settings
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
// Validate the merged result against the Sprinkle schema
|
|
70
|
+
if (!_value.Value.Check(context.sprinkle.type, merged)) {
|
|
71
|
+
const errors = [..._value.Value.Errors(context.sprinkle.type, merged)];
|
|
72
|
+
const message = errors.map(e => `${e.path}: ${e.message}`).join("; ");
|
|
73
|
+
throw new _types.ActionError(`Settings validation failed: ${message}`, "VALIDATION_ERROR", {
|
|
74
|
+
errors
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Apply and persist
|
|
79
|
+
context.sprinkle.settings = merged;
|
|
80
|
+
context.sprinkle.saveSettings();
|
|
81
|
+
return {
|
|
82
|
+
settings: context.sprinkle.getDisplaySettings(),
|
|
83
|
+
profileId: context.sprinkle.profileId
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
//# sourceMappingURL=settings-actions.js.map
|