@cmdoss/suipay-mcp 0.3.0-dev.2 → 0.3.0-dev.4

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 CHANGED
@@ -5,7 +5,7 @@ buyer-funded spend account. The buyer owns the account. The agent holds the
5
5
  delegate key and can spend only under the on-chain grant (recipient bind,
6
6
  per-payment cap, budget).
7
7
 
8
- Pin `@cmdoss/suipay-mcp@0.3.0-dev.2` in MCP config for the `latest` dist-tag.
8
+ Pin `@cmdoss/suipay-mcp@0.3.0-dev.4` in MCP config for the `latest` dist-tag.
9
9
  `npx -y @cmdoss/suipay-mcp@dev` tracks the `dev` prerelease line.
10
10
  `1.0.1` remains on the registry as a historical release; do not install it
11
11
  for new agents.
@@ -13,7 +13,7 @@ for new agents.
13
13
  ## Install
14
14
 
15
15
  ```bash
16
- claude mcp add --scope user suipay -- npx -y @cmdoss/suipay-mcp@0.3.0-dev.2
16
+ claude mcp add --scope user suipay -- npx -y @cmdoss/suipay-mcp@0.3.0-dev.4
17
17
  ```
18
18
 
19
19
  `@dev` installs the Railway-dev gateway/console defaults. A workspace
@@ -153,10 +153,10 @@ Default is Railway **suipay-dev**. `--local` / `target: "local"` is laptop-only.
153
153
 
154
154
  ```bash
155
155
  # Railway suipay-dev (default)
156
- npx @cmdoss/suipay-mcp@0.3.0-dev.2
156
+ npx @cmdoss/suipay-mcp@0.3.0-dev.4
157
157
 
158
158
  # Laptop stack
159
- npx @cmdoss/suipay-mcp@0.3.0-dev.2 --local
159
+ npx @cmdoss/suipay-mcp@0.3.0-dev.4 --local
160
160
  ```
161
161
 
162
162
  `SUIPAY_MCP_TARGET=local|dev` selects the same preset. Explicit
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import {
3
3
  main
4
- } from "../chunk-BPDD27XX.js";
4
+ } from "../chunk-JJOV775N.js";
5
5
  import {
6
6
  logError
7
- } from "../chunk-ETR3LOUH.js";
7
+ } from "../chunk-KRFK3IXQ.js";
8
8
 
9
9
  // src/bin/suipay.ts
10
10
  main().catch((err) => {
@@ -5,7 +5,7 @@ import {
5
5
  loadMcpConfig,
6
6
  loadPaymentProfile,
7
7
  logError
8
- } from "./chunk-ETR3LOUH.js";
8
+ } from "./chunk-KRFK3IXQ.js";
9
9
 
10
10
  // src/index.ts
11
11
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
@@ -2127,8 +2127,8 @@ var AUTH_CODES = {
2127
2127
  retry: "never",
2128
2128
  nextAction: "contact_support",
2129
2129
  user: {
2130
- title: "Wallet cannot spend",
2131
- message: "Your wallet isn't allowed to spend yet. Ask an operator to allow it."
2130
+ title: "Access is invite-only",
2131
+ message: "Access is invite-only. Your wallet isn't invited to spend yet."
2132
2132
  }
2133
2133
  },
2134
2134
  "auth.token_invalid": {
@@ -2647,6 +2647,19 @@ var LIMIT_CODES = {
2647
2647
  nextAction: "retry_later",
2648
2648
  user: { title: "Fee cover limit reached", message: "You've used up your covered network fees for now. Try again later." }
2649
2649
  },
2650
+ "limit.managed_daily_cap": {
2651
+ surfaces: ["gateway"],
2652
+ status: 503,
2653
+ title: "Managed service daily cap reached",
2654
+ paymentState: "not_charged",
2655
+ retry: "after_delay",
2656
+ retryAfterSeconds: 86400,
2657
+ nextAction: "retry_later",
2658
+ user: {
2659
+ title: "Temporarily unavailable",
2660
+ message: "This service isn't taking new payments right now. Try again after midnight UTC."
2661
+ }
2662
+ },
2650
2663
  "limit.rate_limited": {
2651
2664
  surfaces: ["gateway", "console_server"],
2652
2665
  status: 429,
@@ -7006,6 +7019,19 @@ function gatewayFailure(answer, local, extras) {
7006
7019
  txDigest: error.txDigest ?? extras.txDigest
7007
7020
  });
7008
7021
  }
7022
+ var SPEND_NOT_WHITELISTED = "auth.spend_not_whitelisted";
7023
+ async function spendWhitelistRefusal(response, paymentId) {
7024
+ const parsed = parseErrorPayload(await readGatewayAnswer(response));
7025
+ if (parsed?.source !== "problem" || parsed.code !== SPEND_NOT_WHITELISTED || parsed.paymentState !== "not_charged" || parsed.status !== 403) {
7026
+ return null;
7027
+ }
7028
+ const detail = parsed.detail?.trim();
7029
+ return receivedResultError(parsed.code, "not_charged", {
7030
+ ...detail ? { detail } : {},
7031
+ paymentId,
7032
+ challengeId: paymentId
7033
+ });
7034
+ }
7009
7035
  function logInternal(log, entry, error) {
7010
7036
  try {
7011
7037
  const port = log ?? defaultLog;
@@ -8086,6 +8112,11 @@ async function payDelegatedSpendAccount(args) {
8086
8112
  })
8087
8113
  });
