@aibtc/mcp-server 1.34.0 → 1.35.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/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +33 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/relay-diagnostic.tools.d.ts.map +1 -1
- package/dist/tools/relay-diagnostic.tools.js +67 -4
- package/dist/tools/relay-diagnostic.tools.js.map +1 -1
- package/dist/tools/skill-mappings.d.ts +15 -0
- package/dist/tools/skill-mappings.d.ts.map +1 -0
- package/dist/tools/skill-mappings.js +229 -0
- package/dist/tools/skill-mappings.js.map +1 -0
- package/dist/utils/relay-health.d.ts +28 -0
- package/dist/utils/relay-health.d.ts.map +1 -1
- package/dist/utils/relay-health.js +157 -7
- package/dist/utils/relay-health.js.map +1 -1
- package/package.json +1 -1
- package/skill/SKILL.md +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAqDpE;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAmExD"}
|
package/dist/tools/index.js
CHANGED
|
@@ -19,10 +19,40 @@ import { registerYieldHunterTools } from "./yield-hunter.tools.js";
|
|
|
19
19
|
import { registerPillarTools } from "./pillar.tools.js";
|
|
20
20
|
import { registerPillarDirectTools } from "./pillar-direct.tools.js";
|
|
21
21
|
import { registerBitcoinTools } from "./bitcoin.tools.js";
|
|
22
|
+
import { registerRelayDiagnosticTools } from "./relay-diagnostic.tools.js";
|
|
23
|
+
import { getSkillForTool } from "./skill-mappings.js";
|
|
24
|
+
/**
|
|
25
|
+
* Wraps server.registerTool to inject _meta.skill from TOOL_SKILL_MAP when a mapping exists.
|
|
26
|
+
* Returns a cleanup function that restores the original method.
|
|
27
|
+
*/
|
|
28
|
+
function withSkillMeta(server) {
|
|
29
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
30
|
+
const original = server.registerTool;
|
|
31
|
+
const hasOwn = Object.prototype.hasOwnProperty.call(server, "registerTool");
|
|
32
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
33
|
+
server.registerTool = function (name, config, cb) {
|
|
34
|
+
const skill = getSkillForTool(name);
|
|
35
|
+
const patched = skill
|
|
36
|
+
? { ...config, _meta: { ...(config._meta ?? {}), skill } }
|
|
37
|
+
: config;
|
|
38
|
+
return original.call(server, name, patched, cb);
|
|
39
|
+
};
|
|
40
|
+
return () => {
|
|
41
|
+
if (hasOwn) {
|
|
42
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
43
|
+
server.registerTool = original;
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
47
|
+
delete server.registerTool;
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
}
|
|
22
51
|
/**
|
|
23
52
|
* Register all tools with the MCP server
|
|
24
53
|
*/
|
|
25
54
|
export function registerAllTools(server) {
|
|
55
|
+
const restoreRegisterTool = withSkillMeta(server);
|
|
26
56
|
// Wallet & Balance
|
|
27
57
|
registerWalletTools(server);
|
|
28
58
|
// Wallet Management (create, import, unlock, lock, etc.)
|
|
@@ -63,5 +93,8 @@ export function registerAllTools(server) {
|
|
|
63
93
|
registerPillarDirectTools(server);
|
|
64
94
|
// Bitcoin L1 (read-only: balance, fees, UTXOs)
|
|
65
95
|
registerBitcoinTools(server);
|
|
96
|
+
// Relay Diagnostics (sponsor relay health, nonce status, stuck transactions)
|
|
97
|
+
registerRelayDiagnosticTools(server);
|
|
98
|
+
restoreRegisterTool();
|
|
66
99
|
}
|
|
67
100
|
//# sourceMappingURL=index.js.map
|
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,+DAA+D;AAC/D,6DAA6D;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,wBAAwB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-diagnostic.tools.d.ts","sourceRoot":"","sources":["../../src/tools/relay-diagnostic.tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"relay-diagnostic.tools.d.ts","sourceRoot":"","sources":["../../src/tools/relay-diagnostic.tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOpE,wBAAgB,4BAA4B,CAAC,MAAM,EAAE,SAAS,GAAG,IAAI,CAuGpE"}
|
|
@@ -3,20 +3,25 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Tools for checking sponsor relay health and diagnosing nonce issues
|
|
5
5
|
*/
|
|
6
|
+
import { z } from "zod";
|
|
6
7
|
import { createJsonResponse, createErrorResponse } from "../utils/index.js";
|
|
7
|
-
import { checkRelayHealth, formatRelayHealthStatus } from "../utils/relay-health.js";
|
|
8
|
+
import { checkRelayHealth, formatRelayHealthStatus, attemptRbf, attemptFillGaps } from "../utils/relay-health.js";
|
|
8
9
|
import { NETWORK } from "../services/x402.service.js";
|
|
10
|
+
import { getWalletManager } from "../services/wallet-manager.js";
|
|
9
11
|
export function registerRelayDiagnosticTools(server) {
|
|
10
12
|
server.registerTool("check_relay_health", {
|
|
11
13
|
description: `Check the sponsor relay health and nonce status.
|
|
12
14
|
|
|
13
|
-
Use this tool to diagnose
|
|
15
|
+
Use this tool to diagnose sponsored transaction failures. It will:
|
|
14
16
|
- Check relay availability
|
|
15
17
|
- Inspect sponsor address nonce state
|
|
16
18
|
- Detect nonce gaps that block transactions
|
|
19
|
+
- Detect mempool desync (confirmed nonce far behind mempool nonce)
|
|
20
|
+
- List stuck transactions with txid, nonce, and how long they have been pending
|
|
17
21
|
- Report mempool congestion
|
|
18
22
|
|
|
19
|
-
If nonce gaps are detected,
|
|
23
|
+
If nonce gaps or stuck transactions are detected, the output includes
|
|
24
|
+
txids and pending durations to share with the AIBTC team for recovery.`,
|
|
20
25
|
inputSchema: {},
|
|
21
26
|
}, async () => {
|
|
22
27
|
try {
|
|
@@ -27,7 +32,65 @@ If nonce gaps are detected, wait for AIBTC team to clear them before retrying se
|
|
|
27
32
|
});
|
|
28
33
|
}
|
|
29
34
|
catch (error) {
|
|
30
|
-
return createErrorResponse(error
|
|
35
|
+
return createErrorResponse(error);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
server.registerTool("recover_sponsor_nonce", {
|
|
39
|
+
description: `Attempt automated recovery of stuck sponsor transactions via the relay API.
|
|
40
|
+
|
|
41
|
+
Run check_relay_health first to identify stuck txids and missing nonces, then use
|
|
42
|
+
this tool to trigger recovery without needing to contact the AIBTC team manually.
|
|
43
|
+
|
|
44
|
+
Two recovery modes are available:
|
|
45
|
+
- rbf: Replace-by-fee — rebroadcasts stuck transactions with a higher fee so miners
|
|
46
|
+
prioritize them. Provide specific txids or omit to bump all stuck transactions.
|
|
47
|
+
- fill-gaps: Nonce gap-fill — submits placeholder transactions to fill any missing
|
|
48
|
+
nonces that are blocking the queue. Provide specific nonces or omit to fill all gaps.
|
|
49
|
+
- both: Attempt both RBF and gap-fill in sequence (default).
|
|
50
|
+
|
|
51
|
+
If the relay does not yet support these endpoints it returns a 404 or 501 and this
|
|
52
|
+
tool will respond with a clear message rather than throwing an error. In that case,
|
|
53
|
+
share the txids and nonces from check_relay_health with the AIBTC team.`,
|
|
54
|
+
inputSchema: {
|
|
55
|
+
action: z
|
|
56
|
+
.enum(["rbf", "fill-gaps", "both"])
|
|
57
|
+
.default("both")
|
|
58
|
+
.describe("Which recovery operation to attempt"),
|
|
59
|
+
txids: z
|
|
60
|
+
.array(z.string())
|
|
61
|
+
.optional()
|
|
62
|
+
.describe("Specific stuck transaction IDs for RBF (omit to bump all stuck txs)"),
|
|
63
|
+
nonces: z
|
|
64
|
+
.array(z.number().int().nonnegative())
|
|
65
|
+
.optional()
|
|
66
|
+
.describe("Specific missing nonces for gap-fill (omit to fill all detected gaps)"),
|
|
67
|
+
},
|
|
68
|
+
}, async ({ action = "both", txids, nonces }) => {
|
|
69
|
+
try {
|
|
70
|
+
// Resolve API key from wallet (if unlocked) to align with sponsor-builder auth flow
|
|
71
|
+
const walletAccount = getWalletManager().getAccount();
|
|
72
|
+
const walletApiKey = walletAccount?.sponsorApiKey;
|
|
73
|
+
const results = { action };
|
|
74
|
+
if (action === "rbf" || action === "both") {
|
|
75
|
+
const rbfResult = await attemptRbf(NETWORK, txids, walletApiKey);
|
|
76
|
+
results.rbf = rbfResult;
|
|
77
|
+
}
|
|
78
|
+
if (action === "fill-gaps" || action === "both") {
|
|
79
|
+
const fillResult = await attemptFillGaps(NETWORK, nonces, walletApiKey);
|
|
80
|
+
results.fillGaps = fillResult;
|
|
81
|
+
}
|
|
82
|
+
// Summarize outcome
|
|
83
|
+
const anyUnsupported = Object.values(results).some((r) => r && typeof r === "object" && "supported" in r && !r.supported);
|
|
84
|
+
const anySupported = Object.values(results).some((r) => r && typeof r === "object" && "supported" in r && r.supported);
|
|
85
|
+
results.summary = anySupported
|
|
86
|
+
? "Recovery request submitted to relay. Run check_relay_health to verify nonce state improved."
|
|
87
|
+
: anyUnsupported
|
|
88
|
+
? "Relay does not yet support automated recovery. Run check_relay_health for txids and nonces to share with the AIBTC team."
|
|
89
|
+
: "Recovery attempted.";
|
|
90
|
+
return createJsonResponse(results);
|
|
91
|
+
}
|
|
92
|
+
catch (error) {
|
|
93
|
+
return createErrorResponse(error);
|
|
31
94
|
}
|
|
32
95
|
});
|
|
33
96
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-diagnostic.tools.js","sourceRoot":"","sources":["../../src/tools/relay-diagnostic.tools.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAE,gBAAgB,EAAE,uBAAuB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"relay-diagnostic.tools.js","sourceRoot":"","sources":["../../src/tools/relay-diagnostic.tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill reference mappings for MCP tools.
|
|
3
|
+
*
|
|
4
|
+
* Maps each MCP tool name to its corresponding skill in the aibtcdev/skills repository.
|
|
5
|
+
* Skills are loaded via the /skill command in Claude Code and provide higher-level
|
|
6
|
+
* orchestration logic built on top of these MCP tools.
|
|
7
|
+
*
|
|
8
|
+
* Skill source: https://github.com/aibtcdev/skills
|
|
9
|
+
*/
|
|
10
|
+
export declare const TOOL_SKILL_MAP: Record<string, string>;
|
|
11
|
+
/**
|
|
12
|
+
* Returns the skill name for a given MCP tool name, or undefined if no mapping exists.
|
|
13
|
+
*/
|
|
14
|
+
export declare function getSkillForTool(toolName: string): string | undefined;
|
|
15
|
+
//# sourceMappingURL=skill-mappings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-mappings.d.ts","sourceRoot":"","sources":["../../src/tools/skill-mappings.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CA0OjD,CAAC;AAEF;;GAEG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEpE"}
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Skill reference mappings for MCP tools.
|
|
3
|
+
*
|
|
4
|
+
* Maps each MCP tool name to its corresponding skill in the aibtcdev/skills repository.
|
|
5
|
+
* Skills are loaded via the /skill command in Claude Code and provide higher-level
|
|
6
|
+
* orchestration logic built on top of these MCP tools.
|
|
7
|
+
*
|
|
8
|
+
* Skill source: https://github.com/aibtcdev/skills
|
|
9
|
+
*/
|
|
10
|
+
export const TOOL_SKILL_MAP = {
|
|
11
|
+
// wallet skill — encrypted BIP39 wallet management
|
|
12
|
+
get_wallet_info: "wallet",
|
|
13
|
+
wallet_create: "wallet",
|
|
14
|
+
wallet_import: "wallet",
|
|
15
|
+
wallet_unlock: "wallet",
|
|
16
|
+
wallet_lock: "wallet",
|
|
17
|
+
wallet_list: "wallet",
|
|
18
|
+
wallet_switch: "wallet",
|
|
19
|
+
wallet_delete: "wallet",
|
|
20
|
+
wallet_export: "wallet",
|
|
21
|
+
wallet_rotate_password: "wallet",
|
|
22
|
+
wallet_set_timeout: "wallet",
|
|
23
|
+
wallet_status: "wallet",
|
|
24
|
+
// stx skill — STX transfers and Stacks contract operations
|
|
25
|
+
get_stx_balance: "stx",
|
|
26
|
+
transfer_stx: "stx",
|
|
27
|
+
broadcast_transaction: "stx",
|
|
28
|
+
call_contract: "stx",
|
|
29
|
+
deploy_contract: "stx",
|
|
30
|
+
get_transaction_status: "stx",
|
|
31
|
+
// btc skill — Bitcoin L1 operations
|
|
32
|
+
get_btc_balance: "btc",
|
|
33
|
+
get_btc_fees: "btc",
|
|
34
|
+
get_btc_utxos: "btc",
|
|
35
|
+
transfer_btc: "btc",
|
|
36
|
+
get_cardinal_utxos: "btc",
|
|
37
|
+
get_ordinal_utxos: "btc",
|
|
38
|
+
get_inscriptions_by_address: "btc",
|
|
39
|
+
// sbtc skill — sBTC token operations
|
|
40
|
+
sbtc_get_balance: "sbtc",
|
|
41
|
+
sbtc_transfer: "sbtc",
|
|
42
|
+
sbtc_get_deposit_info: "sbtc",
|
|
43
|
+
sbtc_get_peg_info: "sbtc",
|
|
44
|
+
sbtc_deposit: "sbtc",
|
|
45
|
+
sbtc_deposit_status: "sbtc",
|
|
46
|
+
sbtc_initiate_withdrawal: "sbtc",
|
|
47
|
+
sbtc_withdraw: "sbtc",
|
|
48
|
+
sbtc_withdrawal_status: "sbtc",
|
|
49
|
+
sbtc_withdraw_status: "sbtc",
|
|
50
|
+
// tokens skill — SIP-010 fungible token operations
|
|
51
|
+
get_token_balance: "tokens",
|
|
52
|
+
get_token_info: "tokens",
|
|
53
|
+
list_user_tokens: "tokens",
|
|
54
|
+
get_token_holders: "tokens",
|
|
55
|
+
transfer_token: "tokens",
|
|
56
|
+
// nft skill — SIP-009 NFT operations
|
|
57
|
+
get_nft_holdings: "nft",
|
|
58
|
+
get_nft_metadata: "nft",
|
|
59
|
+
transfer_nft: "nft",
|
|
60
|
+
get_nft_owner: "nft",
|
|
61
|
+
get_collection_info: "nft",
|
|
62
|
+
get_nft_history: "nft",
|
|
63
|
+
// stacking skill — STX stacking and PoX operations
|
|
64
|
+
get_pox_info: "stacking",
|
|
65
|
+
get_stacking_status: "stacking",
|
|
66
|
+
stack_stx: "stacking",
|
|
67
|
+
extend_stacking: "stacking",
|
|
68
|
+
// bns skill — Bitcoin Name System operations
|
|
69
|
+
lookup_bns_name: "bns",
|
|
70
|
+
reverse_bns_lookup: "bns",
|
|
71
|
+
get_bns_info: "bns",
|
|
72
|
+
check_bns_availability: "bns",
|
|
73
|
+
get_bns_price: "bns",
|
|
74
|
+
list_user_domains: "bns",
|
|
75
|
+
claim_bns_name_fast: "bns",
|
|
76
|
+
preorder_bns_name: "bns",
|
|
77
|
+
register_bns_name: "bns",
|
|
78
|
+
// query skill — Stacks network and blockchain queries
|
|
79
|
+
get_stx_fees: "query",
|
|
80
|
+
get_account_info: "query",
|
|
81
|
+
get_account_transactions: "query",
|
|
82
|
+
get_block_info: "query",
|
|
83
|
+
get_mempool_info: "query",
|
|
84
|
+
get_contract_info: "query",
|
|
85
|
+
get_contract_events: "query",
|
|
86
|
+
get_network_status: "query",
|
|
87
|
+
call_read_only_function: "query",
|
|
88
|
+
// x402 skill — x402 paid endpoints, inbox, scaffolding, OpenRouter
|
|
89
|
+
list_x402_endpoints: "x402",
|
|
90
|
+
execute_x402_endpoint: "x402",
|
|
91
|
+
probe_x402_endpoint: "x402",
|
|
92
|
+
scaffold_x402_endpoint: "x402",
|
|
93
|
+
scaffold_x402_ai_endpoint: "x402",
|
|
94
|
+
openrouter_integration_guide: "x402",
|
|
95
|
+
openrouter_models: "x402",
|
|
96
|
+
send_inbox_message: "x402",
|
|
97
|
+
// defi skill — ALEX DEX and Zest Protocol
|
|
98
|
+
alex_list_pools: "defi",
|
|
99
|
+
alex_get_swap_quote: "defi",
|
|
100
|
+
alex_swap: "defi",
|
|
101
|
+
alex_get_pool_info: "defi",
|
|
102
|
+
zest_list_assets: "defi",
|
|
103
|
+
zest_get_position: "defi",
|
|
104
|
+
zest_supply: "defi",
|
|
105
|
+
zest_withdraw: "defi",
|
|
106
|
+
zest_borrow: "defi",
|
|
107
|
+
zest_repay: "defi",
|
|
108
|
+
// styx skill — BTC→sBTC conversion via Styx protocol
|
|
109
|
+
styx_pool_status: "styx",
|
|
110
|
+
styx_pools: "styx",
|
|
111
|
+
styx_fees: "styx",
|
|
112
|
+
styx_price: "styx",
|
|
113
|
+
styx_deposit: "styx",
|
|
114
|
+
styx_status: "styx",
|
|
115
|
+
styx_history: "styx",
|
|
116
|
+
// yield-hunter skill — autonomous sBTC yield farming daemon
|
|
117
|
+
yield_hunter_start: "yield-hunter",
|
|
118
|
+
yield_hunter_stop: "yield-hunter",
|
|
119
|
+
yield_hunter_status: "yield-hunter",
|
|
120
|
+
yield_hunter_configure: "yield-hunter",
|
|
121
|
+
// pillar skill — Pillar smart wallet (browser-handoff + agent-signed direct modes)
|
|
122
|
+
pillar_connect: "pillar",
|
|
123
|
+
pillar_disconnect: "pillar",
|
|
124
|
+
pillar_status: "pillar",
|
|
125
|
+
pillar_send: "pillar",
|
|
126
|
+
pillar_fund: "pillar",
|
|
127
|
+
pillar_add_admin: "pillar",
|
|
128
|
+
pillar_supply: "pillar",
|
|
129
|
+
pillar_auto_compound: "pillar",
|
|
130
|
+
pillar_unwind: "pillar",
|
|
131
|
+
pillar_boost: "pillar",
|
|
132
|
+
pillar_position: "pillar",
|
|
133
|
+
pillar_create_wallet: "pillar",
|
|
134
|
+
pillar_invite: "pillar",
|
|
135
|
+
pillar_dca_invite: "pillar",
|
|
136
|
+
pillar_dca_partners: "pillar",
|
|
137
|
+
pillar_dca_leaderboard: "pillar",
|
|
138
|
+
pillar_dca_status: "pillar",
|
|
139
|
+
pillar_key_generate: "pillar",
|
|
140
|
+
pillar_key_unlock: "pillar",
|
|
141
|
+
pillar_key_lock: "pillar",
|
|
142
|
+
pillar_key_info: "pillar",
|
|
143
|
+
pillar_direct_boost: "pillar",
|
|
144
|
+
pillar_direct_unwind: "pillar",
|
|
145
|
+
pillar_direct_supply: "pillar",
|
|
146
|
+
pillar_direct_send: "pillar",
|
|
147
|
+
pillar_direct_auto_compound: "pillar",
|
|
148
|
+
pillar_direct_position: "pillar",
|
|
149
|
+
pillar_direct_withdraw_collateral: "pillar",
|
|
150
|
+
pillar_direct_add_admin: "pillar",
|
|
151
|
+
pillar_direct_create_wallet: "pillar",
|
|
152
|
+
pillar_direct_dca_invite: "pillar",
|
|
153
|
+
pillar_direct_dca_partners: "pillar",
|
|
154
|
+
pillar_direct_dca_leaderboard: "pillar",
|
|
155
|
+
pillar_direct_dca_status: "pillar",
|
|
156
|
+
pillar_direct_quote: "pillar",
|
|
157
|
+
pillar_direct_resolve_recipient: "pillar",
|
|
158
|
+
pillar_direct_stack_stx: "pillar",
|
|
159
|
+
pillar_direct_revoke_fast_pool: "pillar",
|
|
160
|
+
pillar_direct_stacking_status: "pillar",
|
|
161
|
+
// settings skill — MCP server configuration and relay health
|
|
162
|
+
set_hiro_api_key: "settings",
|
|
163
|
+
get_hiro_api_key: "settings",
|
|
164
|
+
delete_hiro_api_key: "settings",
|
|
165
|
+
set_stacks_api_url: "settings",
|
|
166
|
+
get_stacks_api_url: "settings",
|
|
167
|
+
delete_stacks_api_url: "settings",
|
|
168
|
+
get_server_version: "settings",
|
|
169
|
+
check_relay_health: "settings",
|
|
170
|
+
recover_sponsor_nonce: "settings",
|
|
171
|
+
// signing skill — message signing and verification
|
|
172
|
+
stacks_sign_message: "signing",
|
|
173
|
+
stacks_verify_message: "signing",
|
|
174
|
+
btc_sign_message: "signing",
|
|
175
|
+
btc_verify_message: "signing",
|
|
176
|
+
schnorr_sign_digest: "signing",
|
|
177
|
+
schnorr_verify_digest: "signing",
|
|
178
|
+
nostr_sign_event: "signing",
|
|
179
|
+
// ordinals skill — Bitcoin ordinals inscription operations
|
|
180
|
+
get_taproot_address: "ordinals",
|
|
181
|
+
estimate_inscription_fee: "ordinals",
|
|
182
|
+
inscribe: "ordinals",
|
|
183
|
+
inscribe_reveal: "ordinals",
|
|
184
|
+
get_inscription: "ordinals",
|
|
185
|
+
inscribe_child: "ordinals",
|
|
186
|
+
inscribe_child_reveal: "ordinals",
|
|
187
|
+
estimate_child_inscription_fee: "ordinals",
|
|
188
|
+
// ordinals-p2p skill — peer-to-peer ordinals trading via PSBT
|
|
189
|
+
psbt_decode: "ordinals-p2p",
|
|
190
|
+
psbt_sign: "ordinals-p2p",
|
|
191
|
+
psbt_broadcast: "ordinals-p2p",
|
|
192
|
+
psbt_create_ordinal_buy: "ordinals-p2p",
|
|
193
|
+
// identity skill — ERC-8004 on-chain agent identity
|
|
194
|
+
register_identity: "identity",
|
|
195
|
+
get_identity: "identity",
|
|
196
|
+
// reputation skill — ERC-8004 on-chain agent reputation
|
|
197
|
+
give_feedback: "reputation",
|
|
198
|
+
get_reputation: "reputation",
|
|
199
|
+
// validation skill — ERC-8004 on-chain agent validation
|
|
200
|
+
request_validation: "validation",
|
|
201
|
+
get_validation_status: "validation",
|
|
202
|
+
get_validation_summary: "validation",
|
|
203
|
+
// stackspot skill — stacking lottery pots
|
|
204
|
+
stackspot_list_pots: "stackspot",
|
|
205
|
+
stackspot_get_pot_state: "stackspot",
|
|
206
|
+
stackspot_join_pot: "stackspot",
|
|
207
|
+
stackspot_start_pot: "stackspot",
|
|
208
|
+
stackspot_claim_rewards: "stackspot",
|
|
209
|
+
stackspot_cancel_pot: "stackspot",
|
|
210
|
+
// bitflow skill — Bitflow DEX aggregator
|
|
211
|
+
bitflow_get_ticker: "bitflow",
|
|
212
|
+
bitflow_get_tokens: "bitflow",
|
|
213
|
+
bitflow_get_swap_targets: "bitflow",
|
|
214
|
+
bitflow_get_quote: "bitflow",
|
|
215
|
+
bitflow_get_routes: "bitflow",
|
|
216
|
+
bitflow_swap: "bitflow",
|
|
217
|
+
bitflow_get_keeper_contract: "bitflow",
|
|
218
|
+
bitflow_create_order: "bitflow",
|
|
219
|
+
bitflow_get_order: "bitflow",
|
|
220
|
+
bitflow_cancel_order: "bitflow",
|
|
221
|
+
bitflow_get_keeper_user: "bitflow",
|
|
222
|
+
};
|
|
223
|
+
/**
|
|
224
|
+
* Returns the skill name for a given MCP tool name, or undefined if no mapping exists.
|
|
225
|
+
*/
|
|
226
|
+
export function getSkillForTool(toolName) {
|
|
227
|
+
return TOOL_SKILL_MAP[toolName];
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=skill-mappings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"skill-mappings.js","sourceRoot":"","sources":["../../src/tools/skill-mappings.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,MAAM,CAAC,MAAM,cAAc,GAA2B;IACpD,mDAAmD;IACnD,eAAe,EAAE,QAAQ;IACzB,aAAa,EAAE,QAAQ;IACvB,aAAa,EAAE,QAAQ;IACvB,aAAa,EAAE,QAAQ;IACvB,WAAW,EAAE,QAAQ;IACrB,WAAW,EAAE,QAAQ;IACrB,aAAa,EAAE,QAAQ;IACvB,aAAa,EAAE,QAAQ;IACvB,aAAa,EAAE,QAAQ;IACvB,sBAAsB,EAAE,QAAQ;IAChC,kBAAkB,EAAE,QAAQ;IAC5B,aAAa,EAAE,QAAQ;IAEvB,2DAA2D;IAC3D,eAAe,EAAE,KAAK;IACtB,YAAY,EAAE,KAAK;IACnB,qBAAqB,EAAE,KAAK;IAC5B,aAAa,EAAE,KAAK;IACpB,eAAe,EAAE,KAAK;IACtB,sBAAsB,EAAE,KAAK;IAE7B,oCAAoC;IACpC,eAAe,EAAE,KAAK;IACtB,YAAY,EAAE,KAAK;IACnB,aAAa,EAAE,KAAK;IACpB,YAAY,EAAE,KAAK;IACnB,kBAAkB,EAAE,KAAK;IACzB,iBAAiB,EAAE,KAAK;IACxB,2BAA2B,EAAE,KAAK;IAElC,qCAAqC;IACrC,gBAAgB,EAAE,MAAM;IACxB,aAAa,EAAE,MAAM;IACrB,qBAAqB,EAAE,MAAM;IAC7B,iBAAiB,EAAE,MAAM;IACzB,YAAY,EAAE,MAAM;IACpB,mBAAmB,EAAE,MAAM;IAC3B,wBAAwB,EAAE,MAAM;IAChC,aAAa,EAAE,MAAM;IACrB,sBAAsB,EAAE,MAAM;IAC9B,oBAAoB,EAAE,MAAM;IAE5B,mDAAmD;IACnD,iBAAiB,EAAE,QAAQ;IAC3B,cAAc,EAAE,QAAQ;IACxB,gBAAgB,EAAE,QAAQ;IAC1B,iBAAiB,EAAE,QAAQ;IAC3B,cAAc,EAAE,QAAQ;IAExB,qCAAqC;IACrC,gBAAgB,EAAE,KAAK;IACvB,gBAAgB,EAAE,KAAK;IACvB,YAAY,EAAE,KAAK;IACnB,aAAa,EAAE,KAAK;IACpB,mBAAmB,EAAE,KAAK;IAC1B,eAAe,EAAE,KAAK;IAEtB,mDAAmD;IACnD,YAAY,EAAE,UAAU;IACxB,mBAAmB,EAAE,UAAU;IAC/B,SAAS,EAAE,UAAU;IACrB,eAAe,EAAE,UAAU;IAE3B,6CAA6C;IAC7C,eAAe,EAAE,KAAK;IACtB,kBAAkB,EAAE,KAAK;IACzB,YAAY,EAAE,KAAK;IACnB,sBAAsB,EAAE,KAAK;IAC7B,aAAa,EAAE,KAAK;IACpB,iBAAiB,EAAE,KAAK;IACxB,mBAAmB,EAAE,KAAK;IAC1B,iBAAiB,EAAE,KAAK;IACxB,iBAAiB,EAAE,KAAK;IAExB,sDAAsD;IACtD,YAAY,EAAE,OAAO;IACrB,gBAAgB,EAAE,OAAO;IACzB,wBAAwB,EAAE,OAAO;IACjC,cAAc,EAAE,OAAO;IACvB,gBAAgB,EAAE,OAAO;IACzB,iBAAiB,EAAE,OAAO;IAC1B,mBAAmB,EAAE,OAAO;IAC5B,kBAAkB,EAAE,OAAO;IAC3B,uBAAuB,EAAE,OAAO;IAEhC,mEAAmE;IACnE,mBAAmB,EAAE,MAAM;IAC3B,qBAAqB,EAAE,MAAM;IAC7B,mBAAmB,EAAE,MAAM;IAC3B,sBAAsB,EAAE,MAAM;IAC9B,yBAAyB,EAAE,MAAM;IACjC,4BAA4B,EAAE,MAAM;IACpC,iBAAiB,EAAE,MAAM;IACzB,kBAAkB,EAAE,MAAM;IAE1B,0CAA0C;IAC1C,eAAe,EAAE,MAAM;IACvB,mBAAmB,EAAE,MAAM;IAC3B,SAAS,EAAE,MAAM;IACjB,kBAAkB,EAAE,MAAM;IAC1B,gBAAgB,EAAE,MAAM;IACxB,iBAAiB,EAAE,MAAM;IACzB,WAAW,EAAE,MAAM;IACnB,aAAa,EAAE,MAAM;IACrB,WAAW,EAAE,MAAM;IACnB,UAAU,EAAE,MAAM;IAElB,qDAAqD;IACrD,gBAAgB,EAAE,MAAM;IACxB,UAAU,EAAE,MAAM;IAClB,SAAS,EAAE,MAAM;IACjB,UAAU,EAAE,MAAM;IAClB,YAAY,EAAE,MAAM;IACpB,WAAW,EAAE,MAAM;IACnB,YAAY,EAAE,MAAM;IAEpB,4DAA4D;IAC5D,kBAAkB,EAAE,cAAc;IAClC,iBAAiB,EAAE,cAAc;IACjC,mBAAmB,EAAE,cAAc;IACnC,sBAAsB,EAAE,cAAc;IAEtC,mFAAmF;IACnF,cAAc,EAAE,QAAQ;IACxB,iBAAiB,EAAE,QAAQ;IAC3B,aAAa,EAAE,QAAQ;IACvB,WAAW,EAAE,QAAQ;IACrB,WAAW,EAAE,QAAQ;IACrB,gBAAgB,EAAE,QAAQ;IAC1B,aAAa,EAAE,QAAQ;IACvB,oBAAoB,EAAE,QAAQ;IAC9B,aAAa,EAAE,QAAQ;IACvB,YAAY,EAAE,QAAQ;IACtB,eAAe,EAAE,QAAQ;IACzB,oBAAoB,EAAE,QAAQ;IAC9B,aAAa,EAAE,QAAQ;IACvB,iBAAiB,EAAE,QAAQ;IAC3B,mBAAmB,EAAE,QAAQ;IAC7B,sBAAsB,EAAE,QAAQ;IAChC,iBAAiB,EAAE,QAAQ;IAC3B,mBAAmB,EAAE,QAAQ;IAC7B,iBAAiB,EAAE,QAAQ;IAC3B,eAAe,EAAE,QAAQ;IACzB,eAAe,EAAE,QAAQ;IACzB,mBAAmB,EAAE,QAAQ;IAC7B,oBAAoB,EAAE,QAAQ;IAC9B,oBAAoB,EAAE,QAAQ;IAC9B,kBAAkB,EAAE,QAAQ;IAC5B,2BAA2B,EAAE,QAAQ;IACrC,sBAAsB,EAAE,QAAQ;IAChC,iCAAiC,EAAE,QAAQ;IAC3C,uBAAuB,EAAE,QAAQ;IACjC,2BAA2B,EAAE,QAAQ;IACrC,wBAAwB,EAAE,QAAQ;IAClC,0BAA0B,EAAE,QAAQ;IACpC,6BAA6B,EAAE,QAAQ;IACvC,wBAAwB,EAAE,QAAQ;IAClC,mBAAmB,EAAE,QAAQ;IAC7B,+BAA+B,EAAE,QAAQ;IACzC,uBAAuB,EAAE,QAAQ;IACjC,8BAA8B,EAAE,QAAQ;IACxC,6BAA6B,EAAE,QAAQ;IAEvC,6DAA6D;IAC7D,gBAAgB,EAAE,UAAU;IAC5B,gBAAgB,EAAE,UAAU;IAC5B,mBAAmB,EAAE,UAAU;IAC/B,kBAAkB,EAAE,UAAU;IAC9B,kBAAkB,EAAE,UAAU;IAC9B,qBAAqB,EAAE,UAAU;IACjC,kBAAkB,EAAE,UAAU;IAC9B,kBAAkB,EAAE,UAAU;IAC9B,qBAAqB,EAAE,UAAU;IAEjC,mDAAmD;IACnD,mBAAmB,EAAE,SAAS;IAC9B,qBAAqB,EAAE,SAAS;IAChC,gBAAgB,EAAE,SAAS;IAC3B,kBAAkB,EAAE,SAAS;IAC7B,mBAAmB,EAAE,SAAS;IAC9B,qBAAqB,EAAE,SAAS;IAChC,gBAAgB,EAAE,SAAS;IAE3B,2DAA2D;IAC3D,mBAAmB,EAAE,UAAU;IAC/B,wBAAwB,EAAE,UAAU;IACpC,QAAQ,EAAE,UAAU;IACpB,eAAe,EAAE,UAAU;IAC3B,eAAe,EAAE,UAAU;IAC3B,cAAc,EAAE,UAAU;IAC1B,qBAAqB,EAAE,UAAU;IACjC,8BAA8B,EAAE,UAAU;IAE1C,8DAA8D;IAC9D,WAAW,EAAE,cAAc;IAC3B,SAAS,EAAE,cAAc;IACzB,cAAc,EAAE,cAAc;IAC9B,uBAAuB,EAAE,cAAc;IAEvC,oDAAoD;IACpD,iBAAiB,EAAE,UAAU;IAC7B,YAAY,EAAE,UAAU;IAExB,wDAAwD;IACxD,aAAa,EAAE,YAAY;IAC3B,cAAc,EAAE,YAAY;IAE5B,wDAAwD;IACxD,kBAAkB,EAAE,YAAY;IAChC,qBAAqB,EAAE,YAAY;IACnC,sBAAsB,EAAE,YAAY;IAEpC,0CAA0C;IAC1C,mBAAmB,EAAE,WAAW;IAChC,uBAAuB,EAAE,WAAW;IACpC,kBAAkB,EAAE,WAAW;IAC/B,mBAAmB,EAAE,WAAW;IAChC,uBAAuB,EAAE,WAAW;IACpC,oBAAoB,EAAE,WAAW;IAEjC,yCAAyC;IACzC,kBAAkB,EAAE,SAAS;IAC7B,kBAAkB,EAAE,SAAS;IAC7B,wBAAwB,EAAE,SAAS;IACnC,iBAAiB,EAAE,SAAS;IAC5B,kBAAkB,EAAE,SAAS;IAC7B,YAAY,EAAE,SAAS;IACvB,2BAA2B,EAAE,SAAS;IACtC,oBAAoB,EAAE,SAAS;IAC/B,iBAAiB,EAAE,SAAS;IAC5B,oBAAoB,EAAE,SAAS;IAC/B,uBAAuB,EAAE,SAAS;CACnC,CAAC;AAEF;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,QAAgB;IAC9C,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC;AAClC,CAAC"}
|
|
@@ -5,6 +5,11 @@
|
|
|
5
5
|
* diagnostic information when send failures occur.
|
|
6
6
|
*/
|
|
7
7
|
import type { Network } from "../config/networks.js";
|
|
8
|
+
export interface StuckTransaction {
|
|
9
|
+
txid: string;
|
|
10
|
+
nonce: number;
|
|
11
|
+
pendingSeconds: number;
|
|
12
|
+
}
|
|
8
13
|
export interface RelayHealthStatus {
|
|
9
14
|
healthy: boolean;
|
|
10
15
|
network: Network;
|
|
@@ -18,7 +23,10 @@ export interface RelayHealthStatus {
|
|
|
18
23
|
mempoolNonces: number[];
|
|
19
24
|
hasGaps: boolean;
|
|
20
25
|
gapCount: number;
|
|
26
|
+
mempoolDesync: boolean;
|
|
27
|
+
desyncGap: number;
|
|
21
28
|
};
|
|
29
|
+
stuckTransactions?: StuckTransaction[];
|
|
22
30
|
issues?: string[];
|
|
23
31
|
}
|
|
24
32
|
/**
|
|
@@ -29,6 +37,26 @@ export declare function checkRelayHealth(network: Network): Promise<RelayHealthS
|
|
|
29
37
|
* Format relay health status as a human-readable string
|
|
30
38
|
*/
|
|
31
39
|
export declare function formatRelayHealthStatus(status: RelayHealthStatus): string;
|
|
40
|
+
export interface RelayRecoveryResult {
|
|
41
|
+
supported: boolean;
|
|
42
|
+
message?: string;
|
|
43
|
+
result?: unknown;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Attempt RBF (replace-by-fee) on stuck transactions via the relay API.
|
|
47
|
+
* If txids is provided, only those transactions are bumped; otherwise the relay
|
|
48
|
+
* bumps all stuck transactions it knows about.
|
|
49
|
+
*
|
|
50
|
+
* Gracefully returns { supported: false } if the relay returns 404 or 501.
|
|
51
|
+
*/
|
|
52
|
+
export declare function attemptRbf(network: Network, txids?: string[], apiKey?: string): Promise<RelayRecoveryResult>;
|
|
53
|
+
/**
|
|
54
|
+
* Attempt to fill nonce gaps on the relay by having it submit placeholder transactions.
|
|
55
|
+
* If nonces is provided, only those gaps are filled; otherwise the relay fills all detected gaps.
|
|
56
|
+
*
|
|
57
|
+
* Gracefully returns { supported: false } if the relay returns 404 or 501.
|
|
58
|
+
*/
|
|
59
|
+
export declare function attemptFillGaps(network: Network, nonces?: number[], apiKey?: string): Promise<RelayRecoveryResult>;
|
|
32
60
|
/**
|
|
33
61
|
* Wait with exponential backoff when relay nonce issues are detected
|
|
34
62
|
* Returns recommended wait time in milliseconds
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-health.d.ts","sourceRoot":"","sources":["../../src/utils/relay-health.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAGrD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE;QACZ,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"relay-health.d.ts","sourceRoot":"","sources":["../../src/utils/relay-health.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,uBAAuB,CAAC;AAGrD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,WAAW,CAAC,EAAE;QACZ,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;QAC3B,YAAY,EAAE,MAAM,CAAC;QACrB,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,aAAa,EAAE,MAAM,EAAE,CAAC;QACxB,OAAO,EAAE,OAAO,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;QACjB,aAAa,EAAE,OAAO,CAAC;QACvB,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,iBAAiB,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACvC,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAUD;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA4HnF;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAuDzE;AAED,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAsB,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAiDlH;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAiDxH;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,GAAG,MAAM,CASnF"}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Proactively checks the sponsor relay for nonce gaps and provides
|
|
5
5
|
* diagnostic information when send failures occur.
|
|
6
6
|
*/
|
|
7
|
-
import { getSponsorRelayUrl } from "../config/sponsor.js";
|
|
7
|
+
import { getSponsorRelayUrl, getSponsorApiKey } from "../config/sponsor.js";
|
|
8
8
|
import { getHiroApi } from "../services/hiro-api.js";
|
|
9
9
|
/**
|
|
10
10
|
* Known sponsor addresses for each network.
|
|
@@ -53,27 +53,65 @@ export async function checkRelayHealth(network) {
|
|
|
53
53
|
const nonceInfo = await hiroApi.getNonceInfo(sponsorAddress);
|
|
54
54
|
const hasGaps = nonceInfo.detected_missing_nonces.length > 0;
|
|
55
55
|
const gapCount = nonceInfo.detected_missing_nonces.length;
|
|
56
|
+
// Mempool desync: sponsor has submitted far more txs than have been confirmed
|
|
57
|
+
const lastExecuted = nonceInfo.last_executed_tx_nonce || 0;
|
|
58
|
+
const lastMempool = nonceInfo.last_mempool_tx_nonce;
|
|
59
|
+
const desyncGap = lastMempool !== null ? lastMempool - lastExecuted : 0;
|
|
60
|
+
const mempoolDesync = desyncGap > 5;
|
|
56
61
|
if (hasGaps) {
|
|
57
62
|
issues.push(`Sponsor has ${gapCount} missing nonce(s): ${nonceInfo.detected_missing_nonces.slice(0, 5).join(", ")}${gapCount > 5 ? "..." : ""}`);
|
|
58
63
|
}
|
|
59
|
-
if (
|
|
64
|
+
if (mempoolDesync) {
|
|
65
|
+
issues.push(`Mempool desync detected: sponsor nonce ${lastExecuted} (executed) vs ${lastMempool} (mempool), gap of ${desyncGap}`);
|
|
66
|
+
}
|
|
67
|
+
else if (nonceInfo.detected_mempool_nonces.length > 10) {
|
|
60
68
|
issues.push(`Sponsor has ${nonceInfo.detected_mempool_nonces.length} transactions stuck in mempool`);
|
|
61
69
|
}
|
|
62
70
|
const nonceStatus = {
|
|
63
|
-
lastExecuted
|
|
64
|
-
lastMempool
|
|
71
|
+
lastExecuted,
|
|
72
|
+
lastMempool,
|
|
65
73
|
possibleNext: nonceInfo.possible_next_nonce,
|
|
66
74
|
missingNonces: nonceInfo.detected_missing_nonces,
|
|
67
75
|
mempoolNonces: nonceInfo.detected_mempool_nonces,
|
|
68
76
|
hasGaps,
|
|
69
77
|
gapCount,
|
|
78
|
+
mempoolDesync,
|
|
79
|
+
desyncGap,
|
|
70
80
|
};
|
|
81
|
+
// Fetch stuck transactions from mempool for actionable diagnostics
|
|
82
|
+
let stuckTransactions;
|
|
83
|
+
try {
|
|
84
|
+
const mempoolRes = await hiroApi.getMempoolTransactions({
|
|
85
|
+
sender_address: sponsorAddress,
|
|
86
|
+
limit: 50,
|
|
87
|
+
});
|
|
88
|
+
const nowSeconds = Math.floor(Date.now() / 1000);
|
|
89
|
+
const stuck = mempoolRes.results
|
|
90
|
+
.filter((tx) => {
|
|
91
|
+
const pendingSeconds = nowSeconds - tx.receipt_time;
|
|
92
|
+
return pendingSeconds > 60;
|
|
93
|
+
})
|
|
94
|
+
.map((tx) => ({
|
|
95
|
+
txid: tx.tx_id,
|
|
96
|
+
nonce: tx.nonce,
|
|
97
|
+
pendingSeconds: nowSeconds - tx.receipt_time,
|
|
98
|
+
}))
|
|
99
|
+
.sort((a, b) => b.pendingSeconds - a.pendingSeconds)
|
|
100
|
+
.slice(0, 10);
|
|
101
|
+
if (stuck.length > 0) {
|
|
102
|
+
stuckTransactions = stuck;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
catch {
|
|
106
|
+
// Non-fatal: stuck-tx fetch is best-effort
|
|
107
|
+
}
|
|
71
108
|
return {
|
|
72
109
|
healthy: issues.length === 0,
|
|
73
110
|
network,
|
|
74
111
|
version,
|
|
75
112
|
sponsorAddress,
|
|
76
113
|
nonceStatus,
|
|
114
|
+
stuckTransactions,
|
|
77
115
|
issues: issues.length > 0 ? issues : undefined,
|
|
78
116
|
};
|
|
79
117
|
}
|
|
@@ -107,15 +145,28 @@ export function formatRelayHealthStatus(status) {
|
|
|
107
145
|
lines.push(` Last mempool: ${ns.lastMempool ?? "none"}`);
|
|
108
146
|
lines.push(` Next nonce: ${ns.possibleNext}`);
|
|
109
147
|
if (ns.hasGaps) {
|
|
110
|
-
lines.push(`
|
|
148
|
+
lines.push(` GAPS Missing nonces (${ns.gapCount}): ${ns.missingNonces.slice(0, 10).join(", ")}${ns.gapCount > 10 ? "..." : ""}`);
|
|
111
149
|
}
|
|
112
150
|
else {
|
|
113
|
-
lines.push("
|
|
151
|
+
lines.push(" OK No nonce gaps");
|
|
152
|
+
}
|
|
153
|
+
if (ns.mempoolDesync) {
|
|
154
|
+
lines.push(` DESYNC Mempool desync: executed=${ns.lastExecuted}, mempool=${ns.lastMempool ?? "none"}, gap=${ns.desyncGap}`);
|
|
114
155
|
}
|
|
115
156
|
if (ns.mempoolNonces.length > 0) {
|
|
116
|
-
lines.push(`
|
|
157
|
+
lines.push(` WARN Mempool nonces (${ns.mempoolNonces.length}): ${ns.mempoolNonces.slice(0, 10).join(", ")}${ns.mempoolNonces.length > 10 ? "..." : ""}`);
|
|
117
158
|
}
|
|
118
159
|
}
|
|
160
|
+
if (status.stuckTransactions && status.stuckTransactions.length > 0) {
|
|
161
|
+
lines.push("");
|
|
162
|
+
lines.push("Stuck Transactions:");
|
|
163
|
+
status.stuckTransactions.forEach((tx) => {
|
|
164
|
+
const minutes = Math.floor(tx.pendingSeconds / 60);
|
|
165
|
+
const seconds = tx.pendingSeconds % 60;
|
|
166
|
+
const duration = minutes > 0 ? `${minutes}m ${seconds}s` : `${seconds}s`;
|
|
167
|
+
lines.push(` nonce=${tx.nonce} pending=${duration} txid=${tx.txid}`);
|
|
168
|
+
});
|
|
169
|
+
}
|
|
119
170
|
if (status.issues && status.issues.length > 0) {
|
|
120
171
|
lines.push("");
|
|
121
172
|
lines.push("Issues:");
|
|
@@ -123,6 +174,105 @@ export function formatRelayHealthStatus(status) {
|
|
|
123
174
|
}
|
|
124
175
|
return lines.join("\n");
|
|
125
176
|
}
|
|
177
|
+
/**
|
|
178
|
+
* Attempt RBF (replace-by-fee) on stuck transactions via the relay API.
|
|
179
|
+
* If txids is provided, only those transactions are bumped; otherwise the relay
|
|
180
|
+
* bumps all stuck transactions it knows about.
|
|
181
|
+
*
|
|
182
|
+
* Gracefully returns { supported: false } if the relay returns 404 or 501.
|
|
183
|
+
*/
|
|
184
|
+
export async function attemptRbf(network, txids, apiKey) {
|
|
185
|
+
const relayUrl = getSponsorRelayUrl(network);
|
|
186
|
+
const resolvedKey = apiKey || getSponsorApiKey();
|
|
187
|
+
if (!resolvedKey) {
|
|
188
|
+
return {
|
|
189
|
+
supported: true,
|
|
190
|
+
message: "No sponsor API key available. Set SPONSOR_API_KEY env var or use a wallet with sponsorApiKey configured.",
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
const headers = {
|
|
194
|
+
"Content-Type": "application/json",
|
|
195
|
+
"Authorization": `Bearer ${resolvedKey}`,
|
|
196
|
+
};
|
|
197
|
+
const body = {};
|
|
198
|
+
if (txids && txids.length > 0) {
|
|
199
|
+
body.txids = txids;
|
|
200
|
+
}
|
|
201
|
+
const controller = new AbortController();
|
|
202
|
+
const timeout = setTimeout(() => controller.abort(), 30000);
|
|
203
|
+
try {
|
|
204
|
+
const res = await fetch(`${relayUrl}/recovery/rbf`, {
|
|
205
|
+
method: "POST",
|
|
206
|
+
headers,
|
|
207
|
+
body: JSON.stringify(body),
|
|
208
|
+
signal: controller.signal,
|
|
209
|
+
});
|
|
210
|
+
if (res.status === 404 || res.status === 501) {
|
|
211
|
+
return {
|
|
212
|
+
supported: false,
|
|
213
|
+
message: "Relay does not support RBF recovery yet. Share stuck txids with the AIBTC team for manual recovery.",
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
if (!res.ok) {
|
|
217
|
+
const text = await res.text();
|
|
218
|
+
throw new Error(`Relay RBF failed: HTTP ${res.status} — ${text}`);
|
|
219
|
+
}
|
|
220
|
+
const result = await res.json();
|
|
221
|
+
return { supported: true, result };
|
|
222
|
+
}
|
|
223
|
+
finally {
|
|
224
|
+
clearTimeout(timeout);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Attempt to fill nonce gaps on the relay by having it submit placeholder transactions.
|
|
229
|
+
* If nonces is provided, only those gaps are filled; otherwise the relay fills all detected gaps.
|
|
230
|
+
*
|
|
231
|
+
* Gracefully returns { supported: false } if the relay returns 404 or 501.
|
|
232
|
+
*/
|
|
233
|
+
export async function attemptFillGaps(network, nonces, apiKey) {
|
|
234
|
+
const relayUrl = getSponsorRelayUrl(network);
|
|
235
|
+
const resolvedKey = apiKey || getSponsorApiKey();
|
|
236
|
+
if (!resolvedKey) {
|
|
237
|
+
return {
|
|
238
|
+
supported: true,
|
|
239
|
+
message: "No sponsor API key available. Set SPONSOR_API_KEY env var or use a wallet with sponsorApiKey configured.",
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
const headers = {
|
|
243
|
+
"Content-Type": "application/json",
|
|
244
|
+
"Authorization": `Bearer ${resolvedKey}`,
|
|
245
|
+
};
|
|
246
|
+
const body = {};
|
|
247
|
+
if (nonces && nonces.length > 0) {
|
|
248
|
+
body.nonces = nonces;
|
|
249
|
+
}
|
|
250
|
+
const controller = new AbortController();
|
|
251
|
+
const timeout = setTimeout(() => controller.abort(), 30000);
|
|
252
|
+
try {
|
|
253
|
+
const res = await fetch(`${relayUrl}/recovery/fill-gaps`, {
|
|
254
|
+
method: "POST",
|
|
255
|
+
headers,
|
|
256
|
+
body: JSON.stringify(body),
|
|
257
|
+
signal: controller.signal,
|
|
258
|
+
});
|
|
259
|
+
if (res.status === 404 || res.status === 501) {
|
|
260
|
+
return {
|
|
261
|
+
supported: false,
|
|
262
|
+
message: "Relay does not support nonce gap-fill recovery yet. Share missing nonces with the AIBTC team for manual recovery.",
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
if (!res.ok) {
|
|
266
|
+
const text = await res.text();
|
|
267
|
+
throw new Error(`Relay gap-fill failed: HTTP ${res.status} — ${text}`);
|
|
268
|
+
}
|
|
269
|
+
const result = await res.json();
|
|
270
|
+
return { supported: true, result };
|
|
271
|
+
}
|
|
272
|
+
finally {
|
|
273
|
+
clearTimeout(timeout);
|
|
274
|
+
}
|
|
275
|
+
}
|
|
126
276
|
/**
|
|
127
277
|
* Wait with exponential backoff when relay nonce issues are detected
|
|
128
278
|
* Returns recommended wait time in milliseconds
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"relay-health.js","sourceRoot":"","sources":["../../src/utils/relay-health.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"relay-health.js","sourceRoot":"","sources":["../../src/utils/relay-health.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aibtc/mcp-server",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.35.0",
|
|
4
4
|
"description": "Bitcoin-native MCP server for AI agents: BTC/STX wallets, DeFi yield, sBTC peg, NFTs, and x402 payments.",
|
|
5
5
|
"mcpName": "io.github.aibtcdev/mcp-server",
|
|
6
6
|
"type": "module",
|
package/skill/SKILL.md
CHANGED
|
@@ -4,7 +4,7 @@ description: Bitcoin L1 wallet for agents - check balances, send BTC, manage UTX
|
|
|
4
4
|
license: MIT
|
|
5
5
|
metadata:
|
|
6
6
|
author: aibtcdev
|
|
7
|
-
version: 1.
|
|
7
|
+
version: 1.35.0 # x-release-please-version
|
|
8
8
|
npm: "@aibtc/mcp-server"
|
|
9
9
|
github: https://github.com/aibtcdev/aibtc-mcp-server
|
|
10
10
|
---
|