@agentwonderland/mcp 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/core/api-client.d.ts +14 -0
  2. package/dist/core/api-client.js +98 -0
  3. package/dist/core/config.d.ts +77 -0
  4. package/dist/core/config.js +297 -0
  5. package/dist/core/formatters.d.ts +70 -0
  6. package/dist/core/formatters.js +193 -0
  7. package/dist/core/index.d.ts +6 -0
  8. package/dist/core/index.js +6 -0
  9. package/dist/core/ows-adapter.d.ts +43 -0
  10. package/dist/core/ows-adapter.js +100 -0
  11. package/dist/core/payments.d.ts +41 -0
  12. package/dist/core/payments.js +254 -0
  13. package/dist/core/types.d.ts +27 -0
  14. package/dist/core/types.js +4 -0
  15. package/dist/index.d.ts +2 -0
  16. package/dist/index.js +53 -0
  17. package/dist/prompts/index.d.ts +2 -0
  18. package/dist/prompts/index.js +89 -0
  19. package/dist/resources/agents.d.ts +2 -0
  20. package/dist/resources/agents.js +34 -0
  21. package/dist/resources/jobs.d.ts +2 -0
  22. package/dist/resources/jobs.js +15 -0
  23. package/dist/resources/wallet.d.ts +2 -0
  24. package/dist/resources/wallet.js +26 -0
  25. package/dist/tools/_token-cache.d.ts +5 -0
  26. package/dist/tools/_token-cache.js +9 -0
  27. package/dist/tools/agent-info.d.ts +2 -0
  28. package/dist/tools/agent-info.js +97 -0
  29. package/dist/tools/favorites.d.ts +2 -0
  30. package/dist/tools/favorites.js +51 -0
  31. package/dist/tools/index.d.ts +9 -0
  32. package/dist/tools/index.js +9 -0
  33. package/dist/tools/jobs.d.ts +2 -0
  34. package/dist/tools/jobs.js +49 -0
  35. package/dist/tools/rate.d.ts +2 -0
  36. package/dist/tools/rate.js +44 -0
  37. package/dist/tools/run.d.ts +2 -0
  38. package/dist/tools/run.js +80 -0
  39. package/dist/tools/search.d.ts +2 -0
  40. package/dist/tools/search.js +81 -0
  41. package/dist/tools/solve.d.ts +2 -0
  42. package/dist/tools/solve.js +124 -0
  43. package/dist/tools/tip.d.ts +2 -0
  44. package/dist/tools/tip.js +40 -0
  45. package/dist/tools/wallet.d.ts +2 -0
  46. package/dist/tools/wallet.js +197 -0
  47. package/package.json +49 -0
  48. package/src/core/api-client.ts +114 -0
  49. package/src/core/config.ts +384 -0
  50. package/src/core/formatters.ts +256 -0
  51. package/src/core/index.ts +6 -0
  52. package/src/core/ows-adapter.ts +214 -0
  53. package/src/core/payments.ts +278 -0
  54. package/src/core/types.ts +28 -0
  55. package/src/index.ts +65 -0
  56. package/src/prompts/index.ts +120 -0
  57. package/src/resources/agents.ts +37 -0
  58. package/src/resources/jobs.ts +17 -0
  59. package/src/resources/wallet.ts +30 -0
  60. package/src/tools/_token-cache.ts +18 -0
  61. package/src/tools/agent-info.ts +120 -0
  62. package/src/tools/favorites.ts +74 -0
  63. package/src/tools/index.ts +9 -0
  64. package/src/tools/jobs.ts +69 -0
  65. package/src/tools/rate.ts +62 -0
  66. package/src/tools/run.ts +97 -0
  67. package/src/tools/search.ts +96 -0
  68. package/src/tools/solve.ts +162 -0
  69. package/src/tools/tip.ts +59 -0
  70. package/src/tools/wallet.ts +268 -0
  71. package/tsconfig.json +15 -0
