@hpp-io/x402-mcp-bridge 0.0.1 → 0.0.3
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 +125 -77
- package/bin/hpp-x402.js +5 -0
- package/bin/x402-mcp-bridge.js +0 -0
- package/dist/a2a.d.ts +70 -0
- package/dist/a2a.js +210 -0
- package/dist/a2a.js.map +1 -0
- package/dist/autoTopup.d.ts +2 -1
- package/dist/autoTopup.js.map +1 -1
- package/dist/cli/channel.d.ts +1 -0
- package/dist/cli/channel.js +323 -0
- package/dist/cli/channel.js.map +1 -0
- package/dist/cli/hpp-x402.d.ts +2 -0
- package/dist/cli/hpp-x402.js +375 -0
- package/dist/cli/hpp-x402.js.map +1 -0
- package/dist/cli/install-claude-code.d.ts +24 -0
- package/dist/cli/install-claude-code.js +50 -0
- package/dist/cli/install-claude-code.js.map +1 -0
- package/dist/cli/install-claude.d.ts +2 -20
- package/dist/cli/install-claude.js +12 -63
- package/dist/cli/install-claude.js.map +1 -1
- package/dist/cli/install-cursor.d.ts +7 -0
- package/dist/cli/install-cursor.js +26 -0
- package/dist/cli/install-cursor.js.map +1 -0
- package/dist/cli/install-mcp-host.d.ts +35 -0
- package/dist/cli/install-mcp-host.js +82 -0
- package/dist/cli/install-mcp-host.js.map +1 -0
- package/dist/cli/install-openclaw.d.ts +7 -0
- package/dist/cli/install-openclaw.js +28 -0
- package/dist/cli/install-openclaw.js.map +1 -0
- package/dist/cli/install-windsurf.d.ts +7 -0
- package/dist/cli/install-windsurf.js +37 -0
- package/dist/cli/install-windsurf.js.map +1 -0
- package/dist/cli/policy.d.ts +1 -0
- package/dist/cli/policy.js +212 -0
- package/dist/cli/policy.js.map +1 -0
- package/dist/cli/revoke.d.ts +1 -1
- package/dist/cli/revoke.js +1 -5
- package/dist/cli/revoke.js.map +1 -1
- package/dist/cli/safe.d.ts +4172 -9580
- package/dist/cli/setup.d.ts +1 -1
- package/dist/cli/setup.js +24 -6
- package/dist/cli/setup.js.map +1 -1
- package/dist/client.d.ts +25 -10
- package/dist/client.js +139 -2
- package/dist/client.js.map +1 -1
- package/dist/config.d.ts +50 -11
- package/dist/config.js +50 -10
- package/dist/config.js.map +1 -1
- package/dist/discovery.d.ts +43 -0
- package/dist/discovery.js +62 -0
- package/dist/discovery.js.map +1 -0
- package/dist/discoveryTools.d.ts +75 -0
- package/dist/discoveryTools.js +101 -0
- package/dist/discoveryTools.js.map +1 -0
- package/dist/funds/direct-balance.d.ts +27 -0
- package/dist/funds/direct-balance.js +58 -0
- package/dist/funds/direct-balance.js.map +1 -0
- package/dist/funds.d.ts +26 -0
- package/dist/funds.js +2 -0
- package/dist/funds.js.map +1 -0
- package/dist/httpX402.d.ts +45 -0
- package/dist/httpX402.js +214 -0
- package/dist/httpX402.js.map +1 -0
- package/dist/index.js +66 -20
- package/dist/index.js.map +1 -1
- package/dist/keychain.d.ts +23 -0
- package/dist/keychain.js +111 -0
- package/dist/keychain.js.map +1 -0
- package/dist/policy.d.ts +73 -0
- package/dist/policy.js +249 -0
- package/dist/policy.js.map +1 -0
- package/dist/server.d.ts +18 -1
- package/dist/server.js +120 -10
- package/dist/server.js.map +1 -1
- package/docs/policy.md +101 -0
- package/package.json +11 -8
- package/bin/hpp-x402-safe-revoke.js +0 -5
- package/bin/hpp-x402-safe-setup.js +0 -5
|
@@ -0,0 +1,323 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* hpp-x402-channel — inspect / manage local batch-settlement channels.
|
|
3
|
+
*
|
|
4
|
+
* Subcommands:
|
|
5
|
+
*
|
|
6
|
+
* ls List all channels persisted under HPP_X402_HOME.
|
|
7
|
+
* status <channelId> Print full local channel context.
|
|
8
|
+
* refund <url> [amount] Cooperative refund — server co-signs, single
|
|
9
|
+
* multicall(claim + refund) onchain. Immediate.
|
|
10
|
+
* Omit `amount` for a full refund.
|
|
11
|
+
* withdraw <url> [--finalize] Unilateral withdraw — server-free escape hatch.
|
|
12
|
+
* Without --finalize: initiateWithdraw onchain.
|
|
13
|
+
* With --finalize: finalizeWithdraw after
|
|
14
|
+
* the channel's withdrawDelay elapsed.
|
|
15
|
+
*
|
|
16
|
+
* Storage layout matches `FileClientChannelStorage`:
|
|
17
|
+
* {HPP_X402_HOME or ~/.hpp-x402}/client/<channelId>.json
|
|
18
|
+
*
|
|
19
|
+
* Env required for mutating commands (refund, withdraw):
|
|
20
|
+
* AGENT_PRIVATE_KEY payer wallet (0x + 64 hex)
|
|
21
|
+
* HPP_RPC_URL e.g. https://sepolia.hpp.io/<key>
|
|
22
|
+
* HPP_NETWORK CAIP-2 (e.g. eip155:181228)
|
|
23
|
+
* PAYER_SALT optional — bytes32 hex used to derive channelId.
|
|
24
|
+
* Must match the salt the channel was opened with.
|
|
25
|
+
* Defaults to 0x00…0 (SDK default).
|
|
26
|
+
*
|
|
27
|
+
* Usage:
|
|
28
|
+
* hpp-x402-channel ls
|
|
29
|
+
* hpp-x402-channel status 0xe3fd…
|
|
30
|
+
* hpp-x402-channel refund http://localhost:4021/paid/compute/hello-world
|
|
31
|
+
* hpp-x402-channel refund http://localhost:4021/paid/compute/hello-world 5000
|
|
32
|
+
* hpp-x402-channel withdraw http://localhost:4021/paid/compute/hello-world
|
|
33
|
+
* hpp-x402-channel withdraw http://localhost:4021/paid/compute/hello-world --finalize
|
|
34
|
+
*/
|
|
35
|
+
import { homedir } from "node:os";
|
|
36
|
+
import { resolve, join } from "node:path";
|
|
37
|
+
import { readdir } from "node:fs/promises";
|
|
38
|
+
import { FileClientChannelStorage } from "@x402/evm/batch-settlement/client/file-storage";
|
|
39
|
+
import { BatchSettlementEvmScheme } from "@x402/evm/batch-settlement/client";
|
|
40
|
+
import { toClientEvmSigner } from "@x402/evm";
|
|
41
|
+
import { decodePaymentRequiredHeader } from "@x402/core/http";
|
|
42
|
+
import { createPublicClient, createWalletClient, defineChain, http, parseAbi, } from "viem";
|
|
43
|
+
import { privateKeyToAccount } from "viem/accounts";
|
|
44
|
+
const STORAGE_ROOT = process.env.HPP_X402_HOME ?? resolve(homedir(), ".hpp-x402");
|
|
45
|
+
const X402_BATCH_SETTLEMENT = "0x4020074e9dF2ce1deE5A9C1b5c3f541D02a10003";
|
|
46
|
+
const CONTRACT_ABI = parseAbi([
|
|
47
|
+
"function channels(bytes32 channelId) view returns (uint128 balance, uint128 totalClaimed)",
|
|
48
|
+
"function pendingWithdrawals(bytes32 channelId) view returns (uint128 amount, uint40 initiatedAt)",
|
|
49
|
+
"function getChannelId((address payer, address payerAuthorizer, address receiver, address receiverAuthorizer, address token, uint40 withdrawDelay, bytes32 salt) config) view returns (bytes32)",
|
|
50
|
+
"function initiateWithdraw((address payer, address payerAuthorizer, address receiver, address receiverAuthorizer, address token, uint40 withdrawDelay, bytes32 salt) config, uint128 amount)",
|
|
51
|
+
"function finalizeWithdraw((address payer, address payerAuthorizer, address receiver, address receiverAuthorizer, address token, uint40 withdrawDelay, bytes32 salt) config)",
|
|
52
|
+
]);
|
|
53
|
+
function usage() {
|
|
54
|
+
console.error("Usage: hpp-x402-channel <ls|status|refund|withdraw> [args]");
|
|
55
|
+
console.error(" ls List local channels");
|
|
56
|
+
console.error(" status <channelId> Show channel detail");
|
|
57
|
+
console.error(" refund <url> [amount] Cooperative refund (server co-signs)");
|
|
58
|
+
console.error(" withdraw <url> [--finalize] Unilateral withdraw (server-free)");
|
|
59
|
+
process.exit(1);
|
|
60
|
+
}
|
|
61
|
+
function reqEnv(name) {
|
|
62
|
+
const v = process.env[name];
|
|
63
|
+
if (!v || v.length === 0) {
|
|
64
|
+
console.error(`Missing env: ${name}`);
|
|
65
|
+
process.exit(2);
|
|
66
|
+
}
|
|
67
|
+
return v;
|
|
68
|
+
}
|
|
69
|
+
function loadSignerCtx() {
|
|
70
|
+
const key = reqEnv("AGENT_PRIVATE_KEY");
|
|
71
|
+
if (!/^0x[0-9a-fA-F]{64}$/.test(key)) {
|
|
72
|
+
console.error("AGENT_PRIVATE_KEY must be 0x + 64 hex chars");
|
|
73
|
+
process.exit(2);
|
|
74
|
+
}
|
|
75
|
+
const rpcUrl = reqEnv("HPP_RPC_URL");
|
|
76
|
+
const network = reqEnv("HPP_NETWORK");
|
|
77
|
+
if (!/^eip155:\d+$/.test(network)) {
|
|
78
|
+
console.error('HPP_NETWORK must match "eip155:<chainId>"');
|
|
79
|
+
process.exit(2);
|
|
80
|
+
}
|
|
81
|
+
const saltRaw = process.env.PAYER_SALT ?? `0x${"0".repeat(64)}`;
|
|
82
|
+
if (!/^0x[0-9a-fA-F]{64}$/.test(saltRaw)) {
|
|
83
|
+
console.error("PAYER_SALT must be 0x + 64 hex chars");
|
|
84
|
+
process.exit(2);
|
|
85
|
+
}
|
|
86
|
+
const salt = saltRaw;
|
|
87
|
+
const chainId = Number(network.split(":")[1]);
|
|
88
|
+
const account = privateKeyToAccount(key);
|
|
89
|
+
const chain = defineChain({
|
|
90
|
+
id: chainId,
|
|
91
|
+
name: `hpp-${chainId}`,
|
|
92
|
+
nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 },
|
|
93
|
+
rpcUrls: { default: { http: [rpcUrl] } },
|
|
94
|
+
});
|
|
95
|
+
const publicClient = createPublicClient({ chain, transport: http(rpcUrl) });
|
|
96
|
+
return { account, network, chainId, rpcUrl, salt, publicClient };
|
|
97
|
+
}
|
|
98
|
+
async function probeRequirements(url) {
|
|
99
|
+
const r = await fetch(url, { method: "GET" });
|
|
100
|
+
if (r.status !== 402) {
|
|
101
|
+
throw new Error(`probe expected 402, got ${r.status} (server may not advertise this URL)`);
|
|
102
|
+
}
|
|
103
|
+
const header = r.headers.get("PAYMENT-REQUIRED");
|
|
104
|
+
if (!header)
|
|
105
|
+
throw new Error("probe response missing PAYMENT-REQUIRED header");
|
|
106
|
+
const paymentRequired = decodePaymentRequiredHeader(header);
|
|
107
|
+
const requirements = paymentRequired.accepts.find((a) => a.scheme === "batch-settlement");
|
|
108
|
+
if (!requirements)
|
|
109
|
+
throw new Error("server does not advertise batch-settlement on this URL");
|
|
110
|
+
return requirements;
|
|
111
|
+
}
|
|
112
|
+
async function listChannelIds() {
|
|
113
|
+
const clientDir = join(STORAGE_ROOT, "client");
|
|
114
|
+
try {
|
|
115
|
+
const files = await readdir(clientDir);
|
|
116
|
+
return files
|
|
117
|
+
.filter((f) => f.endsWith(".json"))
|
|
118
|
+
.map((f) => f.replace(/\.json$/, ""))
|
|
119
|
+
.sort();
|
|
120
|
+
}
|
|
121
|
+
catch (err) {
|
|
122
|
+
if (err.code === "ENOENT") {
|
|
123
|
+
return [];
|
|
124
|
+
}
|
|
125
|
+
throw err;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
async function cmdLs() {
|
|
129
|
+
const storage = new FileClientChannelStorage({ directory: STORAGE_ROOT });
|
|
130
|
+
const ids = await listChannelIds();
|
|
131
|
+
if (ids.length === 0) {
|
|
132
|
+
console.log(`(no channels under ${STORAGE_ROOT}/client/)`);
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
console.log(`channels in ${STORAGE_ROOT}/client/:\n`);
|
|
136
|
+
for (const id of ids) {
|
|
137
|
+
const ctx = await storage.get(id);
|
|
138
|
+
if (!ctx)
|
|
139
|
+
continue;
|
|
140
|
+
const ch = ctx.channel;
|
|
141
|
+
if (!ch) {
|
|
142
|
+
console.log(` ${id} (no channel record)`);
|
|
143
|
+
continue;
|
|
144
|
+
}
|
|
145
|
+
const balance = String(ch.balance ?? "0");
|
|
146
|
+
const totalClaimed = String(ch.totalClaimed ?? "0");
|
|
147
|
+
const charged = String(ch.chargedCumulativeAmount ?? "0");
|
|
148
|
+
console.log(` ${id}\n` +
|
|
149
|
+
` balance: ${balance} totalClaimed: ${totalClaimed} chargedCumulative: ${charged}`);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
async function cmdStatus(channelId) {
|
|
153
|
+
if (!/^0x[0-9a-fA-F]{64}$/.test(channelId)) {
|
|
154
|
+
console.error("channelId must be 0x + 64 hex chars");
|
|
155
|
+
process.exit(2);
|
|
156
|
+
}
|
|
157
|
+
const storage = new FileClientChannelStorage({ directory: STORAGE_ROOT });
|
|
158
|
+
const ctx = await storage.get(channelId.toLowerCase());
|
|
159
|
+
if (!ctx) {
|
|
160
|
+
console.error(`channel ${channelId} not found under ${STORAGE_ROOT}/client/`);
|
|
161
|
+
process.exit(3);
|
|
162
|
+
}
|
|
163
|
+
console.log(JSON.stringify(ctx, null, 2));
|
|
164
|
+
}
|
|
165
|
+
async function cmdRefund(url, amountArg) {
|
|
166
|
+
if (amountArg !== undefined && !/^\d+$/.test(amountArg)) {
|
|
167
|
+
console.error("amount must be a positive integer (atomic token units)");
|
|
168
|
+
process.exit(2);
|
|
169
|
+
}
|
|
170
|
+
const { account, salt, publicClient } = loadSignerCtx();
|
|
171
|
+
const signer = toClientEvmSigner(account, publicClient);
|
|
172
|
+
// Persistent client storage so this CLI can recover a channel created
|
|
173
|
+
// by another bridge process (Claude Desktop / OpenClaw stdio).
|
|
174
|
+
const storage = new FileClientChannelStorage({ directory: STORAGE_ROOT });
|
|
175
|
+
const scheme = new BatchSettlementEvmScheme(signer, { salt, storage });
|
|
176
|
+
console.log(`refunding channel for ${url}${amountArg ? ` (amount=${amountArg})` : " (full drain)"}…`);
|
|
177
|
+
const settle = await scheme.refund(url, amountArg !== undefined ? { amount: amountArg } : undefined);
|
|
178
|
+
if (!settle.success) {
|
|
179
|
+
console.error(`refund failed: ${settle.errorReason ?? "unknown"} ${settle.errorMessage ?? ""}`);
|
|
180
|
+
process.exit(4);
|
|
181
|
+
}
|
|
182
|
+
console.log(`refund tx: ${settle.transaction}`);
|
|
183
|
+
const extra = settle.extra
|
|
184
|
+
?.channelState;
|
|
185
|
+
if (extra) {
|
|
186
|
+
console.log("post-refund channel state:");
|
|
187
|
+
console.log(JSON.stringify(extra, null, 2));
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
async function cmdWithdraw(url, finalize) {
|
|
191
|
+
const { account, publicClient, chainId, rpcUrl, salt } = loadSignerCtx();
|
|
192
|
+
const signer = toClientEvmSigner(account, publicClient);
|
|
193
|
+
const storage = new FileClientChannelStorage({ directory: STORAGE_ROOT });
|
|
194
|
+
const scheme = new BatchSettlementEvmScheme(signer, { salt, storage });
|
|
195
|
+
const requirements = await probeRequirements(url);
|
|
196
|
+
const channelConfig = scheme.buildChannelConfig(requirements);
|
|
197
|
+
// viem walletClient for the direct onchain writes (initiate / finalize).
|
|
198
|
+
const chain = defineChain({
|
|
199
|
+
id: chainId,
|
|
200
|
+
name: `hpp-${chainId}`,
|
|
201
|
+
nativeCurrency: { name: "Ether", symbol: "ETH", decimals: 18 },
|
|
202
|
+
rpcUrls: { default: { http: [rpcUrl] } },
|
|
203
|
+
});
|
|
204
|
+
const walletClient = createWalletClient({
|
|
205
|
+
chain,
|
|
206
|
+
transport: http(rpcUrl),
|
|
207
|
+
account: account,
|
|
208
|
+
});
|
|
209
|
+
if (!finalize) {
|
|
210
|
+
// initiateWithdraw — amount = onchain balance - charged. Conservative,
|
|
211
|
+
// safe against server claiming up to charged during the delay window.
|
|
212
|
+
// Derive channelId via the contract's view (avoid depending on SDK
|
|
213
|
+
// internal `computeChannelId` whose export path is unstable).
|
|
214
|
+
const channelId = (await publicClient.readContract({
|
|
215
|
+
address: X402_BATCH_SETTLEMENT,
|
|
216
|
+
abi: CONTRACT_ABI,
|
|
217
|
+
functionName: "getChannelId",
|
|
218
|
+
args: [channelConfig],
|
|
219
|
+
}));
|
|
220
|
+
const [balance, _totalClaimed] = (await publicClient.readContract({
|
|
221
|
+
address: X402_BATCH_SETTLEMENT,
|
|
222
|
+
abi: CONTRACT_ABI,
|
|
223
|
+
functionName: "channels",
|
|
224
|
+
args: [channelId],
|
|
225
|
+
}));
|
|
226
|
+
// Read local charged-cumulative from storage.
|
|
227
|
+
const local = await storage.get(channelId.toLowerCase());
|
|
228
|
+
const charged = BigInt(local?.chargedCumulativeAmount ?? "0");
|
|
229
|
+
const withdrawAmount = balance - charged;
|
|
230
|
+
if (withdrawAmount <= 0n) {
|
|
231
|
+
console.error(`nothing to withdraw — balance(${balance}) <= chargedCumulative(${charged})`);
|
|
232
|
+
process.exit(5);
|
|
233
|
+
}
|
|
234
|
+
console.log(`initiateWithdraw amount=${withdrawAmount} (balance ${balance} - charged ${charged})`);
|
|
235
|
+
const txHash = await walletClient.writeContract({
|
|
236
|
+
account: account,
|
|
237
|
+
chain,
|
|
238
|
+
address: X402_BATCH_SETTLEMENT,
|
|
239
|
+
abi: CONTRACT_ABI,
|
|
240
|
+
functionName: "initiateWithdraw",
|
|
241
|
+
args: [channelConfig, withdrawAmount],
|
|
242
|
+
});
|
|
243
|
+
const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash });
|
|
244
|
+
if (receipt.status !== "success") {
|
|
245
|
+
console.error(`initiateWithdraw tx reverted: ${txHash}`);
|
|
246
|
+
process.exit(6);
|
|
247
|
+
}
|
|
248
|
+
console.log(`initiate tx: ${txHash}`);
|
|
249
|
+
const [pendAmount, pendInitAt] = (await publicClient.readContract({
|
|
250
|
+
address: X402_BATCH_SETTLEMENT,
|
|
251
|
+
abi: CONTRACT_ABI,
|
|
252
|
+
functionName: "pendingWithdrawals",
|
|
253
|
+
args: [channelId],
|
|
254
|
+
}));
|
|
255
|
+
const block = await publicClient.getBlock();
|
|
256
|
+
const readyAt = pendInitAt + channelConfig.withdrawDelay;
|
|
257
|
+
const eta = readyAt - Number(block.timestamp);
|
|
258
|
+
console.log(`pendingWithdrawals: amount=${pendAmount} initiatedAt=${pendInitAt}`);
|
|
259
|
+
console.log(`finalize available in ~${eta}s (at block.timestamp >= ${readyAt}). Re-run with --finalize.`);
|
|
260
|
+
return;
|
|
261
|
+
}
|
|
262
|
+
// finalize ----------------------------------------------------------------
|
|
263
|
+
console.log("finalizeWithdraw…");
|
|
264
|
+
const txHash = await walletClient.writeContract({
|
|
265
|
+
account: account,
|
|
266
|
+
chain,
|
|
267
|
+
address: X402_BATCH_SETTLEMENT,
|
|
268
|
+
abi: CONTRACT_ABI,
|
|
269
|
+
functionName: "finalizeWithdraw",
|
|
270
|
+
args: [channelConfig],
|
|
271
|
+
});
|
|
272
|
+
const receipt = await publicClient.waitForTransactionReceipt({ hash: txHash });
|
|
273
|
+
if (receipt.status !== "success") {
|
|
274
|
+
console.error(`finalizeWithdraw tx reverted: ${txHash} (delay not yet elapsed, or amount overshot)`);
|
|
275
|
+
process.exit(6);
|
|
276
|
+
}
|
|
277
|
+
console.log(`finalize tx: ${txHash}`);
|
|
278
|
+
}
|
|
279
|
+
export async function run() {
|
|
280
|
+
const args = process.argv.slice(2);
|
|
281
|
+
const subcmd = args[0];
|
|
282
|
+
switch (subcmd) {
|
|
283
|
+
case "ls":
|
|
284
|
+
await cmdLs();
|
|
285
|
+
break;
|
|
286
|
+
case "status":
|
|
287
|
+
if (!args[1]) {
|
|
288
|
+
console.error("status requires a channelId argument");
|
|
289
|
+
usage();
|
|
290
|
+
}
|
|
291
|
+
await cmdStatus(args[1]);
|
|
292
|
+
break;
|
|
293
|
+
case "refund":
|
|
294
|
+
if (!args[1]) {
|
|
295
|
+
console.error("refund requires a <url> argument");
|
|
296
|
+
usage();
|
|
297
|
+
}
|
|
298
|
+
await cmdRefund(args[1], args[2]);
|
|
299
|
+
break;
|
|
300
|
+
case "withdraw": {
|
|
301
|
+
if (!args[1]) {
|
|
302
|
+
console.error("withdraw requires a <url> argument");
|
|
303
|
+
usage();
|
|
304
|
+
}
|
|
305
|
+
const finalize = args.includes("--finalize");
|
|
306
|
+
await cmdWithdraw(args[1], finalize);
|
|
307
|
+
break;
|
|
308
|
+
}
|
|
309
|
+
case "topup":
|
|
310
|
+
console.error("topup is not yet implemented (needs ERC-3009 deposit signing flow). " +
|
|
311
|
+
"See https://github.com/hpp-io/noosphere-x402-server/issues/9");
|
|
312
|
+
process.exit(64);
|
|
313
|
+
break;
|
|
314
|
+
case "--help":
|
|
315
|
+
case "-h":
|
|
316
|
+
case undefined:
|
|
317
|
+
usage();
|
|
318
|
+
default:
|
|
319
|
+
console.error(`unknown subcommand: ${subcmd}`);
|
|
320
|
+
usage();
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
//# sourceMappingURL=channel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"channel.js","sourceRoot":"","sources":["../../src/cli/channel.ts"],"names":[],"mappings":"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"}
|