@truealter/sdk 0.0.1 → 0.2.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/LICENSE +17 -0
- package/README.md +441 -1
- package/dist/bin/alter-identity.js +1330 -0
- package/dist/bin/alter-identity.js.map +1 -0
- package/dist/bin/mcp-bridge.js +491 -0
- package/dist/bin/mcp-bridge.js.map +1 -0
- package/dist/index.cjs +1316 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +1470 -0
- package/dist/index.d.ts +1470 -0
- package/dist/index.js +1253 -0
- package/dist/index.js.map +1 -0
- package/package.json +62 -8
- package/index.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/errors.ts","../../src/discovery.ts","../../src/x402.ts","../../src/mcp.ts","../../src/auth.ts","../../src/provenance.ts","../../src/client.ts","../../src/adapters/generic-mcp.ts","../../src/adapters/claude-code.ts","../../src/adapters/cursor.ts","../../src/index.ts","../../bin/alter-identity.ts"],"names":["url","body"],"mappings":"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","file":"alter-identity.js","sourcesContent":["/**\n * Typed error hierarchy for the ALTER Identity SDK.\n *\n * Every error thrown by the SDK is an instance of {@link AlterError}, with\n * a discriminated `code` field for programmatic handling. Network failures,\n * authentication problems, payment-required responses, rate limits, tool\n * execution failures, and provenance verification mismatches each get\n * their own subclass so consumers can `instanceof`-narrow.\n */\n\nexport type AlterErrorCode =\n | 'NETWORK'\n | 'TIMEOUT'\n | 'AUTH'\n | 'PAYMENT_REQUIRED'\n | 'RATE_LIMITED'\n | 'TOOL_ERROR'\n | 'PROVENANCE'\n | 'DISCOVERY'\n | 'INVALID_RESPONSE'\n | 'UNSUPPORTED';\n\nexport class AlterError extends Error {\n public readonly code: AlterErrorCode;\n public readonly cause?: unknown;\n\n constructor(code: AlterErrorCode, message: string, cause?: unknown) {\n super(message);\n this.name = 'AlterError';\n this.code = code;\n this.cause = cause;\n // Preserve the prototype chain across transpilation targets.\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class AlterNetworkError extends AlterError {\n constructor(message: string, cause?: unknown) {\n super('NETWORK', message, cause);\n this.name = 'AlterNetworkError';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class AlterTimeoutError extends AlterError {\n constructor(message: string, cause?: unknown) {\n super('TIMEOUT', message, cause);\n this.name = 'AlterTimeoutError';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class AlterAuthError extends AlterError {\n public readonly status: number;\n\n constructor(message: string, status: number = 401) {\n super('AUTH', message);\n this.name = 'AlterAuthError';\n this.status = status;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * Thrown on HTTP 402. Carries the payment envelope returned by the server\n * so an x402 client can settle the transaction and retry.\n */\nexport class AlterPaymentRequired extends AlterError {\n public readonly envelope: PaymentEnvelope;\n public readonly tool: string;\n\n constructor(tool: string, envelope: PaymentEnvelope) {\n super('PAYMENT_REQUIRED', `x402 payment required for tool \"${tool}\"`);\n this.name = 'AlterPaymentRequired';\n this.tool = tool;\n this.envelope = envelope;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class AlterRateLimited extends AlterError {\n public readonly retryAfter: number;\n\n constructor(message: string, retryAfter: number = 60) {\n super('RATE_LIMITED', message);\n this.name = 'AlterRateLimited';\n this.retryAfter = retryAfter;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class AlterToolError extends AlterError {\n public readonly tool: string;\n public readonly rpcCode?: number;\n\n constructor(tool: string, message: string, rpcCode?: number) {\n super('TOOL_ERROR', message);\n this.name = 'AlterToolError';\n this.tool = tool;\n this.rpcCode = rpcCode;\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class AlterProvenanceError extends AlterError {\n constructor(message: string, cause?: unknown) {\n super('PROVENANCE', message, cause);\n this.name = 'AlterProvenanceError';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class AlterDiscoveryError extends AlterError {\n constructor(message: string, cause?: unknown) {\n super('DISCOVERY', message, cause);\n this.name = 'AlterDiscoveryError';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\nexport class AlterInvalidResponse extends AlterError {\n constructor(message: string, cause?: unknown) {\n super('INVALID_RESPONSE', message, cause);\n this.name = 'AlterInvalidResponse';\n Object.setPrototypeOf(this, new.target.prototype);\n }\n}\n\n/**\n * x402 payment envelope returned in HTTP 402 responses or in the\n * `X-402-Payment` response header. The shape mirrors the x402 spec.\n */\nexport interface PaymentEnvelope {\n scheme: 'x402';\n network: 'base' | 'base-sepolia' | 'solana' | string;\n asset: 'USDC' | string;\n amount: string;\n recipient: string;\n resource: string;\n expires_at?: string;\n nonce?: string;\n /** Anything else the server included verbatim. */\n [extra: string]: unknown;\n}\n","/**\n * MCP endpoint discovery.\n *\n * Implements the three-step discovery cascade defined in\n * `draft-morrison-mcp-dns-discovery-01`:\n *\n * 1. DNS TXT record at `_mcp.<domain>` with `mcp=<url>` attribute\n * 2. HTTPS GET `https://<domain>/.well-known/mcp.json`\n * 3. HTTPS GET `https://<domain>/.well-known/alter.json`\n *\n * The DNS lookup is only attempted in environments that expose `dns`\n * (Node, Bun, Deno with the node compatibility layer). Browsers and\n * Cloudflare Workers fall through to the `.well-known` lookups.\n */\n\nimport { AlterDiscoveryError, AlterNetworkError } from './errors.js';\n\nexport interface DiscoveryResult {\n /** Resolved MCP endpoint URL. */\n url: string;\n /** MCP transport — currently always `streamable-http`. */\n transport: 'streamable-http';\n /** Source of the discovery hit, useful for diagnostics. */\n source: 'dns' | 'mcp.json' | 'alter.json' | 'override';\n /** Optional Ed25519 public key from `alter.json` for provenance verification. */\n publicKey?: string;\n /** Optional x402 contract address. */\n x402Contract?: string;\n /** Capability level (E1-E4) when present. */\n capability?: string;\n /** Raw discovery document, kept for callers that want to inspect it. */\n raw?: Record<string, unknown>;\n}\n\nexport interface DiscoveryOptions {\n /** Cache hits in memory for the duration of this process. Default true. */\n cache?: boolean;\n /** Skip DNS lookup even when available. */\n skipDns?: boolean;\n /** Per-request timeout in milliseconds. Default 5_000. */\n timeoutMs?: number;\n /** Override fetch implementation (for testing). */\n fetch?: typeof fetch;\n}\n\nconst _cache = new Map<string, DiscoveryResult>();\n\n/**\n * Resolve the ALTER MCP endpoint for `domain`.\n *\n * Order: cache → DNS TXT → mcp.json → alter.json. Throws\n * {@link AlterDiscoveryError} if every step fails.\n */\nexport async function discover(domain: string, opts: DiscoveryOptions = {}): Promise<DiscoveryResult> {\n const { cache = true, skipDns = false, timeoutMs = 5_000, fetch: fetchImpl = fetch } = opts;\n const host = normaliseDomain(domain);\n\n if (cache && _cache.has(host)) return _cache.get(host)!;\n\n const errors: string[] = [];\n\n // 1. DNS TXT\n if (!skipDns) {\n try {\n const dnsHit = await tryDns(host);\n if (dnsHit) {\n const result: DiscoveryResult = { url: dnsHit, transport: 'streamable-http', source: 'dns' };\n if (cache) _cache.set(host, result);\n return result;\n }\n } catch (err) {\n errors.push(`dns: ${(err as Error).message}`);\n }\n }\n\n // 2. .well-known/mcp.json\n try {\n const result = await tryWellKnown(host, 'mcp.json', timeoutMs, fetchImpl);\n if (result) {\n if (cache) _cache.set(host, result);\n return result;\n }\n } catch (err) {\n errors.push(`mcp.json: ${(err as Error).message}`);\n }\n\n // 3. .well-known/alter.json\n try {\n const result = await tryWellKnown(host, 'alter.json', timeoutMs, fetchImpl);\n if (result) {\n if (cache) _cache.set(host, result);\n return result;\n }\n } catch (err) {\n errors.push(`alter.json: ${(err as Error).message}`);\n }\n\n throw new AlterDiscoveryError(\n `No MCP discovery hit for ${host}: ${errors.join('; ') || 'all sources empty'}`,\n );\n}\n\n/** Wipe the in-memory discovery cache. */\nexport function clearDiscoveryCache(): void {\n _cache.clear();\n}\n\n// ── Internals ────────────────────────────────────────────────────────────\n\nfunction normaliseDomain(input: string): string {\n // Strip protocol, path, port, trailing slashes.\n let host = input.trim().toLowerCase();\n host = host.replace(/^https?:\\/\\//, '');\n host = host.split('/')[0];\n host = host.split(':')[0];\n if (!host) throw new AlterDiscoveryError(`Empty domain: \"${input}\"`);\n return host;\n}\n\nasync function tryDns(host: string): Promise<string | null> {\n // DNS lookups only work where `node:dns` is available. We import lazily\n // so the module stays tree-shakeable in the browser.\n let resolveTxt: (name: string) => Promise<string[][]>;\n try {\n const dns = await import('node:dns/promises');\n resolveTxt = dns.resolveTxt.bind(dns);\n } catch {\n return null;\n }\n\n let records: string[][];\n try {\n records = await resolveTxt(`_mcp.${host}`);\n } catch (err) {\n const code = (err as NodeJS.ErrnoException).code;\n // ENOTFOUND / ENODATA are normal misses, not errors.\n if (code === 'ENOTFOUND' || code === 'ENODATA') return null;\n throw err;\n }\n\n for (const chunks of records) {\n const joined = chunks.join('');\n const parsed = parseDnsTxt(joined);\n if (parsed.mcp) return parsed.mcp;\n }\n return null;\n}\n\nfunction parseDnsTxt(record: string): Record<string, string> {\n // Records are key=value pairs separated by whitespace or semicolons.\n const out: Record<string, string> = {};\n for (const part of record.split(/[;\\s]+/)) {\n const [k, ...rest] = part.split('=');\n if (!k || rest.length === 0) continue;\n out[k.toLowerCase()] = rest.join('=');\n }\n return out;\n}\n\nasync function tryWellKnown(\n host: string,\n file: 'mcp.json' | 'alter.json',\n timeoutMs: number,\n fetchImpl: typeof fetch,\n): Promise<DiscoveryResult | null> {\n const url = `https://${host}/.well-known/${file}`;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n let resp: Response;\n try {\n // `redirect: \"manual\"` — the URL is constructed from caller-supplied\n // domain input; a 3xx to an attacker-controlled origin would silently\n // hand that origin's JSON (including `pk`/`x402`/`cap`) to the SDK as\n // authoritative discovery data. Any redirect is rejected explicitly below.\n resp = await fetchImpl(url, {\n method: 'GET',\n headers: { Accept: 'application/json' },\n signal: controller.signal,\n redirect: 'manual',\n });\n } catch (err) {\n throw new AlterNetworkError(`fetch ${url}: ${(err as Error).message}`, err);\n } finally {\n clearTimeout(timer);\n }\n\n // Manual-redirect mode surfaces 3xx as opaque-redirect (status 0) in browsers\n // and as the actual status in Node. Either way, reject: the Location target\n // is NOT within the validated domain.\n if (resp.type === 'opaqueredirect' || (resp.status >= 300 && resp.status < 400)) {\n throw new AlterNetworkError(\n `${url} → redirect rejected (discovery must not follow redirects; validate the server configuration)`,\n );\n }\n if (resp.status === 404) return null;\n if (!resp.ok) throw new AlterNetworkError(`${url} → HTTP ${resp.status}`);\n\n const doc = (await resp.json()) as Record<string, unknown>;\n\n if (file === 'mcp.json') {\n // mcp.json may carry remotes[] or a top-level url\n const remotes = (doc.remotes as Array<{ url?: string; transportType?: string }>) || [];\n const remote = remotes.find((r) => r.transportType === 'streamable-http' || r.transportType === 'http');\n const url = remote?.url || (doc.url as string | undefined);\n if (!url) return null;\n return { url, transport: 'streamable-http', source: 'mcp.json', raw: doc };\n }\n\n // alter.json — { v, mcp, pk, x402, cap, ... }\n const mcpHost = doc.mcp as string | undefined;\n if (!mcpHost) return null;\n return {\n url: ensureMcpPath(mcpHost),\n transport: 'streamable-http',\n source: 'alter.json',\n publicKey: doc.pk as string | undefined,\n x402Contract: doc.x402 as string | undefined,\n capability: doc.cap as string | undefined,\n raw: doc,\n };\n}\n\n/**\n * `.well-known/alter.json` carries the bare branded host\n * (`https://mcp.truealter.com`) but the actual JSON-RPC endpoint lives\n * at `/api/v1/mcp`. If the discovered URL has no path component, append\n * it. URLs that already include a path are left alone — newer descriptors\n * may move the endpoint.\n */\nfunction ensureMcpPath(url: string): string {\n try {\n const u = new URL(url);\n if (u.pathname === '' || u.pathname === '/') u.pathname = '/api/v1/mcp';\n return u.toString().replace(/\\/$/, '');\n } catch {\n return url;\n }\n}\n","/**\n * x402 micropayment client.\n *\n * Premium MCP tools return HTTP 402 with a payment envelope. The\n * {@link X402Client} settles the envelope on Base L2 (USDC) and replays\n * the original request with the resulting transaction reference.\n *\n * The actual on-chain settlement is delegated to a pluggable\n * {@link X402Signer} so that the SDK ships *without* a hard dependency\n * on viem, ethers, or any specific wallet library. Apps that want a\n * default signer should pass `viemX402Signer` (separate, opt-in package).\n */\n\nimport { AlterError, AlterPaymentRequired, type PaymentEnvelope } from './errors.js';\n\nexport interface X402Signer {\n /**\n * Settle a payment envelope and return a settlement reference (a tx hash\n * for EVM chains, a signature for off-chain payments). The reference is\n * what gets sent back to the MCP server to authorise the retry.\n */\n settle(envelope: PaymentEnvelope): Promise<X402Settlement>;\n}\n\nexport interface X402Settlement {\n /** EVM tx hash, Solana signature, or facilitator-issued reference. */\n reference: string;\n /** Network the settlement was broadcast on. */\n network: string;\n /** Amount paid (matches envelope.amount). */\n amount: string;\n /** Asset paid (matches envelope.asset). */\n asset: string;\n}\n\nexport interface X402ClientOptions {\n /** Pluggable signer. Required if you want automatic settlement. */\n signer?: X402Signer;\n /**\n * Maximum amount the client will spend per query, in the asset's display\n * unit (e.g. `\"0.50\"` for fifty cents USDC). Hard cap — quotes above this\n * are rejected even if a signer is configured.\n */\n maxPerQuery?: string;\n /** Permitted networks. Defaults to `['base', 'base-sepolia']`. */\n networks?: string[];\n /** Permitted assets. Defaults to `['USDC']`. */\n assets?: string[];\n}\n\nexport class X402Client {\n private readonly signer?: X402Signer;\n private readonly maxPerQuery?: number;\n private readonly networks: Set<string>;\n private readonly assets: Set<string>;\n\n constructor(opts: X402ClientOptions = {}) {\n this.signer = opts.signer;\n this.maxPerQuery = opts.maxPerQuery !== undefined ? Number(opts.maxPerQuery) : undefined;\n this.networks = new Set(opts.networks ?? ['base', 'base-sepolia']);\n this.assets = new Set(opts.assets ?? ['USDC']);\n }\n\n /**\n * Validate the envelope against this client's policy and, if a signer\n * is configured, settle it. Returns the settlement reference that\n * should be replayed in the next request's `_payment` field.\n */\n async authorise(envelope: PaymentEnvelope): Promise<X402Settlement> {\n if (envelope.scheme !== 'x402') {\n throw new AlterError('PAYMENT_REQUIRED', `unsupported payment scheme: ${envelope.scheme}`);\n }\n if (!this.networks.has(envelope.network)) {\n throw new AlterError('PAYMENT_REQUIRED', `network ${envelope.network} not permitted by client policy`);\n }\n if (!this.assets.has(envelope.asset)) {\n throw new AlterError('PAYMENT_REQUIRED', `asset ${envelope.asset} not permitted by client policy`);\n }\n if (this.maxPerQuery !== undefined && Number(envelope.amount) > this.maxPerQuery) {\n throw new AlterError(\n 'PAYMENT_REQUIRED',\n `quote ${envelope.amount} ${envelope.asset} exceeds maxPerQuery ${this.maxPerQuery}`,\n );\n }\n if (!this.signer) {\n // No signer — re-raise so the caller can handle settlement themselves.\n throw new AlterPaymentRequired(envelope.resource ?? 'unknown', envelope);\n }\n return this.signer.settle(envelope);\n }\n\n /**\n * Build the `_payment` argument that gets attached to retried tool calls.\n * Mirrors the shape the ALTER server expects.\n */\n static buildPaymentArg(settlement: X402Settlement): Record<string, string> {\n return {\n scheme: 'x402',\n network: settlement.network,\n asset: settlement.asset,\n amount: settlement.amount,\n reference: settlement.reference,\n };\n }\n}\n\n/**\n * Parse an `X-402-Payment` response header into a {@link PaymentEnvelope}.\n * The header value is JSON or a key=value list — we handle both.\n */\nexport function parsePaymentHeader(header: string): PaymentEnvelope | null {\n try {\n const parsed = JSON.parse(header);\n if (parsed && typeof parsed === 'object') return parsed as PaymentEnvelope;\n } catch {\n // fall through to kv parsing\n }\n const out: Record<string, string> = {};\n for (const part of header.split(/[,;]/)) {\n const [k, ...rest] = part.trim().split('=');\n if (!k) continue;\n out[k] = rest.join('=').replace(/^\"|\"$/g, '');\n }\n if (!out.scheme && !out.network && !out.amount) return null;\n return {\n scheme: 'x402',\n network: out.network || 'base',\n asset: out.asset || 'USDC',\n amount: out.amount || '0',\n recipient: out.recipient || '',\n resource: out.resource || '',\n expires_at: out.expires_at,\n nonce: out.nonce,\n };\n}\n","/**\n * Low-level MCP JSON-RPC 2.0 client over Streamable HTTP.\n *\n * The MCP spec (revision 2025-03-26) defines a request/response protocol\n * over HTTP POST with optional `Mcp-Session-Id` correlation. This module\n * is the thin transport — see {@link AlterClient} for the typed wrapper\n * around ALTER's tool surface.\n *\n * Pure native `fetch()` — no axios, no node-fetch, no ws.\n */\n\nimport {\n AlterAuthError,\n AlterError,\n AlterInvalidResponse,\n AlterNetworkError,\n AlterPaymentRequired,\n AlterRateLimited,\n AlterTimeoutError,\n AlterToolError,\n type PaymentEnvelope,\n} from './errors.js';\nimport { parsePaymentHeader, X402Client } from './x402.js';\n\nexport const MCP_PROTOCOL_VERSION = '2025-03-26';\n\nexport interface MCPClientInfo {\n name: string;\n version: string;\n}\n\nexport interface MCPClientOptions {\n /** Streamable HTTP endpoint. Default: https://mcp.truealter.com */\n endpoint?: string;\n /** Optional API key for the `X-ALTER-API-Key` header. */\n apiKey?: string;\n /** Override fetch (testing). */\n fetch?: typeof fetch;\n /** Per-request timeout in milliseconds. Default 30_000. */\n timeoutMs?: number;\n /** Number of retry attempts on transient (429/502/503/504) failures. Default 2. */\n maxRetries?: number;\n /** Client info advertised in `initialize`. */\n clientInfo?: MCPClientInfo;\n /** Optional x402 client for automatic premium tool payment. */\n x402?: X402Client;\n}\n\nexport interface MCPCallOptions {\n /** Override the configured x402 client for this single call. */\n x402?: X402Client;\n /** Skip retries on 402 (useful for \"is this premium?\" probes). */\n noPaymentRetry?: boolean;\n}\n\nexport interface MCPToolDefinition {\n name: string;\n description?: string;\n inputSchema?: unknown;\n _meta?: Record<string, unknown>;\n}\n\nexport interface MCPListToolsResult {\n tools: MCPToolDefinition[];\n _meta?: {\n signatures?: Record<string, { schema_hash: string; signature?: string | null; kid?: string | null }>;\n [extra: string]: unknown;\n };\n}\n\nexport interface MCPContentBlock {\n type: 'text' | 'json' | string;\n text?: string;\n data?: unknown;\n}\n\nexport interface MCPCallToolResult<T = unknown> {\n content: MCPContentBlock[];\n isError?: boolean;\n /** Parsed structured payload — set when content[0].type === 'json' or text parses as JSON. */\n data?: T;\n _meta?: {\n provenance?: import('./provenance.js').ProvenanceEnvelope;\n [extra: string]: unknown;\n };\n}\n\nconst RETRYABLE_STATUSES = new Set([429, 502, 503, 504]);\n\nexport class MCPClient {\n public readonly endpoint: string;\n public sessionId: string | null = null;\n\n private readonly apiKey: string | undefined;\n private readonly fetchImpl: typeof fetch;\n private readonly timeoutMs: number;\n private readonly maxRetries: number;\n private readonly clientInfo: MCPClientInfo;\n private readonly x402?: X402Client;\n private requestCounter = 0;\n private initialised = false;\n\n constructor(opts: MCPClientOptions = {}) {\n this.endpoint = (opts.endpoint ?? 'https://mcp.truealter.com/api/v1/mcp').replace(/\\/+$/, '');\n this.apiKey = opts.apiKey;\n this.fetchImpl = opts.fetch ?? fetch;\n this.timeoutMs = opts.timeoutMs ?? 30_000;\n this.maxRetries = opts.maxRetries ?? 2;\n this.clientInfo = opts.clientInfo ?? { name: '@truealter/sdk', version: '0.2.0' };\n this.x402 = opts.x402;\n }\n\n /**\n * Send the MCP `initialize` handshake and capture the resulting session\n * id. Idempotent — safe to call multiple times.\n */\n async initialize(): Promise<unknown> {\n if (this.initialised) return null;\n const result = await this.rpc('initialize', {\n protocolVersion: MCP_PROTOCOL_VERSION,\n capabilities: {},\n clientInfo: this.clientInfo,\n });\n this.initialised = true;\n return result;\n }\n\n /** List available tools. */\n async listTools(): Promise<MCPListToolsResult> {\n if (!this.initialised) await this.initialize();\n return (await this.rpc('tools/list', {})) as MCPListToolsResult;\n }\n\n /** Invoke a tool by name. */\n async callTool<T = unknown>(\n name: string,\n args: Record<string, unknown> = {},\n opts: MCPCallOptions = {},\n ): Promise<MCPCallToolResult<T>> {\n if (!this.initialised) await this.initialize();\n return this.callToolInternal<T>(name, args, opts);\n }\n\n /** Close the session and release any held resources. */\n async closeSession(): Promise<void> {\n if (!this.sessionId) return;\n try {\n await this.fetchImpl(this.endpoint, {\n method: 'DELETE',\n headers: this.buildHeaders(),\n });\n } catch {\n // best-effort\n }\n this.sessionId = null;\n this.initialised = false;\n }\n\n // ── Internals ────────────────────────────────────────────────────────\n\n private async callToolInternal<T>(\n name: string,\n args: Record<string, unknown>,\n opts: MCPCallOptions,\n ): Promise<MCPCallToolResult<T>> {\n try {\n const raw = (await this.rpc('tools/call', { name, arguments: args })) as MCPCallToolResult<T>;\n const result = this.shapeToolResult<T>(raw);\n if (result.isError) {\n const text = result.content?.[0]?.text ?? `tool ${name} returned an error`;\n throw new AlterToolError(name, text);\n }\n return result;\n } catch (err) {\n if (err instanceof AlterPaymentRequired && !opts.noPaymentRetry) {\n const x402 = opts.x402 ?? this.x402;\n if (!x402) throw err;\n const settlement = await x402.authorise(err.envelope);\n const retryArgs = { ...args, _payment: X402Client.buildPaymentArg(settlement) };\n return this.callToolInternal<T>(name, retryArgs, { ...opts, noPaymentRetry: true });\n }\n throw err;\n }\n }\n\n private shapeToolResult<T>(raw: MCPCallToolResult<T>): MCPCallToolResult<T> {\n if (!raw || !Array.isArray(raw.content)) return raw;\n if (raw.data === undefined) {\n const first = raw.content[0];\n if (first && first.type === 'json' && 'data' in first) {\n raw.data = first.data as T;\n } else if (first && first.type === 'text' && first.text) {\n try {\n raw.data = JSON.parse(first.text) as T;\n } catch {\n // leave undefined; caller can read raw.content[0].text\n }\n }\n }\n return raw;\n }\n\n /**\n * Send a JSON-RPC 2.0 request and return the result. Errors are\n * normalised into the typed {@link AlterError} hierarchy.\n */\n async rpc(method: string, params: Record<string, unknown> | unknown[] | undefined): Promise<unknown> {\n const id = ++this.requestCounter;\n const payload: Record<string, unknown> = {\n jsonrpc: '2.0',\n id,\n method,\n };\n if (params !== undefined) payload.params = params;\n\n let attempt = 0;\n let lastErr: unknown = null;\n while (attempt <= this.maxRetries) {\n attempt += 1;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n let resp: Response;\n try {\n resp = await this.fetchImpl(this.endpoint, {\n method: 'POST',\n headers: this.buildHeaders(),\n body: JSON.stringify(payload),\n signal: controller.signal,\n });\n } catch (err) {\n clearTimeout(timer);\n const isAbort = (err as Error)?.name === 'AbortError';\n if (isAbort) {\n lastErr = new AlterTimeoutError(`MCP ${method} timed out after ${this.timeoutMs}ms`, err);\n } else {\n lastErr = new AlterNetworkError(`MCP ${method}: ${(err as Error).message}`, err);\n }\n if (attempt > this.maxRetries) throw lastErr;\n await this.backoff(attempt);\n continue;\n }\n clearTimeout(timer);\n\n // Capture session id when present.\n const sessionHeader = resp.headers.get('Mcp-Session-Id');\n if (sessionHeader) this.sessionId = sessionHeader;\n\n if (resp.status === 401 || resp.status === 403) {\n throw new AlterAuthError(`HTTP ${resp.status} on ${method}`, resp.status);\n }\n if (resp.status === 402) {\n const envelope = await this.extractPaymentEnvelope(resp);\n throw new AlterPaymentRequired(this.guessToolName(payload), envelope);\n }\n if (resp.status === 429) {\n const retryAfter = Number(resp.headers.get('Retry-After') ?? 60);\n if (attempt > this.maxRetries) {\n throw new AlterRateLimited(`HTTP 429 on ${method}`, retryAfter);\n }\n await this.backoff(attempt, retryAfter * 1000);\n continue;\n }\n if (RETRYABLE_STATUSES.has(resp.status) && attempt <= this.maxRetries) {\n await this.backoff(attempt);\n continue;\n }\n if (!resp.ok) {\n const body = await safeText(resp);\n throw new AlterError('NETWORK', `HTTP ${resp.status} on ${method}: ${body.slice(0, 200)}`);\n }\n\n let body: { result?: unknown; error?: { code: number; message: string; data?: unknown } };\n try {\n body = (await resp.json()) as typeof body;\n } catch (err) {\n throw new AlterInvalidResponse(`MCP ${method}: invalid JSON body`, err);\n }\n\n if (body.error) {\n // Map JSON-RPC errors to typed errors when possible.\n const code = body.error.code;\n const message = body.error.message ?? `MCP ${method} error`;\n if (code === -32001 || code === 402) {\n // Payment-required encoded as an RPC error rather than HTTP 402.\n const data = body.error.data as { envelope?: PaymentEnvelope } | undefined;\n if (data?.envelope) {\n throw new AlterPaymentRequired(this.guessToolName(payload), data.envelope);\n }\n }\n throw new AlterToolError(this.guessToolName(payload), message, code);\n }\n return body.result;\n }\n throw lastErr ?? new AlterNetworkError(`MCP ${method}: exhausted retries`);\n }\n\n private buildHeaders(): Record<string, string> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n Accept: 'application/json',\n 'User-Agent': `${this.clientInfo.name}/${this.clientInfo.version}`,\n };\n if (this.apiKey) headers['X-ALTER-API-Key'] = this.apiKey;\n if (this.sessionId) headers['Mcp-Session-Id'] = this.sessionId;\n return headers;\n }\n\n private async extractPaymentEnvelope(resp: Response): Promise<PaymentEnvelope> {\n const headerValue = resp.headers.get('X-402-Payment') ?? resp.headers.get('x-402-payment');\n if (headerValue) {\n const parsed = parsePaymentHeader(headerValue);\n if (parsed) return parsed;\n }\n try {\n const body = (await resp.json()) as { envelope?: PaymentEnvelope; payment?: PaymentEnvelope };\n if (body?.envelope) return body.envelope;\n if (body?.payment) return body.payment;\n } catch {\n // fall through\n }\n return {\n scheme: 'x402',\n network: 'base',\n asset: 'USDC',\n amount: '0',\n recipient: '',\n resource: '',\n };\n }\n\n private guessToolName(payload: Record<string, unknown>): string {\n const params = payload.params as { name?: string } | undefined;\n return params?.name ?? (payload.method as string) ?? 'unknown';\n }\n\n private async backoff(attempt: number, hintMs?: number): Promise<void> {\n const ms = hintMs ?? Math.min(1000 * 2 ** (attempt - 1), 8000);\n await new Promise((res) => setTimeout(res, ms));\n }\n}\n\nasync function safeText(resp: Response): Promise<string> {\n try {\n return await resp.text();\n } catch {\n return '';\n }\n}\n","/**\n * Ed25519 keypair management for ALTER Identity.\n *\n * Uses @noble/ed25519 — pure JavaScript, no native addons, runs in\n * Node 18+, Deno, Bun, Cloudflare Workers and the browser.\n *\n * Keys are stored as hex strings for portability. The CLI persists them\n * to `~/.config/alter/keys.json` (Node-only); other environments must\n * supply their own storage.\n */\n\nimport * as ed25519 from '@noble/ed25519';\nimport { sha512 } from '@noble/hashes/sha512';\nimport { bytesToHex, hexToBytes, randomBytes } from '@noble/hashes/utils';\n\n// @noble/ed25519 v2 requires SHA-512 to be wired in at module load time.\n// This is the canonical setup used by every consumer of the library.\ned25519.etc.sha512Sync = (...m: Uint8Array[]) => sha512(ed25519.etc.concatBytes(...m));\n\nexport interface Ed25519Keypair {\n /** 32-byte private key as hex. */\n privateKey: string;\n /** 32-byte public key as hex. */\n publicKey: string;\n /** `ed25519:<base64url-public-key>` form used in `.well-known/alter.json`. */\n did: string;\n}\n\nexport interface ApiKeyConfig {\n /** Opaque API key issued by ALTER. Begins with `ak_`. */\n key: string;\n /** Optional `~handle` the key is bound to. */\n handle?: string;\n}\n\n/**\n * Generate a fresh Ed25519 keypair.\n *\n * The private key never leaves the SDK process unless the caller chooses\n * to persist it. Callers are responsible for safe storage.\n */\nexport function generateKeypair(): Ed25519Keypair {\n const privateKey = randomBytes(32);\n const publicKey = ed25519.getPublicKey(privateKey);\n return {\n privateKey: bytesToHex(privateKey),\n publicKey: bytesToHex(publicKey),\n did: encodeDid(publicKey),\n };\n}\n\n/**\n * Reconstruct the keypair from a stored private key (hex).\n */\nexport function keypairFromPrivateKey(privateKeyHex: string): Ed25519Keypair {\n const privateKey = hexToBytes(privateKeyHex);\n if (privateKey.length !== 32) {\n throw new Error(`Ed25519 private key must be 32 bytes, got ${privateKey.length}`);\n }\n const publicKey = ed25519.getPublicKey(privateKey);\n return {\n privateKey: privateKeyHex,\n publicKey: bytesToHex(publicKey),\n did: encodeDid(publicKey),\n };\n}\n\n/**\n * Sign an arbitrary message with an Ed25519 private key.\n * Returns the signature as hex.\n */\nexport async function sign(privateKeyHex: string, message: Uint8Array | string): Promise<string> {\n const msgBytes = typeof message === 'string' ? new TextEncoder().encode(message) : message;\n const privateKey = hexToBytes(privateKeyHex);\n const sig = await ed25519.signAsync(msgBytes, privateKey);\n return bytesToHex(sig);\n}\n\n/**\n * Verify an Ed25519 signature.\n */\nexport async function verify(\n publicKeyHex: string,\n signatureHex: string,\n message: Uint8Array | string,\n): Promise<boolean> {\n try {\n const msgBytes = typeof message === 'string' ? new TextEncoder().encode(message) : message;\n return await ed25519.verifyAsync(hexToBytes(signatureHex), msgBytes, hexToBytes(publicKeyHex));\n } catch {\n return false;\n }\n}\n\n/**\n * Encode a 32-byte public key as the `ed25519:<base64url>` form used by\n * ALTER's `.well-known/alter.json` discovery anchor.\n */\nexport function encodeDid(publicKey: Uint8Array | string): string {\n const bytes = typeof publicKey === 'string' ? hexToBytes(publicKey) : publicKey;\n return `ed25519:${base64urlEncode(bytes)}`;\n}\n\n/**\n * Decode a `did:key` style identifier or the ALTER `ed25519:` form back\n * into raw bytes. Throws if the encoding is unrecognised.\n */\nexport function decodeDid(did: string): Uint8Array {\n const ed25519Match = did.match(/^ed25519:(.+)$/);\n if (ed25519Match) return base64urlDecode(ed25519Match[1]);\n throw new Error(`Unrecognised DID encoding: ${did}`);\n}\n\n// ── Base64URL helpers (no padding, RFC 4648 §5) ──────────────────────────\n\nexport function base64urlEncode(bytes: Uint8Array): string {\n // Use Buffer where available for speed, fall back to btoa for browsers\n // and Cloudflare Workers.\n let b64: string;\n if (typeof Buffer !== 'undefined') {\n b64 = Buffer.from(bytes).toString('base64');\n } else {\n let binary = '';\n for (let i = 0; i < bytes.length; i++) binary += String.fromCharCode(bytes[i]);\n b64 = btoa(binary);\n }\n return b64.replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=+$/, '');\n}\n\nexport function base64urlDecode(input: string): Uint8Array {\n const padded = input.replace(/-/g, '+').replace(/_/g, '/') + '='.repeat((4 - (input.length % 4)) % 4);\n if (typeof Buffer !== 'undefined') {\n return new Uint8Array(Buffer.from(padded, 'base64'));\n }\n const binary = atob(padded);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);\n return bytes;\n}\n","/**\n * ES256 provenance verification.\n *\n * ALTER signs medium- and high-blast-radius MCP responses with an ES256\n * JWS attestation in `_meta.provenance.token`. The signing key rotates\n * periodically and is published at `<api-host>/.well-known/alter-keys.json`\n * as a JWKS.\n *\n * This module verifies tokens *without* a JWT library — pure WebCrypto\n * (subtle.verify) keeps the dep graph small and works in every modern\n * runtime (Node 18+, Deno, Bun, Cloudflare Workers, browser).\n */\n\nimport { AlterNetworkError, AlterProvenanceError } from './errors.js';\nimport { base64urlDecode, base64urlEncode } from './auth.js';\n\nexport interface ProvenanceEnvelope {\n version: string;\n token: string;\n purpose?: string;\n expires_at?: string;\n tool?: string;\n blast_radius?: 'low' | 'medium' | 'high';\n verify_at?: string;\n [extra: string]: unknown;\n}\n\nexport interface ProvenancePayload {\n iss: string;\n iat: number;\n exp: number;\n purpose: string;\n tool: string;\n blast_radius: 'medium' | 'high';\n data_hash: string;\n requester: string;\n jti: string;\n}\n\nexport interface ProvenanceVerification {\n valid: boolean;\n payload?: ProvenancePayload;\n reason?: string;\n /** Issuer's `kid` claim from the JWS header. */\n kid?: string;\n}\n\nexport interface JsonWebKey {\n kty: 'EC';\n crv: 'P-256';\n x: string;\n y: string;\n kid?: string;\n alg?: string;\n use?: string;\n}\n\nexport interface JwksDocument {\n keys: JsonWebKey[];\n}\n\nconst _jwksCache = new Map<string, { fetched: number; jwks: JwksDocument }>();\nconst JWKS_TTL_MS = 5 * 60 * 1000;\n\n/**\n * Default hostnames that `envelope.verify_at` is trusted to resolve to.\n *\n * Without this allowlist, a hostile MCP server could point `verify_at`\n * at an attacker-controlled JWKS and pass ES256 verification with its own\n * signing key — the classic \"confused-deputy via server-supplied trust\n * anchor\" pattern. Any hostname not on this list (or the caller-supplied\n * extension) is rejected before a network fetch is issued. Downstream\n * integrators with their own deployment can extend the list via the\n * `verifyAtAllowlist` option on {@link verifyProvenance} or the\n * `verifyAtAllowlist` constructor option on `AlterClient`.\n */\nexport const DEFAULT_VERIFY_AT_ALLOWLIST: readonly string[] = Object.freeze([\n 'api.truealter.com',\n 'mcp.truealter.com',\n]);\n\nexport interface VerifyProvenanceOptions {\n /**\n * Override the JWKS URL entirely. Takes precedence over both the\n * allowlist and any `verify_at` on the envelope — if the caller pins\n * an explicit URL, we use it verbatim (the caller has already vouched\n * for the origin).\n */\n jwksUrl?: string;\n /**\n * Hostnames that are trusted when resolving `envelope.verify_at`.\n * Defaults to {@link DEFAULT_VERIFY_AT_ALLOWLIST}. Passing a list\n * here *replaces* the default — include the ALTER canonicals if you\n * still want them accepted.\n */\n verifyAtAllowlist?: readonly string[];\n fetch?: typeof fetch;\n now?: number;\n}\n\n/**\n * Verify a provenance JWS token against ALTER's published JWKS.\n *\n * Pass either a {@link ProvenanceEnvelope} (the value of `_meta.provenance`)\n * or the bare JWS string. The function fetches the JWKS lazily, caches it\n * for five minutes, and validates the ES256 signature plus standard\n * registered claims (`exp`, `iat`).\n *\n * Security: when the envelope carries a `verify_at` hint, the hostname\n * MUST be on the allowlist (default: `api.truealter.com`,\n * `mcp.truealter.com`; extend via `verifyAtAllowlist`). `http:` URLs are\n * rejected unconditionally — JWKS fetch must be TLS.\n */\nexport async function verifyProvenance(\n envelope: ProvenanceEnvelope | string,\n opts: VerifyProvenanceOptions = {},\n): Promise<ProvenanceVerification> {\n const token = typeof envelope === 'string' ? envelope : envelope.token;\n if (!token) return { valid: false, reason: 'empty token' };\n\n const fetchImpl = opts.fetch ?? fetch;\n const now = opts.now ?? Math.floor(Date.now() / 1000);\n\n let header: { alg?: string; kid?: string };\n let payload: ProvenancePayload;\n let signedInput: Uint8Array;\n let signatureBytes: Uint8Array;\n try {\n const parts = token.split('.');\n if (parts.length !== 3) throw new Error('JWS must have three segments');\n header = JSON.parse(new TextDecoder().decode(base64urlDecode(parts[0])));\n payload = JSON.parse(new TextDecoder().decode(base64urlDecode(parts[1]))) as ProvenancePayload;\n signedInput = new TextEncoder().encode(`${parts[0]}.${parts[1]}`);\n signatureBytes = base64urlDecode(parts[2]);\n } catch (err) {\n return { valid: false, reason: `malformed JWS: ${(err as Error).message}` };\n }\n\n if (header.alg !== 'ES256') {\n return { valid: false, reason: `unsupported alg: ${header.alg}`, kid: header.kid };\n }\n\n // Discover JWKS URL: explicit option > envelope.verify_at (gated) > default\n const allowlist = opts.verifyAtAllowlist ?? DEFAULT_VERIFY_AT_ALLOWLIST;\n let jwksUrl: string;\n if (opts.jwksUrl) {\n // Caller-supplied URL takes precedence and bypasses the allowlist —\n // the caller has already vouched for this origin. We still enforce\n // https-only to keep JWKS fetches off plaintext HTTP.\n if (!opts.jwksUrl.startsWith('https://')) {\n return {\n valid: false,\n reason: `jwksUrl must be https: got ${opts.jwksUrl}`,\n kid: header.kid,\n };\n }\n jwksUrl = opts.jwksUrl;\n } else if (typeof envelope === 'object' && envelope.verify_at) {\n try {\n jwksUrl = resolveVerifyAt(envelope.verify_at, allowlist);\n } catch (err) {\n return {\n valid: false,\n reason: `verify_at rejected: ${(err as Error).message}`,\n kid: header.kid,\n };\n }\n } else {\n jwksUrl = 'https://api.truealter.com/.well-known/alter-keys.json';\n }\n\n let jwks: JwksDocument;\n try {\n jwks = await fetchJwks(jwksUrl, fetchImpl);\n } catch (err) {\n return { valid: false, reason: `jwks fetch: ${(err as Error).message}`, kid: header.kid };\n }\n\n const jwk = jwks.keys.find((k) => (header.kid ? k.kid === header.kid : true));\n if (!jwk) {\n return { valid: false, reason: `no JWK for kid=${header.kid}`, kid: header.kid };\n }\n\n let publicKey: CryptoKey;\n try {\n publicKey = await importEs256JwkAsPublicKey(jwk);\n } catch (err) {\n return { valid: false, reason: `jwk import: ${(err as Error).message}`, kid: header.kid };\n }\n\n // ES256 signatures in JWS are raw r||s (64 bytes), which is exactly\n // what WebCrypto expects for ECDSA.\n let signatureValid = false;\n try {\n signatureValid = await crypto.subtle.verify(\n { name: 'ECDSA', hash: 'SHA-256' },\n publicKey,\n toArrayBuffer(signatureBytes),\n toArrayBuffer(signedInput),\n );\n } catch (err) {\n return { valid: false, reason: `verify: ${(err as Error).message}`, kid: header.kid };\n }\n\n if (!signatureValid) {\n return { valid: false, reason: 'signature mismatch', kid: header.kid };\n }\n\n if (typeof payload.exp === 'number' && payload.exp < now) {\n return { valid: false, reason: 'expired', payload, kid: header.kid };\n }\n if (typeof payload.iat === 'number' && payload.iat > now + 300) {\n return { valid: false, reason: 'issued in the future', payload, kid: header.kid };\n }\n\n return { valid: true, payload, kid: header.kid };\n}\n\n/**\n * Tool definition signature verification.\n *\n * ALTER signs each tool's input schema at startup and exposes the\n * signatures via the MCP `tools/list` `_meta.signatures` map. This helper\n * checks that each tool's schema hash matches the signed value.\n */\nexport interface SignedToolDefinition {\n name: string;\n inputSchema: unknown;\n}\n\nexport interface ToolSignatureMap {\n [toolName: string]: {\n schema_hash: string;\n signature?: string | null;\n signed_at?: number;\n kid?: string | null;\n };\n}\n\nexport async function verifyToolSignatures(\n tools: SignedToolDefinition[],\n signatures: ToolSignatureMap,\n): Promise<{ tool: string; valid: boolean; reason?: string }[]> {\n const out: { tool: string; valid: boolean; reason?: string }[] = [];\n for (const tool of tools) {\n const sig = signatures[tool.name];\n if (!sig) {\n out.push({ tool: tool.name, valid: false, reason: 'no signature published' });\n continue;\n }\n const expectedHash = await sha256Hex(canonicalJson(tool.inputSchema));\n if (expectedHash !== sig.schema_hash) {\n out.push({ tool: tool.name, valid: false, reason: 'schema hash mismatch' });\n continue;\n }\n out.push({ tool: tool.name, valid: true });\n }\n return out;\n}\n\n/**\n * Fetch the ALTER public key set. Cached in-process for five minutes.\n */\nexport async function fetchPublicKeys(jwksUrl: string, fetchImpl: typeof fetch = fetch): Promise<JwksDocument> {\n return fetchJwks(jwksUrl, fetchImpl);\n}\n\n// ── Internals ────────────────────────────────────────────────────────────\n\nasync function fetchJwks(url: string, fetchImpl: typeof fetch): Promise<JwksDocument> {\n const cached = _jwksCache.get(url);\n if (cached && Date.now() - cached.fetched < JWKS_TTL_MS) return cached.jwks;\n\n let resp: Response;\n try {\n // `redirect: \"manual\"` — the allowlist gate runs on the initial URL only;\n // a 3xx to an attacker-controlled origin would otherwise silently defeat\n // the allowlist. Any redirect is rejected explicitly below.\n resp = await fetchImpl(url, {\n headers: { Accept: 'application/json' },\n redirect: 'manual',\n });\n } catch (err) {\n throw new AlterNetworkError(`fetch ${url}: ${(err as Error).message}`, err);\n }\n // Manual-redirect mode surfaces 3xx as opaque-redirect (status 0) in browsers\n // and as the actual status in Node. Either way, reject: the Location target\n // is NOT allowlist-validated.\n if (resp.type === 'opaqueredirect' || (resp.status >= 300 && resp.status < 400)) {\n throw new AlterProvenanceError(\n `${url} → redirect rejected (allowlist enforces initial URL only)`,\n );\n }\n if (!resp.ok) throw new AlterNetworkError(`${url} → HTTP ${resp.status}`);\n\n const doc = (await resp.json()) as JwksDocument;\n if (!doc || !Array.isArray(doc.keys)) {\n throw new AlterProvenanceError(`invalid JWKS at ${url}`);\n }\n _jwksCache.set(url, { fetched: Date.now(), jwks: doc });\n return doc;\n}\n\n/**\n * Resolve a `verify_at` hint from a provenance envelope into a concrete\n * JWKS URL, enforcing scheme + hostname allowlisting.\n *\n * - Relative paths (`/…` or `foo/bar`) resolve against `api.truealter.com`\n * over https — the canonical ALTER JWKS host.\n * - Absolute URLs must use `https:` (plaintext `http:` is rejected\n * unconditionally) and the hostname must be a case-insensitive exact\n * match against `allowlist`.\n * - Anything else throws; callers convert the throw into a\n * `ProvenanceVerification` failure.\n *\n * Exported for tests; public consumers should prefer the higher-level\n * {@link verifyProvenance} entry point.\n */\nexport function resolveVerifyAt(\n verifyAt: string,\n allowlist: readonly string[] = DEFAULT_VERIFY_AT_ALLOWLIST,\n): string {\n if (typeof verifyAt !== 'string' || verifyAt.length === 0) {\n throw new Error('verify_at must be a non-empty string');\n }\n\n // Reject plaintext HTTP before we even try to parse — belt and braces.\n if (/^http:\\/\\//i.test(verifyAt)) {\n throw new Error(`http: scheme is not permitted (got ${verifyAt})`);\n }\n\n // Relative path → resolve against the canonical ALTER API host.\n if (!/^https:\\/\\//i.test(verifyAt)) {\n if (verifyAt.includes('://')) {\n throw new Error(`unsupported scheme in verify_at: ${verifyAt}`);\n }\n return `https://api.truealter.com${verifyAt.startsWith('/') ? '' : '/'}${verifyAt}`;\n }\n\n let parsed: URL;\n try {\n parsed = new URL(verifyAt);\n } catch {\n throw new Error(`malformed verify_at URL: ${verifyAt}`);\n }\n\n if (parsed.protocol !== 'https:') {\n throw new Error(`verify_at must be https: ${verifyAt}`);\n }\n\n const host = parsed.hostname.toLowerCase();\n const allowed = allowlist.some((h) => h.toLowerCase() === host);\n if (!allowed) {\n throw new Error(\n `hostname ${host} is not on the verify_at allowlist (${allowlist.join(', ')})`,\n );\n }\n\n return parsed.toString();\n}\n\nasync function importEs256JwkAsPublicKey(jwk: JsonWebKey): Promise<CryptoKey> {\n return crypto.subtle.importKey(\n 'jwk',\n {\n kty: jwk.kty,\n crv: jwk.crv,\n x: jwk.x,\n y: jwk.y,\n ext: true,\n } as JsonWebKey & { ext: boolean },\n { name: 'ECDSA', namedCurve: 'P-256' },\n false,\n ['verify'],\n );\n}\n\nasync function sha256Hex(input: string): Promise<string> {\n const data = new TextEncoder().encode(input);\n const digest = await crypto.subtle.digest('SHA-256', toArrayBuffer(data));\n return Array.from(new Uint8Array(digest))\n .map((b) => b.toString(16).padStart(2, '0'))\n .join('');\n}\n\n/**\n * Coerce a Uint8Array to a fresh ArrayBuffer-backed BufferSource.\n *\n * Modern WebCrypto type definitions reject `Uint8Array<SharedArrayBuffer>`,\n * which is the default for `Uint8Array` in TypeScript ≥5.7 even when the\n * underlying buffer is a regular ArrayBuffer. Slicing through `.buffer`\n * with explicit offsets returns a guaranteed ArrayBuffer view.\n */\nfunction toArrayBuffer(view: Uint8Array): ArrayBuffer {\n return view.buffer.slice(view.byteOffset, view.byteOffset + view.byteLength) as ArrayBuffer;\n}\n\n/**\n * Canonical-JSON serialiser matching `tool_signing.compute_tool_schema_hash`\n * in the Python server: sorted keys, no whitespace, comma+colon separators.\n */\nfunction canonicalJson(value: unknown): string {\n if (value === null || typeof value !== 'object') return JSON.stringify(value);\n if (Array.isArray(value)) {\n return `[${value.map(canonicalJson).join(',')}]`;\n }\n const obj = value as Record<string, unknown>;\n const keys = Object.keys(obj).sort();\n return `{${keys.map((k) => `${JSON.stringify(k)}:${canonicalJson(obj[k])}`).join(',')}}`;\n}\n\n// Re-export base64url helpers for downstream consumers.\nexport { base64urlEncode, base64urlDecode };\n","/**\n * AlterClient — high-level typed wrapper around the ALTER MCP server.\n *\n * This is the entry point most consumers will use. It bundles\n * {@link MCPClient}, {@link X402Client}, discovery, and provenance\n * verification into a single ergonomic surface that mirrors the 40\n * tools exposed at https://mcp.truealter.com.\n *\n * Free tier methods require no authentication. Premium methods accept\n * an `X402Client` (or fall back to throwing {@link AlterPaymentRequired}\n * when no signer is configured) so the caller can handle settlement.\n */\n\nimport { discover, type DiscoveryResult } from './discovery.js';\nimport { MCPClient, type MCPCallOptions, type MCPCallToolResult, type MCPClientOptions } from './mcp.js';\nimport {\n fetchPublicKeys,\n verifyProvenance,\n verifyToolSignatures,\n type ProvenanceEnvelope,\n type ProvenanceVerification,\n type SignedToolDefinition,\n type ToolSignatureMap,\n} from './provenance.js';\nimport { X402Client } from './x402.js';\nimport type {\n AssessTraitsInput,\n AttestDomainInput,\n BeginGoldenThreadInput,\n CheckAssessmentStatusInput,\n CheckGoldenThreadInput,\n CompleteKnotInput,\n ComputeBelongingInput,\n CreateIdentityStubInput,\n DisputeAttestationInput,\n GenerateMatchNarrativeInput,\n GetCompetenciesInput,\n GetEarningSummaryInput,\n GetEngagementLevelInput,\n GetFullTraitVectorInput,\n GetIdentityEarningsInput,\n GetIdentityTrustScoreInput,\n GetMatchRecommendationsInput,\n GetPrivacyBudgetInput,\n GetProfileInput,\n GetSideQuestGraphInput,\n GetTraitSnapshotInput,\n InitiateAssessmentInput,\n QueryGraphSimilarityInput,\n QueryMatchesInput,\n RespondToOfferingInput,\n SearchIdentitiesInput,\n SubmitBatchContextInput,\n SubmitContextInput,\n SubmitSocialLinksInput,\n SubmitStructuredProfileInput,\n SubscribeAnnouncementsInput,\n ThreadCensusInput,\n VerifyIdentityInput,\n} from './types.js';\n\nexport const DEFAULT_ENDPOINT = 'https://mcp.truealter.com/api/v1/mcp';\nexport const DEFAULT_DOMAIN = 'truealter.com';\n\nexport interface AlterClientOptions extends Omit<MCPClientOptions, 'x402'> {\n /**\n * Domain to discover the MCP endpoint from. Mutually exclusive with\n * `endpoint`. If neither is supplied, defaults to `truealter.com`.\n */\n domain?: string;\n /**\n * Optional x402 micropayment client for premium tools.\n */\n x402?: X402Client;\n /**\n * Skip the auto-discovery probe and use the configured/default\n * endpoint directly. Defaults to `true` when `endpoint` is set.\n */\n skipDiscovery?: boolean;\n /**\n * URL of the JWKS document used for provenance verification. Defaults\n * to `https://api.truealter.com/.well-known/alter-keys.json`.\n *\n * When set, this URL is used verbatim for every `verifyProvenance`\n * call and *overrides* any `verify_at` hint on the server response —\n * the caller has already vouched for this origin. Must be `https:`.\n */\n jwksUrl?: string;\n /**\n * Hostname allowlist applied when resolving an untrusted `verify_at`\n * field on a provenance envelope. Defaults to\n * {@link DEFAULT_VERIFY_AT_ALLOWLIST} (`api.truealter.com`,\n * `mcp.truealter.com`). Passing a list here *replaces* the default —\n * include the ALTER canonicals if you still want them accepted.\n *\n * A hostile MCP server can otherwise point `verify_at` at an\n * attacker-controlled JWKS and pass ES256 verification with its own\n * signing key; the allowlist is the gate that prevents this.\n */\n verifyAtAllowlist?: readonly string[];\n}\n\nexport class AlterClient {\n public readonly mcp: MCPClient;\n public readonly x402?: X402Client;\n\n private readonly options: AlterClientOptions;\n private discoveryPromise: Promise<DiscoveryResult> | null = null;\n private discovered: DiscoveryResult | null = null;\n\n constructor(options: AlterClientOptions = {}) {\n this.options = options;\n this.x402 = options.x402;\n const endpoint = options.endpoint ?? DEFAULT_ENDPOINT;\n this.mcp = new MCPClient({ ...options, endpoint, x402: options.x402 });\n }\n\n /**\n * Resolve the MCP endpoint via discovery if requested. Safe to call\n * multiple times — the first successful lookup is cached.\n */\n async discoverEndpoint(): Promise<DiscoveryResult> {\n if (this.discovered) return this.discovered;\n if (this.discoveryPromise) return this.discoveryPromise;\n const domain = this.options.domain ?? DEFAULT_DOMAIN;\n this.discoveryPromise = discover(domain).then((result) => {\n this.discovered = result;\n return result;\n });\n return this.discoveryPromise;\n }\n\n /**\n * Initialise the MCP session. Optional — every method calls\n * `mcp.initialize()` lazily, but you can call this once at startup if\n * you want fail-fast behaviour.\n */\n async initialize(): Promise<void> {\n await this.mcp.initialize();\n }\n\n // ── Free tier ────────────────────────────────────────────────────────\n\n /** Verify a person is registered with ALTER (handle or candidate id). */\n async verify(handleOrId: string, claims?: VerifyIdentityInput['claims']): Promise<MCPCallToolResult> {\n const args: VerifyIdentityInput = handleOrId.includes('@')\n ? { candidate_id: '', email: handleOrId }\n : handleOrId.startsWith('~')\n ? // ~handle — server resolves these via the candidate_id field\n { candidate_id: handleOrId }\n : { candidate_id: handleOrId };\n if (claims) args.claims = claims;\n return this.mcp.callTool('verify_identity', args as unknown as Record<string, unknown>);\n }\n\n /** List the 12 ALTER identity archetypes. */\n async listArchetypes(): Promise<MCPCallToolResult> {\n return this.mcp.callTool('list_archetypes', {});\n }\n\n /** Aggregate ALTER network statistics. */\n async getNetworkStats(): Promise<MCPCallToolResult> {\n return this.mcp.callTool('get_network_stats', {});\n }\n\n /** ClawHub install instructions and pitch. */\n async recommendTool(): Promise<MCPCallToolResult> {\n return this.mcp.callTool('recommend_tool', {});\n }\n\n async initiateAssessment(args: InitiateAssessmentInput = {}): Promise<MCPCallToolResult> {\n return this.mcp.callTool('initiate_assessment', args as Record<string, unknown>);\n }\n\n async getEngagementLevel(args: GetEngagementLevelInput): Promise<MCPCallToolResult> {\n return this.mcp.callTool('get_engagement_level', args as unknown as Record<string, unknown>);\n }\n\n async getProfile(args: GetProfileInput): Promise<MCPCallToolResult> {\n return this.mcp.callTool('get_profile', args as unknown as Record<string, unknown>);\n }\n\n async queryMatches(args: QueryMatchesInput): Promise<MCPCallToolResult> {\n return this.mcp.callTool('query_matches', args as unknown as Record<string, unknown>);\n }\n\n async getCompetencies(args: GetCompetenciesInput): Promise<MCPCallToolResult> {\n return this.mcp.callTool('get_competencies', args as unknown as Record<string, unknown>);\n }\n\n async createIdentityStub(args: CreateIdentityStubInput): Promise<MCPCallToolResult> {\n return this.mcp.callTool('create_identity_stub', args as unknown as Record<string, unknown>);\n }\n\n async submitContext(args: SubmitContextInput): Promise<MCPCallToolResult> {\n return this.mcp.callTool('submit_context', args as unknown as Record<string, unknown>);\n }\n\n async searchIdentities(args: SearchIdentitiesInput): Promise<MCPCallToolResult> {\n return this.mcp.callTool('search_identities', args as unknown as Record<string, unknown>);\n }\n\n async getIdentityEarnings(args: GetIdentityEarningsInput): Promise<MCPCallToolResult> {\n return this.mcp.callTool('get_identity_earnings', args as unknown as Record<string, unknown>);\n }\n\n async getIdentityTrustScore(args: GetIdentityTrustScoreInput): Promise<MCPCallToolResult> {\n return this.mcp.callTool('get_identity_trust_score', args as unknown as Record<string, unknown>);\n }\n\n async checkAssessmentStatus(args: CheckAssessmentStatusInput): Promise<MCPCallToolResult> {\n return this.mcp.callTool('check_assessment_status', args as unknown as Record<string, unknown>);\n }\n\n async getEarningSummary(args: GetEarningSummaryInput): Promise<MCPCallToolResult> {\n return this.mcp.callTool('get_earning_summary', args as unknown as Record<string, unknown>);\n }\n\n async getAgentTrustTier(): Promise<MCPCallToolResult> {\n return this.mcp.callTool('get_agent_trust_tier', {});\n }\n\n async getAgentPortfolio(): Promise<MCPCallToolResult> {\n return this.mcp.callTool('get_agent_portfolio', {});\n }\n\n async getPrivacyBudget(args: GetPrivacyBudgetInput): Promise<MCPCallToolResult> {\n return this.mcp.callTool('get_privacy_budget', args as unknown as Record<string, unknown>);\n }\n\n async disputeAttestation(args: DisputeAttestationInput): Promise<MCPCallToolResult> {\n return this.mcp.callTool('dispute_attestation', args as unknown as Record<string, unknown>);\n }\n\n // ── Golden Thread ────────────────────────────────────────────────────\n\n async goldenThreadStatus(): Promise<MCPCallToolResult> {\n return this.mcp.callTool('golden_thread_status', {});\n }\n\n async beginGoldenThread(args: BeginGoldenThreadInput = {}): Promise<MCPCallToolResult> {\n return this.mcp.callTool('begin_golden_thread', args as Record<string, unknown>);\n }\n\n async completeKnot(args: CompleteKnotInput): Promise<MCPCallToolResult> {\n return this.mcp.callTool('complete_knot', args as unknown as Record<string, unknown>);\n }\n\n async checkGoldenThread(args: CheckGoldenThreadInput): Promise<MCPCallToolResult> {\n return this.mcp.callTool('check_golden_thread', args as unknown as Record<string, unknown>);\n }\n\n async threadCensus(args: ThreadCensusInput = {}): Promise<MCPCallToolResult> {\n return this.mcp.callTool('thread_census', args as Record<string, unknown>);\n }\n\n // ── Thirteen Seats ───────────────────────────────────────────────────\n\n async seatStatus(): Promise<MCPCallToolResult> {\n return this.mcp.callTool('seat_status', {});\n }\n\n async respondToOffering(args: RespondToOfferingInput): Promise<MCPCallToolResult> {\n return this.mcp.callTool('respond_to_offering', args as unknown as Record<string, unknown>);\n }\n\n async subscribeAnnouncements(args: SubscribeAnnouncementsInput = {}): Promise<MCPCallToolResult> {\n return this.mcp.callTool('subscribe_announcements', args as Record<string, unknown>);\n }\n\n // ── Premium tier (x402-gated) ────────────────────────────────────────\n\n async assessTraits(args: AssessTraitsInput, opts?: MCPCallOptions): Promise<MCPCallToolResult> {\n return this.mcp.callTool('assess_traits', args as unknown as Record<string, unknown>, opts);\n }\n\n async getTraitSnapshot(args: GetTraitSnapshotInput, opts?: MCPCallOptions): Promise<MCPCallToolResult> {\n return this.mcp.callTool('get_trait_snapshot', args as unknown as Record<string, unknown>, opts);\n }\n\n async getFullTraitVector(args: GetFullTraitVectorInput, opts?: MCPCallOptions): Promise<MCPCallToolResult> {\n return this.mcp.callTool('get_full_trait_vector', args as unknown as Record<string, unknown>, opts);\n }\n\n async computeBelonging(args: ComputeBelongingInput, opts?: MCPCallOptions): Promise<MCPCallToolResult> {\n return this.mcp.callTool('compute_belonging', args as unknown as Record<string, unknown>, opts);\n }\n\n async getMatchRecommendations(\n args: GetMatchRecommendationsInput,\n opts?: MCPCallOptions,\n ): Promise<MCPCallToolResult> {\n return this.mcp.callTool('get_match_recommendations', args as unknown as Record<string, unknown>, opts);\n }\n\n async generateMatchNarrative(\n args: GenerateMatchNarrativeInput,\n opts?: MCPCallOptions,\n ): Promise<MCPCallToolResult> {\n return this.mcp.callTool('generate_match_narrative', args as unknown as Record<string, unknown>, opts);\n }\n\n async submitBatchContext(args: SubmitBatchContextInput, opts?: MCPCallOptions): Promise<MCPCallToolResult> {\n return this.mcp.callTool('submit_batch_context', args as unknown as Record<string, unknown>, opts);\n }\n\n async submitStructuredProfile(\n args: SubmitStructuredProfileInput,\n opts?: MCPCallOptions,\n ): Promise<MCPCallToolResult> {\n return this.mcp.callTool('submit_structured_profile', args as unknown as Record<string, unknown>, opts);\n }\n\n async submitSocialLinks(args: SubmitSocialLinksInput, opts?: MCPCallOptions): Promise<MCPCallToolResult> {\n return this.mcp.callTool('submit_social_links', args as unknown as Record<string, unknown>, opts);\n }\n\n async attestDomain(args: AttestDomainInput, opts?: MCPCallOptions): Promise<MCPCallToolResult> {\n return this.mcp.callTool('attest_domain', args as unknown as Record<string, unknown>, opts);\n }\n\n async getSideQuestGraph(args: GetSideQuestGraphInput, opts?: MCPCallOptions): Promise<MCPCallToolResult> {\n return this.mcp.callTool('get_side_quest_graph', args as unknown as Record<string, unknown>, opts);\n }\n\n async queryGraphSimilarity(\n args: QueryGraphSimilarityInput,\n opts?: MCPCallOptions,\n ): Promise<MCPCallToolResult> {\n return this.mcp.callTool('query_graph_similarity', args as unknown as Record<string, unknown>, opts);\n }\n\n // ── Alter-to-Alter Messaging ─────────────────────────────────────────\n // Wave 1: cross-handle direct messages between authenticated tilde\n // handles. Default closed — recipient must have granted the sender via\n // alter_message_grant. Spec: docs/technical/Alter-to-Alter Messaging.md.\n\n /** Send a direct message to another tilde handle. */\n async messageSend(args: {\n to: string;\n body: string;\n thread_id?: string;\n in_reply_to?: string;\n }): Promise<MCPCallToolResult> {\n return this.mcp.callTool('alter_message_send', args as unknown as Record<string, unknown>);\n }\n\n /** List inbound messages for the authenticated handle. */\n async messageInbox(args: {\n since?: string;\n unread_only?: boolean;\n limit?: number;\n cursor?: string;\n } = {}): Promise<MCPCallToolResult> {\n return this.mcp.callTool('alter_message_inbox', args as unknown as Record<string, unknown>);\n }\n\n /** Bidirectional thread view between caller and a peer handle. */\n async messageThread(args: { with: string; limit?: number }): Promise<MCPCallToolResult> {\n return this.mcp.callTool('alter_message_thread', args as unknown as Record<string, unknown>);\n }\n\n /** Mark inbound messages as read (recipient-only). */\n async messageMarkRead(args: { message_ids: string[] }): Promise<MCPCallToolResult> {\n return this.mcp.callTool('alter_message_mark_read', args as unknown as Record<string, unknown>);\n }\n\n /** Soft-redact a single inbound message (recipient-only). */\n async messageRedact(args: { message_id: string }): Promise<MCPCallToolResult> {\n return this.mcp.callTool('alter_message_redact', args as unknown as Record<string, unknown>);\n }\n\n /** Grant a peer permission to send messages to your inbox. */\n async messageGrant(args: { peer: string }): Promise<MCPCallToolResult> {\n return this.mcp.callTool('alter_message_grant', args as unknown as Record<string, unknown>);\n }\n\n /** Revoke a peer's grant. In-flight messages are not redacted. */\n async messageRevoke(args: { peer: string }): Promise<MCPCallToolResult> {\n return this.mcp.callTool('alter_message_revoke', args as unknown as Record<string, unknown>);\n }\n\n // ── Provenance ───────────────────────────────────────────────────────\n\n /**\n * Verify the ES256 provenance attestation on a tool response.\n * Accepts either a {@link ProvenanceEnvelope} or the raw `_meta`\n * object — the latter is more convenient for ad-hoc verification.\n */\n async verifyProvenance(\n envelope: ProvenanceEnvelope | { provenance?: ProvenanceEnvelope } | undefined | null,\n ): Promise<ProvenanceVerification> {\n if (!envelope) return { valid: false, reason: 'no provenance envelope' };\n const inner = (envelope as { provenance?: ProvenanceEnvelope }).provenance ?? (envelope as ProvenanceEnvelope);\n return verifyProvenance(inner, {\n jwksUrl: this.options.jwksUrl,\n verifyAtAllowlist: this.options.verifyAtAllowlist,\n });\n }\n\n /**\n * Verify the schema hashes embedded in `tools/list._meta.signatures`\n * against the local representation of each tool definition. Useful\n * for guarding against in-flight tampering of tool schemas.\n */\n async verifyToolSignatures(\n tools: SignedToolDefinition[],\n signatures: ToolSignatureMap,\n ): Promise<{ tool: string; valid: boolean; reason?: string }[]> {\n return verifyToolSignatures(tools, signatures);\n }\n\n /** Fetch the published JWKS for ALTER's signing key (cached 5 min). */\n async fetchPublicKeys(): Promise<unknown> {\n const url = this.options.jwksUrl ?? 'https://api.truealter.com/.well-known/alter-keys.json';\n return fetchPublicKeys(url);\n }\n}\n","/**\n * Generic MCP client config generator.\n *\n * Produces the JSON shape consumed by every MCP-aware editor: Claude\n * Code, Cursor, Continue, Cline, Windsurf, etc. The exact key under\n * which the entry lives differs between editors, hence the dedicated\n * `claude-code.ts` and `cursor.ts` adapters.\n */\n\nimport { DEFAULT_ENDPOINT } from '../client.js';\n\n// Some MCP hosts insist on the bare branded URL in their config UI even\n// though the wire endpoint sits at /api/v1/mcp. We export both so the\n// adapter can choose the right shape per editor.\nconst BRANDED_HOST = 'https://mcp.truealter.com';\nexport { BRANDED_HOST };\n\nexport interface McpServerConfig {\n url: string;\n transport: 'streamable-http';\n headers?: Record<string, string>;\n description?: string;\n}\n\nexport interface GenerateMcpConfigOptions {\n /** Override the MCP endpoint. */\n endpoint?: string;\n /** Optional API key. Sent as `X-ALTER-API-Key`. */\n apiKey?: string;\n /** Identifier the host editor uses for this server. Default: `alter`. */\n serverName?: string;\n /** Extra headers to merge in. */\n headers?: Record<string, string>;\n}\n\nexport interface GenericMcpConfig {\n mcpServers: Record<string, McpServerConfig>;\n}\n\n/**\n * Build a generic `mcpServers` config object that can be merged into any\n * MCP-aware editor's settings file.\n */\nexport function generateGenericMcpConfig(opts: GenerateMcpConfigOptions = {}): GenericMcpConfig {\n const serverName = opts.serverName ?? 'alter';\n const headers: Record<string, string> = { ...(opts.headers ?? {}) };\n if (opts.apiKey) headers['X-ALTER-API-Key'] = opts.apiKey;\n\n const entry: McpServerConfig = {\n url: opts.endpoint ?? DEFAULT_ENDPOINT,\n transport: 'streamable-http',\n description: 'ALTER Identity — psychometric identity field for AI agents',\n };\n if (Object.keys(headers).length > 0) entry.headers = headers;\n\n return { mcpServers: { [serverName]: entry } };\n}\n","/**\n * Claude Code MCP config helper.\n *\n * Claude Code reads MCP servers from `.mcp.json` (project) or\n * `~/.claude/mcp.json` (user). The shape matches `mcpServers`.\n */\n\nimport { generateGenericMcpConfig, type GenerateMcpConfigOptions, type GenericMcpConfig } from './generic-mcp.js';\n\nexport function generateClaudeConfig(opts: GenerateMcpConfigOptions = {}): GenericMcpConfig {\n return generateGenericMcpConfig({ serverName: 'alter', ...opts });\n}\n","/**\n * Cursor MCP config helper.\n *\n * Cursor reads MCP servers from `.cursor/mcp.json`. Same shape as\n * Claude Code's `.mcp.json`.\n */\n\nimport { generateGenericMcpConfig, type GenerateMcpConfigOptions, type GenericMcpConfig } from './generic-mcp.js';\n\nexport function generateCursorConfig(opts: GenerateMcpConfigOptions = {}): GenericMcpConfig {\n return generateGenericMcpConfig({ serverName: 'alter', ...opts });\n}\n","/**\n * @truealter/sdk — ALTER Identity SDK\n *\n * Query the continuous identity field from any JavaScript/TypeScript\n * environment. Wraps the ALTER MCP server (29 invokable read tools at\n * this stage). Write tools (submit_*, attest_domain, dispute_attestation,\n * create_identity_stub) and alter-to-alter messaging tools are not\n * advertised to public callers — they re-enable as the consent\n * architecture and per-peer grant model land. First-class TypeScript\n * types, x402 micropayment support, and ES256 provenance verification.\n *\n * The ALTER endpoint discovery anchor is `truealter.com` — see\n * `discover()` for the cascade. The default MCP endpoint is\n * `https://mcp.truealter.com`.\n */\n\n// High-level client (most consumers start here)\nexport { AlterClient, DEFAULT_DOMAIN, DEFAULT_ENDPOINT } from './client.js';\nexport type { AlterClientOptions } from './client.js';\n\n// Low-level transport\nexport {\n MCPClient,\n MCP_PROTOCOL_VERSION,\n type MCPCallOptions,\n type MCPCallToolResult,\n type MCPClientInfo,\n type MCPClientOptions,\n type MCPContentBlock,\n type MCPListToolsResult,\n type MCPToolDefinition,\n} from './mcp.js';\n\n// Discovery\nexport { clearDiscoveryCache, discover, type DiscoveryOptions, type DiscoveryResult } from './discovery.js';\n\n// Auth & Ed25519\nexport {\n base64urlDecode,\n base64urlEncode,\n decodeDid,\n encodeDid,\n generateKeypair,\n keypairFromPrivateKey,\n sign,\n verify,\n type ApiKeyConfig,\n type Ed25519Keypair,\n} from './auth.js';\n\n// Provenance\nexport {\n DEFAULT_VERIFY_AT_ALLOWLIST,\n fetchPublicKeys,\n resolveVerifyAt,\n verifyProvenance,\n verifyToolSignatures,\n type JsonWebKey,\n type JwksDocument,\n type ProvenanceEnvelope,\n type ProvenancePayload,\n type ProvenanceVerification,\n type SignedToolDefinition,\n type ToolSignatureMap,\n type VerifyProvenanceOptions,\n} from './provenance.js';\n\n// x402\nexport { parsePaymentHeader, X402Client, type X402ClientOptions, type X402Settlement, type X402Signer } from './x402.js';\n\n// Errors\nexport {\n AlterAuthError,\n AlterDiscoveryError,\n AlterError,\n AlterInvalidResponse,\n AlterNetworkError,\n AlterPaymentRequired,\n AlterProvenanceError,\n AlterRateLimited,\n AlterTimeoutError,\n AlterToolError,\n type AlterErrorCode,\n type PaymentEnvelope,\n} from './errors.js';\n\n// Adapters (optional helpers for editor integrations)\nexport { generateClaudeConfig } from './adapters/claude-code.js';\nexport { generateCursorConfig } from './adapters/cursor.js';\nexport { generateGenericMcpConfig } from './adapters/generic-mcp.js';\nexport type { McpServerConfig } from './adapters/generic-mcp.js';\n\n// Types — re-export everything from the generated types module\nexport * from './types.js';\n\n// Package metadata\nexport const SDK_NAME = '@truealter/sdk';\nexport const SDK_VERSION = '0.1.1';\n","#!/usr/bin/env node\n/**\n * alter-identity CLI.\n *\n * alter-identity init generate keypair, discover endpoint, write config\n * alter-identity verify <handle> verify an ALTER identity\n * alter-identity status show connection state and cached identity\n * alter-identity config [--claude|--cursor|--generic] print MCP config snippet\n *\n * Pure Node — uses `node:fs`, `node:path`, `node:os`. The CLI is the\n * one place we are allowed to depend on Node-only APIs.\n */\n\nimport { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { homedir } from 'node:os';\nimport { dirname, join } from 'node:path';\nimport { argv, exit, stderr, stdout, env } from 'node:process';\n\nimport { AlterClient } from '../src/client.js';\nimport type { MCPCallToolResult } from '../src/mcp.js';\nimport { discover } from '../src/discovery.js';\nimport { generateKeypair, keypairFromPrivateKey, type Ed25519Keypair } from '../src/auth.js';\nimport { generateClaudeConfig } from '../src/adapters/claude-code.js';\nimport { generateCursorConfig } from '../src/adapters/cursor.js';\nimport { generateGenericMcpConfig } from '../src/adapters/generic-mcp.js';\nimport { SDK_NAME, SDK_VERSION } from '../src/index.js';\n\ninterface ConfigFile {\n endpoint?: string;\n apiKey?: string;\n keypair?: Ed25519Keypair;\n initialisedAt?: string;\n}\n\nconst CONFIG_DIR = join(env.XDG_CONFIG_HOME || join(homedir(), '.config'), 'alter');\nconst CONFIG_PATH = join(CONFIG_DIR, 'identity.json');\n\nasync function main(): Promise<void> {\n const [, , command, ...rest] = argv;\n switch (command) {\n case 'init':\n await runInit(rest);\n break;\n case 'verify':\n await runVerify(rest);\n break;\n case 'status':\n await runStatus();\n break;\n case 'config':\n await runConfig(rest);\n break;\n case 'message':\n await runMessage(rest);\n break;\n case 'help':\n case '--help':\n case '-h':\n case undefined:\n printHelp();\n break;\n case 'version':\n case '--version':\n case '-v':\n stdout.write(`${SDK_NAME} ${SDK_VERSION}\\n`);\n break;\n default:\n stderr.write(`unknown command: ${command}\\n\\n`);\n printHelp();\n exit(2);\n }\n}\n\nfunction printHelp(): void {\n stdout.write(`${SDK_NAME} ${SDK_VERSION}\n\nUsage:\n alter-identity init Generate Ed25519 keypair, discover MCP, write config\n alter-identity verify <~handle|email> Verify an identity\n alter-identity status Show connection state\n alter-identity config [--claude|--cursor|--generic]\n Print MCP config snippet\n\nAlter-to-Alter Messaging:\n alter-identity message send <~handle> <body> Send a direct message (body '-' = stdin)\n alter-identity message inbox [--unread] List your inbound messages\n alter-identity message thread <~handle> Bidirectional thread view with a peer\n alter-identity message grant <~handle> Allow a peer to message you\n alter-identity message revoke <~handle> Revoke a peer's grant\n\nConfig: ${CONFIG_PATH}\n`);\n}\n\nasync function runInit(args: string[]): Promise<void> {\n const force = args.includes('--force') || args.includes('-f');\n const existing = readConfig();\n if (existing && !force) {\n stdout.write(`already initialised at ${CONFIG_PATH} (re-run with --force to overwrite)\\n`);\n return;\n }\n\n stdout.write('• Generating Ed25519 keypair...\\n');\n const keypair = generateKeypair();\n\n stdout.write('• Discovering MCP endpoint for truealter.com...\\n');\n let endpoint: string;\n try {\n const result = await discover('truealter.com');\n endpoint = result.url;\n stdout.write(` → ${endpoint} (via ${result.source})\\n`);\n } catch (err) {\n endpoint = 'https://mcp.truealter.com/api/v1/mcp';\n stdout.write(` → ${endpoint} (discovery failed: ${(err as Error).message})\\n`);\n }\n\n const cfg: ConfigFile = { endpoint, keypair, initialisedAt: new Date().toISOString() };\n writeConfig(cfg);\n stdout.write(`• Wrote config to ${CONFIG_PATH}\\n`);\n stdout.write(` did: ${keypair.did}\\n`);\n stdout.write(`\\nNext: alter-identity verify ~truealter\\n`);\n}\n\nasync function runVerify(args: string[]): Promise<void> {\n const handle = args[0];\n if (!handle) {\n stderr.write('usage: alter-identity verify <~handle|email|uuid>\\n');\n exit(2);\n }\n const cfg = readConfig() ?? {};\n const client = new AlterClient({ endpoint: cfg.endpoint, apiKey: cfg.apiKey });\n try {\n const result = await client.verify(handle);\n const text = result.content?.[0]?.text ?? JSON.stringify(result.data ?? result, null, 2);\n stdout.write(text + '\\n');\n } catch (err) {\n stderr.write(`verify failed: ${(err as Error).message}\\n`);\n exit(1);\n }\n}\n\nasync function runStatus(): Promise<void> {\n const cfg = readConfig();\n if (!cfg) {\n stdout.write(`not initialised — run \\`alter-identity init\\`\\n`);\n return;\n }\n stdout.write(`config: ${CONFIG_PATH}\\n`);\n stdout.write(`endpoint: ${cfg.endpoint ?? '(default)'}\\n`);\n stdout.write(`api key: ${cfg.apiKey ? '(set)' : '(none)'}\\n`);\n if (cfg.keypair) {\n const recovered = keypairFromPrivateKey(cfg.keypair.privateKey);\n stdout.write(`did: ${recovered.did}\\n`);\n }\n stdout.write(`initialised: ${cfg.initialisedAt ?? '(unknown)'}\\n`);\n\n // Probe the endpoint\n const client = new AlterClient({ endpoint: cfg.endpoint, apiKey: cfg.apiKey });\n try {\n const stats = await client.getNetworkStats();\n const text = stats.content?.[0]?.text ?? JSON.stringify(stats.data ?? '');\n stdout.write(`network probe: ok — ${text.slice(0, 120)}\\n`);\n } catch (err) {\n stdout.write(`network probe: failed — ${(err as Error).message}\\n`);\n }\n}\n\nasync function runConfig(args: string[]): Promise<void> {\n const cfg = readConfig() ?? {};\n const opts = { endpoint: cfg.endpoint, apiKey: cfg.apiKey };\n let out: unknown;\n if (args.includes('--cursor')) out = generateCursorConfig(opts);\n else if (args.includes('--generic')) out = generateGenericMcpConfig(opts);\n else out = generateClaudeConfig(opts); // default\n stdout.write(JSON.stringify(out, null, 2) + '\\n');\n}\n\n// ── Alter-to-Alter Messaging ────────────────────────────────────────────\n\nasync function runMessage(args: string[]): Promise<void> {\n const [sub, ...rest] = args;\n if (!sub) {\n stderr.write('usage: alter-identity message <send|inbox|thread|grant|revoke> ...\\n');\n exit(2);\n }\n\n const cfg = readConfig() ?? {};\n const client = new AlterClient({ endpoint: cfg.endpoint, apiKey: cfg.apiKey });\n\n const printResult = (result: MCPCallToolResult): void => {\n const text = result.content?.[0]?.text;\n if (text) {\n stdout.write(text + '\\n');\n return;\n }\n if (result.data !== undefined) {\n stdout.write(JSON.stringify(result.data, null, 2) + '\\n');\n return;\n }\n stdout.write(JSON.stringify(result, null, 2) + '\\n');\n };\n\n try {\n switch (sub) {\n case 'send': {\n const to = rest[0];\n let body = rest[1];\n if (!to || !body) {\n stderr.write('usage: alter-identity message send <~handle> <body|->\\n');\n exit(2);\n }\n if (body === '-') {\n // Read body from stdin\n const chunks: Buffer[] = [];\n for await (const chunk of (await import('node:process')).stdin) {\n chunks.push(chunk as Buffer);\n }\n body = Buffer.concat(chunks).toString('utf8').trim();\n if (!body) {\n stderr.write('error: empty body on stdin\\n');\n exit(2);\n }\n }\n const result = await client.messageSend({ to, body });\n printResult(result);\n break;\n }\n case 'inbox': {\n const unreadOnly = rest.includes('--unread');\n const sinceArg = rest.find((a) => a.startsWith('--since='));\n const since = sinceArg ? sinceArg.slice('--since='.length) : undefined;\n const result = await client.messageInbox({\n unread_only: unreadOnly || undefined,\n since,\n });\n printResult(result);\n break;\n }\n case 'thread': {\n const peer = rest[0];\n if (!peer) {\n stderr.write('usage: alter-identity message thread <~handle>\\n');\n exit(2);\n }\n const result = await client.messageThread({ with: peer });\n printResult(result);\n break;\n }\n case 'grant': {\n const peer = rest[0];\n if (!peer) {\n stderr.write('usage: alter-identity message grant <~handle>\\n');\n exit(2);\n }\n const result = await client.messageGrant({ peer });\n printResult(result);\n break;\n }\n case 'revoke': {\n const peer = rest[0];\n if (!peer) {\n stderr.write('usage: alter-identity message revoke <~handle>\\n');\n exit(2);\n }\n const result = await client.messageRevoke({ peer });\n printResult(result);\n break;\n }\n case 'mark-read': {\n const ids = rest.filter((a) => !a.startsWith('--'));\n if (ids.length === 0) {\n stderr.write('usage: alter-identity message mark-read <id> [<id> ...]\\n');\n exit(2);\n }\n const result = await client.messageMarkRead({ message_ids: ids });\n printResult(result);\n break;\n }\n case 'redact': {\n const id = rest[0];\n if (!id) {\n stderr.write('usage: alter-identity message redact <id>\\n');\n exit(2);\n }\n const result = await client.messageRedact({ message_id: id });\n printResult(result);\n break;\n }\n default:\n stderr.write(`unknown message subcommand: ${sub}\\n`);\n exit(2);\n }\n } catch (err) {\n stderr.write(`message ${sub} failed: ${(err as Error).message}\\n`);\n exit(1);\n }\n}\n\nfunction readConfig(): ConfigFile | null {\n if (!existsSync(CONFIG_PATH)) return null;\n try {\n return JSON.parse(readFileSync(CONFIG_PATH, 'utf8')) as ConfigFile;\n } catch {\n return null;\n }\n}\n\nfunction writeConfig(cfg: ConfigFile): void {\n mkdirSync(dirname(CONFIG_PATH), { recursive: true, mode: 0o700 });\n writeFileSync(CONFIG_PATH, JSON.stringify(cfg, null, 2), { mode: 0o600 });\n}\n\nmain().catch((err: unknown) => {\n stderr.write(`error: ${(err as Error).message}\\n`);\n exit(1);\n});\n"]}
|