@@ -0,0 +1,14 @@
1
+ export declare class ApiError extends Error {
2
+ readonly status: number;
3
+ readonly body?: unknown | undefined;
4
+ constructor(status: number, message: string, body?: unknown | undefined);
5
+ }
6
+ export declare function apiGet<T>(path: string): Promise<T>;
7
+ export declare function apiPost<T>(path: string, body: unknown): Promise<T>;
8
+ /**
9
+ * POST with payment support. Uses the configured payment method to
10
+ * auto-handle 402 → sign → retry for paid endpoints.
11
+ * Pass `payWith` to specify a method, or omit for auto-detection.
12
+ */
13
+ export declare function apiPostWithPayment<T>(path: string, body: unknown, payWith?: string): Promise<T>;
14
+ export declare function apiPut<T>(path: string, body: unknown): Promise<T>;
@@ -0,0 +1,98 @@
1
+ import { getApiUrl, getApiKey } from "./config.js";
2
+ import { getPaymentFetch } from "./payments.js";
3
+ // ── Error class ────────────────────────────────────────────────────
4
+ export class ApiError extends Error {
5
+ status;
6
+ body;
7
+ constructor(status, message, body) {
8
+ super(message);
9
+ this.status = status;
10
+ this.body = body;
11
+ this.name = "ApiError";
12
+ }
13
+ }
14
+ // ── Internal helpers ───────────────────────────────────────────────
15
+ function buildHeaders() {
16
+ const headers = {
17
+ "Content-Type": "application/json",
18
+ Accept: "application/json",
19
+ };
20
+ const apiKey = getApiKey();
21
+ if (apiKey) {
22
+ headers["Authorization"] = `Bearer ${apiKey}`;
23
+ }
24
+ return headers;
25
+ }
26
+ async function handleResponse(response) {
27
+ let body;
28
+ const contentType = response.headers.get("content-type") ?? "";
29
+ if (contentType.includes("application/json")) {
30
+ body = await response.json();
31
+ }
32
+ else {
33
+ body = await response.text();
34
+ }
35
+ if (!response.ok) {
36
+ const bodyObj = body && typeof body === "object" ? body : null;
37
+ const message = bodyObj?.error
38
+ ? String(bodyObj.error)
39
+ : bodyObj?.message
40
+ ? String(bodyObj.message)
41
+ : typeof body === "string"
42
+ ? body
43
+ : `Request failed with status ${response.status}`;
44
+ throw new ApiError(response.status, message, body);
45
+ }
46
+ return body;
47
+ }
48
+ // ── Public API ─────────────────────────────────────────────────────
49
+ export async function apiGet(path) {
50
+ const url = `${getApiUrl()}${path}`;
51
+ const response = await fetch(url, {
52
+ method: "GET",
53
+ headers: buildHeaders(),
54
+ });
55
+ return handleResponse(response);
56
+ }
57
+ export async function apiPost(path, body) {
58
+ const url = `${getApiUrl()}${path}`;
59
+ const response = await fetch(url, {
60
+ method: "POST",
61
+ headers: buildHeaders(),
62
+ body: JSON.stringify(body),
63
+ });
64
+ return handleResponse(response);
65
+ }
66
+ /**
67
+ * POST with payment support. Uses the configured payment method to
68
+ * auto-handle 402 → sign → retry for paid endpoints.
69
+ * Pass `payWith` to specify a method, or omit for auto-detection.
70
+ */
71
+ export async function apiPostWithPayment(path, body, payWith) {
72
+ const url = `${getApiUrl()}${path}`;
73
+ const paymentFetch = await getPaymentFetch(payWith);
74
+ const response = await paymentFetch(url, {
75
+ method: "POST",
76
+ headers: buildHeaders(),
77
+ body: JSON.stringify(body),
78
+ });
79
+ const result = await handleResponse(response);
80
+ // mppx may strip extra fields from the response body during receipt processing.
81
+ // The gateway also sends feedback_token as a header to survive this.
82
+ if (result && typeof result === "object" && !("feedback_token" in result)) {
83
+ const headerToken = response.headers.get("x-feedback-token");
84
+ if (headerToken) {
85
+ result.feedback_token = headerToken;
86
+ }
87
+ }
88
+ return result;
89
+ }
90
+ export async function apiPut(path, body) {
91
+ const url = `${getApiUrl()}${path}`;
92
+ const response = await fetch(url, {
93
+ method: "PUT",
94
+ headers: buildHeaders(),
95
+ body: JSON.stringify(body),
96
+ });
97
+ return handleResponse(response);
98
+ }
@@ -0,0 +1,77 @@
1
+ export interface WalletEntry {
2
+ id: string;
3
+ keyType: "evm" | "ows";
4
+ key?: string;
5
+ owsWalletId?: string;
6
+ chains: string[];
7
+ defaultChain?: string;
8
+ label?: string;
9
+ }
10
+ export interface CardConfig {
11
+ consumerToken: string;
12
+ paymentMethodId?: string;
13
+ last4: string;
14
+ brand: string;
15
+ }
16
+ export interface Config {
17
+ apiUrl: string;
18
+ apiKey: string | null;
19
+ userId: string | null;
20
+ wallets: WalletEntry[];
21
+ defaultWallet: string | null;
22
+ card: CardConfig | null;
23
+ favorites: string[];
24
+ }
25
+ /** All supported chain identifiers. */
26
+ export declare const SUPPORTED_CHAINS: readonly ["tempo", "base", "solana"];
27
+ export type Chain = (typeof SUPPORTED_CHAINS)[number];
28
+ /**
29
+ * Map chain name to the protocol used for payment.
30
+ * All chains now use MPP protocol (mppx).
31
+ */
32
+ export declare function chainProtocol(_chain: string): "mpp";
33
+ export declare function getConfig(): Config;
34
+ export declare function saveConfig(updates: Partial<Config>): void;
35
+ export declare function getApiUrl(): string;
36
+ export declare function getApiKey(): string | null;
37
+ export declare function isAuthenticated(): boolean;
38
+ /**
39
+ * Get all wallets from config + env var synthetic wallets.
40
+ */
41
+ export declare function getWallets(): WalletEntry[];
42
+ /**
43
+ * Get a wallet by its ID.
44
+ */
45
+ export declare function getWalletById(id: string): WalletEntry | undefined;
46
+ /**
47
+ * Get the default wallet. Priority:
48
+ * 1. Configured defaultWallet
49
+ * 2. First wallet in the array
50
+ * 3. First env-var wallet
51
+ */
52
+ export declare function getDefaultWallet(): WalletEntry | undefined;
53
+ /**
54
+ * Add a wallet entry. If a wallet with the same ID exists, replace it.
55
+ */
56
+ export declare function addWallet(entry: WalletEntry): void;
57
+ /**
58
+ * Remove a wallet by ID.
59
+ */
60
+ export declare function removeWallet(id: string): void;
61
+ /**
62
+ * Get card configuration.
63
+ */
64
+ export declare function getCardConfig(): CardConfig | null;
65
+ /**
66
+ * Resolve a payment method string to a wallet + chain.
67
+ * Accepts: wallet ID, chain name, or "card".
68
+ * Returns null if unresolvable.
69
+ */
70
+ export declare function resolveWalletAndChain(method?: string): {
71
+ wallet: WalletEntry;
72
+ chain: string;
73
+ } | null;
74
+ export declare function getFavorites(): string[];
75
+ export declare function addFavorite(agentId: string): void;
76
+ export declare function removeFavorite(agentId: string): void;
77
+ export declare function isFavorite(agentId: string): boolean;
@@ -0,0 +1,297 @@
1
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
2
+ import { join } from "node:path";
3
+ import { homedir } from "node:os";
4
+ /** All supported chain identifiers. */
5
+ export const SUPPORTED_CHAINS = ["tempo", "base", "solana"];
6
+ /**
7
+ * Map chain name to the protocol used for payment.
8
+ * All chains now use MPP protocol (mppx).
9
+ */
10
+ export function chainProtocol(_chain) {
11
+ return "mpp";
12
+ }
13
+ // ── Constants ──────────────────────────────────────────────────────
14
+ const CONFIG_DIR = join(homedir(), ".agentwonderland");
15
+ const CONFIG_FILE = join(CONFIG_DIR, "config.json");
16
+ const DEFAULT_API_URL = "https://api.agentwonderland.com";
17
+ // ── Helpers ────────────────────────────────────────────────────────
18
+ function ensureConfigDir() {
19
+ if (!existsSync(CONFIG_DIR)) {
20
+ mkdirSync(CONFIG_DIR, { recursive: true });
21
+ }
22
+ }
23
+ /**
24
+ * Migrate a legacy flat-field config to the new wallet array model.
25
+ * Returns the new Config, and if migration happened, writes it to disk.
26
+ */
27
+ function migrateIfNeeded(raw) {
28
+ // If wallets array already exists, treat as new format
29
+ if (Array.isArray(raw.wallets)) {
30
+ return {
31
+ apiUrl: raw.apiUrl ?? DEFAULT_API_URL,
32
+ apiKey: raw.apiKey ?? null,
33
+ userId: raw.userId ?? null,
34
+ wallets: raw.wallets,
35
+ defaultWallet: raw.defaultWallet ?? null,
36
+ card: raw.card ?? null,
37
+ favorites: raw.favorites ?? [],
38
+ };
39
+ }
40
+ // Build wallets from legacy flat fields
41
+ const wallets = [];
42
+ let defaultWallet = null;
43
+ if (raw.tempoPrivateKey && raw.evmPrivateKey && raw.tempoPrivateKey === raw.evmPrivateKey) {
44
+ // Same key for both — create a single wallet with both chains
45
+ const chains = ["tempo", raw.chain ?? "base"];
46
+ const id = "wallet-1";
47
+ wallets.push({
48
+ id,
49
+ keyType: "evm",
50
+ key: raw.tempoPrivateKey,
51
+ chains: [...new Set(chains)],
52
+ defaultChain: raw.defaultPaymentMethod === "base" ? (raw.chain ?? "base") : "tempo",
53
+ });
54
+ defaultWallet = id;
55
+ }
56
+ else {
57
+ if (raw.tempoPrivateKey) {
58
+ const id = "tempo-1";
59
+ wallets.push({
60
+ id,
61
+ keyType: "evm",
62
+ key: raw.tempoPrivateKey,
63
+ chains: ["tempo"],
64
+ defaultChain: "tempo",
65
+ });
66
+ if (!defaultWallet || raw.defaultPaymentMethod === "tempo")
67
+ defaultWallet = id;
68
+ }
69
+ if (raw.evmPrivateKey) {
70
+ const chain = raw.chain ?? "base";
71
+ const id = "evm-1";
72
+ wallets.push({
73
+ id,
74
+ keyType: "evm",
75
+ key: raw.evmPrivateKey,
76
+ chains: [chain],
77
+ defaultChain: chain,
78
+ });
79
+ if (!defaultWallet || raw.defaultPaymentMethod === "base")
80
+ defaultWallet = id;
81
+ }
82
+ }
83
+ // Migrate card
84
+ let card = null;
85
+ if (raw.stripeConsumerToken && raw.cardLast4) {
86
+ card = {
87
+ consumerToken: raw.stripeConsumerToken,
88
+ paymentMethodId: raw.stripePaymentMethodId ?? undefined,
89
+ last4: raw.cardLast4,
90
+ brand: raw.cardBrand ?? "card",
91
+ };
92
+ }
93
+ // If default payment was card and no wallet default set
94
+ if (raw.defaultPaymentMethod === "card" && !defaultWallet && wallets.length > 0) {
95
+ defaultWallet = wallets[0].id;
96
+ }
97
+ const config = {
98
+ apiUrl: raw.apiUrl ?? DEFAULT_API_URL,
99
+ apiKey: raw.apiKey ?? null,
100
+ userId: raw.userId ?? null,
101
+ wallets,
102
+ defaultWallet,
103
+ card,
104
+ favorites: [],
105
+ };
106
+ // Write migrated config (only if there was something to migrate)
107
+ if (raw.tempoPrivateKey || raw.evmPrivateKey || raw.stripeConsumerToken) {
108
+ ensureConfigDir();
109
+ writeFileSync(CONFIG_FILE, JSON.stringify(config, null, 2) + "\n", "utf-8");
110
+ }
111
+ return config;
112
+ }
113
+ // ── Public API ─────────────────────────────────────────────────────
114
+ export function getConfig() {
115
+ const defaults = {
116
+ apiUrl: DEFAULT_API_URL,
117
+ apiKey: null,
118
+ userId: null,
119
+ wallets: [],
120
+ defaultWallet: null,
121
+ card: null,
122
+ favorites: [],
123
+ };
124
+ if (!existsSync(CONFIG_FILE)) {
125
+ return defaults;
126
+ }
127
+ try {
128
+ const raw = readFileSync(CONFIG_FILE, "utf-8");
129
+ const parsed = JSON.parse(raw);
130
+ return migrateIfNeeded(parsed);
131
+ }
132
+ catch {
133
+ return defaults;
134
+ }
135
+ }
136
+ export function saveConfig(updates) {
137
+ ensureConfigDir();
138
+ const current = getConfig();
139
+ const merged = { ...current, ...updates };
140
+ writeFileSync(CONFIG_FILE, JSON.stringify(merged, null, 2) + "\n", "utf-8");
141
+ }
142
+ export function getApiUrl() {
143
+ const envUrl = process.env.AGENTWONDERLAND_API_URL;
144
+ if (envUrl)
145
+ return envUrl;
146
+ return getConfig().apiUrl;
147
+ }
148
+ export function getApiKey() {
149
+ const envKey = process.env.AGENTWONDERLAND_API_KEY;
150
+ if (envKey)
151
+ return envKey;
152
+ return getConfig().apiKey;
153
+ }
154
+ export function isAuthenticated() {
155
+ return getApiKey() !== null;
156
+ }
157
+ // ── Wallet helpers ─────────────────────────────────────────────────
158
+ /**
159
+ * Get all wallets from config + env var synthetic wallets.
160
+ */
161
+ export function getWallets() {
162
+ const wallets = [...getConfig().wallets];
163
+ // Env var support: TEMPO_PRIVATE_KEY creates a synthetic wallet
164
+ const tempoEnv = process.env.TEMPO_PRIVATE_KEY;
165
+ if (tempoEnv && !wallets.some((w) => w.id === "env-tempo")) {
166
+ wallets.push({
167
+ id: "env-tempo",
168
+ keyType: "evm",
169
+ key: tempoEnv,
170
+ chains: ["tempo"],
171
+ defaultChain: "tempo",
172
+ label: "Tempo (env)",
173
+ });
174
+ }
175
+ // Env var support: EVM_PRIVATE_KEY creates a synthetic wallet
176
+ const evmEnv = process.env.EVM_PRIVATE_KEY;
177
+ if (evmEnv && !wallets.some((w) => w.id === "env-evm")) {
178
+ wallets.push({
179
+ id: "env-evm",
180
+ keyType: "evm",
181
+ key: evmEnv,
182
+ chains: ["base"],
183
+ defaultChain: "base",
184
+ label: "Base (env)",
185
+ });
186
+ }
187
+ return wallets;
188
+ }
189
+ /**
190
+ * Get a wallet by its ID.
191
+ */
192
+ export function getWalletById(id) {
193
+ return getWallets().find((w) => w.id === id);
194
+ }
195
+ /**
196
+ * Get the default wallet. Priority:
197
+ * 1. Configured defaultWallet
198
+ * 2. First wallet in the array
199
+ * 3. First env-var wallet
200
+ */
201
+ export function getDefaultWallet() {
202
+ const wallets = getWallets();
203
+ if (wallets.length === 0)
204
+ return undefined;
205
+ const config = getConfig();
206
+ if (config.defaultWallet) {
207
+ const found = wallets.find((w) => w.id === config.defaultWallet);
208
+ if (found)
209
+ return found;
210
+ }
211
+ return wallets[0];
212
+ }
213
+ /**
214
+ * Add a wallet entry. If a wallet with the same ID exists, replace it.
215
+ */
216
+ export function addWallet(entry) {
217
+ const config = getConfig();
218
+ const existing = config.wallets.findIndex((w) => w.id === entry.id);
219
+ if (existing >= 0) {
220
+ config.wallets[existing] = entry;
221
+ }
222
+ else {
223
+ config.wallets.push(entry);
224
+ }
225
+ // If no default wallet, set this as default
226
+ if (!config.defaultWallet) {
227
+ config.defaultWallet = entry.id;
228
+ }
229
+ saveConfig({ wallets: config.wallets, defaultWallet: config.defaultWallet });
230
+ }
231
+ /**
232
+ * Remove a wallet by ID.
233
+ */
234
+ export function removeWallet(id) {
235
+ const config = getConfig();
236
+ config.wallets = config.wallets.filter((w) => w.id !== id);
237
+ // If we removed the default, pick the first remaining
238
+ if (config.defaultWallet === id) {
239
+ config.defaultWallet = config.wallets[0]?.id ?? null;
240
+ }
241
+ saveConfig({ wallets: config.wallets, defaultWallet: config.defaultWallet });
242
+ }
243
+ /**
244
+ * Get card configuration.
245
+ */
246
+ export function getCardConfig() {
247
+ return getConfig().card;
248
+ }
249
+ /**
250
+ * Resolve a payment method string to a wallet + chain.
251
+ * Accepts: wallet ID, chain name, or "card".
252
+ * Returns null if unresolvable.
253
+ */
254
+ export function resolveWalletAndChain(method) {
255
+ const wallets = getWallets();
256
+ if (!method) {
257
+ // Use default wallet with its default chain
258
+ const def = getDefaultWallet();
259
+ if (!def)
260
+ return null;
261
+ return { wallet: def, chain: def.defaultChain ?? def.chains[0] };
262
+ }
263
+ // Try as wallet ID first
264
+ const byId = wallets.find((w) => w.id === method);
265
+ if (byId) {
266
+ return { wallet: byId, chain: byId.defaultChain ?? byId.chains[0] };
267
+ }
268
+ // Try as chain name
269
+ const byChain = wallets.find((w) => w.chains.includes(method));
270
+ if (byChain) {
271
+ return { wallet: byChain, chain: method };
272
+ }
273
+ return null;
274
+ }
275
+ // ── Favorites helpers ───────────────────────────────────────────────
276
+ export function getFavorites() {
277
+ return getConfig().favorites ?? [];
278
+ }
279
+ export function addFavorite(agentId) {
280
+ const config = getConfig();
281
+ if (!config.favorites)
282
+ config.favorites = [];
283
+ if (!config.favorites.includes(agentId)) {
284
+ config.favorites.push(agentId);
285
+ saveConfig(config);
286
+ }
287
+ }
288
+ export function removeFavorite(agentId) {
289
+ const config = getConfig();
290
+ if (!config.favorites)
291
+ return;
292
+ config.favorites = config.favorites.filter(id => id !== agentId);
293
+ saveConfig(config);
294
+ }
295
+ export function isFavorite(agentId) {
296
+ return getFavorites().includes(agentId);
297
+ }
@@ -0,0 +1,70 @@
1
+ /**
2
+ * Shared display formatters for human-readable MCP and CLI output.
3
+ * Plain text only — no ANSI color codes.
4
+ */
5
+ export declare function stars(rating: number | null | undefined): string;
6
+ export declare function compactNumber(n: number | null | undefined): string;
7
+ export declare function formatBytes(bytes: number): string;
8
+ export declare function isFileOutput(output: unknown): output is {
9
+ type: "file";
10
+ url: string;
11
+ mime_type?: string;
12
+ size_bytes?: number;
13
+ };
14
+ export declare function formatPrice(pricePer1kTokens?: string | null, pricingModel?: string | null): string;
15
+ interface AgentLike {
16
+ id?: string;
17
+ name?: string;
18
+ avgRating?: number | null;
19
+ ratingCount?: number;
20
+ totalExecutions?: number;
21
+ pricePer1kTokens?: string;
22
+ pricingModel?: string;
23
+ stats?: {
24
+ completedJobs?: number;
25
+ avgRating?: number | null;
26
+ };
27
+ [key: string]: unknown;
28
+ }
29
+ export declare function agentLine(agent: AgentLike): string;
30
+ export declare function formatLastActive(lastActiveAt: string | null | undefined): string | null;
31
+ export declare function agentList(agents: AgentLike[], query?: string): string;
32
+ interface RunResultLike {
33
+ job_id?: string;
34
+ status?: string;
35
+ agent_id?: string;
36
+ agent_name?: string;
37
+ output?: unknown;
38
+ latency_ms?: number;
39
+ execution_latency_ms?: number;
40
+ cost?: number;
41
+ estimated_cost?: number;
42
+ input_tokens?: number;
43
+ tags?: string[];
44
+ }
45
+ export declare function formatRunResult(result: RunResultLike, opts?: {
46
+ paymentMethod?: string;
47
+ }): string;
48
+ /**
49
+ * Hint about what output type an agent typically returns, based on its tags.
50
+ * Returns null if no file-related tags found.
51
+ */
52
+ export declare function outputTypeHint(tags?: string[] | null): string | null;
53
+ export declare function agentWebUrl(agentId: string): string;
54
+ export declare function formatFeedbackSummary(stats: Record<string, unknown>): string;
55
+ interface WalletStatusEntry {
56
+ id: string;
57
+ chains: string[];
58
+ address?: string | null;
59
+ label?: string;
60
+ isDefault?: boolean;
61
+ }
62
+ interface WalletInfo {
63
+ wallets: WalletStatusEntry[];
64
+ card?: {
65
+ brand: string;
66
+ last4: string;
67
+ } | null;
68
+ }
69
+ export declare function formatWalletStatus(info: WalletInfo): string;
70
+ export {};