@aibtc/mcp-server 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +340 -0
- package/dist/api.d.ts +9 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +79 -0
- package/dist/api.js.map +1 -0
- package/dist/config/contracts.d.ts +169 -0
- package/dist/config/contracts.d.ts.map +1 -0
- package/dist/config/contracts.js +250 -0
- package/dist/config/contracts.js.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +3 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/networks.d.ts +11 -0
- package/dist/config/networks.d.ts.map +1 -0
- package/dist/config/networks.js +21 -0
- package/dist/config/networks.js.map +1 -0
- package/dist/endpoints/index.d.ts +2 -0
- package/dist/endpoints/index.d.ts.map +1 -0
- package/dist/endpoints/index.js +2 -0
- package/dist/endpoints/index.js.map +1 -0
- package/dist/endpoints/registry.d.ts +38 -0
- package/dist/endpoints/registry.d.ts.map +1 -0
- package/dist/endpoints/registry.js +935 -0
- package/dist/endpoints/registry.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +79 -0
- package/dist/index.js.map +1 -0
- package/dist/services/bitflow.service.d.ts +159 -0
- package/dist/services/bitflow.service.d.ts.map +1 -0
- package/dist/services/bitflow.service.js +325 -0
- package/dist/services/bitflow.service.js.map +1 -0
- package/dist/services/bns.service.d.ts +87 -0
- package/dist/services/bns.service.d.ts.map +1 -0
- package/dist/services/bns.service.js +312 -0
- package/dist/services/bns.service.js.map +1 -0
- package/dist/services/defi.service.d.ts +146 -0
- package/dist/services/defi.service.d.ts.map +1 -0
- package/dist/services/defi.service.js +461 -0
- package/dist/services/defi.service.js.map +1 -0
- package/dist/services/hiro-api.d.ts +438 -0
- package/dist/services/hiro-api.d.ts.map +1 -0
- package/dist/services/hiro-api.js +376 -0
- package/dist/services/hiro-api.js.map +1 -0
- package/dist/services/nft.service.d.ts +70 -0
- package/dist/services/nft.service.d.ts.map +1 -0
- package/dist/services/nft.service.js +148 -0
- package/dist/services/nft.service.js.map +1 -0
- package/dist/services/sbtc.service.d.ts +44 -0
- package/dist/services/sbtc.service.d.ts.map +1 -0
- package/dist/services/sbtc.service.js +100 -0
- package/dist/services/sbtc.service.js.map +1 -0
- package/dist/services/scaffold.service.d.ts +41 -0
- package/dist/services/scaffold.service.d.ts.map +1 -0
- package/dist/services/scaffold.service.js +1055 -0
- package/dist/services/scaffold.service.js.map +1 -0
- package/dist/services/stacking.service.d.ts +58 -0
- package/dist/services/stacking.service.d.ts.map +1 -0
- package/dist/services/stacking.service.js +153 -0
- package/dist/services/stacking.service.js.map +1 -0
- package/dist/services/tokens.service.d.ts +62 -0
- package/dist/services/tokens.service.d.ts.map +1 -0
- package/dist/services/tokens.service.js +119 -0
- package/dist/services/tokens.service.js.map +1 -0
- package/dist/services/wallet-manager.d.ts +107 -0
- package/dist/services/wallet-manager.d.ts.map +1 -0
- package/dist/services/wallet-manager.js +389 -0
- package/dist/services/wallet-manager.js.map +1 -0
- package/dist/services/x402.service.d.ts +26 -0
- package/dist/services/x402.service.d.ts.map +1 -0
- package/dist/services/x402.service.js +125 -0
- package/dist/services/x402.service.js.map +1 -0
- package/dist/tools/bitflow.tools.d.ts +3 -0
- package/dist/tools/bitflow.tools.d.ts.map +1 -0
- package/dist/tools/bitflow.tools.js +501 -0
- package/dist/tools/bitflow.tools.js.map +1 -0
- package/dist/tools/bns.tools.d.ts +3 -0
- package/dist/tools/bns.tools.d.ts.map +1 -0
- package/dist/tools/bns.tools.js +164 -0
- package/dist/tools/bns.tools.js.map +1 -0
- package/dist/tools/contract.tools.d.ts +3 -0
- package/dist/tools/contract.tools.d.ts.map +1 -0
- package/dist/tools/contract.tools.js +126 -0
- package/dist/tools/contract.tools.js.map +1 -0
- package/dist/tools/defi.tools.d.ts +3 -0
- package/dist/tools/defi.tools.d.ts.map +1 -0
- package/dist/tools/defi.tools.js +425 -0
- package/dist/tools/defi.tools.js.map +1 -0
- package/dist/tools/endpoint.tools.d.ts +3 -0
- package/dist/tools/endpoint.tools.d.ts.map +1 -0
- package/dist/tools/endpoint.tools.js +157 -0
- package/dist/tools/endpoint.tools.js.map +1 -0
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +52 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/nft.tools.d.ts +3 -0
- package/dist/tools/nft.tools.d.ts.map +1 -0
- package/dist/tools/nft.tools.js +154 -0
- package/dist/tools/nft.tools.js.map +1 -0
- package/dist/tools/openrouter.tools.d.ts +3 -0
- package/dist/tools/openrouter.tools.d.ts.map +1 -0
- package/dist/tools/openrouter.tools.js +664 -0
- package/dist/tools/openrouter.tools.js.map +1 -0
- package/dist/tools/query.tools.d.ts +3 -0
- package/dist/tools/query.tools.d.ts.map +1 -0
- package/dist/tools/query.tools.js +209 -0
- package/dist/tools/query.tools.js.map +1 -0
- package/dist/tools/sbtc.tools.d.ts +3 -0
- package/dist/tools/sbtc.tools.d.ts.map +1 -0
- package/dist/tools/sbtc.tools.js +103 -0
- package/dist/tools/sbtc.tools.js.map +1 -0
- package/dist/tools/scaffold.tools.d.ts +3 -0
- package/dist/tools/scaffold.tools.d.ts.map +1 -0
- package/dist/tools/scaffold.tools.js +216 -0
- package/dist/tools/scaffold.tools.js.map +1 -0
- package/dist/tools/stacking.tools.d.ts +3 -0
- package/dist/tools/stacking.tools.d.ts.map +1 -0
- package/dist/tools/stacking.tools.js +112 -0
- package/dist/tools/stacking.tools.js.map +1 -0
- package/dist/tools/tokens.tools.d.ts +3 -0
- package/dist/tools/tokens.tools.d.ts.map +1 -0
- package/dist/tools/tokens.tools.js +154 -0
- package/dist/tools/tokens.tools.js.map +1 -0
- package/dist/tools/transfer.tools.d.ts +3 -0
- package/dist/tools/transfer.tools.d.ts.map +1 -0
- package/dist/tools/transfer.tools.js +62 -0
- package/dist/tools/transfer.tools.js.map +1 -0
- package/dist/tools/wallet-management.tools.d.ts +6 -0
- package/dist/tools/wallet-management.tools.d.ts.map +1 -0
- package/dist/tools/wallet-management.tools.js +390 -0
- package/dist/tools/wallet-management.tools.js.map +1 -0
- package/dist/tools/wallet.tools.d.ts +3 -0
- package/dist/tools/wallet.tools.d.ts.map +1 -0
- package/dist/tools/wallet.tools.js +105 -0
- package/dist/tools/wallet.tools.js.map +1 -0
- package/dist/transactions/builder.d.ts +56 -0
- package/dist/transactions/builder.d.ts.map +1 -0
- package/dist/transactions/builder.js +134 -0
- package/dist/transactions/builder.js.map +1 -0
- package/dist/transactions/clarity-values.d.ts +67 -0
- package/dist/transactions/clarity-values.d.ts.map +1 -0
- package/dist/transactions/clarity-values.js +169 -0
- package/dist/transactions/clarity-values.js.map +1 -0
- package/dist/transactions/post-conditions.d.ts +27 -0
- package/dist/transactions/post-conditions.d.ts.map +1 -0
- package/dist/transactions/post-conditions.js +101 -0
- package/dist/transactions/post-conditions.js.map +1 -0
- package/dist/utils/encryption.d.ts +33 -0
- package/dist/utils/encryption.d.ts.map +1 -0
- package/dist/utils/encryption.js +110 -0
- package/dist/utils/encryption.js.map +1 -0
- package/dist/utils/errors.d.ts +84 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +132 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/formatting.d.ts +51 -0
- package/dist/utils/formatting.d.ts.map +1 -0
- package/dist/utils/formatting.js +114 -0
- package/dist/utils/formatting.js.map +1 -0
- package/dist/utils/index.d.ts +6 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +6 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/storage.d.ts +90 -0
- package/dist/utils/storage.d.ts.map +1 -0
- package/dist/utils/storage.js +196 -0
- package/dist/utils/storage.js.map +1 -0
- package/dist/utils/validation.d.ts +67 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +74 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/wallet.d.ts +86 -0
- package/dist/wallet.d.ts.map +1 -0
- package/dist/wallet.js +279 -0
- package/dist/wallet.js.map +1 -0
- package/package.json +58 -0
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { getWalletAddress, NETWORK } from "../services/x402.service.js";
|
|
3
|
+
import { getHiroApi } from "../services/hiro-api.js";
|
|
4
|
+
import { getExplorerAddressUrl } from "../config/networks.js";
|
|
5
|
+
import { createJsonResponse, createErrorResponse } from "../utils/index.js";
|
|
6
|
+
export function registerQueryTools(server) {
|
|
7
|
+
// Get account info
|
|
8
|
+
server.registerTool("get_account_info", {
|
|
9
|
+
description: "Get detailed account information including nonce and balance.",
|
|
10
|
+
inputSchema: {
|
|
11
|
+
address: z
|
|
12
|
+
.string()
|
|
13
|
+
.optional()
|
|
14
|
+
.describe("Stacks address. Uses configured wallet if not provided."),
|
|
15
|
+
},
|
|
16
|
+
}, async ({ address }) => {
|
|
17
|
+
try {
|
|
18
|
+
const hiro = getHiroApi(NETWORK);
|
|
19
|
+
const walletAddress = address || (await getWalletAddress());
|
|
20
|
+
const info = await hiro.getAccountInfo(walletAddress);
|
|
21
|
+
return createJsonResponse({
|
|
22
|
+
address: walletAddress,
|
|
23
|
+
network: NETWORK,
|
|
24
|
+
nonce: info.nonce,
|
|
25
|
+
balance: info.balance,
|
|
26
|
+
explorerUrl: getExplorerAddressUrl(walletAddress, NETWORK),
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
catch (error) {
|
|
30
|
+
return createErrorResponse(error);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
// Get account transactions
|
|
34
|
+
server.registerTool("get_account_transactions", {
|
|
35
|
+
description: "Get transaction history for an account.",
|
|
36
|
+
inputSchema: {
|
|
37
|
+
address: z
|
|
38
|
+
.string()
|
|
39
|
+
.optional()
|
|
40
|
+
.describe("Stacks address. Uses configured wallet if not provided."),
|
|
41
|
+
limit: z.number().optional().default(20).describe("Maximum number of results"),
|
|
42
|
+
offset: z.number().optional().default(0).describe("Offset for pagination"),
|
|
43
|
+
},
|
|
44
|
+
}, async ({ address, limit, offset }) => {
|
|
45
|
+
try {
|
|
46
|
+
const hiro = getHiroApi(NETWORK);
|
|
47
|
+
const walletAddress = address || (await getWalletAddress());
|
|
48
|
+
const result = await hiro.getAccountTransactions(walletAddress, { limit, offset });
|
|
49
|
+
return createJsonResponse({
|
|
50
|
+
address: walletAddress,
|
|
51
|
+
network: NETWORK,
|
|
52
|
+
total: result.total,
|
|
53
|
+
limit: result.limit,
|
|
54
|
+
offset: result.offset,
|
|
55
|
+
transactions: result.results.map((tx) => ({
|
|
56
|
+
txId: tx.tx_id,
|
|
57
|
+
type: tx.tx_type,
|
|
58
|
+
status: tx.tx_status,
|
|
59
|
+
sender: tx.sender_address,
|
|
60
|
+
blockHeight: tx.block_height,
|
|
61
|
+
fee: tx.fee_rate,
|
|
62
|
+
})),
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
catch (error) {
|
|
66
|
+
return createErrorResponse(error);
|
|
67
|
+
}
|
|
68
|
+
});
|
|
69
|
+
// Get block info
|
|
70
|
+
server.registerTool("get_block_info", {
|
|
71
|
+
description: "Get information about a specific block.",
|
|
72
|
+
inputSchema: {
|
|
73
|
+
heightOrHash: z.string().describe("Block height (number) or block hash"),
|
|
74
|
+
},
|
|
75
|
+
}, async ({ heightOrHash }) => {
|
|
76
|
+
try {
|
|
77
|
+
const hiro = getHiroApi(NETWORK);
|
|
78
|
+
const isHeight = /^\d+$/.test(heightOrHash);
|
|
79
|
+
const block = isHeight
|
|
80
|
+
? await hiro.getBlockByHeight(parseInt(heightOrHash, 10))
|
|
81
|
+
: await hiro.getBlockByHash(heightOrHash);
|
|
82
|
+
return createJsonResponse({
|
|
83
|
+
network: NETWORK,
|
|
84
|
+
hash: block.hash,
|
|
85
|
+
height: block.height,
|
|
86
|
+
canonical: block.canonical,
|
|
87
|
+
burnBlockHeight: block.burn_block_height,
|
|
88
|
+
burnBlockTime: block.burn_block_time,
|
|
89
|
+
txCount: block.txs.length,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
return createErrorResponse(error);
|
|
94
|
+
}
|
|
95
|
+
});
|
|
96
|
+
// Get mempool info
|
|
97
|
+
server.registerTool("get_mempool_info", {
|
|
98
|
+
description: "Get pending transactions in the mempool.",
|
|
99
|
+
inputSchema: {
|
|
100
|
+
senderAddress: z.string().optional().describe("Filter by sender address"),
|
|
101
|
+
limit: z.number().optional().default(20).describe("Maximum number of results"),
|
|
102
|
+
offset: z.number().optional().default(0).describe("Offset for pagination"),
|
|
103
|
+
},
|
|
104
|
+
}, async ({ senderAddress, limit, offset }) => {
|
|
105
|
+
try {
|
|
106
|
+
const hiro = getHiroApi(NETWORK);
|
|
107
|
+
const result = await hiro.getMempoolTransactions({
|
|
108
|
+
sender_address: senderAddress,
|
|
109
|
+
limit,
|
|
110
|
+
offset,
|
|
111
|
+
});
|
|
112
|
+
return createJsonResponse({
|
|
113
|
+
network: NETWORK,
|
|
114
|
+
total: result.total,
|
|
115
|
+
transactions: result.results.map((tx) => ({
|
|
116
|
+
txId: tx.tx_id,
|
|
117
|
+
type: tx.tx_type,
|
|
118
|
+
sender: tx.sender_address,
|
|
119
|
+
fee: tx.fee_rate,
|
|
120
|
+
nonce: tx.nonce,
|
|
121
|
+
receiptTime: tx.receipt_time_iso,
|
|
122
|
+
})),
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
return createErrorResponse(error);
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
// Get contract info
|
|
130
|
+
server.registerTool("get_contract_info", {
|
|
131
|
+
description: "Get information about a smart contract including its ABI.",
|
|
132
|
+
inputSchema: {
|
|
133
|
+
contractId: z.string().describe("Contract ID in format: address.contract-name"),
|
|
134
|
+
},
|
|
135
|
+
}, async ({ contractId }) => {
|
|
136
|
+
try {
|
|
137
|
+
const hiro = getHiroApi(NETWORK);
|
|
138
|
+
const info = await hiro.getContractInfo(contractId);
|
|
139
|
+
const iface = await hiro.getContractInterface(contractId);
|
|
140
|
+
return createJsonResponse({
|
|
141
|
+
contractId,
|
|
142
|
+
network: NETWORK,
|
|
143
|
+
txId: info.tx_id,
|
|
144
|
+
blockHeight: info.block_height,
|
|
145
|
+
functions: iface.functions.map((f) => ({
|
|
146
|
+
name: f.name,
|
|
147
|
+
access: f.access,
|
|
148
|
+
args: f.args,
|
|
149
|
+
outputs: f.outputs,
|
|
150
|
+
})),
|
|
151
|
+
variables: iface.variables,
|
|
152
|
+
maps: iface.maps,
|
|
153
|
+
fungibleTokens: iface.fungible_tokens,
|
|
154
|
+
nonFungibleTokens: iface.non_fungible_tokens,
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
catch (error) {
|
|
158
|
+
return createErrorResponse(error);
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
// Get contract events
|
|
162
|
+
server.registerTool("get_contract_events", {
|
|
163
|
+
description: "Get events emitted by a smart contract.",
|
|
164
|
+
inputSchema: {
|
|
165
|
+
contractId: z.string().describe("Contract ID in format: address.contract-name"),
|
|
166
|
+
limit: z.number().optional().default(20).describe("Maximum number of results"),
|
|
167
|
+
offset: z.number().optional().default(0).describe("Offset for pagination"),
|
|
168
|
+
},
|
|
169
|
+
}, async ({ contractId, limit, offset }) => {
|
|
170
|
+
try {
|
|
171
|
+
const hiro = getHiroApi(NETWORK);
|
|
172
|
+
const result = await hiro.getContractEvents(contractId, { limit, offset });
|
|
173
|
+
return createJsonResponse({
|
|
174
|
+
contractId,
|
|
175
|
+
network: NETWORK,
|
|
176
|
+
events: result.results,
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
return createErrorResponse(error);
|
|
181
|
+
}
|
|
182
|
+
});
|
|
183
|
+
// Get network status
|
|
184
|
+
server.registerTool("get_network_status", {
|
|
185
|
+
description: "Get the current status of the Stacks network.",
|
|
186
|
+
}, async () => {
|
|
187
|
+
try {
|
|
188
|
+
const hiro = getHiroApi(NETWORK);
|
|
189
|
+
const status = await hiro.getNetworkStatus();
|
|
190
|
+
const coreInfo = await hiro.getCoreApiInfo();
|
|
191
|
+
return createJsonResponse({
|
|
192
|
+
network: NETWORK,
|
|
193
|
+
serverVersion: status.server_version,
|
|
194
|
+
status: status.status,
|
|
195
|
+
chainTip: status.chain_tip,
|
|
196
|
+
coreInfo: {
|
|
197
|
+
peerVersion: coreInfo.peer_version,
|
|
198
|
+
stacksTipHeight: coreInfo.stacks_tip_height,
|
|
199
|
+
burnBlockHeight: coreInfo.burn_block_height,
|
|
200
|
+
networkId: coreInfo.network_id,
|
|
201
|
+
},
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
catch (error) {
|
|
205
|
+
return createErrorResponse(error);
|
|
206
|
+
}
|
|
207
|
+
});
|
|
208
|
+
}
|
|
209
|
+
//# sourceMappingURL=query.tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.tools.js","sourceRoot":"","sources":["../../src/tools/query.tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sbtc.tools.d.ts","sourceRoot":"","sources":["../../src/tools/sbtc.tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOpE,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAqHzD"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { getAccount, getWalletAddress, NETWORK } from "../services/x402.service.js";
|
|
3
|
+
import { getSbtcService } from "../services/sbtc.service.js";
|
|
4
|
+
import { getExplorerTxUrl } from "../config/networks.js";
|
|
5
|
+
import { createJsonResponse, createErrorResponse } from "../utils/index.js";
|
|
6
|
+
export function registerSbtcTools(server) {
|
|
7
|
+
// Get sBTC balance
|
|
8
|
+
server.registerTool("sbtc_get_balance", {
|
|
9
|
+
description: "Get the sBTC balance for a wallet address.",
|
|
10
|
+
inputSchema: {
|
|
11
|
+
address: z
|
|
12
|
+
.string()
|
|
13
|
+
.optional()
|
|
14
|
+
.describe("Wallet address to check. Uses configured wallet if not provided."),
|
|
15
|
+
},
|
|
16
|
+
}, async ({ address }) => {
|
|
17
|
+
try {
|
|
18
|
+
const sbtcService = getSbtcService(NETWORK);
|
|
19
|
+
const walletAddress = address || (await getWalletAddress());
|
|
20
|
+
const balance = await sbtcService.getBalance(walletAddress);
|
|
21
|
+
return createJsonResponse({
|
|
22
|
+
address: walletAddress,
|
|
23
|
+
network: NETWORK,
|
|
24
|
+
balance: {
|
|
25
|
+
sats: balance.balanceSats,
|
|
26
|
+
btc: balance.balanceBtc + " sBTC",
|
|
27
|
+
},
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
return createErrorResponse(error);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
// Transfer sBTC
|
|
35
|
+
server.registerTool("sbtc_transfer", {
|
|
36
|
+
description: `Transfer sBTC tokens to a recipient address.
|
|
37
|
+
|
|
38
|
+
sBTC uses 8 decimals (same as Bitcoin).
|
|
39
|
+
Example: To send 0.001 sBTC, use amount "100000" (satoshis).`,
|
|
40
|
+
inputSchema: {
|
|
41
|
+
recipient: z.string().describe("The recipient's Stacks address"),
|
|
42
|
+
amount: z.string().describe("Amount in satoshis (0.00000001 sBTC). Example: '100000' for 0.001 sBTC"),
|
|
43
|
+
memo: z.string().optional().describe("Optional memo message"),
|
|
44
|
+
},
|
|
45
|
+
}, async ({ recipient, amount, memo }) => {
|
|
46
|
+
try {
|
|
47
|
+
const sbtcService = getSbtcService(NETWORK);
|
|
48
|
+
const account = await getAccount();
|
|
49
|
+
const result = await sbtcService.transfer(account, recipient, BigInt(amount), memo);
|
|
50
|
+
const btcAmount = (BigInt(amount) / BigInt(100_000_000)).toString();
|
|
51
|
+
return createJsonResponse({
|
|
52
|
+
success: true,
|
|
53
|
+
txid: result.txid,
|
|
54
|
+
from: account.address,
|
|
55
|
+
recipient,
|
|
56
|
+
amount: btcAmount + " sBTC",
|
|
57
|
+
amountSats: amount,
|
|
58
|
+
network: NETWORK,
|
|
59
|
+
explorerUrl: getExplorerTxUrl(result.txid, NETWORK),
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
catch (error) {
|
|
63
|
+
return createErrorResponse(error);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
// Get sBTC deposit info
|
|
67
|
+
server.registerTool("sbtc_get_deposit_info", {
|
|
68
|
+
description: "Get information about how to deposit BTC to receive sBTC.",
|
|
69
|
+
}, async () => {
|
|
70
|
+
try {
|
|
71
|
+
const sbtcService = getSbtcService(NETWORK);
|
|
72
|
+
const depositInfo = await sbtcService.getDepositInfo();
|
|
73
|
+
return createJsonResponse({
|
|
74
|
+
network: NETWORK,
|
|
75
|
+
...depositInfo,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
return createErrorResponse(error);
|
|
80
|
+
}
|
|
81
|
+
});
|
|
82
|
+
// Get sBTC peg info
|
|
83
|
+
server.registerTool("sbtc_get_peg_info", {
|
|
84
|
+
description: "Get sBTC peg information including total supply and peg ratio.",
|
|
85
|
+
}, async () => {
|
|
86
|
+
try {
|
|
87
|
+
const sbtcService = getSbtcService(NETWORK);
|
|
88
|
+
const pegInfo = await sbtcService.getPegInfo();
|
|
89
|
+
return createJsonResponse({
|
|
90
|
+
network: NETWORK,
|
|
91
|
+
totalSupply: {
|
|
92
|
+
sats: pegInfo.totalSupplySats,
|
|
93
|
+
btc: pegInfo.totalSupplyBtc + " sBTC",
|
|
94
|
+
},
|
|
95
|
+
pegRatio: pegInfo.pegRatio,
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
return createErrorResponse(error);
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=sbtc.tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sbtc.tools.js","sourceRoot":"","sources":["../../src/tools/sbtc.tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AACpF,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE5E,MAAM,UAAU,iBAAiB,CAAC,MAAiB;IACjD,mBAAmB;IACnB,MAAM,CAAC,YAAY,CACjB,kBAAkB,EAClB;QACE,WAAW,EAAE,4CAA4C;QACzD,WAAW,EAAE;YACX,OAAO,EAAE,CAAC;iBACP,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,kEAAkE,CAAC;SAChF;KACF,EACD,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE;QACpB,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM,aAAa,GAAG,OAAO,IAAI,CAAC,MAAM,gBAAgB,EAAE,CAAC,CAAC;YAC5D,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;YAE5D,OAAO,kBAAkB,CAAC;gBACxB,OAAO,EAAE,aAAa;gBACtB,OAAO,EAAE,OAAO;gBAChB,OAAO,EAAE;oBACP,IAAI,EAAE,OAAO,CAAC,WAAW;oBACzB,GAAG,EAAE,OAAO,CAAC,UAAU,GAAG,OAAO;iBAClC;aACF,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CACF,CAAC;IAEF,gBAAgB;IAChB,MAAM,CAAC,YAAY,CACjB,eAAe,EACf;QACE,WAAW,EAAE;;;6DAG0C;QACvD,WAAW,EAAE;YACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gCAAgC,CAAC;YAChE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wEAAwE,CAAC;YACrG,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC;SAC9D;KACF,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE;QACpC,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM,OAAO,GAAG,MAAM,UAAU,EAAE,CAAC;YACnC,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;YAEpF,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;YAEpE,OAAO,kBAAkB,CAAC;gBACxB,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,IAAI,EAAE,OAAO,CAAC,OAAO;gBACrB,SAAS;gBACT,MAAM,EAAE,SAAS,GAAG,OAAO;gBAC3B,UAAU,EAAE,MAAM;gBAClB,OAAO,EAAE,OAAO;gBAChB,WAAW,EAAE,gBAAgB,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC;aACpD,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CACF,CAAC;IAEF,wBAAwB;IACxB,MAAM,CAAC,YAAY,CACjB,uBAAuB,EACvB;QACE,WAAW,EAAE,2DAA2D;KACzE,EACD,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM,WAAW,GAAG,MAAM,WAAW,CAAC,cAAc,EAAE,CAAC;YAEvD,OAAO,kBAAkB,CAAC;gBACxB,OAAO,EAAE,OAAO;gBAChB,GAAG,WAAW;aACf,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CACF,CAAC;IAEF,oBAAoB;IACpB,MAAM,CAAC,YAAY,CACjB,mBAAmB,EACnB;QACE,WAAW,EAAE,gEAAgE;KAC9E,EACD,KAAK,IAAI,EAAE;QACT,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC;YAC5C,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,UAAU,EAAE,CAAC;YAE/C,OAAO,kBAAkB,CAAC;gBACxB,OAAO,EAAE,OAAO;gBAChB,WAAW,EAAE;oBACX,IAAI,EAAE,OAAO,CAAC,eAAe;oBAC7B,GAAG,EAAE,OAAO,CAAC,cAAc,GAAG,OAAO;iBACtC;gBACD,QAAQ,EAAE,OAAO,CAAC,QAAQ;aAC3B,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CACF,CAAC;AAEJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.tools.d.ts","sourceRoot":"","sources":["../../src/tools/scaffold.tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAUpE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CA0O7D"}
|
|
@@ -0,0 +1,216 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { scaffoldProject, scaffoldAIProject, } from "../services/scaffold.service.js";
|
|
3
|
+
import { createJsonResponse, createErrorResponse } from "../utils/index.js";
|
|
4
|
+
export function registerScaffoldTools(server) {
|
|
5
|
+
server.registerTool("scaffold_x402_endpoint", {
|
|
6
|
+
description: `Generate a complete Cloudflare Worker project with x402 payment integration.
|
|
7
|
+
|
|
8
|
+
Creates a ready-to-deploy Hono.js application that accepts payments in STX, sBTC, or USDCx.
|
|
9
|
+
|
|
10
|
+
## Output Files
|
|
11
|
+
|
|
12
|
+
- src/index.ts - Hono app with x402-protected endpoints
|
|
13
|
+
- src/x402-middleware.ts - Payment verification middleware
|
|
14
|
+
- wrangler.jsonc - Cloudflare Worker configuration
|
|
15
|
+
- package.json - Dependencies and scripts
|
|
16
|
+
- tsconfig.json - TypeScript configuration
|
|
17
|
+
- .env.example - Environment variable template
|
|
18
|
+
- .gitignore - Standard ignores
|
|
19
|
+
- README.md - Documentation
|
|
20
|
+
|
|
21
|
+
## After Generation
|
|
22
|
+
|
|
23
|
+
1. cd into the project directory
|
|
24
|
+
2. Run: npm install
|
|
25
|
+
3. Copy .env.example to .env and add Cloudflare credentials
|
|
26
|
+
4. Set recipient address as secret: wrangler secret put RECIPIENT_ADDRESS
|
|
27
|
+
5. Run: npm run dev (local development)
|
|
28
|
+
6. Run: npm run deploy (deploy to Cloudflare)
|
|
29
|
+
|
|
30
|
+
## Payment Flow
|
|
31
|
+
|
|
32
|
+
The generated endpoints implement the x402 payment protocol:
|
|
33
|
+
1. Client requests endpoint without payment → receives 402 with payment requirements
|
|
34
|
+
2. Client signs transaction (does NOT broadcast)
|
|
35
|
+
3. Client retries with X-PAYMENT header containing signed tx
|
|
36
|
+
4. Server settles payment via facilitator and returns response`,
|
|
37
|
+
inputSchema: {
|
|
38
|
+
outputDir: z.string().describe("Absolute path to output directory (must exist)"),
|
|
39
|
+
projectName: z
|
|
40
|
+
.string()
|
|
41
|
+
.regex(/^[a-z][a-z0-9-]*$/, "Project name must be lowercase with hyphens only")
|
|
42
|
+
.describe("Project name (lowercase, hyphens allowed, e.g., 'my-x402-api')"),
|
|
43
|
+
endpoints: z
|
|
44
|
+
.array(z.object({
|
|
45
|
+
path: z
|
|
46
|
+
.string()
|
|
47
|
+
.startsWith("/")
|
|
48
|
+
.describe("Endpoint path (e.g., '/api/premium')"),
|
|
49
|
+
method: z.enum(["GET", "POST"]).describe("HTTP method"),
|
|
50
|
+
description: z.string().describe("Endpoint description for documentation"),
|
|
51
|
+
amount: z
|
|
52
|
+
.string()
|
|
53
|
+
.regex(/^\d+(\.\d+)?$/, "Amount must be a positive number")
|
|
54
|
+
.describe("Payment amount (e.g., '0.001' STX or '0.0001' sBTC)"),
|
|
55
|
+
tokenType: z.enum(["STX", "sBTC", "USDCx"]).describe("Payment token type"),
|
|
56
|
+
}))
|
|
57
|
+
.min(1)
|
|
58
|
+
.describe("Array of endpoint configurations"),
|
|
59
|
+
recipientAddress: z
|
|
60
|
+
.string()
|
|
61
|
+
.regex(/^S[PT][A-Z0-9]+$/, "Must be a valid Stacks address")
|
|
62
|
+
.describe("Stacks address to receive payments"),
|
|
63
|
+
network: z
|
|
64
|
+
.enum(["mainnet", "testnet"])
|
|
65
|
+
.optional()
|
|
66
|
+
.default("testnet")
|
|
67
|
+
.describe("Network for payments (default: testnet)"),
|
|
68
|
+
facilitatorUrl: z
|
|
69
|
+
.string()
|
|
70
|
+
.url()
|
|
71
|
+
.optional()
|
|
72
|
+
.describe("Custom facilitator URL (default: https://facilitator.x402stacks.xyz)"),
|
|
73
|
+
},
|
|
74
|
+
}, async ({ outputDir, projectName, endpoints, recipientAddress, network, facilitatorUrl }) => {
|
|
75
|
+
try {
|
|
76
|
+
const result = await scaffoldProject({
|
|
77
|
+
outputDir,
|
|
78
|
+
projectName,
|
|
79
|
+
endpoints: endpoints,
|
|
80
|
+
recipientAddress,
|
|
81
|
+
network: network || "testnet",
|
|
82
|
+
facilitatorUrl: facilitatorUrl || "https://facilitator.x402stacks.xyz",
|
|
83
|
+
});
|
|
84
|
+
return createJsonResponse({
|
|
85
|
+
success: true,
|
|
86
|
+
message: `Project scaffolded successfully at ${result.projectPath}`,
|
|
87
|
+
projectPath: result.projectPath,
|
|
88
|
+
filesCreated: result.filesCreated,
|
|
89
|
+
nextSteps: result.nextSteps,
|
|
90
|
+
endpoints: endpoints.map((ep) => ({
|
|
91
|
+
path: ep.path,
|
|
92
|
+
method: ep.method,
|
|
93
|
+
cost: `${ep.amount} ${ep.tokenType}`,
|
|
94
|
+
})),
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
return createErrorResponse(error);
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
// AI-powered x402 endpoint scaffolding with OpenRouter
|
|
102
|
+
server.registerTool("scaffold_x402_ai_endpoint", {
|
|
103
|
+
description: `Generate a complete Cloudflare Worker project with x402 payment + OpenRouter AI integration.
|
|
104
|
+
|
|
105
|
+
Creates a ready-to-deploy Hono.js application that:
|
|
106
|
+
- Accepts payments in STX, sBTC, or USDCx
|
|
107
|
+
- Calls OpenRouter AI models (Claude, GPT-4, Llama, etc.)
|
|
108
|
+
- Returns AI-generated responses after payment
|
|
109
|
+
|
|
110
|
+
## AI Types
|
|
111
|
+
|
|
112
|
+
- **chat**: General chat/Q&A endpoint
|
|
113
|
+
- **completion**: Text completion/continuation
|
|
114
|
+
- **summarize**: Summarize provided text
|
|
115
|
+
- **translate**: Translate text to target language
|
|
116
|
+
- **custom**: Custom system prompt
|
|
117
|
+
|
|
118
|
+
## Output Files
|
|
119
|
+
|
|
120
|
+
- src/index.ts - Hono app with x402-protected AI endpoints
|
|
121
|
+
- src/x402-middleware.ts - Payment verification middleware
|
|
122
|
+
- src/openrouter.ts - OpenRouter API client
|
|
123
|
+
- wrangler.jsonc - Cloudflare Worker configuration
|
|
124
|
+
- package.json, tsconfig.json, .env.example, README.md
|
|
125
|
+
|
|
126
|
+
## After Generation
|
|
127
|
+
|
|
128
|
+
1. cd into the project directory
|
|
129
|
+
2. npm install
|
|
130
|
+
3. Set secrets: wrangler secret put RECIPIENT_ADDRESS
|
|
131
|
+
4. Set secrets: wrangler secret put OPENROUTER_API_KEY
|
|
132
|
+
5. For local dev: create .dev.vars with both secrets
|
|
133
|
+
6. npm run dev`,
|
|
134
|
+
inputSchema: {
|
|
135
|
+
outputDir: z.string().describe("Absolute path to output directory (must exist)"),
|
|
136
|
+
projectName: z
|
|
137
|
+
.string()
|
|
138
|
+
.regex(/^[a-z][a-z0-9-]*$/, "Project name must be lowercase with hyphens only")
|
|
139
|
+
.describe("Project name (lowercase, hyphens allowed, e.g., 'my-ai-api')"),
|
|
140
|
+
endpoints: z
|
|
141
|
+
.array(z.object({
|
|
142
|
+
path: z
|
|
143
|
+
.string()
|
|
144
|
+
.startsWith("/")
|
|
145
|
+
.describe("Endpoint path (e.g., '/api/chat')"),
|
|
146
|
+
description: z.string().describe("Endpoint description for documentation"),
|
|
147
|
+
amount: z
|
|
148
|
+
.string()
|
|
149
|
+
.regex(/^\d+(\.\d+)?$/, "Amount must be a positive number")
|
|
150
|
+
.describe("Payment amount (e.g., '0.01' STX)"),
|
|
151
|
+
tokenType: z.enum(["STX", "sBTC", "USDCx"]).describe("Payment token type"),
|
|
152
|
+
aiType: z
|
|
153
|
+
.enum(["chat", "completion", "summarize", "translate", "custom"])
|
|
154
|
+
.describe("Type of AI operation"),
|
|
155
|
+
model: z
|
|
156
|
+
.string()
|
|
157
|
+
.optional()
|
|
158
|
+
.describe("OpenRouter model (e.g., 'anthropic/claude-3-haiku')"),
|
|
159
|
+
systemPrompt: z
|
|
160
|
+
.string()
|
|
161
|
+
.optional()
|
|
162
|
+
.describe("Custom system prompt (for 'custom' aiType or to override default)"),
|
|
163
|
+
}))
|
|
164
|
+
.min(1)
|
|
165
|
+
.describe("Array of AI endpoint configurations"),
|
|
166
|
+
recipientAddress: z
|
|
167
|
+
.string()
|
|
168
|
+
.regex(/^S[PT][A-Z0-9]+$/, "Must be a valid Stacks address")
|
|
169
|
+
.describe("Stacks address to receive payments"),
|
|
170
|
+
network: z
|
|
171
|
+
.enum(["mainnet", "testnet"])
|
|
172
|
+
.optional()
|
|
173
|
+
.default("testnet")
|
|
174
|
+
.describe("Network for payments (default: testnet)"),
|
|
175
|
+
facilitatorUrl: z
|
|
176
|
+
.string()
|
|
177
|
+
.url()
|
|
178
|
+
.optional()
|
|
179
|
+
.describe("Custom facilitator URL (default: https://facilitator.x402stacks.xyz)"),
|
|
180
|
+
defaultModel: z
|
|
181
|
+
.string()
|
|
182
|
+
.optional()
|
|
183
|
+
.default("anthropic/claude-3-haiku")
|
|
184
|
+
.describe("Default OpenRouter model for all endpoints (default: anthropic/claude-3-haiku)"),
|
|
185
|
+
},
|
|
186
|
+
}, async ({ outputDir, projectName, endpoints, recipientAddress, network, facilitatorUrl, defaultModel, }) => {
|
|
187
|
+
try {
|
|
188
|
+
const result = await scaffoldAIProject({
|
|
189
|
+
outputDir,
|
|
190
|
+
projectName,
|
|
191
|
+
endpoints: endpoints,
|
|
192
|
+
recipientAddress,
|
|
193
|
+
network: network || "testnet",
|
|
194
|
+
facilitatorUrl: facilitatorUrl || "https://facilitator.x402stacks.xyz",
|
|
195
|
+
defaultModel: defaultModel || "anthropic/claude-3-haiku",
|
|
196
|
+
});
|
|
197
|
+
return createJsonResponse({
|
|
198
|
+
success: true,
|
|
199
|
+
message: `AI project scaffolded successfully at ${result.projectPath}`,
|
|
200
|
+
projectPath: result.projectPath,
|
|
201
|
+
filesCreated: result.filesCreated,
|
|
202
|
+
nextSteps: result.nextSteps,
|
|
203
|
+
endpoints: endpoints.map((ep) => ({
|
|
204
|
+
path: ep.path,
|
|
205
|
+
aiType: ep.aiType,
|
|
206
|
+
model: ep.model || defaultModel || "anthropic/claude-3-haiku",
|
|
207
|
+
cost: `${ep.amount} ${ep.tokenType}`,
|
|
208
|
+
})),
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
return createErrorResponse(error);
|
|
213
|
+
}
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
//# sourceMappingURL=scaffold.tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scaffold.tools.js","sourceRoot":"","sources":["../../src/tools/scaffold.tools.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EACL,eAAe,EACf,iBAAiB,GAGlB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAE5E,MAAM,UAAU,qBAAqB,CAAC,MAAiB;IACrD,MAAM,CAAC,YAAY,CACjB,wBAAwB,EACxB;QACE,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;+DA8B4C;QACzD,WAAW,EAAE;YACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;YAChF,WAAW,EAAE,CAAC;iBACX,MAAM,EAAE;iBACR,KAAK,CAAC,mBAAmB,EAAE,kDAAkD,CAAC;iBAC9E,QAAQ,CAAC,gEAAgE,CAAC;YAC7E,SAAS,EAAE,CAAC;iBACT,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;gBACP,IAAI,EAAE,CAAC;qBACJ,MAAM,EAAE;qBACR,UAAU,CAAC,GAAG,CAAC;qBACf,QAAQ,CAAC,sCAAsC,CAAC;gBACnD,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,aAAa,CAAC;gBACvD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;gBAC1E,MAAM,EAAE,CAAC;qBACN,MAAM,EAAE;qBACR,KAAK,CAAC,eAAe,EAAE,kCAAkC,CAAC;qBAC1D,QAAQ,CAAC,qDAAqD,CAAC;gBAClE,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC;aAC3E,CAAC,CACH;iBACA,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CAAC,kCAAkC,CAAC;YAC/C,gBAAgB,EAAE,CAAC;iBAChB,MAAM,EAAE;iBACR,KAAK,CAAC,kBAAkB,EAAE,gCAAgC,CAAC;iBAC3D,QAAQ,CAAC,oCAAoC,CAAC;YACjD,OAAO,EAAE,CAAC;iBACP,IAAI,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;iBAC5B,QAAQ,EAAE;iBACV,OAAO,CAAC,SAAS,CAAC;iBAClB,QAAQ,CAAC,yCAAyC,CAAC;YACtD,cAAc,EAAE,CAAC;iBACd,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,QAAQ,EAAE;iBACV,QAAQ,CACP,sEAAsE,CACvE;SACJ;KACF,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS,EAAE,gBAAgB,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE;QACzF,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC;gBACnC,SAAS;gBACT,WAAW;gBACX,SAAS,EAAE,SAA6B;gBACxC,gBAAgB;gBAChB,OAAO,EAAE,OAAO,IAAI,SAAS;gBAC7B,cAAc,EAAE,cAAc,IAAI,oCAAoC;aACvE,CAAC,CAAC;YAEH,OAAO,kBAAkB,CAAC;gBACxB,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,sCAAsC,MAAM,CAAC,WAAW,EAAE;gBACnE,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;oBAChC,IAAI,EAAE,EAAE,CAAC,IAAI;oBACb,MAAM,EAAE,EAAE,CAAC,MAAM;oBACjB,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,SAAS,EAAE;iBACrC,CAAC,CAAC;aACJ,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CACF,CAAC;IAEF,uDAAuD;IACvD,MAAM,CAAC,YAAY,CACjB,2BAA2B,EAC3B;QACE,WAAW,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;eA8BJ;QACT,WAAW,EAAE;YACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;YAChF,WAAW,EAAE,CAAC;iBACX,MAAM,EAAE;iBACR,KAAK,CAAC,mBAAmB,EAAE,kDAAkD,CAAC;iBAC9E,QAAQ,CAAC,8DAA8D,CAAC;YAC3E,SAAS,EAAE,CAAC;iBACT,KAAK,CACJ,CAAC,CAAC,MAAM,CAAC;gBACP,IAAI,EAAE,CAAC;qBACJ,MAAM,EAAE;qBACR,UAAU,CAAC,GAAG,CAAC;qBACf,QAAQ,CAAC,mCAAmC,CAAC;gBAChD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,wCAAwC,CAAC;gBAC1E,MAAM,EAAE,CAAC;qBACN,MAAM,EAAE;qBACR,KAAK,CAAC,eAAe,EAAE,kCAAkC,CAAC;qBAC1D,QAAQ,CAAC,mCAAmC,CAAC;gBAChD,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC;gBAC1E,MAAM,EAAE,CAAC;qBACN,IAAI,CAAC,CAAC,MAAM,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,CAAC,CAAC;qBAChE,QAAQ,CAAC,sBAAsB,CAAC;gBACnC,KAAK,EAAE,CAAC;qBACL,MAAM,EAAE;qBACR,QAAQ,EAAE;qBACV,QAAQ,CAAC,qDAAqD,CAAC;gBAClE,YAAY,EAAE,CAAC;qBACZ,MAAM,EAAE;qBACR,QAAQ,EAAE;qBACV,QAAQ,CAAC,mEAAmE,CAAC;aACjF,CAAC,CACH;iBACA,GAAG,CAAC,CAAC,CAAC;iBACN,QAAQ,CAAC,qCAAqC,CAAC;YAClD,gBAAgB,EAAE,CAAC;iBAChB,MAAM,EAAE;iBACR,KAAK,CAAC,kBAAkB,EAAE,gCAAgC,CAAC;iBAC3D,QAAQ,CAAC,oCAAoC,CAAC;YACjD,OAAO,EAAE,CAAC;iBACP,IAAI,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;iBAC5B,QAAQ,EAAE;iBACV,OAAO,CAAC,SAAS,CAAC;iBAClB,QAAQ,CAAC,yCAAyC,CAAC;YACtD,cAAc,EAAE,CAAC;iBACd,MAAM,EAAE;iBACR,GAAG,EAAE;iBACL,QAAQ,EAAE;iBACV,QAAQ,CAAC,sEAAsE,CAAC;YACnF,YAAY,EAAE,CAAC;iBACZ,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,OAAO,CAAC,0BAA0B,CAAC;iBACnC,QAAQ,CAAC,gFAAgF,CAAC;SAC9F;KACF,EACD,KAAK,EAAE,EACL,SAAS,EACT,WAAW,EACX,SAAS,EACT,gBAAgB,EAChB,OAAO,EACP,cAAc,EACd,YAAY,GACb,EAAE,EAAE;QACH,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC;gBACrC,SAAS;gBACT,WAAW;gBACX,SAAS,EAAE,SAA+B;gBAC1C,gBAAgB;gBAChB,OAAO,EAAE,OAAO,IAAI,SAAS;gBAC7B,cAAc,EAAE,cAAc,IAAI,oCAAoC;gBACtE,YAAY,EAAE,YAAY,IAAI,0BAA0B;aACzD,CAAC,CAAC;YAEH,OAAO,kBAAkB,CAAC;gBACxB,OAAO,EAAE,IAAI;gBACb,OAAO,EAAE,yCAAyC,MAAM,CAAC,WAAW,EAAE;gBACtE,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,YAAY,EAAE,MAAM,CAAC,YAAY;gBACjC,SAAS,EAAE,MAAM,CAAC,SAAS;gBAC3B,SAAS,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;oBAChC,IAAI,EAAE,EAAE,CAAC,IAAI;oBACb,MAAM,EAAE,EAAE,CAAC,MAAM;oBACjB,KAAK,EAAE,EAAE,CAAC,KAAK,IAAI,YAAY,IAAI,0BAA0B;oBAC7D,IAAI,EAAE,GAAG,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,SAAS,EAAE;iBACrC,CAAC,CAAC;aACJ,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,mBAAmB,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;IACH,CAAC,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stacking.tools.d.ts","sourceRoot":"","sources":["../../src/tools/stacking.tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOpE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuI7D"}
|