8088
8114
  if (!createRes.ok) {
8115
+ const refused = await spendWhitelistRefusal(createRes, paymentId);
8116
+ if (refused) {
8117
+ await releaseReservation(ledger, ownedPaymentId, log);
8118
+ return refused;
8119
+ }
8089
8120
  return abortBeforeSign("SPONSOR_UNAVAILABLE", PUBLIC_DETAIL.SPONSOR_UNAVAILABLE);
8090
8121
  }
8091
8122
  const sponsored = await createRes.json();
@@ -8167,6 +8198,11 @@ async function payDelegatedSpendAccount(args) {
8167
8198
  })
8168
8199
  });
8169
8200
  if (!execRes.ok) {
8201
+ const refused = await spendWhitelistRefusal(execRes, paymentId);
8202
+ if (refused) {
8203
+ await releaseReservation(ledger, ownedPaymentId, log);
8204
+ return refused;
8205
+ }
8170
8206
  return completeAttempt(ledger, ownedPaymentId, ambiguous("EXECUTE_AMBIGUOUS", PUBLIC_DETAIL.EXECUTE_AMBIGUOUS, {
8171
8207
  paymentId,
8172
8208
  // The sponsor-minted digest is the only handle on a possible
@@ -11788,8 +11824,10 @@ function toolFailure(fields, options = {}) {
11788
11824
  };
11789
11825
  const json = JSON.stringify(structured, null, 2);
11790
11826
  const lead = fields.paymentState === "charged" ? CHARGED_LINE : fields.paymentState === "unknown" ? UNKNOWN_LINE : null;
11827
+ const invite = fields.code === "auth.spend_not_whitelisted" && fields.detail?.trim() && isErrorCode(fields.code) ? definitionOf(fields.code).user?.message : void 0;
11828
+ const head = [lead, invite].filter((line) => Boolean(line));
11791
11829
  return {
11792
- content: [{ type: "text", text: lead ? `${lead}
11830
+ content: [{ type: "text", text: head.length > 0 ? `${head.join("\n")}
11793
11831
  ${json}` : json }],
11794
11832
  structuredContent: structured,
11795
11833
  isError: true
@@ -1246,6 +1246,19 @@ declare const ERRORS: {
1246
1246
  readonly message: "You've used up your covered network fees for now. Try again later.";
1247
1247
  };
1248
1248
  };
1249
+ readonly 'limit.managed_daily_cap': {
1250
+ readonly surfaces: readonly ["gateway"];
1251
+ readonly status: 503;
1252
+ readonly title: "Managed service daily cap reached";
1253
+ readonly paymentState: "not_charged";
1254
+ readonly retry: "after_delay";
1255
+ readonly retryAfterSeconds: 86400;
1256
+ readonly nextAction: "retry_later";
1257
+ readonly user: {
1258
+ readonly title: "Temporarily unavailable";
1259
+ readonly message: "This service isn't taking new payments right now. Try again after midnight UTC.";
1260
+ };
1261
+ };
1249
1262
  readonly 'limit.rate_limited': {
1250
1263
  readonly surfaces: readonly ["gateway", "console_server"];
1251
1264
  readonly status: 429;
@@ -3017,8 +3030,8 @@ declare const ERRORS: {
3017
3030
  readonly retry: "never";
3018
3031
  readonly nextAction: "contact_support";
3019
3032
  readonly user: {
3020
- readonly title: "Wallet cannot spend";
3021
- readonly message: "Your wallet isn't allowed to spend yet. Ask an operator to allow it.";
3033
+ readonly title: "Access is invite-only";
3034
+ readonly message: "Access is invite-only. Your wallet isn't invited to spend yet.";
3022
3035
  };
3023
3036
  };
3024
3037
  readonly 'auth.token_invalid': {
package/dist/http.d.ts CHANGED
@@ -1,3 +1,3 @@
1
- export { H as handleSuipayMcpHttpRequest } from './http-Y4pl8kN8.js';
1
+ export { H as handleSuipayMcpHttpRequest } from './http-sIwCQq0D.js';
2
2
  import '@modelcontextprotocol/sdk/server/index.js';
3
3
  import '@mysten/sui/keypairs/ed25519';
package/dist/http.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  handleSuipayMcpHttpRequest
3
- } from "./chunk-ETR3LOUH.js";
3
+ } from "./chunk-KRFK3IXQ.js";
4
4
  export {
5
5
  handleSuipayMcpHttpRequest
6
6
  };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { S as SpendAccountSigningRequest, P as PaidHttpRequest, D as DelegatedKeySigner, G as GetObjectJson, a as DelegatedPayerSession, b as DelegatedPayerConfig, c as DelegatedPayerDeps, d as SpendIntent, e as DelegatedPayResult, f as DelegationScope, C as CodeFor, N as NextAction, g as GrantPolicyBinding, h as PaymentAttemptLedger, i as DelegatedPayerLog, j as PreparedSettlementTerms, X as X402PayProgress, O as Offer, M as McpConfig, k as McpAuthContext, l as McpTraceHooks, m as SpendAccountPayDeps, n as createReader } from './http-Y4pl8kN8.js';
2
- export { A as AgentHeldResolver, o as AgentHeldSettlement, p as MCP_TARGET_PRESETS, q as McpEnvelope, r as McpEnvelopeEntry, s as McpServerOptions, t as McpTarget, u as McpTraceContext, v as McpTraceRuntime, w as PACKAGE_NAME, x as PreparedPayment, y as SpendAccountPrepareResult, z as SpendAccountPrepareSession, T as TOOLS, B as buildSpendAccountPayKind, E as canonicalMcpRequestId, F as createServer, H as handleSuipayMcpHttpRequest, I as inspectMcpEnvelope, J as loadMcpConfig, K as parseMcpTargetFlag, L as prepareSpendAccountPayment, Q as resetAgentHeldProcessLedger, R as resolveAgentHeldSettlement, U as resolveGrantTarget, V as resolveMcpTarget, W as sameMcpGateway, Y as traceMcpHttpRequest, Z as verifySpendAccountPayReconstructs } from './http-Y4pl8kN8.js';
1
+ import { S as SpendAccountSigningRequest, P as PaidHttpRequest, D as DelegatedKeySigner, G as GetObjectJson, a as DelegatedPayerSession, b as DelegatedPayerConfig, c as DelegatedPayerDeps, d as SpendIntent, e as DelegatedPayResult, f as DelegationScope, C as CodeFor, N as NextAction, g as GrantPolicyBinding, h as PaymentAttemptLedger, i as DelegatedPayerLog, j as PreparedSettlementTerms, X as X402PayProgress, O as Offer, M as McpConfig, k as McpAuthContext, l as McpTraceHooks, m as SpendAccountPayDeps, n as createReader } from './http-sIwCQq0D.js';
2
+ export { A as AgentHeldResolver, o as AgentHeldSettlement, p as MCP_TARGET_PRESETS, q as McpEnvelope, r as McpEnvelopeEntry, s as McpServerOptions, t as McpTarget, u as McpTraceContext, v as McpTraceRuntime, w as PACKAGE_NAME, x as PreparedPayment, y as SpendAccountPrepareResult, z as SpendAccountPrepareSession, T as TOOLS, B as buildSpendAccountPayKind, E as canonicalMcpRequestId, F as createServer, H as handleSuipayMcpHttpRequest, I as inspectMcpEnvelope, J as loadMcpConfig, K as parseMcpTargetFlag, L as prepareSpendAccountPayment, Q as resetAgentHeldProcessLedger, R as resolveAgentHeldSettlement, U as resolveGrantTarget, V as resolveMcpTarget, W as sameMcpGateway, Y as traceMcpHttpRequest, Z as verifySpendAccountPayReconstructs } from './http-sIwCQq0D.js';
3
3
  import { SuiGrpcClient } from '@mysten/sui/grpc';
4
4
  import { Ed25519Keypair } from '@mysten/sui/keypairs/ed25519';
5
5
  import { CallToolResult } from '@modelcontextprotocol/sdk/types.js';
package/dist/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  loadBootProfile,
3
3
  main
4
- } from "./chunk-BPDD27XX.js";
4
+ } from "./chunk-JJOV775N.js";
5
5
  import {
6
6
  MCP_TARGET_PRESETS,
7
7
  PACKAGE_NAME,
@@ -26,7 +26,7 @@ import {
26
26
  settlePreparedMcpPayment,
27
27
  traceMcpHttpRequest,
28
28
  verifySpendAccountPayReconstructs
29
- } from "./chunk-ETR3LOUH.js";
29
+ } from "./chunk-KRFK3IXQ.js";
30
30
  export {
31
31
  MCP_TARGET_PRESETS,
32
32
  PACKAGE_NAME,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cmdoss/suipay-mcp",
3
- "version": "0.3.0-dev.2",
3
+ "version": "0.3.0-dev.4",
4
4
  "type": "module",
5
5
  "description": "SuiPay MCP — pay MPP-gated APIs from a spend-account grant with an agent-held delegate key.",
6
6
  "main": "./dist/index.js",
@@ -37,8 +37,8 @@
37
37
  "tsup": "^8.0.0",
38
38
  "typescript": "^6.0.3",
39
39
  "vitest": "^4.1.10",
40
- "@cmdoss/suipay-core": "0.1.0",
41
- "@cmdoss/suipay-sdk": "0.1.0"
40
+ "@cmdoss/suipay-sdk": "0.1.0",
41
+ "@cmdoss/suipay-core": "0.1.0"
42
42
  },
43
43
  "scripts": {
44
44
  "build": "tsup",