@paybox-sh/sdk 2.2.0 → 2.4.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 +16 -7
- package/SKILL.md +49 -19
- package/dist/{chunk-DWDC6W5P.js → chunk-ACNRTJGL.js} +66 -6
- package/dist/chunk-ACNRTJGL.js.map +1 -0
- package/dist/cli.js +159 -299
- package/dist/cli.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-DWDC6W5P.js.map +0 -1
package/README.md
CHANGED
|
@@ -30,11 +30,11 @@ computer with no connector screen — not the grok.com MCP connector path.
|
|
|
30
30
|
|
|
31
31
|
```bash
|
|
32
32
|
# Setup is two commands. `login` authenticates; `connect` pairs a signing key.
|
|
33
|
-
# Pairing prints
|
|
34
|
-
#
|
|
35
|
-
# so there is nothing to copy. Neither command needs a browser on the
|
|
36
|
-
# running the CLI — approve both from a phone if you like. Add --no-open
|
|
37
|
-
# either command to print the link without launching a browser.
|
|
33
|
+
# Pairing prints a two-digit number and a link; you open the link and pick that
|
|
34
|
+
# same number in PayBox. The key is generated locally and never leaves this
|
|
35
|
+
# machine, so there is nothing to copy. Neither command needs a browser on the
|
|
36
|
+
# machine running the CLI — approve both from a phone if you like. Add --no-open
|
|
37
|
+
# to either command to print the link without launching a browser.
|
|
38
38
|
paybox login # device-code OAuth (browser + passkey)
|
|
39
39
|
paybox login --key pbx_live_… # personal API key instead (no OAuth)
|
|
40
40
|
paybox connect # pair a signing key
|
|
@@ -73,11 +73,18 @@ paybox --json credentials # machine-readable output on any comma
|
|
|
73
73
|
```
|
|
74
74
|
|
|
75
75
|
`version`/`update`/`uninstall` are conveniences over npm: `update` runs
|
|
76
|
-
`npm i -g @paybox-sh/sdk@latest`
|
|
76
|
+
`npm i -g @paybox-sh/sdk@latest` against the same registry `version` checks
|
|
77
|
+
(use `--print` to just show it); `uninstall`
|
|
77
78
|
clears `~/.config/paybox` and prints the `npm rm -g` line (a package can't remove
|
|
78
79
|
its own binary). For project installs use `pnpm up`/`pnpm rm`, or `npx
|
|
79
80
|
@paybox-sh/sdk@latest` to always run the latest without installing.
|
|
80
81
|
|
|
82
|
+
A global install also updates itself: at most once a day, before a command, the
|
|
83
|
+
CLI checks npm. When a newer version in the same major exists, it installs it,
|
|
84
|
+
prints one line to stderr, and runs the same command again with the new version.
|
|
85
|
+
Stdout does not change. Project installs, `npx`, and new major versions get a
|
|
86
|
+
stderr notice instead. Set `PAYBOX_NO_AUTO_UPDATE=1` to turn it off.
|
|
87
|
+
|
|
81
88
|
`sign`, `swap`, `pay-x402`, and `use-service` can complete in-process with a
|
|
82
89
|
configured `pbxk1.` key. Plugin calls return the raw MCP tool result.
|
|
83
90
|
|
|
@@ -215,6 +222,8 @@ Resolution order: explicit constructor options → environment → stored config
|
|
|
215
222
|
| `PAYBOX_ACCESS_TOKEN` | A raw OAuth access token. |
|
|
216
223
|
| `PAYBOX_SIGNING_KEY` | A `pbxk1.` wallet signing key (enables sign/swap). |
|
|
217
224
|
| `PAYBOX_CONFIG_DIR` | Override the config dir (default `~/.config/paybox`). |
|
|
225
|
+
| `PAYBOX_NO_AUTO_UPDATE` | `1` turns off the daily self-update of a global install. |
|
|
226
|
+
| `PAYBOX_UPDATE_REGISTRY` | Registry the self-update checks and installs from (default `https://registry.npmjs.org`). Project `.npmrc` and `npm_config_registry` are ignored. |
|
|
218
227
|
|
|
219
228
|
`paybox login` writes `~/.config/paybox/config.json` (mode `0600` on
|
|
220
229
|
macOS/Linux). On Windows the POSIX mode bits don't restrict access — the file
|
|
@@ -230,7 +239,7 @@ once ahead of time **as the identity CI will use**, then carry both secrets:
|
|
|
230
239
|
# On a laptop. The pbx_live_ key comes from the PayBox app (Agents → create an
|
|
231
240
|
# agent, pick its wallets); it is shown once.
|
|
232
241
|
paybox login --key pbx_live_… # authenticate as the client CI will use
|
|
233
|
-
paybox connect # pick the
|
|
242
|
+
paybox connect # pick the number; approve on any device
|
|
234
243
|
grep signingKey ~/.config/paybox/config.json
|
|
235
244
|
```
|
|
236
245
|
|
package/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: PayBox CLI setup
|
|
3
|
-
version: 0.8.
|
|
3
|
+
version: 0.8.15
|
|
4
4
|
description: >-
|
|
5
5
|
Use PayBox to pay, sign, swap, or check wallet balances, including CLI setup
|
|
6
6
|
when needed. Use when the user requests these wallet actions without choosing
|
|
@@ -20,20 +20,27 @@ Keep the requested action, amount, asset, network, and recipient.
|
|
|
20
20
|
Ask for missing details before a money operation.
|
|
21
21
|
Selecting PayBox does not authorize spending, signing, funding, or changing grants.
|
|
22
22
|
|
|
23
|
-
Follow **Which host** below first. For CLI tasks,
|
|
24
|
-
|
|
23
|
+
Follow **Which host** below first. For CLI tasks, run `paybox --json version`
|
|
24
|
+
first in every session. If `updateAvailable` is `true` and `latest` has the
|
|
25
|
+
same major version as `version`, run `paybox update`, check the new `version`,
|
|
26
|
+
and continue without a question. For a new major version, tell the user and
|
|
27
|
+
continue on the current one. Updating keeps the
|
|
28
|
+
login and the signing key. If `latest` is `null`, continue. Then run
|
|
29
|
+
`paybox --json whoami`.
|
|
25
30
|
This command reports local configuration. It does not verify remote access.
|
|
26
31
|
The setup sections below apply only to the missing steps identified here.
|
|
27
32
|
|
|
28
33
|
- If authentication is configured, run `paybox --json credentials` to verify access
|
|
29
34
|
and find the granted wallet. Use its credential ID, not its name.
|
|
30
|
-
- If authentication is absent, follow the login flow below. Install the CLI
|
|
31
|
-
if it is
|
|
35
|
+
- If authentication is absent, follow the login flow below. Install the CLI if
|
|
36
|
+
it is missing and update it if it is outdated. Do not replace an existing
|
|
37
|
+
configuration.
|
|
32
38
|
- If access works but local signing is needed and `canSign` is false, run
|
|
33
39
|
`paybox connect`. Do not repeat login. Read-only tasks do not require pairing.
|
|
34
40
|
- If no suitable wallet is granted, run `paybox account-change` with a short
|
|
35
41
|
reason in `--note`. Share its `manage_url`, then check credentials again after
|
|
36
42
|
the user confirms. The CLI cannot create wallets. Creation happens in the app.
|
|
43
|
+
Then apply **Re-pair for a new wallet** before you report the wallet ready.
|
|
37
44
|
- If access fails, report the specific blocker. Do not interpret a network error
|
|
38
45
|
as missing authentication or start repeated login attempts.
|
|
39
46
|
|
|
@@ -59,11 +66,11 @@ When the user says "install PayBox" and you are Muse, Grok Bot, or running on a
|
|
|
59
66
|
computer, start here immediately.
|
|
60
67
|
|
|
61
68
|
The user asks to install PayBox. Two things need them: they approve wallet
|
|
62
|
-
access on the PayBox page, and they confirm one
|
|
63
|
-
yours.
|
|
69
|
+
access on the PayBox page, and they confirm one two-digit number. Everything
|
|
70
|
+
else is yours.
|
|
64
71
|
|
|
65
72
|
No secret ever passes through chat. The signing key is generated on the machine
|
|
66
|
-
running the CLI and stays there; what you show the user is
|
|
73
|
+
running the CLI and stays there; what you show the user is a two-digit number
|
|
67
74
|
derived from its public half, which is safe to put in a transcript.
|
|
68
75
|
|
|
69
76
|
## Host capabilities
|
|
@@ -200,26 +207,27 @@ previous client. Ignore it.
|
|
|
200
207
|
|
|
201
208
|
Skip this step for read-only tasks. For setup-only requests or tasks that need
|
|
202
209
|
local signing, run `paybox connect --no-open` when `canSign` is false.
|
|
203
|
-
Login does not pair for you. The CLI prints
|
|
210
|
+
Login does not pair for you. The CLI prints a two-digit number and a link to
|
|
211
|
+
stderr:
|
|
204
212
|
|
|
205
213
|
```
|
|
206
|
-
|
|
207
|
-
Open this on any device and pick that
|
|
214
|
+
47
|
|
215
|
+
Open this on any device and pick that number to connect this machine:
|
|
208
216
|
https://app.paybox.sh/agent-key?client_id=…&pairing_id=…
|
|
209
217
|
```
|
|
210
218
|
|
|
211
219
|
Send **one** message seconds after Step 1 completes, titled **Connect your
|
|
212
|
-
signing key**: the
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
220
|
+
signing key**: the number exactly as printed and the printed link in the same
|
|
221
|
+
message. Never reuse the sample number above. PayBox shows three numbers and the
|
|
222
|
+
user picks yours. Use the printed URL verbatim, since it carries the
|
|
223
|
+
`pairing_id` and the `client_id` comes from the server.
|
|
216
224
|
|
|
217
225
|
Do not `Start-Process`, `open`, `rundll32`, or `xdg-open` any of these URLs
|
|
218
226
|
yourself. `connect` polls and returns on its own. Do not send the link twice and
|
|
219
227
|
do not re-run `connect` while one is polling: a second pairing invalidates the
|
|
220
|
-
|
|
228
|
+
number on screen.
|
|
221
229
|
|
|
222
|
-
Never ask for the key itself and never accept one. The
|
|
230
|
+
Never ask for the key itself and never accept one. The number is safe to
|
|
223
231
|
send; a `pbxk1.` value is not. The key is generated on the machine running the
|
|
224
232
|
CLI and PayBox never holds it. `PAYBOX_SIGNING_KEY` is only for headless runs
|
|
225
233
|
that reuse a key paired elsewhere, and no flag takes a key, because an argument
|
|
@@ -237,6 +245,26 @@ requests or local signing, `canSign` must be `true`. If pairing is incomplete,
|
|
|
237
245
|
do not report readiness or start a signing operation. If the user denied
|
|
238
246
|
pairing or setup failed, report the blocker and stop.
|
|
239
247
|
|
|
248
|
+
### Re-pair for a new wallet
|
|
249
|
+
|
|
250
|
+
A signing key covers only the wallets granted when it was paired. `canSign`
|
|
251
|
+
stays `true` after the user adds a wallet, so do not rely on it. Re-pair when:
|
|
252
|
+
|
|
253
|
+
- a wallet in `paybox --json credentials` has `signer_status` other than `ready`;
|
|
254
|
+
- a sign or swap fails with `reason: "signer_wallet_not_authorized"`;
|
|
255
|
+
- the user says they added a wallet.
|
|
256
|
+
|
|
257
|
+
Run `paybox connect --no-open` at once, without a question. Send the number and
|
|
258
|
+
the link in one message, wait for `connect` to finish, then run
|
|
259
|
+
`paybox --json credentials` and confirm that the wallet is `ready`. Never send
|
|
260
|
+
the user to regenerate a token, to the grant page, or to the dashboard. If the
|
|
261
|
+
user will add more than one wallet, ask them to add all of them first and
|
|
262
|
+
re-pair once.
|
|
263
|
+
|
|
264
|
+
If the pairing page does not show what `connect` printed, such as emoji instead
|
|
265
|
+
of a number, the CLI is outdated: stop that `connect`, run `paybox update`, and
|
|
266
|
+
run `paybox connect --no-open` again.
|
|
267
|
+
|
|
240
268
|
## Setup messages
|
|
241
269
|
|
|
242
270
|
Send only the message for each missing step. No "Installing", "Opening", "Got
|
|
@@ -372,9 +400,9 @@ Do not switch to staging. Do not report the dollar as sent.
|
|
|
372
400
|
- The user had to prompt you after approving wallet access, and you did not
|
|
373
401
|
resume the same attempt.
|
|
374
402
|
- A browser opened before the user had the link.
|
|
375
|
-
- The pairing
|
|
403
|
+
- The pairing number waited minutes after they finished Authorize wallets.
|
|
376
404
|
- You rebuilt the pairing URL instead of relaying the one `connect` printed.
|
|
377
|
-
- You sent a
|
|
405
|
+
- You sent a number from an earlier `connect` run, or the sample number.
|
|
378
406
|
- You asked the user for the signing key, or accepted one they offered.
|
|
379
407
|
- You sent a link twice, or re-ran `login` or `connect` while one was running.
|
|
380
408
|
- You launched authorize, connect, or agent-key with a local open command.
|
|
@@ -389,4 +417,6 @@ Do not switch to staging. Do not report the dollar as sent.
|
|
|
389
417
|
- You told the user PayBox is unavailable on this host.
|
|
390
418
|
- You started login in a group chat where `group_login` is no.
|
|
391
419
|
- You claimed signing readiness before `canSign` was true.
|
|
420
|
+
- You called a new wallet ready before its `signer_status` was `ready`.
|
|
421
|
+
- You sent the user to regenerate a token or to the grant page to fix signing.
|
|
392
422
|
- A setup-only Welcome replaced or interrupted a task the user already asked for.
|
|
@@ -372,7 +372,7 @@ import { Buffer as Buffer2 } from "buffer";
|
|
|
372
372
|
import nacl from "tweetnacl";
|
|
373
373
|
import { MoonXEvmSigner, EvmSchemeMismatchError } from "@moon-x/evm-adapter";
|
|
374
374
|
import { MoonXSolanaSigner, SolanaSchemeMismatchError } from "@moon-x/solana-adapter";
|
|
375
|
-
import { Transaction, VersionedTransaction } from "@solana/web3.js";
|
|
375
|
+
import { PublicKey, Transaction, VersionedTransaction } from "@solana/web3.js";
|
|
376
376
|
import { hashTypedData, keccak256, serializeTransaction } from "viem";
|
|
377
377
|
function parseWireU128(value, field) {
|
|
378
378
|
if (value === void 0 || value === null) {
|
|
@@ -445,8 +445,42 @@ function buildEnvelope(rawSigningPayloadHex, binding, creds) {
|
|
|
445
445
|
function eip1559SigningHash(tx) {
|
|
446
446
|
return keccak256(serializeTransaction(reviveTx(tx)));
|
|
447
447
|
}
|
|
448
|
+
var SOLANA_V1_PREFIX = 129;
|
|
449
|
+
var SOLANA_SIGNATURE_BYTES = 64;
|
|
450
|
+
var SOLANA_V1_FEE_PAYER_OFFSET = 42;
|
|
451
|
+
var SOLANA_PUBKEY_BYTES = 32;
|
|
452
|
+
function solanaV1Message(raw) {
|
|
453
|
+
const signatureCount = raw[1];
|
|
454
|
+
if (!signatureCount || raw.length <= signatureCount * SOLANA_SIGNATURE_BYTES) {
|
|
455
|
+
throw new Error("solana v1 tx has no signature slots");
|
|
456
|
+
}
|
|
457
|
+
return raw.subarray(0, raw.length - signatureCount * SOLANA_SIGNATURE_BYTES);
|
|
458
|
+
}
|
|
459
|
+
async function signSolanaV1(raw, address, sign) {
|
|
460
|
+
if (raw[1] !== 1) {
|
|
461
|
+
throw new Error("solana v1 transactions with more than one signer are not supported");
|
|
462
|
+
}
|
|
463
|
+
const feePayer = new PublicKey(
|
|
464
|
+
raw.subarray(SOLANA_V1_FEE_PAYER_OFFSET, SOLANA_V1_FEE_PAYER_OFFSET + SOLANA_PUBKEY_BYTES)
|
|
465
|
+
);
|
|
466
|
+
if (!feePayer.equals(new PublicKey(address))) {
|
|
467
|
+
throw new Error("solana v1 transaction signer is not the wallet address");
|
|
468
|
+
}
|
|
469
|
+
const message = solanaV1Message(raw);
|
|
470
|
+
const signature = await sign(message);
|
|
471
|
+
if (signature.length !== SOLANA_SIGNATURE_BYTES) {
|
|
472
|
+
throw new Error("the signing service returned an Ed25519 signature that is not 64 bytes");
|
|
473
|
+
}
|
|
474
|
+
const signed = new Uint8Array(message.length + SOLANA_SIGNATURE_BYTES);
|
|
475
|
+
signed.set(message);
|
|
476
|
+
signed.set(signature, message.length);
|
|
477
|
+
return signed;
|
|
478
|
+
}
|
|
448
479
|
function solanaSigningPayload(base64Tx) {
|
|
449
480
|
const raw = Buffer2.from(base64Tx, "base64");
|
|
481
|
+
if (raw[0] === SOLANA_V1_PREFIX) {
|
|
482
|
+
return bytesToHex(new Uint8Array(solanaV1Message(raw)));
|
|
483
|
+
}
|
|
450
484
|
let i = 0;
|
|
451
485
|
let sigCount = 0;
|
|
452
486
|
let shift = 0;
|
|
@@ -479,7 +513,7 @@ function buildSwapEnvelopes(txs, binding, creds) {
|
|
|
479
513
|
);
|
|
480
514
|
}
|
|
481
515
|
return txs.map((t) => {
|
|
482
|
-
const payload2 = t.vm === "solana" ? solanaSigningPayload(t.transaction) : eip1559SigningHash(t.transaction);
|
|
516
|
+
const payload2 = t.vm === "eip712" ? eip712SigningHash(t.transaction) : t.vm === "solana" ? solanaSigningPayload(t.transaction) : eip1559SigningHash(t.transaction);
|
|
483
517
|
const { signed_body, agent_signature } = buildEnvelope(payload2, binding, creds);
|
|
484
518
|
return { api_pub: creds.apiPubHex, signed_body, agent_signature };
|
|
485
519
|
});
|
|
@@ -597,6 +631,14 @@ async function signIntent(intent, creds, binding, transport) {
|
|
|
597
631
|
return { ok: true, artifact: { signature: bytesToHex(sig) } };
|
|
598
632
|
}
|
|
599
633
|
case "solanaTransaction": {
|
|
634
|
+
const raw = Buffer2.from(intent.transactionBase64, "base64");
|
|
635
|
+
if (raw[0] === SOLANA_V1_PREFIX) {
|
|
636
|
+
const signed2 = await signSolanaV1(raw, intent.address, ed25519Sign);
|
|
637
|
+
return {
|
|
638
|
+
ok: true,
|
|
639
|
+
artifact: { signedTransactionBase64: Buffer2.from(signed2).toString("base64") }
|
|
640
|
+
};
|
|
641
|
+
}
|
|
600
642
|
const tx = deserializeSolanaTx(intent.transactionBase64);
|
|
601
643
|
const signed = await new MoonXSolanaSigner(ed25519Sign, intent.address).signTransaction(
|
|
602
644
|
tx
|
|
@@ -649,12 +691,16 @@ async function resolveBinding(post, requestId2, creds) {
|
|
|
649
691
|
}
|
|
650
692
|
async function signWalletRequest(post, requestId2, intent, creds, binding) {
|
|
651
693
|
const resolved = binding && binding.key_id && binding.derivation_path ? toBinding(binding) : await resolveBinding(post, requestId2, creds);
|
|
694
|
+
let rejected;
|
|
652
695
|
const transport = (envelope) => post(`/agent/requests/${requestId2}/moonx-sign`, {
|
|
653
696
|
api_pub: creds.apiPubHex,
|
|
654
697
|
...envelope
|
|
698
|
+
}).catch((err) => {
|
|
699
|
+
rejected = err;
|
|
700
|
+
throw err;
|
|
655
701
|
});
|
|
656
702
|
const result = await signIntent(intent, creds, resolved, transport);
|
|
657
|
-
if (!result.ok) throw new Error(result.error);
|
|
703
|
+
if (!result.ok) throw rejected ?? new Error(result.error);
|
|
658
704
|
await post(`/agent/requests/${requestId2}/signature`, { artifact: result.artifact });
|
|
659
705
|
return result.artifact;
|
|
660
706
|
}
|
|
@@ -1044,13 +1090,26 @@ function signingResultForResponse(result, response) {
|
|
|
1044
1090
|
function didNotHappen(r) {
|
|
1045
1091
|
return r?.status === "denied" || r?.status === "error";
|
|
1046
1092
|
}
|
|
1093
|
+
var SIGNER_WALLET_NOT_AUTHORIZED = "agent signer is not authorized for this wallet";
|
|
1094
|
+
function serverError(body) {
|
|
1095
|
+
try {
|
|
1096
|
+
return JSON.parse(body)?.error;
|
|
1097
|
+
} catch {
|
|
1098
|
+
return void 0;
|
|
1099
|
+
}
|
|
1100
|
+
}
|
|
1047
1101
|
var PayboxError = class extends Error {
|
|
1048
1102
|
constructor(status, body, context) {
|
|
1049
|
-
|
|
1103
|
+
const unauthorized = status === 403 && serverError(body) === SIGNER_WALLET_NOT_AUTHORIZED;
|
|
1104
|
+
super(
|
|
1105
|
+
unauthorized ? "The signing key on this machine is not authorized for this wallet. Run `paybox connect` to pair a key that covers it, then retry." : `paybox ${context} failed (${status}): ${body}`
|
|
1106
|
+
);
|
|
1050
1107
|
this.status = status;
|
|
1051
1108
|
this.body = body;
|
|
1052
1109
|
this.name = "PayboxError";
|
|
1110
|
+
if (unauthorized) this.reason = "signer_wallet_not_authorized";
|
|
1053
1111
|
}
|
|
1112
|
+
reason;
|
|
1054
1113
|
};
|
|
1055
1114
|
var PayboxClient = class _PayboxClient {
|
|
1056
1115
|
baseUrl;
|
|
@@ -1311,7 +1370,8 @@ var PayboxClient = class _PayboxClient {
|
|
|
1311
1370
|
async signWithReconcile(requestId2, sign) {
|
|
1312
1371
|
try {
|
|
1313
1372
|
await sign();
|
|
1314
|
-
} catch {
|
|
1373
|
+
} catch (err) {
|
|
1374
|
+
if (err instanceof PayboxError && err.reason) throw err;
|
|
1315
1375
|
const reconciled = await this.getRequest(requestId2);
|
|
1316
1376
|
if (reconciled.status !== "pending_signature") return;
|
|
1317
1377
|
await sign();
|
|
@@ -1509,4 +1569,4 @@ export {
|
|
|
1509
1569
|
PayboxError,
|
|
1510
1570
|
PayboxClient
|
|
1511
1571
|
};
|
|
1512
|
-
//# sourceMappingURL=chunk-
|
|
1572
|
+
//# sourceMappingURL=chunk-ACNRTJGL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/auth.ts","../src/config.ts","../src/next-action.ts","../src/pending-funding.ts","../node_modules/.pnpm/@paybox+mcp-app@file+..+mcp-app_@modelcontextprotocol+sdk@1.29.0_zod@4.4.3__bn.js@5.2.3_ac1e09a20c76a1143611be5dd3d4f9db/node_modules/@paybox/mcp-app/src/signing/creds.ts","../node_modules/.pnpm/@paybox+mcp-app@file+..+mcp-app_@modelcontextprotocol+sdk@1.29.0_zod@4.4.3__bn.js@5.2.3_ac1e09a20c76a1143611be5dd3d4f9db/node_modules/@paybox/mcp-app/src/signing/sign.ts","../src/signer.ts","../src/mcp.ts","../src/execution.ts","../src/plugins/signing.ts","../src/client.ts"],"sourcesContent":["\nimport { spawn } from \"node:child_process\";\nimport { createHash, randomBytes } from \"node:crypto\";\nimport { createServer } from \"node:http\";\nimport type { AddressInfo } from \"node:net\";\n\nimport type { OAuthTokens } from \"./config.js\";\n\nexport function mcpResource(baseUrl: string): string {\n return `${baseUrl.replace(/\\/+$/, \"\")}/mcp`;\n}\n\nexport function appBaseFrom(baseUrl: string, override?: string): string | null {\n if (override) return override.replace(/\\/+$/, \"\");\n const m = baseUrl.replace(/\\/+$/, \"\").match(/^(https?:\\/\\/)api\\.(.+)$/);\n return m ? `${m[1]}app.${m[2]}` : null;\n}\n\nexport function agentClientId(accessToken: string): string | null {\n const payload = accessToken.split(\".\")[1];\n if (!payload) return null;\n try {\n const claims = JSON.parse(Buffer.from(payload, \"base64url\").toString(\"utf8\")) as {\n cid?: string;\n };\n return claims.cid ?? null;\n } catch {\n return null;\n }\n}\n\ninterface AsMetadata {\n registration_endpoint: string;\n authorization_endpoint: string;\n token_endpoint: string;\n device_authorization_endpoint?: string;\n}\n\nasync function metadata(baseUrl: string): Promise<AsMetadata> {\n const url = `${baseUrl.replace(/\\/+$/, \"\")}/.well-known/oauth-authorization-server`;\n const res = await fetch(url);\n if (!res.ok) {\n throw new Error(`could not read OAuth metadata from ${url} (${res.status})`);\n }\n return (await res.json()) as AsMetadata;\n}\n\nfunction base64url(b: Buffer): string {\n return b.toString(\"base64url\");\n}\n\nfunction pkce(): { verifier: string; challenge: string } {\n const verifier = base64url(randomBytes(32));\n const challenge = base64url(createHash(\"sha256\").update(verifier).digest());\n return { verifier, challenge };\n}\n\nexport function openBrowser(url: string): void {\n const [cmd, args] =\n process.platform === \"darwin\"\n ? ([\"open\", [url]] as const)\n : process.platform === \"win32\"\n ? ([\"rundll32\", [\"url.dll,FileProtocolHandler\", url]] as const)\n : ([\"xdg-open\", [url]] as const);\n try {\n spawn(cmd, [...args], { stdio: \"ignore\", detached: true }).unref();\n } catch {\n }\n}\n\nconst CALLBACK_PAGE =\n \"<!doctype html><meta charset=utf-8><title>PayBox</title>\" +\n \"<body style=\\\"font:16px system-ui;padding:3rem;text-align:center\\\">\" +\n \"<h2>PayBox CLI connected</h2><p>You can close this tab and return to the terminal.</p>\";\n\nexport interface LoginOptions {\n scope?: string;\n clientName?: string;\n log?: (msg: string) => void;\n timeoutMs?: number;\n open?: boolean;\n}\n\nexport async function loginLoopback(\n baseUrl: string,\n opts: LoginOptions = {},\n): Promise<OAuthTokens> {\n const scope = opts.scope ?? \"mcp offline_access\";\n const clientName = opts.clientName ?? \"PayBox CLI\";\n const log = opts.log ?? ((m: string) => console.error(m));\n const meta = await metadata(baseUrl);\n const resource = mcpResource(baseUrl);\n\n let resolveCode: (v: { code: string; state: string | null }) => void;\n let rejectCode: (e: Error) => void;\n const codePromise = new Promise<{ code: string; state: string | null }>((res, rej) => {\n resolveCode = res;\n rejectCode = rej;\n });\n\n const server = createServer((req, res) => {\n const u = new URL(req.url ?? \"/\", \"http://127.0.0.1\");\n if (u.pathname !== \"/callback\") {\n res.writeHead(404).end();\n return;\n }\n res.writeHead(200, { \"content-type\": \"text/html\" }).end(CALLBACK_PAGE);\n const code = u.searchParams.get(\"code\");\n if (code) resolveCode({ code, state: u.searchParams.get(\"state\") });\n else rejectCode(new Error(u.searchParams.get(\"error\") ?? \"authorization failed\"));\n });\n await new Promise<void>((r) => server.listen(0, \"127.0.0.1\", r));\n const port = (server.address() as AddressInfo).port;\n const redirectUri = `http://127.0.0.1:${port}/callback`;\n\n const timeoutMs = opts.timeoutMs ?? 300_000;\n const timer = setTimeout(\n () => rejectCode(new Error(`login timed out after ${Math.round(timeoutMs / 1000)}s — no approval received`)),\n timeoutMs,\n );\n timer.unref();\n\n try {\n const reg = await fetch(meta.registration_endpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n client_name: clientName,\n redirect_uris: [redirectUri],\n token_endpoint_auth_method: \"none\",\n grant_types: [\"authorization_code\", \"refresh_token\"],\n response_types: [\"code\"],\n }),\n });\n if (!reg.ok) throw new Error(`client registration failed (${reg.status}): ${await reg.text()}`);\n const { client_id: clientId } = (await reg.json()) as { client_id: string };\n\n const { verifier, challenge } = pkce();\n const state = base64url(randomBytes(16));\n const authUrl =\n `${meta.authorization_endpoint}?response_type=code` +\n `&client_id=${encodeURIComponent(clientId)}` +\n `&redirect_uri=${encodeURIComponent(redirectUri)}` +\n `&code_challenge=${challenge}&code_challenge_method=S256` +\n `&scope=${encodeURIComponent(scope)}` +\n `&state=${state}&resource=${encodeURIComponent(resource)}`;\n\n log(`Opening your browser to approve access:\\n ${authUrl}\\n`);\n openBrowser(authUrl);\n\n const { code, state: returnedState } = await codePromise;\n if (returnedState !== state) throw new Error(\"OAuth state mismatch — aborting\");\n\n const form = new URLSearchParams({\n grant_type: \"authorization_code\",\n code,\n redirect_uri: redirectUri,\n client_id: clientId,\n code_verifier: verifier,\n resource,\n });\n const tok = await fetch(meta.token_endpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body: form,\n });\n if (!tok.ok) throw new Error(`token exchange failed (${tok.status}): ${await tok.text()}`);\n const t = (await tok.json()) as {\n access_token: string;\n refresh_token?: string;\n expires_in?: number;\n };\n return {\n clientId,\n accessToken: t.access_token,\n refreshToken: t.refresh_token,\n expiresAt: t.expires_in ? Date.now() + t.expires_in * 1000 : undefined,\n resource,\n };\n } finally {\n clearTimeout(timer);\n server.close();\n }\n}\n\nexport async function loginDevice(\n baseUrl: string,\n opts: LoginOptions = {},\n): Promise<OAuthTokens> {\n const scope = opts.scope ?? \"mcp offline_access\";\n const clientName = opts.clientName ?? \"PayBox CLI\";\n const log = opts.log ?? ((m: string) => console.error(m));\n const meta = await metadata(baseUrl);\n if (!meta.device_authorization_endpoint) {\n throw new Error(\n \"this PayBox API does not advertise device_authorization_endpoint — upgrade the API and retry `paybox login`\",\n );\n }\n const resource = mcpResource(baseUrl);\n\n const reg = await fetch(meta.registration_endpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({\n client_name: clientName,\n redirect_uris: [\"http://127.0.0.1/device\"],\n token_endpoint_auth_method: \"none\",\n grant_types: [\"urn:ietf:params:oauth:grant-type:device_code\", \"refresh_token\"],\n response_types: [\"code\"],\n scope,\n }),\n });\n if (!reg.ok) throw new Error(`client registration failed (${reg.status}): ${await reg.text()}`);\n const { client_id: clientId } = (await reg.json()) as { client_id: string };\n\n const started = await fetch(meta.device_authorization_endpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({ client_id: clientId, scope, resource }),\n });\n if (!started.ok) {\n throw new Error(`device authorization failed (${started.status}): ${await started.text()}`);\n }\n const da = (await started.json()) as {\n device_code: string;\n user_code: string;\n verification_uri: string;\n verification_uri_complete: string;\n expires_in: number;\n interval?: number;\n };\n\n log(\n `Open this URL on your phone (or this computer) to approve access:\\n ${da.verification_uri_complete}\\n` +\n `Code: ${da.user_code}\\n`,\n );\n if (opts.open !== false) openBrowser(da.verification_uri_complete);\n\n const timeoutMs = opts.timeoutMs ?? da.expires_in * 1000;\n const deadline = Date.now() + timeoutMs;\n let intervalSec = da.interval && da.interval > 0 ? da.interval : 5;\n\n while (Date.now() < deadline) {\n await new Promise((r) => setTimeout(r, intervalSec * 1000));\n const tok = await fetch(meta.token_endpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n grant_type: \"urn:ietf:params:oauth:grant-type:device_code\",\n device_code: da.device_code,\n client_id: clientId,\n }),\n });\n const raw = await tok.text();\n if (tok.ok) {\n const t = JSON.parse(raw) as {\n access_token: string;\n refresh_token?: string;\n expires_in?: number;\n };\n return {\n clientId,\n accessToken: t.access_token,\n refreshToken: t.refresh_token,\n expiresAt: t.expires_in ? Date.now() + t.expires_in * 1000 : undefined,\n resource,\n };\n }\n let err = raw || \"authorization failed\";\n let code = \"\";\n try {\n const body = JSON.parse(raw) as { error?: string; error_description?: string };\n code = body.error ?? \"\";\n err = body.error_description ?? body.error ?? err;\n } catch {\n }\n if (code === \"authorization_pending\") continue;\n if (code === \"slow_down\") {\n intervalSec += 5;\n continue;\n }\n throw new Error(err);\n }\n throw new Error(`login timed out after ${Math.round(timeoutMs / 1000)}s — no approval received`);\n}\n\nexport async function refreshTokens(baseUrl: string, current: OAuthTokens): Promise<OAuthTokens> {\n if (!current.refreshToken) throw new Error(\"no refresh token — run `paybox login` again\");\n const meta = await metadata(baseUrl);\n const resource = current.resource ?? mcpResource(baseUrl);\n const form = new URLSearchParams({\n grant_type: \"refresh_token\",\n refresh_token: current.refreshToken,\n client_id: current.clientId,\n resource,\n });\n const res = await fetch(meta.token_endpoint, {\n method: \"POST\",\n headers: { \"content-type\": \"application/x-www-form-urlencoded\" },\n body: form,\n });\n if (!res.ok) throw new Error(`token refresh failed (${res.status}): ${await res.text()}`);\n const t = (await res.json()) as {\n access_token: string;\n refresh_token?: string;\n expires_in?: number;\n };\n return {\n ...current,\n accessToken: t.access_token,\n refreshToken: t.refresh_token ?? current.refreshToken,\n expiresAt: t.expires_in ? Date.now() + t.expires_in * 1000 : undefined,\n resource,\n };\n}\n","\nimport { chmodSync, mkdirSync, readFileSync, writeFileSync } from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\n\nexport interface OAuthTokens {\n clientId: string;\n accessToken: string;\n refreshToken?: string;\n expiresAt?: number;\n resource: string;\n}\n\nexport interface StoredConfig {\n baseUrl?: string;\n appUrl?: string;\n apiKey?: string;\n oauth?: OAuthTokens;\n signingKey?: string;\n}\n\nexport function configDir(): string {\n if (process.env.PAYBOX_CONFIG_DIR) return process.env.PAYBOX_CONFIG_DIR;\n const base = process.env.XDG_CONFIG_HOME ?? join(homedir(), \".config\");\n return join(base, \"paybox\");\n}\n\nexport function configFile(): string {\n return join(configDir(), \"config.json\");\n}\n\nexport function loadConfig(): StoredConfig {\n try {\n return JSON.parse(readFileSync(configFile(), \"utf8\")) as StoredConfig;\n } catch {\n return {};\n }\n}\n\nexport function saveConfig(config: StoredConfig): void {\n mkdirSync(configDir(), { recursive: true, mode: 0o700 });\n writeFileSync(configFile(), `${JSON.stringify(config, null, 2)}\\n`, { mode: 0o600 });\n if (process.platform !== \"win32\") chmodSync(configFile(), 0o600);\n}\n","import type { AgentResponse } from \"./types.js\";\n\nexport type NextActionKind =\n | \"sign\"\n | \"await_human\"\n | \"fund\"\n | \"poll\"\n | \"reconcile\"\n | \"stop\";\n\nexport interface NextActionCapabilities {\n canSignInProcess: boolean;\n canRenderSigningUi: boolean;\n canOpenApprovalUi: boolean;\n canPoll: boolean;\n canReconcile: boolean;\n}\n\nexport interface NextAction {\n kind: NextActionKind;\n reason: string;\n}\n\nexport function nextActionFor(\n response: AgentResponse,\n capabilities: NextActionCapabilities,\n): NextAction {\n switch (response.status) {\n case \"pending_signature\":\n if (capabilities.canSignInProcess) return { kind: \"sign\", reason: \"signer_ready\" };\n if (capabilities.canRenderSigningUi) {\n return { kind: \"await_human\", reason: \"signing_ui_required\" };\n }\n return { kind: \"stop\", reason: \"signer_unavailable\" };\n case \"pending_approval\":\n if (capabilities.canOpenApprovalUi) {\n return { kind: \"await_human\", reason: \"approval_required\" };\n }\n return { kind: \"stop\", reason: \"approval_ui_unavailable\" };\n case \"pending_confirmation\":\n case \"pending_settlement\":\n case \"pending_funding\":\n return capabilities.canPoll\n ? { kind: \"poll\", reason: response.status }\n : { kind: \"stop\", reason: \"polling_unavailable\" };\n case \"success\":\n return { kind: \"stop\", reason: \"completed\" };\n case \"denied\":\n case \"error\":\n return response.retryable && capabilities.canReconcile\n ? { kind: \"reconcile\", reason: \"retryable_terminal\" }\n : { kind: \"stop\", reason: response.status };\n }\n}\n","import type { AgentResponse, McpToolResult } from \"./types.js\";\n\nfunction record(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? value as Record<string, unknown> : null;\n}\n\nexport function pendingFundingResponse(value: unknown): AgentResponse | null {\n const data = record(value);\n const response = data?.status === \"pending_funding\" ? data : record(data?.response);\n if (response?.status !== \"pending_funding\") {\n return null;\n }\n return {\n request_id: typeof response.request_id === \"string\" ? response.request_id : \"\",\n status: \"pending_funding\",\n output: null,\n approval_id: null,\n error: null,\n };\n}\n\nexport function nonSigningFundingResult<T>(value: T): T {\n const response = pendingFundingResponse(value);\n if (!response) return value;\n return (record(value)?.status === \"pending_funding\" ? response : { response, plan: null }) as T;\n}\n\nexport function pendingFundingToolResponse(result: McpToolResult): AgentResponse | null {\n const structured = pendingFundingResponse(result.structuredContent);\n if (structured) return structured;\n for (const item of result.content) {\n if (item.type !== \"text\" || typeof item.text !== \"string\") continue;\n let value: unknown;\n try {\n value = JSON.parse(item.text);\n } catch {\n continue;\n }\n const response = pendingFundingResponse(value);\n if (response) return response;\n }\n return null;\n}\n\nexport function nonSigningFundingToolResult(result: McpToolResult): McpToolResult {\n const response = pendingFundingToolResponse(result);\n if (!response) return result;\n return {\n content: [{ type: \"text\", text: JSON.stringify(response) }],\n structuredContent: response,\n isError: false,\n };\n}\n","\nconst STORAGE_KEY = \"paybox.walletSign.creds.v2\";\n\nexport const TOKEN_PREFIX = \"pbxk1.\";\n\nexport interface Creds {\n apiPubHex: string;\n apiPrivHex: string;\n savedAt: number;\n}\n\nlet sessionCreds: Creds | null = null;\nlet sessionDecided = false;\nconst listeners = new Set<() => void>();\n\nexport function subscribe(listener: () => void): () => void {\n listeners.add(listener);\n return () => { listeners.delete(listener); };\n}\n\nfunction notify(): void { queueMicrotask(() => listeners.forEach(listener => listener())); }\n\nexport function hasStorage(): boolean {\n try {\n const probe = \"__paybox_probe__\";\n window.localStorage.setItem(probe, \"1\");\n window.localStorage.removeItem(probe);\n return true;\n } catch {\n return false;\n }\n}\n\nexport function load(): Creds | null {\n if (sessionDecided) return sessionCreds;\n try {\n const raw = window.localStorage.getItem(STORAGE_KEY);\n if (raw) {\n const parsed = JSON.parse(raw) as Partial<Creds>;\n if (\n typeof parsed.apiPubHex === \"string\" &&\n typeof parsed.apiPrivHex === \"string\" &&\n parsed.apiPubHex &&\n parsed.apiPrivHex\n ) {\n return {\n apiPubHex: parsed.apiPubHex,\n apiPrivHex: parsed.apiPrivHex,\n savedAt: typeof parsed.savedAt === \"number\" ? parsed.savedAt : 0,\n };\n }\n }\n } catch {\n }\n return null;\n}\n\nexport function save(c: Omit<Creds, \"savedAt\"> & { savedAt?: number }): void {\n const toStore: Creds = {\n apiPubHex: c.apiPubHex,\n apiPrivHex: c.apiPrivHex,\n savedAt: c.savedAt ?? Date.now(),\n };\n sessionCreds = toStore;\n sessionDecided = true;\n try {\n window.localStorage.setItem(STORAGE_KEY, JSON.stringify(toStore));\n } catch {\n }\n notify();\n}\n\nexport function clear(): void {\n sessionCreds = null;\n sessionDecided = true;\n try {\n window.localStorage.removeItem(STORAGE_KEY);\n } catch {\n }\n notify();\n}\n\nexport function validateHex(s: string, label: string): string | null {\n const trimmed = s.trim();\n if (!trimmed) return `${label} is required`;\n const body = trimmed.startsWith(\"0x\") || trimmed.startsWith(\"0X\") ? trimmed.slice(2) : trimmed;\n if (body.length === 0) return `${label} is empty`;\n if (body.length % 2 !== 0) return `${label} must have an even number of hex digits`;\n if (!/^[0-9a-fA-F]+$/.test(body)) return `${label} must be hexadecimal`;\n return null;\n}\n\nfunction b64urlEncode(s: string): string {\n return btoa(s).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/, \"\");\n}\n\nfunction b64urlDecode(s: string): string {\n let b = s.replace(/-/g, \"+\").replace(/_/g, \"/\");\n while (b.length % 4) b += \"=\";\n return atob(b);\n}\n\nexport function encodeToken(c: { apiPubHex: string; apiPrivHex: string }): string {\n return TOKEN_PREFIX + b64urlEncode(JSON.stringify({ p: c.apiPubHex, s: c.apiPrivHex }));\n}\n\nexport function parseToken(input: string): { apiPubHex: string; apiPrivHex: string } | null {\n const t = input.trim();\n if (!t) return null;\n const body = t.startsWith(TOKEN_PREFIX) ? t.slice(TOKEN_PREFIX.length) : t;\n let obj: unknown;\n try {\n obj = JSON.parse(b64urlDecode(body));\n } catch {\n return null;\n }\n if (!obj || typeof obj !== \"object\") return null;\n const o = obj as Record<string, unknown>;\n const apiPubHex = String(o.p ?? o.apiPubHex ?? \"\").trim();\n const apiPrivHex = String(o.s ?? o.apiPrivHex ?? \"\").trim();\n if (!apiPubHex || !apiPrivHex) return null;\n if (validateHex(apiPubHex, \"key\") || validateHex(apiPrivHex, \"key\")) return null;\n return { apiPubHex, apiPrivHex };\n}\n","\nimport { Buffer } from \"buffer\";\nimport nacl from \"tweetnacl\";\nimport { MoonXEvmSigner, EvmSchemeMismatchError } from \"@moon-x/evm-adapter\";\nimport { MoonXSolanaSigner, SolanaSchemeMismatchError } from \"@moon-x/solana-adapter\";\nimport { PublicKey, Transaction, VersionedTransaction } from \"@solana/web3.js\";\nimport { hashTypedData, keccak256, serializeTransaction } from \"viem\";\nimport type {\n Authorization,\n TransactionSerializable,\n TypedDataDefinition,\n} from \"viem\";\n\nimport type { Creds } from \"./creds.js\";\n\nexport interface WireTx {\n to: `0x${string}`;\n value?: string | number | bigint;\n data?: `0x${string}`;\n chainId: number;\n gas?: string | number | bigint;\n maxPriorityFeePerGas?: string | number | bigint;\n maxFeePerGas?: string | number | bigint;\n nonce: number;\n}\n\nexport function parseWireU128(value: unknown, field: string): bigint {\n if (value === undefined || value === null) {\n throw new Error(`transaction is missing ${field}`);\n }\n if (typeof value === \"bigint\") {\n if (value < 0n) {\n throw new Error(`transaction field ${field} must be a non-negative integer`);\n }\n return value;\n }\n if (typeof value === \"number\") {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new Error(`transaction field ${field} must be a non-negative integer`);\n }\n return BigInt(value);\n }\n if (typeof value === \"string\") {\n const trimmed = value.trim();\n if (!trimmed) {\n throw new Error(`transaction field ${field} is empty`);\n }\n if (/^0[xX][0-9a-fA-F]+$/.test(trimmed)) {\n return BigInt(trimmed);\n }\n if (!/^\\d+$/.test(trimmed)) {\n throw new Error(`transaction field ${field} is not a valid integer`);\n }\n return BigInt(trimmed);\n }\n throw new Error(`transaction field ${field} has an invalid type`);\n}\n\nexport type SignIntent =\n | { op: \"message\"; message: string }\n | { op: \"typedData\"; typedData: TypedDataDefinition }\n | { op: \"transaction\"; transaction: WireTx }\n | { op: \"authorization\"; authorization: Authorization }\n | { op: \"solanaMessage\"; address: string; message: string }\n | { op: \"solanaTransaction\"; address: string; transactionBase64: string }\n | { op: \"raw\"; rawSigningPayloadHex: string };\n\nexport interface WalletBinding {\n walletId: string;\n keyId: string;\n derivationPath: string;\n}\n\nexport interface MoonxSignResult {\n scheme: string;\n signature: {\n r?: string;\n s?: string;\n recovery_id?: number;\n signature?: string;\n };\n}\n\nexport type MoonxSignTransport = (envelope: {\n signed_body: string;\n agent_signature: string;\n}) => Promise<MoonxSignResult>;\n\nexport type SignArtifactResult =\n | { ok: true; artifact: Record<string, unknown> }\n | { ok: false; error: string };\n\nfunction reviveTx(w: WireTx): TransactionSerializable {\n if (typeof w !== \"object\" || w === null || Array.isArray(w)) {\n throw new Error(\"transaction must be an object, not a JSON-encoded string\");\n }\n return {\n type: \"eip1559\",\n to: w.to,\n value: parseWireU128(w.value ?? \"0\", \"value\"),\n data: w.data,\n chainId: w.chainId,\n gas: parseWireU128(w.gas, \"gas\"),\n maxPriorityFeePerGas: parseWireU128(w.maxPriorityFeePerGas, \"maxPriorityFeePerGas\"),\n maxFeePerGas: parseWireU128(w.maxFeePerGas, \"maxFeePerGas\"),\n nonce: w.nonce,\n };\n}\n\nfunction hexToBytes(hex: string): Uint8Array {\n return new Uint8Array(Buffer.from(hex.replace(/^0x/, \"\"), \"hex\"));\n}\nfunction bytesToHex(bytes: Uint8Array): string {\n return Buffer.from(bytes).toString(\"hex\");\n}\n\nfunction buildEnvelope(\n rawSigningPayloadHex: string,\n binding: WalletBinding,\n creds: Creds,\n): { signed_body: string; agent_signature: string } {\n const signedPayload = {\n raw_signing_payload: rawSigningPayloadHex.replace(/^0x/, \"\").toLowerCase(),\n key_id: binding.keyId,\n derivation_path: binding.derivationPath,\n issued_at: new Date().toISOString(),\n };\n const signedBodyBytes = new TextEncoder().encode(JSON.stringify(signedPayload));\n const keyPair = nacl.sign.keyPair.fromSeed(hexToBytes(creds.apiPrivHex));\n const agentSig = nacl.sign.detached(signedBodyBytes, keyPair.secretKey);\n return {\n signed_body: bytesToHex(signedBodyBytes),\n agent_signature: bytesToHex(agentSig),\n };\n}\n\nexport function eip1559SigningHash(tx: WireTx): `0x${string}` {\n return keccak256(serializeTransaction(reviveTx(tx)));\n}\n\nconst SOLANA_V1_PREFIX = 0x81;\nconst SOLANA_SIGNATURE_BYTES = 64;\nconst SOLANA_V1_FEE_PAYER_OFFSET = 42;\nconst SOLANA_PUBKEY_BYTES = 32;\n\nfunction solanaV1Message(raw: Uint8Array): Uint8Array {\n const signatureCount = raw[1];\n if (!signatureCount || raw.length <= signatureCount * SOLANA_SIGNATURE_BYTES) {\n throw new Error(\"solana v1 tx has no signature slots\");\n }\n return raw.subarray(0, raw.length - signatureCount * SOLANA_SIGNATURE_BYTES);\n}\n\nasync function signSolanaV1(\n raw: Uint8Array,\n address: string,\n sign: (message: Uint8Array) => Promise<Uint8Array>,\n): Promise<Uint8Array> {\n if (raw[1] !== 1) {\n throw new Error(\"solana v1 transactions with more than one signer are not supported\");\n }\n const feePayer = new PublicKey(\n raw.subarray(SOLANA_V1_FEE_PAYER_OFFSET, SOLANA_V1_FEE_PAYER_OFFSET + SOLANA_PUBKEY_BYTES),\n );\n if (!feePayer.equals(new PublicKey(address))) {\n throw new Error(\"solana v1 transaction signer is not the wallet address\");\n }\n const message = solanaV1Message(raw);\n const signature = await sign(message);\n if (signature.length !== SOLANA_SIGNATURE_BYTES) {\n throw new Error(\"the signing service returned an Ed25519 signature that is not 64 bytes\");\n }\n const signed = new Uint8Array(message.length + SOLANA_SIGNATURE_BYTES);\n signed.set(message);\n signed.set(signature, message.length);\n return signed;\n}\n\nexport function solanaSigningPayload(base64Tx: string): string {\n const raw = Buffer.from(base64Tx, \"base64\");\n if (raw[0] === SOLANA_V1_PREFIX) {\n return bytesToHex(new Uint8Array(solanaV1Message(raw)));\n }\n let i = 0;\n let sigCount = 0;\n let shift = 0;\n for (;;) {\n const b = raw[i++];\n sigCount |= (b & 0x7f) << shift;\n if ((b & 0x80) === 0) break;\n shift += 7;\n }\n if (sigCount < 1) {\n throw new Error(\"solana tx has no signature slots\");\n }\n return bytesToHex(new Uint8Array(raw.subarray(i + sigCount * 64)));\n}\n\nexport function deserializeSolanaTx(base64Tx: string): Transaction | VersionedTransaction {\n const raw = Buffer.from(base64Tx, \"base64\");\n try {\n return Transaction.from(raw);\n } catch {\n return VersionedTransaction.deserialize(new Uint8Array(raw));\n }\n}\n\nexport interface TxEnvelope {\n api_pub: string;\n signed_body: string;\n agent_signature: string;\n}\n\nexport interface PlanTx {\n vm?: string;\n transaction: WireTx | string;\n}\n\nexport function buildSwapEnvelopes(\n txs: PlanTx[],\n binding: WalletBinding,\n creds: Creds,\n): TxEnvelope[] {\n if (!binding.walletId) {\n throw new Error(\"PayBox did not supply a wallet id for this operation.\");\n }\n if (!binding.keyId || !binding.derivationPath) {\n throw new Error(\n \"This wallet isn't provisioned for signing yet (missing key binding). \" +\n \"Re-provision it in the PayBox app, then retry.\",\n );\n }\n return txs.map((t) => {\n const payload =\n t.vm === \"eip712\"\n ? eip712SigningHash(t.transaction as unknown as TypedDataDefinition)\n : t.vm === \"solana\"\n ? solanaSigningPayload(t.transaction as string)\n : eip1559SigningHash(t.transaction as WireTx);\n const { signed_body, agent_signature } = buildEnvelope(payload, binding, creds);\n return { api_pub: creds.apiPubHex, signed_body, agent_signature };\n });\n}\n\nexport function eip712SigningHash(typedData: TypedDataDefinition): `0x${string}` {\n return hashTypedData(typedData);\n}\n\nexport function buildX402Envelope(\n typedData: TypedDataDefinition,\n binding: WalletBinding,\n creds: Creds,\n): TxEnvelope {\n if (!binding.walletId) {\n throw new Error(\"PayBox did not supply a wallet id for this payment.\");\n }\n if (!binding.keyId || !binding.derivationPath) {\n throw new Error(\n \"This wallet isn't provisioned for signing yet (missing key binding). \" +\n \"Re-provision it in the PayBox app, then retry.\",\n );\n }\n const { signed_body, agent_signature } = buildEnvelope(\n eip712SigningHash(typedData),\n binding,\n creds,\n );\n return { api_pub: creds.apiPubHex, signed_body, agent_signature };\n}\n\nexport function buildX402SolanaEnvelope(\n transactionBase64: string,\n binding: WalletBinding,\n creds: Creds,\n): TxEnvelope {\n if (!binding.walletId) {\n throw new Error(\"PayBox did not supply a wallet id for this payment.\");\n }\n if (!binding.keyId || !binding.derivationPath) {\n throw new Error(\n \"This wallet isn't provisioned for signing yet (missing key binding). \" +\n \"Re-provision it in the PayBox app, then retry.\",\n );\n }\n const { signed_body, agent_signature } = buildEnvelope(\n solanaSigningPayload(transactionBase64),\n binding,\n creds,\n );\n return { api_pub: creds.apiPubHex, signed_body, agent_signature };\n}\n\nexport interface GaslessDigest {\n kind: \"userOp\" | \"authorization\";\n rawPayloadHex: string;\n}\n\nexport function buildGaslessEnvelopes(\n digests: GaslessDigest[],\n binding: WalletBinding,\n creds: Creds,\n): TxEnvelope[] {\n if (digests.length === 0) {\n throw new Error(\"gasless prepared calls have no signing items.\");\n }\n if (!binding.walletId) {\n throw new Error(\"PayBox did not supply a wallet id for this operation.\");\n }\n if (!binding.keyId || !binding.derivationPath) {\n throw new Error(\n \"This wallet isn't provisioned for signing yet (missing key binding). \" +\n \"Re-provision it in the PayBox app, then retry.\",\n );\n }\n return digests.map((d) => {\n const { signed_body, agent_signature } = buildEnvelope(d.rawPayloadHex, binding, creds);\n return { api_pub: creds.apiPubHex, signed_body, agent_signature };\n });\n}\n\nexport type ResolveBindingTransport = (envelope: {\n signed_body: string;\n agent_signature: string;\n}) => Promise<{ key_id?: string; derivation_path?: string }>;\n\nexport function buildIssuedAtEnvelope(creds: Creds): {\n signed_body: string;\n agent_signature: string;\n} {\n const signedBodyBytes = new TextEncoder().encode(\n JSON.stringify({ issued_at: new Date().toISOString() }),\n );\n const keyPair = nacl.sign.keyPair.fromSeed(hexToBytes(creds.apiPrivHex));\n const agentSig = nacl.sign.detached(signedBodyBytes, keyPair.secretKey);\n return {\n signed_body: bytesToHex(signedBodyBytes),\n agent_signature: bytesToHex(agentSig),\n };\n}\n\nexport async function resolveWalletBinding(\n creds: Creds,\n resolve: ResolveBindingTransport,\n): Promise<{ keyId: string; derivationPath: string }> {\n const res = await resolve(buildIssuedAtEnvelope(creds));\n if (!res.key_id || !res.derivation_path) {\n throw new Error(\"the signing service returned no binding for this wallet\");\n }\n return { keyId: res.key_id, derivationPath: res.derivation_path };\n}\n\nexport async function signIntent(\n intent: SignIntent,\n creds: Creds,\n binding: WalletBinding,\n transport: MoonxSignTransport,\n): Promise<SignArtifactResult> {\n if (!binding.walletId) {\n return { ok: false, error: \"PayBox did not supply a wallet id for this operation.\" };\n }\n if (!binding.keyId || !binding.derivationPath) {\n return {\n ok: false,\n error:\n \"This wallet isn't provisioned for signing yet (missing key binding). \" +\n \"Re-provision it in the PayBox app, then retry.\",\n };\n }\n\n const ecdsaSign = async (digest: `0x${string}`) => {\n const result = await transport(buildEnvelope(digest, binding, creds));\n const { r, s, recovery_id } = result.signature;\n if (r == null || s == null || recovery_id == null) {\n throw new Error(\"the signing service returned an ECDSA result without {r, s, recovery_id}\");\n }\n return {\n r: `0x${r}` as `0x${string}`,\n s: `0x${s}` as `0x${string}`,\n yParity: recovery_id as 0 | 1,\n };\n };\n const ed25519Sign = async (message: Uint8Array) => {\n const result = await transport(buildEnvelope(bytesToHex(message), binding, creds));\n const sig = result.signature.signature;\n if (!sig) throw new Error(\"the signing service returned an Ed25519 result without a signature\");\n return hexToBytes(sig);\n };\n\n try {\n switch (intent.op) {\n case \"message\":\n return {\n ok: true,\n artifact: { signature: await new MoonXEvmSigner(ecdsaSign).signMessage(intent.message) },\n };\n case \"typedData\":\n return {\n ok: true,\n artifact: {\n signature: await new MoonXEvmSigner(ecdsaSign).signTypedData(intent.typedData),\n },\n };\n case \"transaction\":\n return {\n ok: true,\n artifact: {\n serializedTransaction: await new MoonXEvmSigner(ecdsaSign).signTransaction(\n reviveTx(intent.transaction),\n ),\n },\n };\n case \"authorization\":\n return {\n ok: true,\n artifact: {\n authorization: await new MoonXEvmSigner(ecdsaSign).signAuthorization(\n intent.authorization,\n ),\n },\n };\n case \"solanaMessage\": {\n const sig = await new MoonXSolanaSigner(ed25519Sign, intent.address).signMessage(\n intent.message,\n );\n return { ok: true, artifact: { signature: bytesToHex(sig) } };\n }\n case \"solanaTransaction\": {\n const raw = Buffer.from(intent.transactionBase64, \"base64\");\n if (raw[0] === SOLANA_V1_PREFIX) {\n const signed = await signSolanaV1(raw, intent.address, ed25519Sign);\n return {\n ok: true,\n artifact: { signedTransactionBase64: Buffer.from(signed).toString(\"base64\") },\n };\n }\n const tx = deserializeSolanaTx(intent.transactionBase64);\n const signed = await new MoonXSolanaSigner(ed25519Sign, intent.address).signTransaction(\n tx,\n );\n return {\n ok: true,\n artifact: { signedTransactionBase64: Buffer.from(signed).toString(\"base64\") },\n };\n }\n case \"raw\": {\n const result = await transport(buildEnvelope(intent.rawSigningPayloadHex, binding, creds));\n return { ok: true, artifact: { scheme: result.scheme, signature: result.signature } };\n }\n default:\n return { ok: false, error: `unknown op: ${(intent as { op?: string }).op}` };\n }\n } catch (err) {\n if (err instanceof EvmSchemeMismatchError || err instanceof SolanaSchemeMismatchError) {\n return { ok: false, error: err.message };\n }\n const message = err instanceof Error ? err.message : String(err);\n return { ok: false, error: message };\n }\n}\n","\nimport { parseToken } from \"@paybox/mcp-app/creds\";\nimport type { Creds } from \"@paybox/mcp-app/creds\";\nimport {\n buildIssuedAtEnvelope,\n buildSwapEnvelopes,\n buildX402Envelope,\n buildX402SolanaEnvelope,\n signIntent,\n} from \"@paybox/mcp-app/sign\";\nimport type {\n MoonxSignResult,\n SignIntent,\n TxEnvelope,\n WalletBinding,\n} from \"@paybox/mcp-app/sign\";\n\nimport type { BindingResponse, TransactionSigningPlan, X402Plan } from \"./types.js\";\n\nexport type Poster = (path: string, body: unknown) => Promise<unknown>;\n\nexport function credsFromToken(token: string): Creds {\n if (token.trim().startsWith(\"pbx_live_\")) {\n throw new Error(\n \"invalid signing key: got a `pbx_live_` API key; expected a `pbxk1.` token (keypair only)\",\n );\n }\n const kp = parseToken(token);\n if (!kp) {\n throw new Error(\"invalid signing key: expected a `pbxk1.` token (keypair only)\");\n }\n return { apiPubHex: kp.apiPubHex, apiPrivHex: kp.apiPrivHex, savedAt: Date.now() };\n}\n\nfunction toBinding(b: BindingResponse): WalletBinding {\n return { walletId: b.wallet_id, keyId: b.key_id ?? \"\", derivationPath: b.derivation_path ?? \"\" };\n}\n\nasync function resolveBinding(\n post: Poster,\n requestId: string,\n creds: Creds,\n): Promise<WalletBinding> {\n const env = buildIssuedAtEnvelope(creds);\n const r = (await post(`/agent/requests/${requestId}/binding`, {\n api_pub: creds.apiPubHex,\n signed_body: env.signed_body,\n agent_signature: env.agent_signature,\n })) as BindingResponse;\n return toBinding(r);\n}\n\nexport async function signWalletRequest(\n post: Poster,\n requestId: string,\n intent: SignIntent,\n creds: Creds,\n binding?: BindingResponse | null,\n): Promise<Record<string, unknown>> {\n const resolved =\n binding && binding.key_id && binding.derivation_path\n ? toBinding(binding)\n : await resolveBinding(post, requestId, creds);\n let rejected: unknown;\n const transport = (envelope: { signed_body: string; agent_signature: string }) =>\n (\n post(`/agent/requests/${requestId}/moonx-sign`, {\n api_pub: creds.apiPubHex,\n ...envelope,\n }) as Promise<MoonxSignResult>\n ).catch((err: unknown) => {\n rejected = err;\n throw err;\n });\n const result = await signIntent(intent, creds, resolved, transport);\n if (!result.ok) throw rejected ?? new Error(result.error);\n await post(`/agent/requests/${requestId}/signature`, { artifact: result.artifact });\n return result.artifact;\n}\n\nfunction isRefreshablePlan(plan: TransactionSigningPlan): boolean {\n if (typeof plan.refresh_before_sign === \"boolean\") return plan.refresh_before_sign;\n const txs = plan.txs as Array<{ vm?: string; kind?: string }>;\n const solana = txs.some((t) => t.vm === \"solana\");\n return solana && txs.some(\n (t) => t.kind === \"swap\" || t.kind === \"prediction_trade\",\n );\n}\n\nasync function refreshPlan(post: Poster, requestId: string): Promise<unknown> {\n const r = (await post(`/agent/requests/${requestId}/refresh`, {})) as { plan?: unknown };\n if (!r || typeof r.plan !== \"object\" || r.plan === null) {\n throw new Error(\"refresh returned no plan\");\n }\n return r.plan;\n}\n\nasync function refreshSwapPlan(post: Poster, requestId: string): Promise<TransactionSigningPlan> {\n const refreshed = (await refreshPlan(post, requestId)) as TransactionSigningPlan;\n if (!Array.isArray(refreshed.txs) || refreshed.txs.length === 0) {\n throw new Error(\"swap refresh returned a plan with no txs\");\n }\n return refreshed;\n}\n\nfunction isSolanaRailX402(plan: X402Plan): boolean {\n return plan.x402?.rail === \"solana\";\n}\n\nasync function refreshX402SolanaTx(post: Poster, requestId: string): Promise<string> {\n const refreshed = (await refreshPlan(post, requestId)) as X402Plan;\n const tx = refreshed.solana?.transaction;\n if (typeof tx !== \"string\" || tx.length === 0) {\n throw new Error(\"x402 refresh returned a plan with no Solana transaction\");\n }\n return tx;\n}\n\nexport async function signSwapRequest(\n post: Poster,\n requestId: string,\n plan: TransactionSigningPlan,\n creds: Creds,\n validate?: (plan: TransactionSigningPlan) => void,\n): Promise<void> {\n const signPlan = isRefreshablePlan(plan)\n ? await refreshSwapPlan(post, requestId)\n : plan;\n validate?.(signPlan);\n let binding: WalletBinding = {\n walletId: signPlan.binding.wallet_id,\n keyId: signPlan.binding.key_id ?? \"\",\n derivationPath: signPlan.binding.derivation_path ?? \"\",\n };\n if (binding.walletId && (!binding.keyId || !binding.derivationPath)) {\n binding = await resolveBinding(post, requestId, creds);\n }\n const envelopes: TxEnvelope[] = buildSwapEnvelopes(signPlan.txs, binding, creds);\n await post(`/agent/requests/${requestId}/envelopes`, { envelopes });\n}\n\nexport async function signX402Request(\n post: Poster,\n requestId: string,\n plan: X402Plan,\n creds: Creds,\n): Promise<void> {\n let binding: WalletBinding = {\n walletId: plan.binding.wallet_id,\n keyId: plan.binding.key_id ?? \"\",\n derivationPath: plan.binding.derivation_path ?? \"\",\n };\n if (binding.walletId && (!binding.keyId || !binding.derivationPath)) {\n binding = await resolveBinding(post, requestId, creds);\n }\n const envelope: TxEnvelope = isSolanaRailX402(plan)\n ? buildX402SolanaEnvelope(await refreshX402SolanaTx(post, requestId), binding, creds)\n : buildX402Envelope(\n plan.typed_data as Parameters<typeof buildX402Envelope>[0],\n binding,\n creds,\n );\n await post(`/agent/requests/${requestId}/envelopes`, { envelopes: [envelope] });\n}\n","import type { McpToolResult } from \"./types.js\";\n\nconst PROTOCOL_VERSION = \"2025-06-18\";\ntype SigningSurface = \"in-process\" | \"browser\" | \"none\";\n\ninterface JsonRpcResponse<T> {\n result?: T;\n error?: {\n code: number;\n message: string;\n };\n}\n\ninterface McpTransportOptions {\n baseUrl: string;\n bearer: () => Promise<string>;\n fetchImpl: typeof fetch;\n}\n\nfunction responseBody(text: string): string {\n const events = text\n .split(/\\r?\\n/)\n .filter((line) => line.startsWith(\"data:\"))\n .map((line) => line.slice(5).trim());\n return events.length === 0 ? text : events.join(\"\");\n}\n\nfunction errorText(result: McpToolResult): string {\n return result.content\n .filter((item) => item.type === \"text\" && typeof item.text === \"string\")\n .map((item) => item.text)\n .join(\"\\n\");\n}\n\nexport function toolJson<T>(tool: string, result: McpToolResult): T {\n if (result.isError) {\n throw new Error(errorText(result) || `paybox ${tool} failed`);\n }\n const text = result.content.find(\n (item) => item.type === \"text\" && typeof item.text === \"string\",\n )?.text;\n if (typeof text !== \"string\") {\n throw new Error(`paybox ${tool} returned no JSON content`);\n }\n return JSON.parse(text) as T;\n}\n\nexport class McpTransport {\n private readonly endpoint: string;\n private readonly bearer: () => Promise<string>;\n private readonly fetchImpl: typeof fetch;\n private nextId = 0;\n private initialization?: Promise<void>;\n\n constructor(options: McpTransportOptions) {\n this.endpoint = `${options.baseUrl}/mcp`;\n this.bearer = options.bearer;\n this.fetchImpl = options.fetchImpl;\n }\n\n async callTool(\n name: string,\n args: Record<string, unknown>,\n signingSurface?: SigningSurface,\n ): Promise<McpToolResult> {\n await this.initialize(signingSurface);\n return this.rpc(\"tools/call\", { name, arguments: args }, signingSurface);\n }\n\n private async initialize(signingSurface?: SigningSurface): Promise<void> {\n this.initialization ??= this.rpc<unknown>(\"initialize\", {\n protocolVersion: PROTOCOL_VERSION,\n capabilities: {},\n clientInfo: { name: \"paybox-sdk\", version: \"1\" },\n }, signingSurface).then(() => this.notify(\"notifications/initialized\", {}, signingSurface));\n try {\n await this.initialization;\n } catch (error) {\n this.initialization = undefined;\n throw error;\n }\n }\n\n private async post(\n payload: Record<string, unknown>,\n method: string,\n signingSurface?: SigningSurface,\n ): Promise<string> {\n const response = await this.fetchImpl(this.endpoint, {\n method: \"POST\",\n headers: {\n accept: \"application/json, text/event-stream\",\n authorization: `Bearer ${await this.bearer()}`,\n \"content-type\": \"application/json\",\n \"mcp-protocol-version\": PROTOCOL_VERSION,\n ...(signingSurface ? { \"x-paybox-signing-surface\": signingSurface } : {}),\n },\n body: JSON.stringify(payload),\n });\n const text = await response.text();\n if (!response.ok) {\n throw new Error(\n `paybox MCP ${method} failed (${response.status}): ${text}`,\n );\n }\n return text;\n }\n\n private async notify(\n method: string,\n params: unknown,\n signingSurface?: SigningSurface,\n ): Promise<void> {\n await this.post({ jsonrpc: \"2.0\", method, params }, method, signingSurface);\n }\n\n private async rpc<T>(\n method: string,\n params: unknown,\n signingSurface?: SigningSurface,\n ): Promise<T> {\n const text = await this.post(\n {\n jsonrpc: \"2.0\",\n id: ++this.nextId,\n method,\n params,\n },\n method,\n signingSurface,\n );\n const parsed = JSON.parse(responseBody(text)) as JsonRpcResponse<T>;\n if (parsed.error) {\n throw new Error(\n `paybox MCP ${method} failed (${parsed.error.code}): ${parsed.error.message}`,\n );\n }\n if (parsed.result === undefined) {\n throw new Error(`paybox MCP ${method} returned no result`);\n }\n return parsed.result;\n }\n}\n","import { setTimeout as delay } from \"node:timers/promises\";\nimport { toolJson } from \"./mcp.js\";\nimport { pendingFundingResponse, pendingFundingToolResponse } from \"./pending-funding.js\";\nimport { supportedSigningAction, supportedSigningPlan, type SigningAction } from \"./plugins/signing.js\";\nimport type {\n AgentResponse, ExecutionOptions, ExecutionOutcome, ExecutionResult,\n McpToolResult, TransactionSigningPlan, UsePluginArgs,\n} from \"./types.js\";\n\ninterface ExecutionPorts {\n callTool(name: string, args: Record<string, unknown>): Promise<McpToolResult>;\n getRequest(requestId: string): Promise<AgentResponse>;\n sign?: (requestId: string, action: SigningAction, validate: (plan: TransactionSigningPlan) => void) => Promise<void>;\n}\n\nclass UnsupportedPlanError extends Error {}\n\nconst invocationIdMeta = \"com.moonpay.paybox/invocationId\";\nconst requestIdMeta = \"com.moonpay.paybox/requestId\";\n\nfunction requestId(value: unknown): string | null {\n return typeof value === \"string\"\n && /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value)\n ? value.toLowerCase() : null;\n}\n\nfunction payload(result: McpToolResult): Record<string, unknown> {\n const value = result.structuredContent ?? toolJson<unknown>(\"plugin execution\", { ...result, isError: false });\n if (!value || typeof value !== \"object\" || Array.isArray(value)) throw new Error(\"invalid response\");\n return value as Record<string, unknown>;\n}\n\nconst statuses = new Set([\n \"pending_approval\", \"pending_funding\", \"pending_signature\", \"pending_settlement\", \"pending_confirmation\",\n \"success\", \"denied\", \"error\",\n]);\n\nexport async function executePlugin(\n start: UsePluginArgs | string,\n options: ExecutionOptions,\n connect: (signal: AbortSignal) => ExecutionPorts,\n): Promise<ExecutionResult> {\n const timeoutMs = options.timeoutMs ?? 300_000;\n const intervalMs = options.intervalMs ?? 2_000;\n if (!Number.isInteger(timeoutMs) || timeoutMs <= 0 || timeoutMs > 2_147_483_647\n || !Number.isInteger(intervalMs) || intervalMs <= 0 || intervalMs > 30_000) {\n throw new RangeError(\"timeoutMs must be 1..2147483647 and intervalMs must be 1..30000\");\n }\n let id = typeof start === \"string\" ? requestId(start) : null;\n if (typeof start === \"string\" && !id) throw new TypeError(\"requestId must be a UUID\");\n let response: AgentResponse | null = null;\n const result = (outcome: ExecutionOutcome, reason?: string): ExecutionResult => ({\n outcome, requestId: id, response, ...(reason ? { reason } : {}),\n });\n const controller = new AbortController();\n let stopped: \"cancelled\" | \"deadline_exceeded\" = \"cancelled\";\n const cancel = () => controller.abort();\n options.signal?.addEventListener(\"abort\", cancel, { once: true });\n if (options.signal?.aborted) cancel();\n const timer = setTimeout(() => {\n if (!controller.signal.aborted) {\n stopped = \"deadline_exceeded\";\n controller.abort();\n }\n }, timeoutMs);\n let onAbort: () => void;\n const aborted = new Promise<ExecutionResult>((resolve) => {\n onAbort = () => resolve(result(stopped));\n if (controller.signal.aborted) onAbort();\n else controller.signal.addEventListener(\"abort\", onAbort, { once: true });\n });\n const ports = connect(controller.signal);\n const read = async () => {\n controller.signal.throwIfAborted();\n const next = await ports.getRequest(id!);\n controller.signal.throwIfAborted();\n if (!next || requestId(next.request_id) !== id || !statuses.has(next.status)) {\n throw new Error(\"invalid request response\");\n }\n response = pendingFundingResponse(next) ?? next;\n return response;\n };\n const terminal = (current: AgentResponse): ExecutionResult | null => {\n if (current.status === \"error\" || current.status === \"denied\") return result(\"terminal\");\n if (current.status !== \"success\") return null;\n const value = current.output?.value as Record<string, unknown> | null;\n const fields = current.output?.output_type === \"tx_hash\" ? [\"tx_hash\"]\n : current.output?.output_type === \"signature\" ? [\"signature\", \"serializedTransaction\", \"signedTransactionBase64\"] : [];\n return fields.some(field => typeof value?.[field] === \"string\" && (value[field] as string).trim())\n ? result(\"terminal\") : result(\"unsupported\", \"success_output_not_supported\");\n };\n const drive = async (): Promise<ExecutionResult> => {\n try {\n controller.signal.throwIfAborted();\n let toolError = false;\n if (typeof start !== \"string\") {\n const raw = await ports.callTool(\"use_plugin\", {\n plugin_id: start.pluginId, tool_id: start.toolId,\n input: start.input, invocation_id: start.invocationId,\n });\n controller.signal.throwIfAborted();\n const funding = pendingFundingToolResponse(raw);\n if (funding) {\n response = funding;\n id = requestId(funding.request_id);\n return result(\"unsupported\", \"funding_required\");\n }\n let data: Record<string, unknown>;\n try {\n data = payload(raw);\n } catch {\n return result(\"reconcile_required\", raw.isError ? \"tool_error\" : \"invalid_plugin_result\");\n }\n toolError = raw.isError === true || data.status === \"error\";\n const nextId = requestId(data.request_id);\n if (!nextId) return result(toolError ? \"reconcile_required\" : \"unsupported\", toolError ? \"tool_error\" : \"no_request_id\");\n if (requestId(start.pluginId)) {\n const invocationId = requestId(raw._meta?.[invocationIdMeta]);\n const expectedInvocationId = requestId(start.invocationId);\n const boundRequestId = requestId(raw._meta?.[requestIdMeta]);\n if (!invocationId || (start.invocationId !== undefined && invocationId !== expectedInvocationId)\n || boundRequestId !== nextId) {\n return result(\"reconcile_required\", \"request_id_mismatch\");\n }\n }\n id = nextId;\n }\n let current = await read();\n let attempted = false;\n let pauseMs = intervalMs;\n for (;;) {\n controller.signal.throwIfAborted();\n const done = terminal(current);\n if (done) return done;\n if (current.status === \"pending_funding\") return result(\"unsupported\", \"funding_required\");\n if (toolError) return result(\"reconcile_required\", \"tool_error\");\n if (current.status === \"pending_approval\" && !options.waitForApproval) {\n return result(\"approval_required\");\n }\n if (current.status === \"pending_signature\") {\n if (attempted) return result(\"reconcile_required\", \"submission_not_confirmed\");\n if (options.autoSign === false || !ports.sign) return result(\"signing_required\");\n try {\n const raw = await ports.callTool(\"reopen_signing_window\", { request_id: id });\n if (raw.isError) throw new Error(\"reopen failed\");\n const reopened = payload(raw);\n if (requestId(reopened.request_id) !== id) return result(\"unsupported\", \"request_id_mismatch\");\n current = await read();\n if (current.status !== \"pending_signature\") continue;\n if (reopened.status !== \"pending_signature\") return result(\"reconcile_required\", \"request_changed\");\n const action = supportedSigningAction(reopened);\n if (!action) return result(\"unsupported\", \"signing_plan_not_supported\");\n attempted = true;\n await ports.sign(id!, action, (refreshed) => {\n controller.signal.throwIfAborted();\n if (!supportedSigningPlan(refreshed)) throw new UnsupportedPlanError();\n });\n } catch (error) {\n current = await read();\n const done = terminal(current);\n if (done) return done;\n if (error instanceof UnsupportedPlanError) return result(\"unsupported\", \"refreshed_plan_not_supported\");\n if (current.status === \"pending_signature\") return result(\"reconcile_required\", \"signing_interrupted\");\n }\n current = await read();\n continue;\n }\n await delay(pauseMs, undefined, { signal: controller.signal });\n const previous = current.status;\n current = await read();\n pauseMs = current.status === previous ? Math.min(pauseMs * 2, 30_000) : intervalMs;\n }\n } catch {\n return result(controller.signal.aborted ? stopped : \"reconcile_required\", \"execution_interrupted\");\n }\n };\n try {\n return await Promise.race([drive(), aborted]);\n } finally {\n clearTimeout(timer);\n options.signal?.removeEventListener(\"abort\", cancel);\n controller.signal.removeEventListener(\"abort\", onAbort!);\n }\n}\n","import { deserializeSolanaTx, eip1559SigningHash } from \"@paybox/mcp-app/sign\";\nimport type { TransactionSigningPlan, BindingResponse, WalletSignArgs } from \"../types.js\";\n\nexport type SigningAction = { type: \"transactions\"; plan: TransactionSigningPlan }\n | { type: \"wallet_sign\"; intent: WalletSignArgs[\"intent\"]; binding: BindingResponse | null };\n\nexport function supportedSigningAction(value: Record<string, unknown>): SigningAction | null {\n if (value.operation != null) {\n const operation = value.operation as Record<string, unknown>;\n const intent = operation.intent as WalletSignArgs[\"intent\"] | undefined;\n if (operation.type !== \"wallet_sign\" || (value.next_action as { kind?: string })?.kind !== \"sign\"\n || !intent || ![\"transaction\", \"solanaTransaction\"].includes(intent.op)) return null;\n try {\n if (intent.op === \"transaction\") eip1559SigningHash(intent.transaction);\n else if (intent.op === \"solanaTransaction\" && typeof intent.address === \"string\" && intent.address) deserializeSolanaTx(intent.transactionBase64);\n else return null;\n } catch { return null; }\n const binding = operation.wallet_id == null ? null : {\n wallet_id: operation.wallet_id, key_id: operation.key_id ?? null, derivation_path: operation.derivation_path ?? null,\n };\n if (binding && (typeof binding.wallet_id !== \"string\"\n || binding.key_id !== null && typeof binding.key_id !== \"string\"\n || binding.derivation_path !== null && typeof binding.derivation_path !== \"string\")) return null;\n return { type: \"wallet_sign\", intent, binding: binding as BindingResponse | null };\n }\n const plan = supportedSigningPlan(value.plan);\n return plan ? { type: \"transactions\", plan } : null;\n}\n\nexport function supportedSigningPlan(value: unknown): TransactionSigningPlan | null {\n if (!value || typeof value !== \"object\") return null;\n const plan = value as Record<string, unknown>;\n if (plan.version !== undefined || plan.schema_version !== undefined || plan.gasless != null\n || typeof plan.refresh_before_sign !== \"boolean\") return null;\n const binding = plan.binding as TransactionSigningPlan[\"binding\"] | undefined;\n if (!binding || typeof binding.wallet_id !== \"string\" || !binding.wallet_id\n || (binding.key_id != null && typeof binding.key_id !== \"string\")\n || (binding.derivation_path != null && typeof binding.derivation_path !== \"string\")\n || typeof plan.sender !== \"string\" || !plan.sender\n || !Array.isArray(plan.txs) || plan.txs.length === 0) return null;\n try {\n for (const tx of plan.txs) {\n if (!tx || tx.vm !== plan.txs[0].vm) return null;\n if (tx.vm === \"solana\" && typeof tx.transaction === \"string\") deserializeSolanaTx(tx.transaction);\n else if (tx.vm === \"evm\" && tx.transaction && typeof tx.transaction === \"object\" && !Array.isArray(tx.transaction)) eip1559SigningHash(tx.transaction);\n else return null;\n }\n } catch {\n return null;\n }\n return value as TransactionSigningPlan;\n}\n","\nimport { refreshTokens } from \"./auth.js\";\nimport { loadConfig, saveConfig, type OAuthTokens } from \"./config.js\";\nimport { nextActionFor, type NextAction } from \"./next-action.js\";\nimport { McpTransport, toolJson } from \"./mcp.js\";\nimport { nonSigningFundingResult, nonSigningFundingToolResult, pendingFundingResponse } from \"./pending-funding.js\";\nimport { executePlugin } from \"./execution.js\";\nimport {\n credsFromToken,\n signSwapRequest,\n signWalletRequest,\n signX402Request,\n type Poster,\n} from \"./signer.js\";\nimport type {\n RequestPaymentArgs,\n RequestSecretArgs,\n RequestSwapArgs,\n RequestWalletSignArgs,\n VerifySolanaBalanceArgs as VerifySolanaBalanceWireArgs,\n} from \"./types.generated.js\";\nimport type {\n AccountChangeResult,\n AgentResponse,\n BuyLinkArgs,\n BuyLinkResult,\n DepositLinkArgs,\n DepositLinkResult,\n ClientCredentialList,\n DiscoverServicesPage,\n DiscoverServicesOptions,\n DiscoverServicesPageOptions,\n DiscoverPluginsArgs,\n DiscoverPluginsPage,\n ExecutionOptions,\n ExecutionResult,\n McpToolResult,\n OperationReadiness,\n OperationReadinessArgs,\n PaymentArgs,\n PluginContractResult,\n PortfolioArgs,\n SecretArgs,\n ServiceSummary,\n SwapArgs,\n SwapResult,\n UseServiceArgs,\n UsePluginArgs,\n VerifySolanaBalanceArgs,\n VerifySolanaBalanceResult,\n WalletSignArgs,\n WalletSignResult,\n X402Args,\n X402Result,\n} from \"./types.js\";\n\nconst DEFAULT_BASE_URL = \"https://api.paybox.sh\";\nconst EXPIRY_SKEW_MS = 60_000;\n\nfunction signingResultForResponse<TPlan>(\n result: { response: AgentResponse; plan: TPlan | null },\n response: AgentResponse,\n): { response: AgentResponse; plan: TPlan | null } {\n const funding = pendingFundingResponse(response);\n if (funding) return { response: funding, plan: null };\n const exposesPlan =\n response.status === \"pending_approval\" || response.status === \"pending_signature\";\n return { ...result, response, plan: exposesPlan ? result.plan : null };\n}\n\nexport function didNotHappen(r: { status?: unknown } | null | undefined): boolean {\n return r?.status === \"denied\" || r?.status === \"error\";\n}\n\nconst SIGNER_WALLET_NOT_AUTHORIZED = \"agent signer is not authorized for this wallet\";\n\nfunction serverError(body: string): unknown {\n try {\n return (JSON.parse(body) as { error?: unknown } | null)?.error;\n } catch {\n return undefined;\n }\n}\n\nexport class PayboxError extends Error {\n readonly reason?: \"signer_wallet_not_authorized\";\n\n constructor(\n readonly status: number,\n readonly body: string,\n context: string,\n ) {\n const unauthorized = status === 403 && serverError(body) === SIGNER_WALLET_NOT_AUTHORIZED;\n super(\n unauthorized\n ? \"The signing key on this machine is not authorized for this wallet. Run `paybox connect` to pair a key that covers it, then retry.\"\n : `paybox ${context} failed (${status}): ${body}`,\n );\n this.name = \"PayboxError\";\n if (unauthorized) this.reason = \"signer_wallet_not_authorized\";\n }\n}\n\nexport interface PayboxClientOptions {\n baseUrl?: string;\n apiKey?: string;\n token?: string;\n signingKey?: string;\n fetchImpl?: typeof fetch;\n}\n\nexport interface SignOptions {\n autoSign?: boolean;\n waitForApproval?: boolean | { intervalMs?: number; timeoutMs?: number };\n}\n\nexport class PayboxClient {\n readonly baseUrl: string;\n private readonly opts: PayboxClientOptions;\n private readonly fetchImpl: typeof fetch;\n private oauth?: OAuthTokens;\n private configBacked = false;\n private readonly mcp: McpTransport;\n\n constructor(options: PayboxClientOptions = {}) {\n this.opts = options;\n this.baseUrl = (options.baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this.fetchImpl = options.fetchImpl ?? fetch;\n this.mcp = new McpTransport({\n baseUrl: this.baseUrl,\n bearer: () => this.bearer(),\n fetchImpl: this.fetchImpl,\n });\n }\n\n static fromConfig(overrides: PayboxClientOptions = {}): PayboxClient {\n const cfg = loadConfig();\n const client = new PayboxClient({\n baseUrl: overrides.baseUrl ?? process.env.PAYBOX_API_URL ?? cfg.baseUrl,\n apiKey: overrides.apiKey ?? process.env.PAYBOX_API_KEY ?? cfg.apiKey,\n token: overrides.token ?? process.env.PAYBOX_ACCESS_TOKEN,\n signingKey: overrides.signingKey ?? process.env.PAYBOX_SIGNING_KEY ?? cfg.signingKey,\n fetchImpl: overrides.fetchImpl,\n });\n if (!client.opts.apiKey && !client.opts.token && cfg.oauth) {\n client.oauth = cfg.oauth;\n client.configBacked = true;\n }\n return client;\n }\n\n private signingCreds() {\n if (!this.opts.signingKey) return null;\n try {\n return credsFromToken(this.opts.signingKey);\n } catch {\n return null;\n }\n }\n\n get canSign(): boolean {\n return this.signingCreds() !== null;\n }\n\n nextAction(response: AgentResponse): NextAction {\n return nextActionFor(response, {\n canSignInProcess: this.canSign,\n canRenderSigningUi: false,\n canOpenApprovalUi: false,\n canPoll: true,\n canReconcile: true,\n });\n }\n\n private async bearer(): Promise<string> {\n if (this.opts.token) return this.opts.token;\n if (this.opts.apiKey) return this.opts.apiKey;\n if (this.oauth) {\n if (this.oauth.expiresAt && Date.now() > this.oauth.expiresAt - EXPIRY_SKEW_MS) {\n this.oauth = await refreshTokens(this.baseUrl, this.oauth);\n if (this.configBacked) {\n const cfg = loadConfig();\n cfg.oauth = this.oauth;\n saveConfig(cfg);\n }\n }\n return this.oauth.accessToken;\n }\n throw new Error(\n \"not authenticated — run `paybox login`, set PAYBOX_API_KEY, or pass { apiKey } / { token }\",\n );\n }\n\n private async request<T>(\n method: string,\n path: string,\n init: { query?: Record<string, string | undefined>; body?: unknown; signal?: AbortSignal } = {},\n ): Promise<T> {\n init.signal?.throwIfAborted();\n const url = new URL(this.baseUrl + path);\n for (const [k, v] of Object.entries(init.query ?? {})) {\n if (v != null) url.searchParams.set(k, v);\n }\n const headers: Record<string, string> = { authorization: `Bearer ${await this.bearer()}` };\n let body: string | undefined;\n if (init.body !== undefined) {\n headers[\"content-type\"] = \"application/json\";\n body = JSON.stringify(init.body);\n }\n init.signal?.throwIfAborted();\n const res = await this.fetchImpl(url, { method, headers, body, signal: init.signal });\n const text = await res.text();\n init.signal?.throwIfAborted();\n if (!res.ok) throw new PayboxError(res.status, text, `${method} ${path}`);\n return nonSigningFundingResult((text ? JSON.parse(text) : undefined) as T);\n }\n\n private readonly poster: Poster = (path, body) => this.request<unknown>(\"POST\", path, { body });\n\n listCredentials(): Promise<ClientCredentialList> {\n return this.request(\"GET\", \"/agent/grants\");\n }\n\n checkOperationReadiness(args: OperationReadinessArgs): Promise<OperationReadiness> {\n return this.request(\"POST\", \"/agent/readiness\", { body: args });\n }\n\n getPortfolio(args: PortfolioArgs): Promise<unknown> {\n return this.request(\"GET\", \"/agent/portfolio\", {\n query: {\n address: args.address,\n network_ids: args.networkIds,\n token: args.token,\n network_id: args.networkId != null ? String(args.networkId) : undefined,\n },\n });\n }\n\n verifySolanaBalance(args: VerifySolanaBalanceArgs): Promise<VerifySolanaBalanceResult> {\n const body: VerifySolanaBalanceWireArgs = {\n address: args.address,\n token_mint: args.tokenMint,\n transaction_signature: args.transactionSignature,\n };\n return this.request(\"POST\", \"/agent/portfolio/verify-solana-balance\", { body });\n }\n\n requestPayment(args: PaymentArgs): Promise<AgentResponse> {\n const operation: RequestPaymentArgs & { type: \"payment\" } = {\n type: \"payment\",\n credential_id: args.credentialId,\n merchant: args.merchant,\n merchant_url: args.merchantUrl,\n amount_cents: args.amountCents,\n currency: args.currency ?? \"USD\",\n };\n return this.request(\"POST\", \"/agent/request\", { body: { operation } });\n }\n\n requestSecret(args: SecretArgs): Promise<AgentResponse> {\n const operation: RequestSecretArgs & { type: \"secret\" } = {\n type: \"secret\",\n credential_id: args.credentialId,\n raw: args.raw ?? false,\n purpose: args.purpose ?? null,\n };\n return this.request(\"POST\", \"/agent/request\", { body: { operation } });\n }\n\n async requestWalletSign(args: WalletSignArgs, opts: SignOptions = {}): Promise<AgentResponse> {\n return this.withExpiryRetry(\n async () => {\n const operation: RequestWalletSignArgs & { type: \"wallet_sign\" } = {\n type: \"wallet_sign\",\n credential_id: args.credentialId,\n intent: args.intent,\n };\n const { response, binding } = await this.request<WalletSignResult>(\n \"POST\",\n \"/agent/wallet-sign\",\n { body: { operation } },\n );\n const creds = this.signingCreds();\n if (\n (opts.autoSign ?? true) &&\n response.status === \"pending_signature\" &&\n creds\n ) {\n const sign = () =>\n signWalletRequest(this.poster, response.request_id, args.intent, creds, binding);\n await this.signWithReconcile(response.request_id, sign);\n return this.getRequest(response.request_id);\n }\n return response;\n },\n (r) => r,\n );\n }\n\n async completeWalletSignRequest(\n requestId: string,\n ): Promise<AgentResponse> {\n const creds = this.signingCreds();\n if (!creds) {\n throw new Error(\"cannot complete wallet-sign request without a valid local signing key\");\n }\n const result = await this.mcp.callTool(\n \"reopen_signing_window\",\n { request_id: requestId },\n \"in-process\",\n );\n const parked = toolJson<{\n request_id?: string;\n status?: string;\n next_action?: { kind?: string };\n operation?: { type?: string; intent?: WalletSignArgs[\"intent\"]; wallet_id?: string; key_id?: string; derivation_path?: string };\n }>(\"reopen_signing_window\", result);\n if (parked.request_id !== requestId) {\n throw new Error(\"paybox returned a different request_id for the parked signature\");\n }\n if (parked.status === \"success\") return this.getRequest(requestId);\n if (parked.status !== \"pending_signature\") {\n throw new Error(`cannot complete wallet-sign request while it is ${parked.status ?? \"unknown\"}`);\n }\n const intent = parked.operation?.intent;\n if (\n parked.next_action?.kind !== \"sign\" ||\n parked.operation?.type !== \"wallet_sign\" ||\n !intent ||\n typeof intent.op !== \"string\"\n ) {\n throw new Error(\"paybox returned no signable wallet intent for this request\");\n }\n const binding = parked.operation && {\n wallet_id: parked.operation.wallet_id ?? \"\",\n key_id: parked.operation.key_id ?? null,\n derivation_path: parked.operation.derivation_path ?? null,\n };\n await this.signWithReconcile(requestId, () =>\n signWalletRequest(this.poster, requestId, intent, creds, binding),\n );\n return this.getRequest(requestId);\n }\n\n async requestSwap(args: SwapArgs, opts: SignOptions = {}): Promise<SwapResult> {\n return this.withExpiryRetry(\n async () => {\n const operation: RequestSwapArgs & { type: \"swap\" } = {\n type: \"swap\",\n credential_id: args.credentialId,\n src_chain: args.srcChain,\n dst_chain: args.dstChain ?? args.srcChain,\n src_token: args.srcToken,\n dst_token: args.dstToken,\n amount: args.amount,\n swap_direction: args.swapDirection ?? \"exact-amount-in\",\n slippage_bps: args.slippageBps ?? 150,\n recipient: args.recipient ?? null,\n value_cents: args.valueCents ?? null,\n };\n const result = await this.request<SwapResult>(\"POST\", \"/agent/swap\", {\n body: { operation },\n });\n return this.completeSwap(result, opts);\n },\n (r) => r.response,\n );\n }\n\n private async completeSwap(result: SwapResult, opts: SignOptions): Promise<SwapResult> {\n const creds = this.signingCreds();\n if (!(opts.autoSign ?? true) || !creds) {\n return signingResultForResponse(result, result.response);\n }\n let response = result.response;\n if (response.status === \"pending_approval\" && opts.waitForApproval) {\n response = await this.waitWhileApproval(response.request_id, opts.waitForApproval);\n }\n if (response.status !== \"pending_signature\") {\n return signingResultForResponse(result, response);\n }\n const plan = result.plan;\n if (!plan) {\n throw new Error(\"paybox returned pending_signature without a swap signing plan\");\n }\n const sign = () => signSwapRequest(this.poster, response.request_id, plan, creds);\n await this.signWithReconcile(response.request_id, sign);\n return signingResultForResponse(\n result,\n await this.requestAfterSign(response.request_id, opts.waitForApproval),\n );\n }\n\n private async waitWhileApproval(\n requestId: string,\n wait: boolean | { intervalMs?: number; timeoutMs?: number },\n ): Promise<AgentResponse> {\n const o = typeof wait === \"object\" ? wait : {};\n const interval = o.intervalMs ?? 2000;\n const deadline = Date.now() + (o.timeoutMs ?? 300_000);\n for (;;) {\n const r = await this.getRequest(requestId);\n if (r.status !== \"pending_approval\" || Date.now() > deadline) return r;\n await new Promise((res) => setTimeout(res, interval));\n }\n }\n\n private async withExpiryRetry<T>(\n run: () => Promise<T>,\n responseOf: (result: T) => AgentResponse,\n ): Promise<T> {\n const first = await run();\n const r = responseOf(first);\n if (didNotHappen(r) && r.retryable) {\n return run();\n }\n return first;\n }\n\n private async signWithReconcile(requestId: string, sign: () => Promise<unknown>): Promise<void> {\n try {\n await sign();\n } catch (err) {\n if (err instanceof PayboxError && err.reason) throw err;\n const reconciled = await this.getRequest(requestId);\n if (reconciled.status !== \"pending_signature\") return;\n await sign();\n }\n }\n\n async discoverServices(\n query?: string,\n opts: DiscoverServicesOptions = {},\n ): Promise<ServiceSummary[]> {\n const result = await this.request<{ services: ServiceSummary[] }>(\"GET\", \"/agent/services\", {\n query: {\n query,\n network: opts.network === \"all\" ? undefined : opts.network,\n raw: opts.raw ? \"true\" : undefined,\n },\n });\n return result.services;\n }\n\n async discoverServicesPage(\n query?: string,\n opts: DiscoverServicesPageOptions = {},\n ): Promise<DiscoverServicesPage> {\n return this.request<DiscoverServicesPage>(\"GET\", \"/agent/services\", {\n query: {\n query,\n network: opts.network === \"all\" ? undefined : opts.network,\n limit: (opts.limit ?? 10).toString(),\n cursor: opts.cursor,\n raw: opts.raw ? \"true\" : undefined,\n },\n });\n }\n\n async discoverPlugins(args: DiscoverPluginsArgs = {}): Promise<DiscoverPluginsPage> {\n return toolJson(\n \"discover_plugins\",\n await this.mcp.callTool(\"discover_plugins\", {\n query: args.query,\n source: args.source,\n status: args.status,\n limit: args.limit,\n cursor: args.cursor,\n }),\n );\n }\n\n async getPluginContract(contractUri: string): Promise<PluginContractResult> {\n return toolJson(\n \"get_contract\",\n await this.mcp.callTool(\"get_contract\", { contract_uri: contractUri }),\n );\n }\n\n async usePlugin(args: UsePluginArgs): Promise<McpToolResult> {\n return nonSigningFundingToolResult(await this.mcp.callTool(\"use_plugin\", {\n plugin_id: args.pluginId,\n tool_id: args.toolId,\n input: args.input,\n invocation_id: args.invocationId,\n }));\n }\n\n runPlugin(args: UsePluginArgs, options: ExecutionOptions = {}): Promise<ExecutionResult> {\n return this.executePlugin(args, options);\n }\n\n resumeRequest(requestId: string, options: ExecutionOptions = {}): Promise<ExecutionResult> {\n return this.executePlugin(requestId, options);\n }\n\n private executePlugin(start: UsePluginArgs | string, options: ExecutionOptions): Promise<ExecutionResult> {\n return executePlugin(start, options, (signal) => {\n const mcp = new McpTransport({\n baseUrl: this.baseUrl,\n bearer: () => this.bearer(),\n fetchImpl: (input, init) => {\n signal.throwIfAborted();\n return this.fetchImpl(input, { ...init, signal });\n },\n });\n const post: Poster = (path, body) => this.request(\"POST\", path, { body, signal });\n const creds = this.signingCreds();\n return {\n callTool: (name, args) => mcp.callTool(name, args, name === \"reopen_signing_window\" ? \"in-process\" : undefined),\n getRequest: (id) => this.request(\"GET\", `/agent/requests/${id}`, { signal }),\n sign: creds ? async (id, action, validate) => {\n if (action.type === \"transactions\") await signSwapRequest(post, id, action.plan, creds, validate);\n else await signWalletRequest(post, id, action.intent, creds, action.binding);\n } : undefined,\n };\n });\n }\n\n async payX402(args: X402Args, opts: SignOptions = {}): Promise<X402Result> {\n return this.withExpiryRetry(\n async () => {\n const result = await this.request<X402Result>(\"POST\", \"/agent/x402\", {\n body: {\n credential_id: args.credentialId,\n accepts: args.accepts,\n resource_url: args.resourceUrl,\n },\n });\n return this.completeX402(result, opts);\n },\n (r) => r.response,\n );\n }\n\n async useService(args: UseServiceArgs, opts: SignOptions = {}): Promise<X402Result> {\n return this.withExpiryRetry(\n async () => {\n const result = await this.request<X402Result>(\"POST\", \"/agent/use-service\", {\n body: {\n credential_id: args.credentialId,\n url: args.url,\n method: args.method,\n body: args.body,\n },\n });\n return this.completeX402(result, opts);\n },\n (r) => r.response,\n );\n }\n\n private async completeX402(result: X402Result, opts: SignOptions): Promise<X402Result> {\n const creds = this.signingCreds();\n if (!(opts.autoSign ?? true) || !creds) {\n return signingResultForResponse(result, result.response);\n }\n let response = result.response;\n if (response.status === \"pending_approval\" && opts.waitForApproval) {\n response = await this.waitWhileApproval(response.request_id, opts.waitForApproval);\n }\n if (response.status !== \"pending_signature\") {\n return signingResultForResponse(result, response);\n }\n const plan = result.plan;\n if (!plan) {\n throw new Error(\"paybox returned pending_signature without an x402 signing plan\");\n }\n const sign = () => signX402Request(this.poster, response.request_id, plan, creds);\n await this.signWithReconcile(response.request_id, sign);\n return signingResultForResponse(\n result,\n await this.requestAfterSign(response.request_id, opts.waitForApproval),\n );\n }\n\n claimPaymentCredentials(requestId: string): Promise<Record<string, unknown>> {\n return this.request(\"POST\", `/agent/requests/${requestId}/credentials`);\n }\n\n requestAccountChange(note?: string): Promise<AccountChangeResult> {\n return this.request(\"POST\", \"/agent/account-change\", { body: { note } });\n }\n\n getBuyLink(args: BuyLinkArgs): Promise<BuyLinkResult> {\n return this.request(\"GET\", \"/agent/buy-link\", {\n query: {\n credential_id: args.credentialId,\n destination_chain: args.destinationChain,\n currency_code: args.currencyCode,\n amount_usd: args.amountUsd?.toString(),\n },\n });\n }\n\n getDepositLink(args: DepositLinkArgs): Promise<DepositLinkResult> {\n return this.request(\"GET\", \"/agent/deposit-link\", {\n query: {\n credential_id: args.credentialId,\n amount_usd: args.amountUsd?.toString(),\n },\n });\n }\n\n getRequest(requestId: string): Promise<AgentResponse> {\n return this.request(\"GET\", `/agent/requests/${requestId}`);\n }\n\n private requestAfterSign(\n requestId: string,\n wait: SignOptions[\"waitForApproval\"],\n ): Promise<AgentResponse> {\n if (!wait) return this.getRequest(requestId);\n return this.waitForRequest(requestId, typeof wait === \"object\" ? wait : {});\n }\n\n async waitForRequest(\n requestId: string,\n opts: { intervalMs?: number; timeoutMs?: number } = {},\n ): Promise<AgentResponse> {\n const interval = opts.intervalMs ?? 2000;\n const deadline = Date.now() + (opts.timeoutMs ?? 300_000);\n for (;;) {\n const r = await this.getRequest(requestId);\n const pending =\n r.status === \"pending_approval\" ||\n r.status === \"pending_funding\" ||\n r.status === \"pending_signature\" ||\n r.status === \"pending_settlement\" ||\n r.status === \"pending_confirmation\";\n if (!pending || Date.now() > deadline) return r;\n await new Promise((res) => setTimeout(res, interval));\n }\n }\n}\n"],"mappings":"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","names":["Buffer","payload","Buffer","signed","requestId","payload","done","requestId"]}
|