@neus/sdk 1.1.1 → 1.1.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/client.js CHANGED
@@ -1052,23 +1052,22 @@ export class NeusClient {
1052
1052
  }
1053
1053
  };
1054
1054
 
1055
- const isFarcasterWallet = (() => {
1055
+ const isBaseMiniAppWallet = (() => {
1056
1056
  if (typeof window === 'undefined') return false;
1057
1057
  try {
1058
1058
  const w = window;
1059
- const fc = w.farcaster;
1060
- if (!fc || !fc.context) return false;
1061
- const fcProvider = fc.provider || fc.walletProvider || (fc.context && fc.context.walletProvider);
1062
- if (fcProvider === provider) return true;
1063
- if (w.mini && w.mini.wallet === provider && fc && fc.context) return true;
1064
- if (w.ethereum === provider && fc && fc.context) return true;
1059
+ const mini = w.mini;
1060
+ if (!mini) return false;
1061
+ const miniProvider = mini.wallet || mini.provider;
1062
+ if (miniProvider === provider) return true;
1063
+ if (w.ethereum === provider && mini) return true;
1065
1064
  } catch {
1066
1065
  void 0;
1067
1066
  }
1068
1067
  return false;
1069
1068
  })();
1070
1069
 
1071
- if (isFarcasterWallet) {
1070
+ if (isBaseMiniAppWallet) {
1072
1071
  try {
1073
1072
  const hexMsg = toHexUtf8(message);
1074
1073
  signature = await provider.request({ method: 'personal_sign', params: [hexMsg, walletAddress] });
@@ -1482,7 +1481,9 @@ export class NeusClient {
1482
1481
 
1483
1482
  const qs = [];
1484
1483
  if (options.limit) qs.push(`limit=${encodeURIComponent(String(options.limit))}`);
1485
- if (options.offset) qs.push(`offset=${encodeURIComponent(String(options.offset))}`);
1484
+ const cursorRaw = options.cursor !== null && options.cursor !== undefined ? String(options.cursor).trim() : '';
1485
+ if (cursorRaw) qs.push(`cursor=${encodeURIComponent(cursorRaw)}`);
1486
+ else if (options.offset) qs.push(`offset=${encodeURIComponent(String(options.offset))}`);
1486
1487
  if (options.qHash) qs.push(`qHash=${encodeURIComponent(options.qHash.toLowerCase())}`);
1487
1488
 
1488
1489
  const query = qs.length ? `?${qs.join('&')}` : '';
@@ -1501,7 +1502,11 @@ export class NeusClient {
1501
1502
  proofs: Array.isArray(proofs) ? proofs : [],
1502
1503
  totalCount: response.data?.totalCount ?? proofs.length,
1503
1504
  hasMore: Boolean(response.data?.hasMore),
1504
- nextOffset: response.data?.nextOffset ?? null
1505
+ nextOffset: response.data?.nextOffset ?? null,
1506
+ nextCursor:
1507
+ typeof response.data?.nextCursor === 'string' && response.data.nextCursor.trim()
1508
+ ? response.data.nextCursor.trim()
1509
+ : null
1505
1510
  };
1506
1511
  }
1507
1512
 
@@ -1566,7 +1571,9 @@ export class NeusClient {
1566
1571
 
1567
1572
  const qs = [];
1568
1573
  if (options.limit) qs.push(`limit=${encodeURIComponent(String(options.limit))}`);
1569
- if (options.offset) qs.push(`offset=${encodeURIComponent(String(options.offset))}`);
1574
+ const cursorRaw = options.cursor !== null && options.cursor !== undefined ? String(options.cursor).trim() : '';
1575
+ if (cursorRaw) qs.push(`cursor=${encodeURIComponent(cursorRaw)}`);
1576
+ else if (options.offset) qs.push(`offset=${encodeURIComponent(String(options.offset))}`);
1570
1577
  if (options.qHash) qs.push(`qHash=${encodeURIComponent(options.qHash.toLowerCase())}`);
1571
1578
  const query = qs.length ? `?${qs.join('&')}` : '';
1572
1579
 
@@ -1587,7 +1594,11 @@ export class NeusClient {
1587
1594
  proofs: Array.isArray(proofs) ? proofs : [],
1588
1595
  totalCount: response.data?.totalCount ?? proofs.length,
1589
1596
  hasMore: Boolean(response.data?.hasMore),
1590
- nextOffset: response.data?.nextOffset ?? null
1597
+ nextOffset: response.data?.nextOffset ?? null,
1598
+ nextCursor:
1599
+ typeof response.data?.nextCursor === 'string' && response.data.nextCursor.trim()
1600
+ ? response.data.nextCursor.trim()
1601
+ : null
1591
1602
  };
1592
1603
  }
1593
1604
 
@@ -1597,6 +1608,9 @@ export class NeusClient {
1597
1608
  throw new ValidationError('Valid address is required');
1598
1609
  }
1599
1610
 
1611
+ const gateIdParam = typeof params.gateId === 'string' ? params.gateId.trim() : '';
1612
+ const verifierIds = gateIdParam ? undefined : params.verifierIds;
1613
+
1600
1614
  const qs = new URLSearchParams();
1601
1615
  qs.set('address', address);
1602
1616
 
@@ -1622,7 +1636,8 @@ export class NeusClient {
1622
1636
  setIfPresent(key, value);
1623
1637
  };
1624
1638
 
1625
- setCsvIfPresent('verifierIds', params.verifierIds);
1639
+ setIfPresent('gateId', gateIdParam);
1640
+ setCsvIfPresent('verifierIds', verifierIds);
1626
1641
  setBoolIfPresent('requireAll', params.requireAll);
1627
1642
  setIfPresent('minCount', params.minCount);
1628
1643
  setIfPresent('sinceDays', params.sinceDays);
@@ -1693,12 +1708,12 @@ export class NeusClient {
1693
1708
  }
1694
1709
 
1695
1710
  let mergedHeaders = headersOverride;
1696
- if (!mergedHeaders) {
1711
+ if (!mergedHeaders && !gateIdParam) {
1697
1712
  try {
1698
1713
  const sponsorHeaders = await this._resolveSponsorGrantHeaders(
1699
- Array.isArray(params.verifierIds)
1700
- ? params.verifierIds
1701
- : (params.verifierIds ? [params.verifierIds] : [])
1714
+ Array.isArray(verifierIds)
1715
+ ? verifierIds
1716
+ : (verifierIds ? [verifierIds] : [])
1702
1717
  );
1703
1718
  if (sponsorHeaders && Object.keys(sponsorHeaders).length > 0) {
1704
1719
  mergedHeaders = sponsorHeaders;
package/mcp-hosts.js ADDED
@@ -0,0 +1,121 @@
1
+ /**
2
+ * MCP host install constants shared by the `neus` CLI and product UI.
3
+ * Browser-safe: no Node-only APIs except the Buffer fallback for non-browser tests.
4
+ */
5
+
6
+ export const NEUS_MCP_SERVER_NAME = 'neus';
7
+ export const NEUS_MCP_URL = 'https://mcp.neus.network/mcp';
8
+ export const NEUS_SETUP_CLI = 'npx -y -p @neus/sdk neus setup';
9
+ export const NEUS_AUTH_CLI = 'npx -y -p @neus/sdk neus auth';
10
+ export const NEUS_MCP_SETUP_DOCS_URL = 'https://docs.neus.network/mcp/ide-plugin';
11
+
12
+ /** CLI `neus setup --client` values. */
13
+ export const MCP_INSTALL_CLIENTS = ['claude', 'codex', 'cursor', 'vscode'];
14
+
15
+ /** Product Profile "Open in" hosts. */
16
+ export const MCP_INSTALL_HOSTS = ['cursor', 'claude', 'codex'];
17
+
18
+ export const IDE_HOST_LABELS = {
19
+ cursor: 'Cursor',
20
+ claude: 'Claude Code',
21
+ codex: 'Codex'
22
+ };
23
+
24
+ export const IDE_HOST_BRAND_LOGOS = {
25
+ cursor: '/images/brandLogos/cursor.svg',
26
+ claude: '/images/brandLogos/anthropic.svg',
27
+ codex: '/images/brandLogos/openai.svg'
28
+ };
29
+
30
+ /**
31
+ * @param {string | null | undefined} accessKey
32
+ * @returns {{ type: 'http'; url: string; headers?: { Authorization: string } }}
33
+ */
34
+ export function buildNeusMcpHttpConfig(accessKey) {
35
+ const key = String(accessKey || '').trim();
36
+ return {
37
+ type: 'http',
38
+ url: NEUS_MCP_URL,
39
+ ...(key ? { headers: { Authorization: `Bearer ${key}` } } : {})
40
+ };
41
+ }
42
+
43
+ /**
44
+ * @param {unknown} value
45
+ * @returns {string}
46
+ */
47
+ function encodeBase64Json(value) {
48
+ const json = JSON.stringify(value);
49
+ if (typeof globalThis.btoa === 'function') {
50
+ return globalThis.btoa(json);
51
+ }
52
+ return Buffer.from(json, 'utf8').toString('base64');
53
+ }
54
+
55
+ /**
56
+ * @param {string | null | undefined} accessKey
57
+ * @returns {string}
58
+ */
59
+ export function buildCursorMcpInstallUrl(accessKey) {
60
+ const config = buildNeusMcpHttpConfig(accessKey);
61
+ const encoded = encodeBase64Json(config);
62
+ return `cursor://anysphere.cursor-deeplink/mcp/install?name=${encodeURIComponent(NEUS_MCP_SERVER_NAME)}&config=${encodeURIComponent(encoded)}`;
63
+ }
64
+
65
+ /**
66
+ * @param {string | null | undefined} accessKey
67
+ * @returns {string}
68
+ */
69
+ export function buildVsCodeMcpInstallUrl(accessKey) {
70
+ const payload = {
71
+ name: NEUS_MCP_SERVER_NAME,
72
+ ...buildNeusMcpHttpConfig(accessKey)
73
+ };
74
+ return `vscode:mcp/install?${encodeURIComponent(JSON.stringify(payload))}`;
75
+ }
76
+
77
+ /**
78
+ * @param {'claude' | 'codex' | 'cursor' | 'vscode'} client
79
+ * @returns {string}
80
+ */
81
+ export function buildAuthCommandForClient(client) {
82
+ if (client === 'codex') {
83
+ return `${NEUS_AUTH_CLI} --client codex`;
84
+ }
85
+ return NEUS_AUTH_CLI;
86
+ }
87
+
88
+ /**
89
+ * @param {'claude' | 'codex' | 'cursor' | 'vscode'} client
90
+ * @param {string | null | undefined} accessKey
91
+ * @returns {string}
92
+ */
93
+ export function buildSetupCommandForClient(client, accessKey) {
94
+ const key = String(accessKey || '').trim();
95
+ const setup = key
96
+ ? `${NEUS_SETUP_CLI} --client ${client} --access-key ${key}`
97
+ : `${NEUS_SETUP_CLI} --client ${client}`;
98
+ if (key) return setup;
99
+ return `${setup}\n${buildAuthCommandForClient(client)}`;
100
+ }
101
+
102
+ /**
103
+ * @param {'cursor' | 'claude' | 'codex'} host
104
+ * @param {string | null | undefined} accessKey
105
+ * @returns {string}
106
+ */
107
+ export function buildSetupCommandForHost(host, accessKey) {
108
+ return buildSetupCommandForClient(host, accessKey);
109
+ }
110
+
111
+ /**
112
+ * Cursor supports MCP install deeplinks; Codex uses CLI, not VS Code deeplinks.
113
+ * @param {'cursor' | 'claude' | 'codex'} host
114
+ * @returns {boolean}
115
+ */
116
+ export function supportsMcpInstallDeeplink(host) {
117
+ if (host !== 'cursor') return false;
118
+ if (typeof navigator === 'undefined') return false;
119
+ const ua = navigator.userAgent || '';
120
+ return !/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(ua);
121
+ }
package/package.json CHANGED
@@ -1,142 +1,147 @@
1
- {
2
- "name": "@neus/sdk",
3
- "version": "1.1.1",
4
- "description": "NEUS makes trust portable across the internet — so people, apps, and AI agents can prove what is real before access, payout, or execution.",
5
- "bin": {
6
- "neus": "cli/neus.mjs"
7
- },
8
- "main": "index.js",
9
- "type": "module",
10
- "types": "types.d.ts",
11
- "exports": {
12
- ".": {
13
- "types": "./types.d.ts",
14
- "import": "./index.js",
15
- "require": "./cjs/index.cjs"
16
- },
17
- "./client": {
18
- "types": "./types.d.ts",
19
- "import": "./client.js",
20
- "require": "./cjs/client.cjs"
21
- },
22
- "./utils": {
23
- "import": "./utils.js",
24
- "require": "./cjs/utils.cjs"
25
- },
26
- "./errors": {
27
- "import": "./errors.js",
28
- "require": "./cjs/errors.cjs"
29
- },
30
- "./gates": {
31
- "import": "./gates.js",
32
- "require": "./cjs/gates.cjs"
33
- },
34
- "./widgets": {
35
- "types": "./types.d.ts",
36
- "import": "./widgets/index.js",
37
- "require": "./widgets.cjs"
38
- },
39
- "./widgets/verify-gate": {
40
- "types": "./types.d.ts",
41
- "import": "./widgets/verify-gate/index.js",
42
- "require": "./widgets.cjs"
43
- }
44
- },
45
- "sideEffects": false,
46
- "scripts": {
47
- "test": "npm run build:cjs && vitest run",
48
- "test:coverage": "vitest run --coverage",
49
- "lint": "eslint . --ignore-pattern widgets/verify-gate/dist/**",
50
- "format": "prettier --write \"**/*.js\"",
51
- "build": "npm run build:widgets && npm run build:cjs",
52
- "build:widgets": "npx esbuild widgets/verify-gate/VerifyGate.jsx widgets/verify-gate/ProofBadge.jsx --bundle --platform=browser --format=esm --outdir=widgets/verify-gate/dist --jsx=automatic --legal-comments=none --loader:.svg=dataurl --external:react --external:react-dom --external:react/jsx-runtime --external:@neus/sdk/client",
53
- "build:cjs": "npx esbuild index.js client.js utils.js errors.js gates.js --bundle --platform=node --format=cjs --outdir=cjs --out-extension:.js=.cjs --legal-comments=none --external:ethers --external:@zkpassport/sdk --external:react --external:react-dom --external:react/jsx-runtime",
54
- "prepack": "npm run build",
55
- "prepublishOnly": "npm run lint && npm test && npm run build"
56
- },
57
- "keywords": [
58
- "neus",
59
- "verification",
60
- "cryptographic-proofs",
61
- "identity",
62
- "authentication",
63
- "blockchain",
64
- "cross-chain",
65
- "web3",
66
- "passwordless",
67
- "universal-protocol",
68
- "proof",
69
- "ownership",
70
- "sdk",
71
- "mcp",
72
- "model-context-protocol",
73
- "oauth"
74
- ],
75
- "author": "NEUS Network",
76
- "license": "Apache-2.0",
77
- "repository": {
78
- "type": "git",
79
- "url": "git+https://github.com/neus/network.git",
80
- "directory": "sdk"
81
- },
82
- "bugs": {
83
- "url": "https://github.com/neus/network/issues"
84
- },
85
- "homepage": "https://neus.network",
86
- "publishConfig": {
87
- "access": "public",
88
- "registry": "https://registry.npmjs.org"
89
- },
90
- "engines": {
91
- "node": ">=20.0.0"
92
- },
93
- "peerDependencies": {
94
- "ethers": "^6.0.0",
95
- "react": ">=17.0.0",
96
- "react-dom": ">=17.0.0"
97
- },
98
- "peerDependenciesMeta": {
99
- "@zkpassport/sdk": {
100
- "optional": true
101
- },
102
- "react": {
103
- "optional": true
104
- },
105
- "react-dom": {
106
- "optional": true
107
- }
108
- },
109
- "optionalDependencies": {
110
- "@zkpassport/sdk": "^0.14.0"
111
- },
112
- "dependencies": {
113
- "bs58": "^6.0.0"
114
- },
115
- "devDependencies": {
116
- "@vitest/coverage-v8": "^4.1.3",
117
- "esbuild": "^0.28.0",
118
- "eslint": "^8.56.0",
119
- "eslint-plugin-react": "^7.37.2",
120
- "prettier": "^3.2.0",
121
- "vitest": "^4.1.3"
122
- },
123
- "files": [
124
- "cli/neus.mjs",
125
- "index.js",
126
- "client.js",
127
- "utils.js",
128
- "errors.js",
129
- "gates.js",
130
- "sponsor.js",
131
- "cjs/**",
132
- "widgets.cjs",
133
- "types.d.ts",
134
- "README.md",
135
- "SECURITY.md",
136
- "LICENSE",
137
- "widgets/index.js",
138
- "widgets/verify-gate/index.js",
139
- "widgets/verify-gate/dist/VerifyGate.js",
140
- "widgets/verify-gate/dist/ProofBadge.js"
141
- ]
142
- }
1
+ {
2
+ "name": "@neus/sdk",
3
+ "version": "1.1.4",
4
+ "description": "NEUS makes trust portable across the internet — so people, apps, and AI agents can prove what is real before access, payout, or execution.",
5
+ "bin": {
6
+ "neus": "cli/neus.mjs"
7
+ },
8
+ "main": "index.js",
9
+ "type": "module",
10
+ "types": "types.d.ts",
11
+ "exports": {
12
+ ".": {
13
+ "types": "./types.d.ts",
14
+ "import": "./index.js",
15
+ "require": "./cjs/index.cjs"
16
+ },
17
+ "./client": {
18
+ "types": "./types.d.ts",
19
+ "import": "./client.js",
20
+ "require": "./cjs/client.cjs"
21
+ },
22
+ "./utils": {
23
+ "import": "./utils.js",
24
+ "require": "./cjs/utils.cjs"
25
+ },
26
+ "./errors": {
27
+ "import": "./errors.js",
28
+ "require": "./cjs/errors.cjs"
29
+ },
30
+ "./gates": {
31
+ "import": "./gates.js",
32
+ "require": "./cjs/gates.cjs"
33
+ },
34
+ "./mcp-hosts": {
35
+ "import": "./mcp-hosts.js",
36
+ "require": "./cjs/mcp-hosts.cjs"
37
+ },
38
+ "./widgets": {
39
+ "types": "./types.d.ts",
40
+ "import": "./widgets/index.js",
41
+ "require": "./widgets.cjs"
42
+ },
43
+ "./widgets/verify-gate": {
44
+ "types": "./types.d.ts",
45
+ "import": "./widgets/verify-gate/index.js",
46
+ "require": "./widgets.cjs"
47
+ }
48
+ },
49
+ "sideEffects": false,
50
+ "scripts": {
51
+ "test": "npm run build:cjs && vitest run",
52
+ "test:coverage": "vitest run --coverage",
53
+ "lint": "eslint . --ignore-pattern widgets/verify-gate/dist/**",
54
+ "format": "prettier --write \"**/*.js\"",
55
+ "build": "npm run build:widgets && npm run build:cjs",
56
+ "build:widgets": "npx esbuild widgets/verify-gate/VerifyGate.jsx widgets/verify-gate/ProofBadge.jsx --bundle --platform=browser --format=esm --outdir=widgets/verify-gate/dist --jsx=automatic --legal-comments=none --external:react --external:react-dom --external:react/jsx-runtime --external:@neus/sdk/client",
57
+ "build:cjs": "npx esbuild index.js client.js utils.js errors.js gates.js mcp-hosts.js --bundle --platform=node --format=cjs --outdir=cjs --out-extension:.js=.cjs --legal-comments=none --external:ethers --external:@zkpassport/sdk --external:react --external:react-dom --external:react/jsx-runtime",
58
+ "prepack": "npm run build",
59
+ "prepublishOnly": "npm run lint && npm test && npm run build"
60
+ },
61
+ "keywords": [
62
+ "neus",
63
+ "verification",
64
+ "cryptographic-proofs",
65
+ "identity",
66
+ "authentication",
67
+ "blockchain",
68
+ "cross-chain",
69
+ "web3",
70
+ "passwordless",
71
+ "universal-protocol",
72
+ "proof",
73
+ "ownership",
74
+ "sdk",
75
+ "mcp",
76
+ "model-context-protocol",
77
+ "oauth"
78
+ ],
79
+ "author": "NEUS Network",
80
+ "license": "Apache-2.0",
81
+ "repository": {
82
+ "type": "git",
83
+ "url": "git+https://github.com/neus/network.git",
84
+ "directory": "sdk"
85
+ },
86
+ "bugs": {
87
+ "url": "https://github.com/neus/network/issues"
88
+ },
89
+ "homepage": "https://neus.network",
90
+ "publishConfig": {
91
+ "access": "public",
92
+ "registry": "https://registry.npmjs.org"
93
+ },
94
+ "engines": {
95
+ "node": ">=20.0.0"
96
+ },
97
+ "peerDependencies": {
98
+ "ethers": "^6.0.0",
99
+ "react": ">=17.0.0",
100
+ "react-dom": ">=17.0.0"
101
+ },
102
+ "peerDependenciesMeta": {
103
+ "@zkpassport/sdk": {
104
+ "optional": true
105
+ },
106
+ "react": {
107
+ "optional": true
108
+ },
109
+ "react-dom": {
110
+ "optional": true
111
+ }
112
+ },
113
+ "optionalDependencies": {
114
+ "@zkpassport/sdk": "^0.14.0"
115
+ },
116
+ "dependencies": {
117
+ "bs58": "^6.0.0"
118
+ },
119
+ "devDependencies": {
120
+ "@vitest/coverage-v8": "^4.1.3",
121
+ "esbuild": "^0.28.0",
122
+ "eslint": "^8.56.0",
123
+ "eslint-plugin-react": "^7.37.2",
124
+ "prettier": "^3.2.0",
125
+ "vitest": "^4.1.3"
126
+ },
127
+ "files": [
128
+ "cli/neus.mjs",
129
+ "mcp-hosts.js",
130
+ "index.js",
131
+ "client.js",
132
+ "utils.js",
133
+ "errors.js",
134
+ "gates.js",
135
+ "sponsor.js",
136
+ "cjs/**",
137
+ "widgets.cjs",
138
+ "types.d.ts",
139
+ "README.md",
140
+ "SECURITY.md",
141
+ "LICENSE",
142
+ "widgets/index.js",
143
+ "widgets/verify-gate/index.js",
144
+ "widgets/verify-gate/dist/VerifyGate.js",
145
+ "widgets/verify-gate/dist/ProofBadge.js"
146
+ ]
147
+ }
package/types.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- declare module '@neus/sdk' {
1
+ declare module '@neus/sdk' {
2
2
  export interface Eip1193Provider {
3
3
  request(args: { method: string; params?: unknown[] | Record<string, unknown> }): Promise<unknown>;
4
4
  }
@@ -57,18 +57,18 @@ declare module '@neus/sdk' {
57
57
 
58
58
  export interface NeusClientConfig {
59
59
  apiUrl?: string;
60
- /** Optional server profile key MCP/CI only; not required for VerifyGate or gateCheck. */
60
+ /** Optional server profile key; MCP/CI only. Not required for VerifyGate or gateCheck. */
61
61
  apiKey?: string;
62
62
  /** Public app attribution id (non-secret). */
63
63
  appId?: string;
64
- /** Hub wallet that pays for user verification checks (your NEUS account). */
64
+ /** Advanced server/app sponsor wallet. Published gate checkout resolves billing from gateId. */
65
65
  billingWallet?: string;
66
66
  /** Alias for billingWallet. */
67
67
  sponsorOrgWallet?: string;
68
68
  orgWallet?: string;
69
69
  /** Site origin used when issuing billing authorization (defaults to browser origin). */
70
70
  appOrigin?: string;
71
- /** @deprecated Advanced server path only use appId + billingWallet for the default app flow. */
71
+ /** Advanced server path only; not required for published gate checkout. */
72
72
  appLinkQHash?: string;
73
73
  paymentSignature?: string;
74
74
  extraHeaders?: Record<string, string>;
@@ -479,6 +479,7 @@ declare module '@neus/sdk' {
479
479
  export interface GetProofsOptions {
480
480
  limit?: number;
481
481
  offset?: number;
482
+ cursor?: string;
482
483
  chain?: string;
483
484
  signatureMethod?: string;
484
485
  }
@@ -489,6 +490,8 @@ declare module '@neus/sdk' {
489
490
  totalCount: number;
490
491
  hasMore: boolean;
491
492
  nextOffset?: number | null;
493
+ /** Keyset continuation when the API returns cursor paging (preferred over deep offsets). */
494
+ nextCursor?: string | null;
492
495
  }
493
496
 
494
497
  export interface GateRequirement {
@@ -514,6 +517,8 @@ declare module '@neus/sdk' {
514
517
 
515
518
  export interface GateCheckApiParams {
516
519
  address: string;
520
+ /** Published gate handle; resolves checks server-side (preferred public path). */
521
+ gateId?: string;
517
522
  verifierIds?: string[] | string;
518
523
  requireAll?: boolean;
519
524
  minCount?: number;
@@ -879,6 +884,8 @@ declare module '@neus/sdk' {
879
884
 
880
885
  declare module '@neus/sdk/widgets' {
881
886
  export interface VerifyGateProps {
887
+ /** Published gate checkout handle (default integration path). */
888
+ gateId?: string;
882
889
  requiredVerifiers?: string[];
883
890
  onVerified?: (result: {
884
891
  qHash: string;
@@ -910,12 +917,8 @@ declare module '@neus/sdk/widgets' {
910
917
  oauthProvider?: string;
911
918
  style?: Record<string, any>;
912
919
  children?: any;
913
- verifierOptions?: Record<string, any>;
914
- verifierData?: Record<string, any>;
915
- proofOptions?: Record<string, any>;
916
920
  strategy?: 'reuse-or-create' | 'reuse' | 'fresh';
917
921
  checkExisting?: boolean;
918
- maxProofAgeMs?: number;
919
922
  allowPrivateReuse?: boolean;
920
923
  showBrand?: boolean;
921
924
  disabled?: boolean;
@@ -996,3 +999,31 @@ declare module '@neus/sdk/widgets/verify-gate' {
996
999
  declare module '@neus/sdk/client' {
997
1000
  export { NeusClient } from '@neus/sdk';
998
1001
  }
1002
+
1003
+ declare module '@neus/sdk/mcp-hosts' {
1004
+ export type McpInstallClient = 'claude' | 'codex' | 'cursor' | 'vscode';
1005
+ export type McpInstallHost = 'cursor' | 'claude' | 'codex';
1006
+
1007
+ export const NEUS_MCP_SERVER_NAME: string;
1008
+ export const NEUS_MCP_URL: string;
1009
+ export const NEUS_SETUP_CLI: string;
1010
+ export const NEUS_AUTH_CLI: string;
1011
+ export const NEUS_MCP_SETUP_DOCS_URL: string;
1012
+ export const MCP_INSTALL_CLIENTS: McpInstallClient[];
1013
+ export const MCP_INSTALL_HOSTS: McpInstallHost[];
1014
+ export const IDE_HOST_LABELS: Record<McpInstallHost, string>;
1015
+ export const IDE_HOST_BRAND_LOGOS: Record<McpInstallHost, string>;
1016
+
1017
+ export function buildNeusMcpHttpConfig(accessKey?: string | null): {
1018
+ type: 'http';
1019
+ url: string;
1020
+ headers?: { Authorization: string };
1021
+ };
1022
+
1023
+ export function buildCursorMcpInstallUrl(accessKey?: string | null): string;
1024
+ export function buildVsCodeMcpInstallUrl(accessKey?: string | null): string;
1025
+ export function buildAuthCommandForClient(client: McpInstallClient): string;
1026
+ export function buildSetupCommandForClient(client: McpInstallClient, accessKey?: string | null): string;
1027
+ export function buildSetupCommandForHost(host: McpInstallHost, accessKey?: string | null): string;
1028
+ export function supportsMcpInstallDeeplink(host: McpInstallHost): boolean;
1029
+ }