@usesotto/cli 0.1.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/dist/bin.js +1619 -0
- package/dist/bin.js.map +1 -0
- package/dist/index.cjs +1625 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +183 -0
- package/dist/index.d.ts +183 -0
- package/dist/index.js +1600 -0
- package/dist/index.js.map +1 -0
- package/package.json +47 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../purchase-client/src/errors.ts","../../purchase-client/src/journal.ts","../../purchase-client/src/http.ts","../../purchase-client/src/sse.ts","../../purchase-client/src/client.ts","../src/config.ts","../src/core.ts","../src/exit-codes.ts","../src/help.ts","../src/output.ts","../src/commands/rail.ts","../src/commands/buy.ts","../src/commands/catalog.ts","../src/commands/session.ts","../src/commands/status.ts","../src/version.ts","../src/mcp/protocol.ts","../src/mcp/tools.ts","../src/mcp/serve.ts","../src/run.ts"],"names":["text"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * The one error taxonomy every Sotto surface shares. Codes mirror the API's\n * `error` field verbatim — the client never invents, renames, or collapses a\n * server code, so CLI, MCP, and app render identical failures.\n */\nexport const SOTTO_API_ERROR_CODES = Object.freeze([\n \"attempt-unknown\",\n \"challenge-invalid\",\n \"compose-assist-unavailable\",\n \"compose-request-invalid\",\n \"database-unavailable\",\n \"five-north-unavailable\",\n \"listing-id-missing\",\n \"listing-not-quarantinable\",\n \"listing-not-restorable\",\n \"listing-unknown\",\n \"not-implemented\",\n \"ops-token-required\",\n \"ops-unavailable\",\n \"origin-owned-elsewhere\",\n \"origin-unknown\",\n \"origin-url-invalid\",\n \"owner-hint-invalid\",\n \"party-id-invalid\",\n \"party-proof-rejected\",\n \"payer-profile-unavailable\",\n \"price-changed\",\n \"probe-not-x402\",\n \"provider-name-invalid\",\n \"provider-unreachable\",\n \"publication-ineligible\",\n \"publication-request-invalid\",\n \"publication-stale\",\n \"purchase-initiation-failed\",\n \"resource-unknown\",\n \"route-parameters-unsupported\",\n \"session-required\",\n \"signer-response-invalid\",\n \"verification-fields-missing\",\n \"wallet-id-invalid\",\n \"wallet-unknown\",\n] as const);\n\nexport type SottoApiErrorCode = (typeof SOTTO_API_ERROR_CODES)[number];\n\n/** A non-2xx API answer, carried whole: status, server code, and detail. */\nexport class SottoApiError extends Error {\n readonly status: number;\n readonly code: string;\n readonly detail: string | undefined;\n readonly body: Readonly<Record<string, unknown>>;\n\n constructor(\n status: number,\n body: Readonly<Record<string, unknown>>,\n fallbackCode: string,\n ) {\n const code = typeof body.error === \"string\" ? body.error : fallbackCode;\n const detail = typeof body.detail === \"string\" ? body.detail : undefined;\n super(detail === undefined ? code : `${code}: ${detail}`);\n this.name = \"SottoApiError\";\n this.status = status;\n this.code = code;\n this.detail = detail;\n this.body = body;\n }\n}\n\n/** The API answered, but not with the shape this client version expects. */\nexport class SottoResponseShapeError extends Error {\n constructor(context: string) {\n super(`The API response did not carry the expected shape: ${context}`);\n this.name = \"SottoResponseShapeError\";\n }\n}\n\n/** The transport failed before any API answer existed (DNS, refused, abort). */\nexport class SottoTransportError extends Error {\n override readonly cause: unknown;\n\n constructor(context: string, cause: unknown) {\n super(`The Sotto API was unreachable: ${context}`);\n this.name = \"SottoTransportError\";\n this.cause = cause;\n }\n}\n\n/** A response body exceeded the bounded read limit; nothing was truncated silently. */\nexport class SottoResponseTooLargeError extends Error {\n constructor(limitBytes: number) {\n super(\n `The API response exceeded the bounded read limit of ${limitBytes} bytes`,\n );\n this.name = \"SottoResponseTooLargeError\";\n }\n}\n","/**\n * The journal-state vocabulary, mirrored verbatim from the database schema\n * (`sotto.purchase_attempts` / `sotto.attempt_events` in migration\n * 0010_human_reconciliation.sql and `sotto.delivery_claims` in\n * 0011_paid_delivery.sql). Settlement and delivery stay separate facts —\n * a \"settled\" attempt is not \"delivered\" until the delivery claim says so.\n */\nexport const ATTEMPT_EVENT_TYPES = Object.freeze([\n \"intent-created\",\n \"prepared-hash-verified\",\n \"approval-requested\",\n \"wallet-rejected\",\n \"wallet-unsupported\",\n \"signature-verified\",\n \"execution-started\",\n \"settlement-reconciled\",\n \"settlement-rejected\",\n] as const);\n\nexport type AttemptEventType = (typeof ATTEMPT_EVENT_TYPES)[number];\n\nexport type AttemptState = AttemptEventType;\n\n/** Attempt states after which the purchase journal appends nothing further. */\nexport const TERMINAL_ATTEMPT_STATES = Object.freeze([\n \"wallet-rejected\",\n \"wallet-unsupported\",\n \"settlement-reconciled\",\n \"settlement-rejected\",\n] as const);\n\nexport type TerminalAttemptState = (typeof TERMINAL_ATTEMPT_STATES)[number];\n\nexport const DELIVERY_CLAIM_STATES = Object.freeze([\n \"ready\",\n \"leased\",\n \"dispatching\",\n \"delivered\",\n \"delivery-failed\",\n \"delivery-unknown\",\n] as const);\n\nexport type DeliveryClaimState = (typeof DELIVERY_CLAIM_STATES)[number];\n\n/** Delivery claim states after which the delivery worker stops. */\nexport const TERMINAL_DELIVERY_STATES = Object.freeze([\n \"delivered\",\n \"delivery-failed\",\n \"delivery-unknown\",\n] as const);\n\nexport function isTerminalAttemptState(\n state: string,\n): state is TerminalAttemptState {\n return (TERMINAL_ATTEMPT_STATES as readonly string[]).includes(state);\n}\n\nexport function isTerminalDeliveryState(state: string): boolean {\n return (TERMINAL_DELIVERY_STATES as readonly string[]).includes(state);\n}\n\n/**\n * The paired outcome of one attempt, never merged into a generic success:\n * `settled` and `delivered` are separate booleans, and the honest\n * settled-undelivered case is representable.\n */\nexport type PairedOutcome = Readonly<{\n settled: boolean;\n settlementRejected: boolean;\n delivered: boolean;\n deliveryFailed: boolean;\n deliveryPending: boolean;\n}>;\n\nexport function pairedOutcome(\n attemptState: string,\n deliveryClaimState: string | null,\n): PairedOutcome {\n const settled = attemptState === \"settlement-reconciled\";\n const delivered = deliveryClaimState === \"delivered\";\n const deliveryFailed =\n deliveryClaimState === \"delivery-failed\" ||\n deliveryClaimState === \"delivery-unknown\";\n return Object.freeze({\n settled,\n settlementRejected: attemptState === \"settlement-rejected\",\n delivered,\n deliveryFailed,\n deliveryPending: settled && !delivered && !deliveryFailed,\n });\n}\n","import {\n SottoApiError,\n SottoResponseShapeError,\n SottoResponseTooLargeError,\n SottoTransportError,\n} from \"./errors.js\";\n\nexport const DEFAULT_MAX_RESPONSE_BYTES = 2 * 1024 * 1024;\n\nexport type FetchLike = (\n url: string,\n init: Readonly<{\n method: string;\n headers: Readonly<Record<string, string>>;\n body?: string;\n signal?: AbortSignal;\n redirect?: \"error\";\n }>,\n) => Promise<Response>;\n\nexport type TransportOptions = Readonly<{\n origin: string;\n token?: () => string | undefined;\n fetch?: FetchLike;\n maxResponseBytes?: number;\n}>;\n\nexport type RequestInput = Readonly<{\n method: \"GET\" | \"POST\" | \"DELETE\";\n path: string;\n body?: Readonly<Record<string, unknown>>;\n signal?: AbortSignal;\n headers?: Readonly<Record<string, string>>;\n}>;\n\nfunction normalizedOrigin(origin: string): string {\n const url = new URL(origin);\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n throw new SottoTransportError(`unsupported origin ${origin}`, undefined);\n }\n return url.origin;\n}\n\n/** Reads a body with a hard byte bound; over-limit reads fail loudly. */\nexport async function readBounded(\n response: Response,\n limitBytes: number,\n): Promise<string> {\n const body = response.body;\n if (body === null) return \"\";\n const reader = body.getReader();\n const chunks: Uint8Array[] = [];\n let total = 0;\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n total += value.byteLength;\n if (total > limitBytes) {\n await reader.cancel();\n throw new SottoResponseTooLargeError(limitBytes);\n }\n chunks.push(value);\n }\n return new TextDecoder().decode(\n chunks.length === 1 ? chunks[0] : concat(chunks, total),\n );\n}\n\nfunction concat(chunks: readonly Uint8Array[], total: number): Uint8Array {\n const merged = new Uint8Array(total);\n let offset = 0;\n for (const chunk of chunks) {\n merged.set(chunk, offset);\n offset += chunk.byteLength;\n }\n return merged;\n}\n\nexport type Transport = Readonly<{\n origin: string;\n authorizationHeader(): Readonly<Record<string, string>>;\n request(input: RequestInput): Promise<Readonly<Record<string, unknown>>>;\n fetchRaw(\n path: string,\n headers: Readonly<Record<string, string>>,\n signal: AbortSignal | undefined,\n ): Promise<Response>;\n}>;\n\n/**\n * The one HTTP seam of the purchasing core: injectable fetch, bearer-token\n * authorization, bounded JSON reads, verbatim error-code pass-through. No\n * method here can sign anything — the client's authority is the session\n * token and nothing else.\n */\nexport function createTransport(options: TransportOptions): Transport {\n const origin = normalizedOrigin(options.origin);\n const fetchImpl: FetchLike =\n options.fetch ?? ((url, init) => globalThis.fetch(url, init));\n const limit = options.maxResponseBytes ?? DEFAULT_MAX_RESPONSE_BYTES;\n\n const authorizationHeader = (): Readonly<Record<string, string>> => {\n const token = options.token?.();\n return token === undefined ? {} : { authorization: `Bearer ${token}` };\n };\n\n return Object.freeze({\n origin,\n authorizationHeader,\n request: async ({ method, path, body, signal, headers }) => {\n let response: Response;\n try {\n response = await fetchImpl(`${origin}${path}`, {\n method,\n redirect: \"error\",\n headers: {\n accept: \"application/json\",\n ...(body === undefined\n ? {}\n : { \"content-type\": \"application/json\" }),\n ...authorizationHeader(),\n ...headers,\n },\n ...(body === undefined ? {} : { body: JSON.stringify(body) }),\n ...(signal === undefined ? {} : { signal }),\n });\n } catch (error) {\n throw new SottoTransportError(`${method} ${path}`, error);\n }\n if (response.status === 204) return Object.freeze({});\n const text = await readBounded(response, limit);\n let parsed: unknown;\n try {\n parsed = text === \"\" ? {} : JSON.parse(text);\n } catch {\n throw new SottoResponseShapeError(\n `${method} ${path} answered non-JSON with status ${response.status}`,\n );\n }\n if (typeof parsed !== \"object\" || parsed === null) {\n throw new SottoResponseShapeError(\n `${method} ${path} answered a non-object body`,\n );\n }\n const record = parsed as Record<string, unknown>;\n if (!response.ok) {\n throw new SottoApiError(\n response.status,\n record,\n `http-${response.status}`,\n );\n }\n return record;\n },\n fetchRaw: async (path, headers, signal) => {\n try {\n return await fetchImpl(`${origin}${path}`, {\n method: \"GET\",\n redirect: \"error\",\n headers: { ...authorizationHeader(), ...headers },\n ...(signal === undefined ? {} : { signal }),\n });\n } catch (error) {\n throw new SottoTransportError(`GET ${path}`, error);\n }\n },\n });\n}\n","import { SottoApiError, SottoResponseShapeError } from \"./errors.js\";\nimport type { Transport } from \"./http.js\";\nimport { readBounded } from \"./http.js\";\nimport { isTerminalAttemptState } from \"./journal.js\";\nimport type { AttemptEvent } from \"./types.js\";\n\nconst MAX_EVENT_BYTES = 64 * 1024;\n\nexport type FollowOptions = Readonly<{\n lastEventId?: number;\n signal?: AbortSignal;\n reconnectDelayMs?: number;\n maxReconnects?: number;\n}>;\n\nexport type ParsedSseEvent = Readonly<{\n id: string | undefined;\n event: string | undefined;\n data: string;\n}>;\n\n/** Incremental SSE frame parser: feed chunks, collect complete events. */\nexport function createSseParser(): {\n feed(chunk: string): readonly ParsedSseEvent[];\n} {\n let buffer = \"\";\n return {\n feed(chunk) {\n buffer += chunk.replaceAll(\"\\r\\n\", \"\\n\");\n if (buffer.length > MAX_EVENT_BYTES) {\n throw new SottoResponseShapeError(\"SSE frame exceeded 64KiB\");\n }\n const events: ParsedSseEvent[] = [];\n for (;;) {\n const boundary = buffer.indexOf(\"\\n\\n\");\n if (boundary === -1) break;\n const frame = buffer.slice(0, boundary);\n buffer = buffer.slice(boundary + 2);\n let id: string | undefined;\n let event: string | undefined;\n const data: string[] = [];\n for (const line of frame.split(\"\\n\")) {\n if (line.startsWith(\":\")) continue; // heartbeat comment\n if (line.startsWith(\"id:\")) id = line.slice(3).trim();\n else if (line.startsWith(\"event:\")) event = line.slice(6).trim();\n else if (line.startsWith(\"data:\")) data.push(line.slice(5).trim());\n }\n if (id !== undefined || event !== undefined || data.length > 0) {\n events.push(Object.freeze({ id, event, data: data.join(\"\\n\") }));\n }\n }\n return events;\n },\n };\n}\n\nfunction parseAttemptEvent(frame: ParsedSseEvent): AttemptEvent {\n let parsed: unknown;\n try {\n parsed = JSON.parse(frame.data);\n } catch {\n throw new SottoResponseShapeError(\"SSE data was not JSON\");\n }\n const record = parsed as Record<string, unknown>;\n if (\n typeof record.sequence !== \"number\" ||\n typeof record.type !== \"string\" ||\n typeof record.recordedAt !== \"string\"\n ) {\n throw new SottoResponseShapeError(\"SSE event missed journal fields\");\n }\n return Object.freeze({\n sequence: record.sequence,\n type: record.type,\n recordedAt: record.recordedAt,\n updateId: typeof record.updateId === \"string\" ? record.updateId : null,\n });\n}\n\nconst delay = (ms: number, signal: AbortSignal | undefined) =>\n new Promise<void>((resolve) => {\n const timer = setTimeout(done, ms);\n function done() {\n signal?.removeEventListener(\"abort\", done);\n clearTimeout(timer);\n resolve();\n }\n signal?.addEventListener(\"abort\", done, { once: true });\n });\n\n/**\n * Follows `/v1/purchases/:attemptId/events` as an async iterator of\n * journal events. Every yielded event is an already-committed\n * `sotto.attempt_events` row. A dropped connection reconnects with\n * `Last-Event-ID` so no sequence is missed or repeated; iteration ends at\n * the journal's terminal event or the caller's AbortSignal — never by\n * inventing an outcome.\n */\nexport async function* followPurchaseEvents(\n transport: Transport,\n attemptId: string,\n options: FollowOptions = {},\n): AsyncGenerator<AttemptEvent, void, undefined> {\n let cursor = options.lastEventId ?? 0;\n const signal = options.signal;\n // aborted() defeats control-flow narrowing: the flag flips between awaits.\n const aborted = (): boolean => signal?.aborted === true;\n const reconnectDelayMs = options.reconnectDelayMs ?? 1_000;\n let reconnectsLeft = options.maxReconnects ?? 30;\n for (;;) {\n if (aborted()) return;\n const response = await transport.fetchRaw(\n `/v1/purchases/${encodeURIComponent(attemptId)}/events`,\n {\n accept: \"text/event-stream\",\n ...(cursor > 0 ? { \"last-event-id\": String(cursor) } : {}),\n },\n signal,\n );\n if (!response.ok) {\n const text = await readBounded(response, MAX_EVENT_BYTES);\n let body: Record<string, unknown> = {};\n try {\n body = JSON.parse(text) as Record<string, unknown>;\n } catch {\n // non-JSON error body: the status alone names the failure\n }\n throw new SottoApiError(response.status, body, `http-${response.status}`);\n }\n if (response.body === null) {\n throw new SottoResponseShapeError(\"event stream had no body\");\n }\n const parser = createSseParser();\n const reader = response.body.getReader();\n const decoder = new TextDecoder();\n const abort = () => void reader.cancel().catch(() => undefined);\n signal?.addEventListener(\"abort\", abort, { once: true });\n try {\n for (;;) {\n const { done, value } = await reader.read();\n if (done) break;\n for (const frame of parser.feed(\n decoder.decode(value, { stream: true }),\n )) {\n if (frame.data === \"\") continue;\n const event = parseAttemptEvent(frame);\n if (event.sequence <= cursor) continue;\n cursor = event.sequence;\n yield event;\n if (isTerminalAttemptState(event.type)) return;\n }\n }\n } finally {\n signal?.removeEventListener(\"abort\", abort);\n }\n if (aborted()) return;\n if (reconnectsLeft <= 0) {\n throw new SottoResponseShapeError(\n \"event stream ended before a terminal journal event and the \" +\n \"reconnect budget is exhausted\",\n );\n }\n reconnectsLeft -= 1;\n await delay(reconnectDelayMs, signal);\n }\n}\n","import { SottoResponseShapeError } from \"./errors.js\";\nimport type { TransportOptions } from \"./http.js\";\nimport { createTransport } from \"./http.js\";\nimport type { FollowOptions } from \"./sse.js\";\nimport { followPurchaseEvents } from \"./sse.js\";\nimport type {\n AttemptEvent,\n AttemptEvidence,\n AttemptSummary,\n CatalogResource,\n HealthReport,\n PublicAttempt,\n PurchaseDetail,\n PurchaseInitiated,\n ResourceHealth,\n StatsReport,\n} from \"./types.js\";\n\nexport type SottoClientOptions = TransportOptions;\n\nexport type SottoClient = Readonly<{\n origin: string;\n health(signal?: AbortSignal): Promise<HealthReport>;\n session: Readonly<{\n /** True when the configured token resolves to a live owner session. */\n verify(signal?: AbortSignal): Promise<boolean>;\n logout(signal?: AbortSignal): Promise<void>;\n }>;\n catalog: Readonly<{\n listResources(signal?: AbortSignal): Promise<readonly CatalogResource[]>;\n resourceByListing(\n listingId: string,\n signal?: AbortSignal,\n ): Promise<CatalogResource>;\n resourceHealth(\n listingId: string,\n signal?: AbortSignal,\n ): Promise<ResourceHealth>;\n }>;\n purchases: Readonly<{\n initiate(\n listingId: string,\n signal?: AbortSignal,\n ): Promise<PurchaseInitiated>;\n get(attemptId: string, signal?: AbortSignal): Promise<PurchaseDetail>;\n list(\n limit?: number,\n signal?: AbortSignal,\n ): Promise<readonly AttemptSummary[]>;\n follow(\n attemptId: string,\n options?: FollowOptions,\n ): AsyncGenerator<AttemptEvent, void, undefined>;\n }>;\n attempts: Readonly<{\n listPublic(\n limit?: number,\n signal?: AbortSignal,\n ): Promise<readonly PublicAttempt[]>;\n evidence(attemptId: string, signal?: AbortSignal): Promise<AttemptEvidence>;\n }>;\n stats: Readonly<{\n read(window?: string, signal?: AbortSignal): Promise<StatsReport>;\n }>;\n}>;\n\nfunction requireArray<T>(value: unknown, context: string): readonly T[] {\n if (!Array.isArray(value)) throw new SottoResponseShapeError(context);\n return value as readonly T[];\n}\n\nfunction requireRecord<T>(value: unknown, context: string): T {\n if (typeof value !== \"object\" || value === null) {\n throw new SottoResponseShapeError(context);\n }\n return value as T;\n}\n\n/**\n * The one purchasing core (product contract, Agent Interfaces): CLI, MCP,\n * and app consume this identical client so catalog, purchase lifecycle,\n * status, and error semantics cannot drift between surfaces. It holds a\n * session token at most — it has no signing capability of any kind, and\n * every real spend still terminates at the human wallet boundary.\n */\nexport function createSottoClient(options: SottoClientOptions): SottoClient {\n const transport = createTransport(options);\n const get = (path: string, signal?: AbortSignal) =>\n transport.request({\n method: \"GET\",\n path,\n ...(signal === undefined ? {} : { signal }),\n });\n\n const client: SottoClient = {\n origin: transport.origin,\n health: async (signal?: AbortSignal) =>\n requireRecord<HealthReport>(await get(\"/healthz\", signal), \"healthz\"),\n session: Object.freeze({\n verify: async (signal?: AbortSignal) => {\n try {\n await get(\"/v1/purchases?limit=1\", signal);\n return true;\n } catch (error) {\n if (\n error instanceof Error &&\n \"code\" in error &&\n (error as { code: unknown }).code === \"session-required\"\n ) {\n return false;\n }\n throw error;\n }\n },\n logout: async (signal?: AbortSignal) => {\n await transport.request({\n method: \"DELETE\",\n path: \"/v1/session\",\n ...(signal === undefined ? {} : { signal }),\n });\n },\n }),\n catalog: Object.freeze({\n listResources: async (signal?: AbortSignal) =>\n requireArray<CatalogResource>(\n (await get(\"/v1/resources\", signal)).resources,\n \"resources\",\n ),\n resourceByListing: async (listingId: string, signal?: AbortSignal) =>\n requireRecord<CatalogResource>(\n (await get(`/v1/resources/${encodeURIComponent(listingId)}`, signal))\n .resource,\n \"resource\",\n ),\n resourceHealth: async (listingId: string, signal?: AbortSignal) => {\n const body = await get(\n `/v1/resources/${encodeURIComponent(listingId)}/health`,\n signal,\n );\n return (body.health ?? null) as ResourceHealth;\n },\n }),\n purchases: Object.freeze({\n initiate: async (listingId: string, signal?: AbortSignal) =>\n requireRecord<PurchaseInitiated>(\n await transport.request({\n method: \"POST\",\n path: \"/v1/purchases\",\n body: { listingId },\n ...(signal === undefined ? {} : { signal }),\n }),\n \"purchase initiation\",\n ),\n get: async (attemptId: string, signal?: AbortSignal) =>\n requireRecord<PurchaseDetail>(\n await get(`/v1/purchases/${encodeURIComponent(attemptId)}`, signal),\n \"purchase detail\",\n ),\n list: async (limit = 50, signal?: AbortSignal) =>\n requireArray<AttemptSummary>(\n (await get(`/v1/purchases?limit=${limit}`, signal)).attempts,\n \"attempts\",\n ),\n follow: (attemptId: string, followOptions?: FollowOptions) =>\n followPurchaseEvents(transport, attemptId, followOptions),\n }),\n attempts: Object.freeze({\n listPublic: async (limit = 50, signal?: AbortSignal) =>\n requireArray<PublicAttempt>(\n (await get(`/v1/attempts?limit=${limit}`, signal)).attempts,\n \"public attempts\",\n ),\n evidence: async (attemptId: string, signal?: AbortSignal) =>\n requireRecord<AttemptEvidence>(\n (await get(`/v1/attempts/${encodeURIComponent(attemptId)}`, signal))\n .attempt,\n \"attempt evidence\",\n ),\n }),\n stats: Object.freeze({\n read: async (window = \"7d\", signal?: AbortSignal) =>\n requireRecord<StatsReport>(\n await get(`/v1/stats?window=${encodeURIComponent(window)}`, signal),\n \"stats\",\n ),\n }),\n };\n return Object.freeze(client);\n}\n","import {\n chmodSync,\n mkdirSync,\n readFileSync,\n rmSync,\n writeFileSync,\n} from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join } from \"node:path\";\n\nconst TOKEN = /^[0-9a-f]{64}$/u;\n\nexport type CliConfig = Readonly<{\n apiOrigin?: string;\n token?: string;\n walletUrl?: string;\n}>;\n\nexport type Env = Readonly<Record<string, string | undefined>>;\n\nexport function configPath(env: Env): string {\n const base =\n env.SOTTO_CONFIG_DIR ??\n join(env.XDG_CONFIG_HOME ?? join(homedir(), \".config\"), \"sotto\");\n return join(base, \"config.json\");\n}\n\n/** Malformed config fails closed: the CLI treats it as absent and says so. */\nexport function readConfig(env: Env): CliConfig {\n let raw: string;\n try {\n raw = readFileSync(configPath(env), \"utf8\");\n } catch {\n return Object.freeze({});\n }\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n return Object.freeze({});\n }\n if (typeof parsed !== \"object\" || parsed === null) return Object.freeze({});\n const record = parsed as Record<string, unknown>;\n return Object.freeze({\n ...(typeof record.apiOrigin === \"string\"\n ? { apiOrigin: record.apiOrigin }\n : {}),\n ...(typeof record.token === \"string\" && TOKEN.test(record.token)\n ? { token: record.token }\n : {}),\n ...(typeof record.walletUrl === \"string\"\n ? { walletUrl: record.walletUrl }\n : {}),\n });\n}\n\n/**\n * Persists the config with owner-only permissions: 0700 directory, 0600\n * file — the session token never becomes group- or world-readable, and an\n * existing looser mode is tightened on every write.\n */\nexport function writeConfig(env: Env, config: CliConfig): string {\n const path = configPath(env);\n mkdirSync(dirname(path), { recursive: true, mode: 0o700 });\n writeFileSync(path, `${JSON.stringify(config, null, 2)}\\n`, {\n encoding: \"utf8\",\n mode: 0o600,\n });\n chmodSync(path, 0o600);\n return path;\n}\n\nexport function deleteConfig(env: Env): void {\n rmSync(configPath(env), { force: true });\n}\n\nexport type ResolvedSettings = Readonly<{\n apiOrigin: string | undefined;\n token: string | undefined;\n walletUrl: string | undefined;\n tokenSource: \"env\" | \"config\" | \"absent\";\n}>;\n\n/** Environment overrides config; explicit flags override both. */\nexport function resolveSettings(\n env: Env,\n flags: Readonly<{ apiOrigin?: string }> = {},\n): ResolvedSettings {\n const config = readConfig(env);\n const envToken = env.SOTTO_SESSION_TOKEN;\n const token =\n envToken !== undefined && TOKEN.test(envToken) ? envToken : config.token;\n return Object.freeze({\n apiOrigin: flags.apiOrigin ?? env.SOTTO_API_ORIGIN ?? config.apiOrigin,\n token,\n walletUrl: env.SOTTO_WALLET_URL ?? config.walletUrl,\n tokenSource:\n envToken !== undefined && TOKEN.test(envToken)\n ? \"env\"\n : config.token !== undefined\n ? \"config\"\n : \"absent\",\n });\n}\n\nexport function isValidToken(candidate: string): boolean {\n return TOKEN.test(candidate);\n}\n","import {\n createSottoClient,\n type CatalogResource,\n type FetchLike,\n type SottoClient,\n} from \"@sotto/purchase-client\";\nimport { resolveSettings, type Env, type ResolvedSettings } from \"./config.js\";\n\nexport class CliUsageError extends Error {}\nexport class CliAuthError extends Error {}\n\nexport type ClientContext = Readonly<{\n client: SottoClient;\n settings: ResolvedSettings;\n}>;\n\n/**\n * Builds the shared purchasing-core client from resolved settings. Every\n * CLI command and MCP tool goes through this one construction — there is\n * no second HTTP path and no signing capability anywhere behind it.\n */\nexport function buildClient(\n env: Env,\n flags: Readonly<{ apiOrigin?: string }> = {},\n fetchImpl?: FetchLike,\n): ClientContext {\n const settings = resolveSettings(env, flags);\n if (settings.apiOrigin === undefined) {\n throw new CliUsageError(\n \"No API origin is configured. Set SOTTO_API_ORIGIN, pass \" +\n \"--api-origin, or run `sotto login --api-origin <url> --token <token>`.\",\n );\n }\n const client = createSottoClient({\n origin: settings.apiOrigin,\n token: () => settings.token,\n ...(fetchImpl === undefined ? {} : { fetch: fetchImpl }),\n });\n return Object.freeze({ client, settings });\n}\n\nexport function requireToken(settings: ResolvedSettings): string {\n if (settings.token === undefined) {\n throw new CliAuthError(\n \"No owner session token is configured. Copy the session token from \" +\n \"the Sotto app (or the /v1/session/verify response) and run \" +\n \"`sotto login --token <token>`, or export SOTTO_SESSION_TOKEN.\",\n );\n }\n return settings.token;\n}\n\nexport type SearchFilters = Readonly<{\n query?: string;\n method?: string;\n maxPriceAtomic?: bigint;\n}>;\n\n/** Case-insensitive text match over the verified catalog's own fields. */\nexport function filterResources(\n resources: readonly CatalogResource[],\n filters: SearchFilters,\n): readonly CatalogResource[] {\n const query = filters.query?.toLowerCase();\n return resources.filter((resource) => {\n if (\n filters.method !== undefined &&\n resource.method.toUpperCase() !== filters.method.toUpperCase()\n ) {\n return false;\n }\n if (\n filters.maxPriceAtomic !== undefined &&\n BigInt(resource.amountAtomic) > filters.maxPriceAtomic\n ) {\n return false;\n }\n if (query === undefined || query === \"\") return true;\n return [\n resource.name,\n resource.description,\n resource.providerDisplayName,\n resource.normalizedOrigin,\n resource.routeTemplate,\n resource.method,\n ]\n .join(\"\\n\")\n .toLowerCase()\n .includes(query);\n });\n}\n\nconst UUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/u;\n\n/**\n * Resolves a listing ID or a canonical resource URL to its verified\n * catalog listing — the `sotto try <resource-url>` path. A URL matches\n * when origin and route equal a published resource exactly.\n */\nexport async function resolveResource(\n client: SottoClient,\n reference: string,\n signal?: AbortSignal,\n): Promise<CatalogResource> {\n if (UUID.test(reference)) {\n return client.catalog.resourceByListing(reference, signal);\n }\n let url: URL;\n try {\n url = new URL(reference);\n } catch {\n throw new CliUsageError(\n `\"${reference}\" is neither a listing ID nor a resource URL. Pass the ` +\n \"listing ID from `sotto search` or the resource's canonical URL.\",\n );\n }\n const resources = await client.catalog.listResources(signal);\n const match = resources.find(\n (resource) =>\n resource.normalizedOrigin === url.origin &&\n resource.routeTemplate === url.pathname,\n );\n if (match === undefined) {\n throw new CliUsageError(\n `No verified resource matches ${url.origin}${url.pathname}. Browse ` +\n \"`sotto search` for the published catalog.\",\n );\n }\n return match;\n}\n\nexport function parseMaxPrice(raw: string | undefined): bigint | undefined {\n if (raw === undefined) return undefined;\n if (!/^[0-9]{1,38}$/u.test(raw)) {\n throw new CliUsageError(\n \"--max-price takes an atomic-unit integer (the catalog's amountAtomic).\",\n );\n }\n return BigInt(raw);\n}\n","/**\n * One exit code per distinct terminal fact, so scripts can branch on the\n * paired settlement/delivery outcome without parsing copy. Ambiguous\n * outcomes (8) must never be auto-retried — the CLI prints reconcile\n * guidance instead of spending twice.\n */\nexport const EXIT = Object.freeze({\n /** Read succeeded, or the purchase settled AND delivered. */\n ok: 0,\n /** Transport failure, API failure, or an unexpected error. */\n failure: 1,\n /** The command line itself was invalid. */\n usage: 2,\n /** No usable owner session (token absent, expired, or revoked). */\n auth: 3,\n /** The human wallet rejected this exact prepared call. */\n walletRejected: 4,\n /** The wallet cannot sign this prepared transaction shape. */\n walletUnsupported: 5,\n /** Canton rejected the settlement; no value moved. */\n settlementRejected: 6,\n /** The execute-before deadline passed without a terminal journal event. */\n expired: 7,\n /** Settled but not delivered, or otherwise ambiguous — reconcile, never retry. */\n ambiguous: 8,\n} as const);\n\nexport type ExitCode = (typeof EXIT)[keyof typeof EXIT];\n","export const HELP_TEXT = `sotto — Canton x402 marketplace CLI (thin client over the Sotto API)\n\nUSAGE\n sotto <command> [arguments] [flags]\n\nSESSION (copy-token flow — no device authorization exists server-side yet)\n login [--api-origin <url>] --token <token> [--wallet-url <url>]\n Store the owner-session token you copied from the Sotto app's\n session response. Stored 0600 in ~/.config/sotto/config.json and\n sent only as \"Authorization: Bearer\" to that API origin.\n whoami Report API origin, token presence, and session validity.\n logout Revoke the server session and remove the local token.\n\nCATALOG\n search [query] [--method <m>] [--max-price <atomic>]\n List verified resources. --tag is not supported: the catalog\n carries no tags yet and the CLI will say so instead of ignoring it.\n inspect <listingId|resource-url>\n Show one resource with its fresh server-observed price + timestamp.\n try <resource-url>\n Inspect the listing behind a canonical URL and print the exact\n prepare command. Alias of inspect with purchase guidance.\n\nPURCHASING (a HUMAN approves every spend at the wallet; the CLI never signs)\n buy <listingId> [--max-price <atomic>] [--no-wait]\n Initiate one exact purchase, print the prepared call + request\n commitment (+ prepared hash once verified), then follow the journal\n as a text rail until a terminal state.\n status <attemptId> [--follow]\n Show or follow the full journal state.\n evidence <attemptId>\n Paired settlement/delivery outcome, update ID, explorer URL.\n stats [--window 24h|7d|30d|all]\n Real persisted aggregates; settlement and delivery rates separate.\n\nAGENTS\n mcp serve Buyer MCP server on stdio (JSON-RPC on stdout, logs on\n stderr). Same token via config or SOTTO_SESSION_TOKEN.\n\nGLOBAL FLAGS\n --json Machine-readable output on every read command.\n --api-origin Override the API origin for this invocation.\n --version Print the CLI version. --help This text.\n\nENVIRONMENT\n SOTTO_API_ORIGIN, SOTTO_SESSION_TOKEN, SOTTO_WALLET_URL, NO_COLOR\n\nEXIT CODES\n 0 delivered/ok 1 failure 2 usage 3 no session 4 wallet-rejected\n 5 wallet-unsupported 6 settlement-rejected 7 expired\n 8 ambiguous or settled-undelivered (reconcile; NEVER auto-retried)`;\n","/**\n * Terminal output helpers bound to DESIGN.md §6: truncation keeps hint +\n * tail for party IDs and first-8 + last-4 for update IDs, amounts always\n * carry the asset, and `--json` returns the full untruncated values.\n * NO_COLOR or a non-TTY stream turns every escape sequence off.\n */\nexport type Io = Readonly<{\n stdout: (line: string) => void;\n stderr: (line: string) => void;\n env: Readonly<Record<string, string | undefined>>;\n isTTY: boolean;\n}>;\n\nexport function colorEnabled(io: Io): boolean {\n return io.isTTY && io.env.NO_COLOR === undefined;\n}\n\nexport function bold(io: Io, text: string): string {\n return colorEnabled(io) ? `\u001b[1m${text}\u001b[0m` : text;\n}\n\nexport function dim(io: Io, text: string): string {\n return colorEnabled(io) ? `\u001b[2m${text}\u001b[0m` : text;\n}\n\nexport function truncateParty(partyId: string): string {\n const separator = partyId.indexOf(\"::\");\n if (separator === -1 || partyId.length <= separator + 12) return partyId;\n const hint = partyId.slice(0, separator);\n const namespace = partyId.slice(separator + 2);\n return `${hint}::${namespace.slice(0, 4)}…${namespace.slice(-5)}`;\n}\n\nexport function truncateUpdateId(updateId: string): string {\n if (updateId.length <= 14) return updateId;\n return `${updateId.slice(0, 8)}…${updateId.slice(-4)}`;\n}\n\nexport function truncateAttemptId(attemptId: string): string {\n if (attemptId.length <= 20) return attemptId;\n return `${attemptId.slice(0, 15)}…${attemptId.slice(-4)}`;\n}\n\nexport function amountWithAsset(atomic: string, asset: string): string {\n return `${atomic} ${asset} (atomic units)`;\n}\n\nexport function resourceUrl(origin: string, route: string): string {\n return `${origin}${route}`;\n}\n\nexport function printJson(io: Io, value: unknown): void {\n io.stdout(JSON.stringify(value, null, 2));\n}\n\n/** `[x]` done / `[>]` active / `[ ]` pending station line with mono timestamp. */\nexport function railLine(\n mark: \"done\" | \"active\" | \"pending\",\n timestamp: string | null,\n label: string,\n): string {\n const box = mark === \"done\" ? \"[x]\" : mark === \"active\" ? \"[>]\" : \"[ ]\";\n const at = timestamp === null ? \" \" : timestamp;\n return `${box} ${at} ${label}`;\n}\n\nexport function table(\n rows: readonly (readonly string[])[],\n header: readonly string[],\n): readonly string[] {\n const all = [header, ...rows];\n const widths = header.map((_, column) =>\n Math.max(...all.map((row) => (row[column] ?? \"\").length)),\n );\n return all.map((row) =>\n row\n .map((cell, column) => cell.padEnd(widths[column] ?? 0))\n .join(\" \")\n .trimEnd(),\n );\n}\n","import {\n isTerminalAttemptState,\n pairedOutcome,\n type AttemptEvent,\n type PurchaseDetail,\n type SottoClient,\n} from \"@sotto/purchase-client\";\nimport { EXIT, type ExitCode } from \"../exit-codes.js\";\nimport { bold, railLine, type Io } from \"../output.js\";\n\nexport const STATION_LABELS: Readonly<Record<string, string>> = Object.freeze({\n \"intent-created\": \"Intent journaled\",\n \"prepared-hash-verified\": \"Prepared transaction hash verified\",\n \"approval-requested\": \"Human wallet approval requested\",\n \"wallet-rejected\": \"Wallet rejected this exact call\",\n \"wallet-unsupported\": \"Wallet cannot sign this transaction shape\",\n \"signature-verified\": \"Wallet signature verified\",\n \"execution-started\": \"Canton execution started\",\n \"settlement-reconciled\": \"Settlement reconciled on Canton\",\n \"settlement-rejected\": \"Settlement rejected by Canton\",\n});\n\nexport function renderEvent(io: Io, event: AttemptEvent): void {\n io.stdout(\n railLine(\n \"done\",\n event.recordedAt,\n `${STATION_LABELS[event.type] ?? event.type}${\n event.updateId === null ? \"\" : ` — update ${event.updateId}`\n }`,\n ),\n );\n}\n\nexport function renderApprovalBlock(\n io: Io,\n walletUrl: string | undefined,\n): void {\n io.stdout(\"\");\n io.stdout(bold(io, \"── HUMAN APPROVAL REQUIRED ──────────────────────────\"));\n io.stdout(\"A human must approve this exact prepared call in the Sotto\");\n io.stdout(\"wallet before any value moves. This CLI cannot sign anything.\");\n if (walletUrl !== undefined) {\n io.stdout(bold(io, `Wallet approval page: ${walletUrl}`));\n } else {\n io.stdout(\n \"Open the wallet link from your Sotto onboarding to approve \" +\n \"(store it once with `sotto login --wallet-url <url>`).\",\n );\n }\n io.stdout(bold(io, \"─────────────────────────────────────────────────────\"));\n io.stdout(\"\");\n}\n\nexport function reconcileGuidance(io: Io, attemptId: string): void {\n io.stderr(\n \"This outcome is not final proof of delivery. Do NOT retry the \" +\n \"purchase — a second attempt can pay twice for one call.\",\n );\n io.stderr(`Reconcile with: sotto status ${attemptId}`);\n io.stderr(`Evidence: sotto evidence ${attemptId}`);\n}\n\nconst DELIVERY_POLL_MS = 2_000;\nconst DELIVERY_WAIT_MS = 120_000;\n\n/**\n * After the journal's settlement-reconciled terminal event the delivery\n * worker still runs; poll the paired facts until delivery is terminal or\n * the wait budget ends. Settlement and delivery stay two facts.\n */\nexport async function settleDeliveryExit(\n io: Io,\n client: SottoClient,\n attemptId: string,\n waitMs = DELIVERY_WAIT_MS,\n pollMs = DELIVERY_POLL_MS,\n): Promise<ExitCode> {\n const deadline = Date.now() + waitMs;\n for (;;) {\n const detail: PurchaseDetail = await client.purchases.get(attemptId);\n const outcome = pairedOutcome(\n detail.attempt.state,\n detail.delivery?.claimState ?? null,\n );\n if (outcome.delivered) {\n io.stdout(\n railLine(\n \"done\",\n detail.delivery?.respondedAt ?? new Date().toISOString(),\n \"Delivered — paid provider response recorded\",\n ),\n );\n io.stdout(\"Settled: yes. Delivered: yes.\");\n return EXIT.ok;\n }\n if (outcome.deliveryFailed) {\n io.stdout(\n \"Settled: yes. Delivered: NO — delivery \" +\n `${detail.delivery?.claimState ?? \"unknown\"} (${detail.delivery?.failureCode ?? \"no failure code\"}).`,\n );\n reconcileGuidance(io, attemptId);\n return EXIT.ambiguous;\n }\n if (Date.now() >= deadline) {\n io.stdout(\n \"Settled: yes. Delivered: not yet — the delivery worker has not \" +\n \"reported a terminal state within the wait budget.\",\n );\n reconcileGuidance(io, attemptId);\n return EXIT.ambiguous;\n }\n await new Promise((resolve) => setTimeout(resolve, pollMs));\n }\n}\n\nexport function terminalExit(eventType: string): ExitCode | undefined {\n if (!isTerminalAttemptState(eventType)) return undefined;\n switch (eventType) {\n case \"wallet-rejected\":\n return EXIT.walletRejected;\n case \"wallet-unsupported\":\n return EXIT.walletUnsupported;\n case \"settlement-rejected\":\n return EXIT.settlementRejected;\n default:\n return EXIT.ok; // settlement-reconciled; delivery decided separately\n }\n}\n","import {\n SottoApiError,\n pairedOutcome,\n type PurchaseInitiated,\n type SottoClient,\n} from \"@sotto/purchase-client\";\nimport type { Env } from \"../config.js\";\nimport {\n buildClient,\n parseMaxPrice,\n requireToken,\n CliUsageError,\n} from \"../core.js\";\nimport { EXIT, type ExitCode } from \"../exit-codes.js\";\nimport {\n amountWithAsset,\n bold,\n printJson,\n railLine,\n type Io,\n} from \"../output.js\";\nimport {\n renderApprovalBlock,\n renderEvent,\n reconcileGuidance,\n settleDeliveryExit,\n terminalExit,\n} from \"./rail.js\";\nimport type { FetchLike } from \"@sotto/purchase-client\";\n\nexport type BuyCommandInput = Readonly<{\n io: Io;\n env: Env;\n positionals: readonly string[];\n flags: Readonly<Record<string, string | boolean | undefined>>;\n fetchImpl?: FetchLike;\n}>;\n\nfunction renderPreparedCall(\n io: Io,\n client: SottoClient,\n initiated: PurchaseInitiated,\n listingId: string,\n): void {\n io.stdout(bold(io, \"Prepared paid call (exact, one call):\"));\n io.stdout(` Listing: ${listingId}`);\n io.stdout(` Attempt: ${initiated.attemptId}`);\n io.stdout(` Command ID: ${initiated.commandId}`);\n io.stdout(\n ` Observed price: ${initiated.price.observed.amountAtomic} ` +\n `(atomic) at ${initiated.price.observed.observedAt}`,\n );\n io.stdout(` Recipient: ${initiated.price.observed.recipient}`);\n io.stdout(` Execute before: ${initiated.executeBefore}`);\n io.stdout(` API origin: ${client.origin}`);\n}\n\nasync function renderCommitments(\n io: Io,\n client: SottoClient,\n attemptId: string,\n): Promise<void> {\n const detail = await client.purchases.get(attemptId);\n io.stdout(` Request commitment: ${detail.attempt.requestCommitment}`);\n io.stdout(` Purchase commit.: ${detail.attempt.purchaseCommitment}`);\n io.stdout(\n ` Prepared tx hash: ${detail.attempt.preparedTransactionHash ?? \"not prepared yet — appears at prepared-hash-verified\"}`,\n );\n}\n\n/**\n * `sotto buy <listingId>`: initiates one exact purchase, prints the\n * prepared call and its commitments, then follows the journal SSE as a\n * text rail. Every station line is an already-committed journal row; the\n * CLI never signs, never retries an ambiguous outcome, and exits with a\n * distinct code per terminal fact.\n */\nexport async function buyCommand(input: BuyCommandInput): Promise<ExitCode> {\n const { io, flags } = input;\n const listingId = input.positionals[0];\n if (listingId === undefined) {\n throw new CliUsageError(\n \"Pass the listing ID of the verified resource: sotto buy <listingId>\",\n );\n }\n if (flags.input !== undefined) {\n throw new CliUsageError(\n \"The purchasing API binds no request input yet — only parameterless \" +\n \"resources are purchasable, so --input has nothing to carry. \" +\n \"Drop --input to purchase the exact listed call.\",\n );\n }\n const context = buildClient(\n input.env,\n typeof flags[\"api-origin\"] === \"string\"\n ? { apiOrigin: flags[\"api-origin\"] }\n : {},\n input.fetchImpl,\n );\n requireToken(context.settings);\n const { client } = context;\n const maxPrice = parseMaxPrice(\n typeof flags[\"max-price\"] === \"string\" ? flags[\"max-price\"] : undefined,\n );\n if (maxPrice !== undefined) {\n const resource = await client.catalog.resourceByListing(listingId);\n if (BigInt(resource.amountAtomic) > maxPrice) {\n io.stderr(\n `Local policy stop (not a ledger limit): the indexed price ` +\n `${amountWithAsset(resource.amountAtomic, resource.asset)} exceeds ` +\n `--max-price ${maxPrice}. Nothing was initiated.`,\n );\n return EXIT.usage;\n }\n }\n const initiated = (await client.purchases.initiate(\n listingId,\n )) as PurchaseInitiated;\n renderPreparedCall(io, client, initiated, listingId);\n await renderCommitments(io, client, initiated.attemptId);\n io.stdout(\"\");\n if (flags[\"no-wait\"] === true) {\n if (flags.json === true) printJson(io, initiated);\n io.stdout(`Follow it with: sotto status ${initiated.attemptId} --follow`);\n return EXIT.ok;\n }\n return followToExit(io, client, initiated.attemptId, {\n executeBefore: initiated.executeBefore,\n walletUrl: context.settings.walletUrl,\n json: flags.json === true,\n });\n}\n\nexport async function followToExit(\n io: Io,\n client: SottoClient,\n attemptId: string,\n options: Readonly<{\n executeBefore?: string;\n walletUrl?: string | undefined;\n json?: boolean;\n lastEventId?: number;\n }>,\n): Promise<ExitCode> {\n io.stdout(railLine(\"active\", null, \"Following the purchase journal…\"));\n let lastType: string | undefined;\n const expiresAt =\n options.executeBefore === undefined\n ? undefined\n : Date.parse(options.executeBefore);\n const controller = new AbortController();\n const expiry =\n expiresAt === undefined\n ? undefined\n : setTimeout(\n () => controller.abort(),\n // Small grace after execute-before: a settlement event recorded\n // right at the deadline still arrives before the stream stops.\n Math.max(expiresAt - Date.now() + 5_000, 1_000),\n );\n try {\n for await (const event of client.purchases.follow(attemptId, {\n signal: controller.signal,\n ...(options.lastEventId === undefined\n ? {}\n : { lastEventId: options.lastEventId }),\n })) {\n renderEvent(io, event);\n lastType = event.type;\n if (event.type === \"approval-requested\") {\n renderApprovalBlock(io, options.walletUrl);\n }\n }\n } catch (error) {\n if (!controller.signal.aborted) {\n if (error instanceof SottoApiError) throw error;\n io.stderr(String(error instanceof Error ? error.message : error));\n reconcileGuidance(io, attemptId);\n return EXIT.ambiguous;\n }\n } finally {\n if (expiry !== undefined) clearTimeout(expiry);\n }\n if (controller.signal.aborted && terminalExit(lastType ?? \"\") === undefined) {\n io.stdout(\n \"The execute-before deadline passed without a terminal journal \" +\n \"event. The attempt can no longer settle as prepared.\",\n );\n reconcileGuidance(io, attemptId);\n return EXIT.expired;\n }\n const exit = terminalExit(lastType ?? \"\");\n if (exit === undefined) {\n reconcileGuidance(io, attemptId);\n return EXIT.ambiguous;\n }\n if (exit !== EXIT.ok) {\n if (options.json === true) {\n const detail = await client.purchases.get(attemptId);\n printJson(io, detail);\n }\n return exit;\n }\n const deliveryExit = await settleDeliveryExit(io, client, attemptId);\n if (options.json === true) {\n const detail = await client.purchases.get(attemptId);\n printJson(io, {\n ...detail,\n pairedOutcome: pairedOutcome(\n detail.attempt.state,\n detail.delivery?.claimState ?? null,\n ),\n });\n }\n return deliveryExit;\n}\n","import type { CatalogResource } from \"@sotto/purchase-client\";\nimport type { Env } from \"../config.js\";\nimport {\n buildClient,\n filterResources,\n parseMaxPrice,\n resolveResource,\n CliUsageError,\n} from \"../core.js\";\nimport { EXIT, type ExitCode } from \"../exit-codes.js\";\nimport {\n amountWithAsset,\n printJson,\n resourceUrl,\n table,\n type Io,\n} from \"../output.js\";\nimport type { FetchLike } from \"@sotto/purchase-client\";\n\nexport type CatalogCommandInput = Readonly<{\n io: Io;\n env: Env;\n positionals: readonly string[];\n flags: Readonly<Record<string, string | boolean | undefined>>;\n fetchImpl?: FetchLike;\n}>;\n\nfunction apiOriginFlag(\n flags: CatalogCommandInput[\"flags\"],\n): Readonly<{ apiOrigin?: string }> {\n return typeof flags[\"api-origin\"] === \"string\"\n ? { apiOrigin: flags[\"api-origin\"] }\n : {};\n}\n\nexport async function searchCommand(\n input: CatalogCommandInput,\n): Promise<ExitCode> {\n const { io, flags } = input;\n if (flags.tag !== undefined) {\n throw new CliUsageError(\n \"The verified catalog carries no tags yet, so --tag cannot filter \" +\n \"anything. Filter by --method, --max-price, or free text instead.\",\n );\n }\n const { client } = buildClient(\n input.env,\n apiOriginFlag(flags),\n input.fetchImpl,\n );\n const maxPrice = parseMaxPrice(\n typeof flags[\"max-price\"] === \"string\" ? flags[\"max-price\"] : undefined,\n );\n const resources = filterResources(await client.catalog.listResources(), {\n ...(input.positionals[0] === undefined\n ? {}\n : { query: input.positionals[0] }),\n ...(typeof flags.method === \"string\" ? { method: flags.method } : {}),\n ...(maxPrice === undefined ? {} : { maxPriceAtomic: maxPrice }),\n });\n if (flags.json === true) {\n printJson(io, { resources });\n return EXIT.ok;\n }\n if (resources.length === 0) {\n io.stdout(\"No verified resources match. The catalog answer is honest —\");\n io.stdout(\"nothing is hidden and nothing is sampled.\");\n return EXIT.ok;\n }\n for (const line of table(\n resources.map((resource) => [\n resource.listingId,\n resource.method,\n resourceUrl(resource.normalizedOrigin, resource.routeTemplate),\n amountWithAsset(resource.amountAtomic, resource.asset),\n resource.lastVerifiedAt,\n ]),\n [\"LISTING\", \"METHOD\", \"RESOURCE\", \"PRICE\", \"LAST VERIFIED\"],\n )) {\n io.stdout(line);\n }\n return EXIT.ok;\n}\n\nfunction renderResource(\n io: Io,\n resource: CatalogResource,\n health: unknown,\n): void {\n io.stdout(`${resource.name} — ${resource.providerDisplayName}`);\n io.stdout(resource.description);\n io.stdout(\"\");\n io.stdout(\n `Resource: ${resource.method} ${resourceUrl(resource.normalizedOrigin, resource.routeTemplate)}`,\n );\n io.stdout(`Network: ${resource.network}`);\n io.stdout(\n `Observed price: ${amountWithAsset(resource.amountAtomic, resource.asset)}`,\n );\n io.stdout(`Recipient: ${resource.recipient}`);\n io.stdout(`Last verified: ${resource.lastVerifiedAt} (server-observed)`);\n io.stdout(\n `Health: ${health === null ? \"no observation recorded yet\" : JSON.stringify(health)}`,\n );\n}\n\n/** `inspect` and its `try` alias: fresh observed price plus its timestamp. */\nexport async function inspectCommand(\n input: CatalogCommandInput,\n withPrepareGuidance: boolean,\n): Promise<ExitCode> {\n const reference = input.positionals[0];\n if (reference === undefined) {\n throw new CliUsageError(\n \"Pass a listing ID or the resource's canonical URL: \" +\n \"sotto inspect <resource> | sotto try <resource-url>\",\n );\n }\n const { client } = buildClient(\n input.env,\n apiOriginFlag(input.flags),\n input.fetchImpl,\n );\n const resource = await resolveResource(client, reference);\n const health = await client.catalog.resourceHealth(resource.listingId);\n if (input.flags.json === true) {\n printJson(input.io, { resource, health });\n return EXIT.ok;\n }\n renderResource(input.io, resource, health);\n if (withPrepareGuidance) {\n input.io.stdout(\"\");\n input.io.stdout(\"To prepare this exact paid call for human approval:\");\n input.io.stdout(` sotto buy ${resource.listingId}`);\n input.io.stdout(\n \"Purchase initiation re-observes the live 402; a changed price stops \" +\n \"before anything is journaled.\",\n );\n }\n return EXIT.ok;\n}\n","import {\n deleteConfig,\n isValidToken,\n readConfig,\n writeConfig,\n type Env,\n} from \"../config.js\";\nimport { buildClient, CliUsageError } from \"../core.js\";\nimport { EXIT, type ExitCode } from \"../exit-codes.js\";\nimport { printJson, type Io } from \"../output.js\";\nimport type { FetchLike } from \"@sotto/purchase-client\";\n\nexport type SessionCommandInput = Readonly<{\n io: Io;\n env: Env;\n flags: Readonly<Record<string, string | boolean | undefined>>;\n fetchImpl?: FetchLike;\n}>;\n\n/**\n * `sotto login`. There is no device-authorization grant server-side yet,\n * so the honest flow is copy-token: establish an owner session in the\n * Sotto app (hosted onboarding or party-proof), copy the session token it\n * shows once, and store it here with 0600 permissions. The token is never\n * echoed back.\n */\nexport async function loginCommand(\n input: SessionCommandInput,\n): Promise<ExitCode> {\n const { io, env, flags } = input;\n const token = typeof flags.token === \"string\" ? flags.token : undefined;\n const apiOrigin =\n typeof flags[\"api-origin\"] === \"string\" ? flags[\"api-origin\"] : undefined;\n const walletUrl =\n typeof flags[\"wallet-url\"] === \"string\" ? flags[\"wallet-url\"] : undefined;\n const existing = readConfig(env);\n const origin = apiOrigin ?? env.SOTTO_API_ORIGIN ?? existing.apiOrigin;\n if (token === undefined) {\n io.stdout(\"To connect this CLI to your Sotto owner session:\");\n io.stdout(\"\");\n io.stdout(\n ` 1. Open the Sotto app${origin === undefined ? \"\" : ` for ${origin}`} ` +\n \"and establish an owner session (hosted onboarding or party proof).\",\n );\n io.stdout(\n \" 2. Copy the one-time session token from the session response \" +\n \"(the app shows it once; it is the same opaque token the browser \" +\n \"cookie carries).\",\n );\n io.stdout(\" 3. Run: sotto login --api-origin <api-url> --token <token>\");\n io.stdout(\"\");\n io.stdout(\n \"The token is stored 0600 in ~/.config/sotto/config.json and sent \" +\n \"only as an Authorization: Bearer header to that API origin.\",\n );\n return EXIT.ok;\n }\n if (!isValidToken(token)) {\n throw new CliUsageError(\n \"The session token must be the 64-hex value from the session \" +\n \"response. Do not paste a cookie header or a signing key.\",\n );\n }\n if (origin === undefined) {\n throw new CliUsageError(\n \"Pass --api-origin <url> (or set SOTTO_API_ORIGIN) so the token is \" +\n \"bound to one API origin.\",\n );\n }\n const { client } = buildClient(env, { apiOrigin: origin }, input.fetchImpl);\n void client; // origin validated by construction\n const path = writeConfig(env, {\n apiOrigin: origin,\n token,\n ...(walletUrl === undefined\n ? existing.walletUrl === undefined\n ? {}\n : { walletUrl: existing.walletUrl }\n : { walletUrl }),\n });\n io.stdout(`Owner session token stored (0600) at ${path}.`);\n io.stdout(`API origin: ${origin}`);\n io.stdout(\"Verify it with: sotto whoami\");\n return EXIT.ok;\n}\n\nexport async function whoamiCommand(\n input: SessionCommandInput,\n): Promise<ExitCode> {\n const { io, env, flags } = input;\n const context = buildClient(\n env,\n typeof flags[\"api-origin\"] === \"string\"\n ? { apiOrigin: flags[\"api-origin\"] }\n : {},\n input.fetchImpl,\n );\n const hasToken = context.settings.token !== undefined;\n const sessionValid = hasToken ? await context.client.session.verify() : false;\n const report = {\n apiOrigin: context.client.origin,\n tokenConfigured: hasToken,\n tokenSource: context.settings.tokenSource,\n sessionValid,\n };\n if (flags.json === true) {\n printJson(io, report);\n } else {\n io.stdout(`API origin: ${report.apiOrigin}`);\n io.stdout(\n `Token: ${hasToken ? `configured (${report.tokenSource})` : \"absent\"}`,\n );\n io.stdout(\n `Session: ${\n sessionValid\n ? \"valid owner session\"\n : hasToken\n ? \"rejected — expired or revoked; run `sotto login` again\"\n : \"absent — run `sotto login`\"\n }`,\n );\n }\n return sessionValid ? EXIT.ok : EXIT.auth;\n}\n\nexport async function logoutCommand(\n input: SessionCommandInput,\n): Promise<ExitCode> {\n const { io, env } = input;\n const config = readConfig(env);\n if (config.token !== undefined && config.apiOrigin !== undefined) {\n try {\n const { client } = buildClient(env, {}, input.fetchImpl);\n await client.session.logout();\n io.stdout(\"Server session revoked.\");\n } catch {\n io.stderr(\n \"The API did not confirm revocation; the local token is removed \" +\n \"anyway. The session still expires server-side on its own TTL.\",\n );\n }\n }\n if (config.apiOrigin === undefined && config.walletUrl === undefined) {\n deleteConfig(env);\n } else {\n writeConfig(env, {\n ...(config.apiOrigin === undefined\n ? {}\n : { apiOrigin: config.apiOrigin }),\n ...(config.walletUrl === undefined\n ? {}\n : { walletUrl: config.walletUrl }),\n });\n }\n io.stdout(\"Local session token removed.\");\n return EXIT.ok;\n}\n","import { pairedOutcome } from \"@sotto/purchase-client\";\nimport type { Env } from \"../config.js\";\nimport { buildClient, requireToken, CliUsageError } from \"../core.js\";\nimport { EXIT, type ExitCode } from \"../exit-codes.js\";\nimport { printJson, railLine, truncateUpdateId, type Io } from \"../output.js\";\nimport { STATION_LABELS, reconcileGuidance } from \"./rail.js\";\nimport { followToExit } from \"./buy.js\";\nimport type { FetchLike } from \"@sotto/purchase-client\";\n\nexport type StatusCommandInput = Readonly<{\n io: Io;\n env: Env;\n positionals: readonly string[];\n flags: Readonly<Record<string, string | boolean | undefined>>;\n fetchImpl?: FetchLike;\n}>;\n\nfunction originFlag(\n flags: StatusCommandInput[\"flags\"],\n): Readonly<{ apiOrigin?: string }> {\n return typeof flags[\"api-origin\"] === \"string\"\n ? { apiOrigin: flags[\"api-origin\"] }\n : {};\n}\n\nexport async function statusCommand(\n input: StatusCommandInput,\n): Promise<ExitCode> {\n const attemptId = input.positionals[0];\n if (attemptId === undefined) {\n throw new CliUsageError(\"Pass the attempt ID: sotto status <attemptId>\");\n }\n const context = buildClient(\n input.env,\n originFlag(input.flags),\n input.fetchImpl,\n );\n requireToken(context.settings);\n const detail = await context.client.purchases.get(attemptId);\n const outcome = pairedOutcome(\n detail.attempt.state,\n detail.delivery?.claimState ?? null,\n );\n if (input.flags.json === true) {\n printJson(input.io, { ...detail, pairedOutcome: outcome });\n return EXIT.ok;\n }\n const { io } = input;\n io.stdout(`Attempt ${detail.attempt.attemptId}`);\n io.stdout(`State: ${detail.attempt.state}`);\n io.stdout(`Created: ${detail.attempt.createdAt}`);\n io.stdout(`Execute before: ${detail.attempt.executeBefore}`);\n for (const event of detail.events) {\n io.stdout(\n railLine(\n \"done\",\n event.recordedAt,\n STATION_LABELS[event.type] ?? event.type,\n ),\n );\n }\n io.stdout(\n `Settlement: ${detail.settlement?.state ?? \"not submitted\"}` +\n (detail.settlement?.updateId == null\n ? \"\"\n : ` — update ${truncateUpdateId(detail.settlement.updateId)}`),\n );\n io.stdout(\n `Delivery: ${detail.delivery?.claimState ?? \"not started\"}` +\n (detail.delivery?.failureCode == null\n ? \"\"\n : ` (${detail.delivery.failureCode})`),\n );\n if (outcome.deliveryPending || outcome.deliveryFailed) {\n reconcileGuidance(io, detail.attempt.attemptId);\n }\n if (input.flags.follow === true && detail.events.length > 0) {\n const lastSequence = detail.events[detail.events.length - 1]?.sequence ?? 0;\n return followToExit(io, context.client, attemptId, {\n executeBefore: detail.attempt.executeBefore,\n walletUrl: context.settings.walletUrl,\n lastEventId: lastSequence,\n });\n }\n return EXIT.ok;\n}\n\nexport async function evidenceCommand(\n input: StatusCommandInput,\n): Promise<ExitCode> {\n const attemptId = input.positionals[0];\n if (attemptId === undefined) {\n throw new CliUsageError(\"Pass the attempt ID: sotto evidence <attemptId>\");\n }\n const context = buildClient(\n input.env,\n originFlag(input.flags),\n input.fetchImpl,\n );\n const evidence = await context.client.attempts.evidence(attemptId);\n if (input.flags.json === true) {\n printJson(input.io, { attempt: evidence });\n return EXIT.ok;\n }\n const { io } = input;\n io.stdout(`Attempt ${evidence.attemptId}`);\n if (evidence.resource !== null) {\n io.stdout(\n `Resource: ${evidence.resource.method} ${evidence.resource.origin}${evidence.resource.route}`,\n );\n }\n if (evidence.amount !== null) {\n io.stdout(\n `Amount: ${evidence.amount.atomic} ${evidence.amount.asset} (atomic units)`,\n );\n }\n io.stdout(\n `Settlement: ${evidence.settlement.status}` +\n (evidence.settlement.updateId === null\n ? \"\"\n : ` — update ${evidence.settlement.updateId}`),\n );\n if (evidence.settlement.explorerUrl !== null) {\n io.stdout(`Explorer: ${evidence.settlement.explorerUrl}`);\n }\n io.stdout(\n `Delivery: ${evidence.delivery.status}` +\n (evidence.delivery.failureCode === null\n ? \"\"\n : ` (${evidence.delivery.failureCode})`),\n );\n for (const entry of evidence.timeline) {\n io.stdout(\n railLine(\"done\", entry.recordedAt, `${entry.type} [${entry.source}]`),\n );\n }\n for (const redaction of evidence.redactions) {\n io.stdout(`Withheld: ${redaction.field} — ${redaction.reason}`);\n }\n return EXIT.ok;\n}\n\nexport async function statsCommand(\n input: StatusCommandInput,\n): Promise<ExitCode> {\n const context = buildClient(\n input.env,\n originFlag(input.flags),\n input.fetchImpl,\n );\n const window =\n typeof input.flags.window === \"string\" ? input.flags.window : \"7d\";\n const stats = await context.client.stats.read(window);\n if (input.flags.json === true) {\n printJson(input.io, stats);\n return EXIT.ok;\n }\n const { io } = input;\n const rate = (value: number | null) =>\n value === null\n ? \"unavailable (no denominator)\"\n : `${(value * 100).toFixed(1)}%`;\n io.stdout(`Window: ${stats.window}`);\n io.stdout(\n `Attempts: ${stats.attempts.total} total, ${stats.attempts.executed} executed`,\n );\n io.stdout(`Settlement rate: ${rate(stats.attempts.settlementRate)}`);\n io.stdout(`Delivery rate: ${rate(stats.attempts.deliveryRate)}`);\n io.stdout(\n `Probes: ${stats.probes.observations} observations, healthy rate ${rate(stats.probes.healthyRate)}`,\n );\n io.stdout(`Source commit: ${stats.sourceCommit}`);\n return EXIT.ok;\n}\n","/** Kept in lockstep with package.json; scripts/verify-package.mjs asserts it. */\nexport const CLI_VERSION = \"0.1.0\";\n","/**\n * Minimal MCP stdio server: newline-delimited JSON-RPC 2.0. Implemented by\n * hand so the published CLI carries zero runtime dependencies; stdout\n * carries JSON-RPC frames only, and every log goes to stderr.\n */\nexport const MCP_PROTOCOL_VERSION = \"2025-06-18\";\n\nexport type JsonRpcId = string | number | null;\n\nexport type JsonRpcMessage = Readonly<{\n jsonrpc: \"2.0\";\n id?: JsonRpcId;\n method?: string;\n params?: Readonly<Record<string, unknown>>;\n result?: unknown;\n error?: unknown;\n}>;\n\nexport type MethodHandler = (\n params: Readonly<Record<string, unknown>>,\n) => Promise<unknown> | unknown;\n\nexport type McpServerDefinition = Readonly<{\n serverInfo: Readonly<{ name: string; version: string }>;\n methods: Readonly<Record<string, MethodHandler>>;\n}>;\n\nexport class JsonRpcError extends Error {\n readonly code: number;\n constructor(code: number, message: string) {\n super(message);\n this.code = code;\n this.name = \"JsonRpcError\";\n }\n}\n\nexport function parseMessage(line: string): JsonRpcMessage | undefined {\n const trimmed = line.trim();\n if (trimmed === \"\") return undefined;\n let parsed: unknown;\n try {\n parsed = JSON.parse(trimmed);\n } catch {\n throw new JsonRpcError(-32700, \"parse error: the line was not JSON\");\n }\n if (\n typeof parsed !== \"object\" ||\n parsed === null ||\n (parsed as { jsonrpc?: unknown }).jsonrpc !== \"2.0\"\n ) {\n throw new JsonRpcError(-32600, \"invalid request: jsonrpc 2.0 required\");\n }\n return parsed as JsonRpcMessage;\n}\n\n/**\n * Handles one incoming message. Returns the serialized response frame, or\n * undefined for notifications (which never get a response).\n */\nexport async function handleMessage(\n definition: McpServerDefinition,\n message: JsonRpcMessage,\n): Promise<string | undefined> {\n const id = message.id;\n const isRequest = id !== undefined;\n if (typeof message.method !== \"string\") {\n return isRequest\n ? respondError(id, -32600, \"invalid request: method missing\")\n : undefined;\n }\n if (message.method.startsWith(\"notifications/\")) return undefined;\n const handler =\n message.method === \"initialize\"\n ? initializeHandler(definition)\n : message.method === \"ping\"\n ? () => ({})\n : definition.methods[message.method];\n if (handler === undefined) {\n return isRequest\n ? respondError(id, -32601, `method not found: ${message.method}`)\n : undefined;\n }\n try {\n const result = await handler(message.params ?? {});\n return isRequest\n ? JSON.stringify({ jsonrpc: \"2.0\", id, result })\n : undefined;\n } catch (error) {\n if (!isRequest) return undefined;\n if (error instanceof JsonRpcError) {\n return respondError(id, error.code, error.message);\n }\n return respondError(\n id,\n -32603,\n error instanceof Error ? error.message : \"internal error\",\n );\n }\n}\n\nfunction initializeHandler(definition: McpServerDefinition): MethodHandler {\n return (params) => {\n const requested = params.protocolVersion;\n return {\n protocolVersion:\n typeof requested === \"string\" && requested !== \"\"\n ? requested\n : MCP_PROTOCOL_VERSION,\n capabilities: { tools: { listChanged: false } },\n serverInfo: definition.serverInfo,\n };\n };\n}\n\nfunction respondError(id: JsonRpcId, code: number, message: string): string {\n return JSON.stringify({ jsonrpc: \"2.0\", id, error: { code, message } });\n}\n\nexport type StreamLike = Readonly<{\n input: AsyncIterable<string | Uint8Array>;\n write: (frame: string) => void;\n logError: (line: string) => void;\n}>;\n\n/** Reads newline-delimited frames until the input ends. */\nexport async function serveJsonRpc(\n definition: McpServerDefinition,\n streams: StreamLike,\n): Promise<void> {\n let buffer = \"\";\n const decoder = new TextDecoder();\n for await (const chunk of streams.input) {\n buffer +=\n typeof chunk === \"string\"\n ? chunk\n : decoder.decode(chunk, { stream: true });\n for (;;) {\n const newline = buffer.indexOf(\"\\n\");\n if (newline === -1) break;\n const line = buffer.slice(0, newline);\n buffer = buffer.slice(newline + 1);\n let message: JsonRpcMessage | undefined;\n try {\n message = parseMessage(line);\n } catch (error) {\n if (error instanceof JsonRpcError) {\n streams.write(\n `${JSON.stringify({ jsonrpc: \"2.0\", id: null, error: { code: error.code, message: error.message } })}\\n`,\n );\n }\n continue;\n }\n if (message === undefined) continue;\n const response = await handleMessage(definition, message);\n if (response !== undefined) streams.write(`${response}\\n`);\n }\n }\n}\n","import {\n SottoApiError,\n pairedOutcome,\n type SottoClient,\n} from \"@sotto/purchase-client\";\nimport { filterResources, parseMaxPrice, resolveResource } from \"../core.js\";\n\nexport type ToolDefinition = Readonly<{\n name: string;\n title: string;\n description: string;\n inputSchema: Readonly<Record<string, unknown>>;\n annotations: Readonly<Record<string, unknown>>;\n}>;\n\nexport type ToolResult = Readonly<{\n content: readonly Readonly<{ type: \"text\"; text: string }>[];\n isError?: boolean;\n}>;\n\nconst text = (value: unknown): ToolResult => ({\n content: [{ type: \"text\", text: JSON.stringify(value, null, 2) }],\n});\n\nconst failure = (message: string): ToolResult => ({\n content: [{ type: \"text\", text: message }],\n isError: true,\n});\n\nconst str = (value: unknown): string | undefined =>\n typeof value === \"string\" && value !== \"\" ? value : undefined;\n\nexport const TOOL_DEFINITIONS: readonly ToolDefinition[] = Object.freeze([\n {\n name: \"search_resources\",\n title: \"Search verified Canton x402 resources\",\n description:\n \"Search Sotto's verified catalog. Read-only; an empty catalog answers \" +\n \"an honest empty list, never samples.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\", description: \"Free-text filter\" },\n method: { type: \"string\", description: \"HTTP method filter\" },\n maxPriceAtomic: {\n type: \"string\",\n description: \"Upper price bound in atomic units\",\n },\n },\n additionalProperties: false,\n },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n {\n name: \"inspect_resource\",\n title: \"Inspect one verified resource\",\n description:\n \"Fetch one resource by listing ID or canonical URL: method, route, \" +\n \"fresh server-observed price with its timestamp, recipient, and the \" +\n \"latest health observation. Read-only.\",\n inputSchema: {\n type: \"object\",\n properties: {\n resource: {\n type: \"string\",\n description: \"Listing ID or canonical resource URL\",\n },\n },\n required: [\"resource\"],\n additionalProperties: false,\n },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n {\n name: \"purchase\",\n title: \"Purchase (moves real money after human wallet approval)\",\n description:\n \"Initiate ONE exact purchase of a verified resource. This journals a \" +\n \"real payment intent; a HUMAN must approve the prepared call at the \" +\n \"Sotto wallet before any value moves. This tool cannot sign, has no \" +\n \"key, and never retries. Ask the human before calling it.\",\n inputSchema: {\n type: \"object\",\n properties: {\n listingId: { type: \"string\", description: \"Verified listing ID\" },\n maxPriceAtomic: {\n type: \"string\",\n description:\n \"Local policy bound (atomic units) — refused client-side, not a \" +\n \"ledger-enforced limit\",\n },\n },\n required: [\"listingId\"],\n additionalProperties: false,\n },\n annotations: {\n readOnlyHint: false,\n destructiveHint: false,\n idempotentHint: false,\n openWorldHint: true,\n },\n },\n {\n name: \"purchase_status\",\n title: \"Read a purchase's full journal state\",\n description:\n \"Full lifecycle for one attempt: journal events, settlement and \" +\n \"delivery as separate facts, including the honest settled-undelivered \" +\n \"case with reconcile guidance. Read-only.\",\n inputSchema: {\n type: \"object\",\n properties: { attemptId: { type: \"string\" } },\n required: [\"attemptId\"],\n additionalProperties: false,\n },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n {\n name: \"get_evidence\",\n title: \"Read attempt evidence\",\n description:\n \"Paired settlement/delivery outcome, source-labeled timeline, update \" +\n \"ID, and public explorer URL when indexed. Read-only.\",\n inputSchema: {\n type: \"object\",\n properties: { attemptId: { type: \"string\" } },\n required: [\"attemptId\"],\n additionalProperties: false,\n },\n annotations: { readOnlyHint: true, openWorldHint: true },\n },\n] as const);\n\n/** Executes one tool call against the shared purchasing core. */\nexport async function callTool(\n client: SottoClient,\n name: string,\n args: Readonly<Record<string, unknown>>,\n): Promise<ToolResult> {\n try {\n switch (name) {\n case \"search_resources\": {\n const maxPrice = parseMaxPrice(str(args.maxPriceAtomic));\n const query = str(args.query);\n const method = str(args.method);\n const resources = filterResources(\n await client.catalog.listResources(),\n {\n ...(query === undefined ? {} : { query }),\n ...(method === undefined ? {} : { method }),\n ...(maxPrice === undefined ? {} : { maxPriceAtomic: maxPrice }),\n },\n );\n return text({ resources });\n }\n case \"inspect_resource\": {\n const reference = str(args.resource);\n if (reference === undefined) return failure(\"resource is required\");\n const resource = await resolveResource(client, reference);\n const health = await client.catalog.resourceHealth(resource.listingId);\n return text({ resource, health });\n }\n case \"purchase\": {\n const listingId = str(args.listingId);\n if (listingId === undefined) return failure(\"listingId is required\");\n const maxPrice = parseMaxPrice(str(args.maxPriceAtomic));\n if (maxPrice !== undefined) {\n const resource = await client.catalog.resourceByListing(listingId);\n if (BigInt(resource.amountAtomic) > maxPrice) {\n return failure(\n `local-policy-stop: the indexed price ${resource.amountAtomic} ` +\n `${resource.asset} (atomic) exceeds maxPriceAtomic ` +\n `${maxPrice}. Nothing was initiated. This is local policy, ` +\n \"not a ledger-enforced limit. Report the block to the human \" +\n \"instead of seeking another transfer path.\",\n );\n }\n }\n const initiated = await client.purchases.initiate(listingId);\n return text({\n ...initiated,\n humanApproval:\n \"A HUMAN must approve this exact prepared call at the Sotto \" +\n \"wallet before any value moves. This tool cannot sign and will \" +\n \"not retry. Follow progress with purchase_status.\",\n });\n }\n case \"purchase_status\": {\n const attemptId = str(args.attemptId);\n if (attemptId === undefined) return failure(\"attemptId is required\");\n const detail = await client.purchases.get(attemptId);\n const outcome = pairedOutcome(\n detail.attempt.state,\n detail.delivery?.claimState ?? null,\n );\n return text({\n ...detail,\n pairedOutcome: outcome,\n ...(outcome.deliveryPending || outcome.deliveryFailed\n ? {\n reconcileGuidance:\n \"Settled but not delivered. Do NOT purchase again — a \" +\n \"second attempt can pay twice. Reconcile with get_evidence \" +\n \"and report the state to the human.\",\n }\n : {}),\n });\n }\n case \"get_evidence\": {\n const attemptId = str(args.attemptId);\n if (attemptId === undefined) return failure(\"attemptId is required\");\n return text({ attempt: await client.attempts.evidence(attemptId) });\n }\n default:\n return failure(`unknown tool: ${name}`);\n }\n } catch (error) {\n if (error instanceof SottoApiError) {\n return failure(`${error.code}: ${error.detail ?? \"no detail\"}`);\n }\n return failure(error instanceof Error ? error.message : String(error));\n }\n}\n","import type { Env } from \"../config.js\";\nimport { buildClient, requireToken } from \"../core.js\";\nimport { CLI_VERSION } from \"../version.js\";\nimport {\n serveJsonRpc,\n type McpServerDefinition,\n type StreamLike,\n} from \"./protocol.js\";\nimport { TOOL_DEFINITIONS, callTool } from \"./tools.js\";\nimport type { FetchLike } from \"@sotto/purchase-client\";\n\n/**\n * `sotto mcp serve` — the buyer MCP server over stdio. Auth is the same\n * stored session token (or SOTTO_SESSION_TOKEN) the CLI uses; there is no\n * key material anywhere in this process and no generic signing tool in\n * the tool list. Stdout stays pure JSON-RPC; diagnostics go to stderr.\n */\nexport function buildMcpDefinition(\n env: Env,\n fetchImpl?: FetchLike,\n): McpServerDefinition {\n const context = buildClient(env, {}, fetchImpl);\n requireToken(context.settings);\n return Object.freeze({\n serverInfo: Object.freeze({ name: \"sotto\", version: CLI_VERSION }),\n methods: Object.freeze({\n \"tools/list\": () => ({\n tools: TOOL_DEFINITIONS.map((tool) => ({\n name: tool.name,\n title: tool.title,\n description: tool.description,\n inputSchema: tool.inputSchema,\n annotations: tool.annotations,\n })),\n }),\n \"tools/call\": async (params: Readonly<Record<string, unknown>>) => {\n const name = typeof params.name === \"string\" ? params.name : \"\";\n const args =\n typeof params.arguments === \"object\" && params.arguments !== null\n ? (params.arguments as Readonly<Record<string, unknown>>)\n : {};\n return callTool(context.client, name, args);\n },\n }),\n });\n}\n\nexport async function serveMcp(env: Env, streams: StreamLike): Promise<void> {\n const definition = buildMcpDefinition(env);\n streams.logError(\n `sotto mcp serve: stdio JSON-RPC against ${env.SOTTO_API_ORIGIN ?? \"configured origin\"} — logs on stderr only`,\n );\n await serveJsonRpc(definition, streams);\n}\n","import { parseArgs } from \"node:util\";\nimport {\n SottoApiError,\n SottoTransportError,\n type FetchLike,\n} from \"@sotto/purchase-client\";\nimport type { Env } from \"./config.js\";\nimport { CliAuthError, CliUsageError } from \"./core.js\";\nimport { EXIT, type ExitCode } from \"./exit-codes.js\";\nimport { HELP_TEXT } from \"./help.js\";\nimport type { Io } from \"./output.js\";\nimport { buyCommand } from \"./commands/buy.js\";\nimport { inspectCommand, searchCommand } from \"./commands/catalog.js\";\nimport {\n loginCommand,\n logoutCommand,\n whoamiCommand,\n} from \"./commands/session.js\";\nimport {\n evidenceCommand,\n statsCommand,\n statusCommand,\n} from \"./commands/status.js\";\nimport { serveMcp } from \"./mcp/serve.js\";\nimport type { StreamLike } from \"./mcp/protocol.js\";\nimport { CLI_VERSION } from \"./version.js\";\n\nexport type RunOptions = Readonly<{\n io: Io;\n env: Env;\n fetchImpl?: FetchLike;\n mcpStreams?: StreamLike;\n}>;\n\nconst FLAG_OPTIONS = {\n \"api-origin\": { type: \"string\" },\n \"max-price\": { type: \"string\" },\n \"no-wait\": { type: \"boolean\" },\n \"wallet-url\": { type: \"string\" },\n follow: { type: \"boolean\" },\n help: { type: \"boolean\" },\n input: { type: \"string\" },\n json: { type: \"boolean\" },\n method: { type: \"string\" },\n tag: { type: \"string\" },\n token: { type: \"string\" },\n version: { type: \"boolean\" },\n window: { type: \"string\" },\n} as const;\n\nfunction mapError(io: Io, error: unknown): ExitCode {\n if (error instanceof CliUsageError) {\n io.stderr(error.message);\n return EXIT.usage;\n }\n if (error instanceof CliAuthError) {\n io.stderr(error.message);\n return EXIT.auth;\n }\n if (error instanceof SottoApiError) {\n if (error.code === \"session-required\") {\n io.stderr(\n \"The owner session is absent, expired, or revoked. Run \" +\n \"`sotto login` with a fresh token from the Sotto app.\",\n );\n return EXIT.auth;\n }\n io.stderr(`${error.code}: ${error.detail ?? `HTTP ${error.status}`}`);\n return EXIT.failure;\n }\n if (error instanceof SottoTransportError) {\n io.stderr(error.message);\n return EXIT.failure;\n }\n io.stderr(error instanceof Error ? error.message : String(error));\n return EXIT.failure;\n}\n\n/** Parses argv, dispatches one command, and maps every error to an exit code. */\nexport async function run(\n argv: readonly string[],\n options: RunOptions,\n): Promise<ExitCode> {\n const { io, env } = options;\n let parsed: ReturnType<\n typeof parseArgs<{ options: typeof FLAG_OPTIONS; allowPositionals: true }>\n >;\n try {\n parsed = parseArgs({\n args: [...argv],\n options: FLAG_OPTIONS,\n allowPositionals: true,\n strict: true,\n });\n } catch (error) {\n io.stderr(error instanceof Error ? error.message : String(error));\n io.stderr(\"Run `sotto --help` for usage.\");\n return EXIT.usage;\n }\n const flags = parsed.values as Readonly<\n Record<string, string | boolean | undefined>\n >;\n const [command, ...positionals] = parsed.positionals;\n if (flags.version === true) {\n io.stdout(CLI_VERSION);\n return EXIT.ok;\n }\n if (command === undefined || flags.help === true) {\n io.stdout(HELP_TEXT);\n return command === undefined && flags.help !== true ? EXIT.usage : EXIT.ok;\n }\n const input = {\n io,\n env,\n positionals,\n flags,\n ...(options.fetchImpl === undefined\n ? {}\n : { fetchImpl: options.fetchImpl }),\n };\n try {\n switch (command) {\n case \"login\":\n return await loginCommand(input);\n case \"whoami\":\n return await whoamiCommand(input);\n case \"logout\":\n return await logoutCommand(input);\n case \"search\":\n return await searchCommand(input);\n case \"inspect\":\n return await inspectCommand(input, false);\n case \"try\":\n return await inspectCommand(input, true);\n case \"buy\":\n return await buyCommand(input);\n case \"status\":\n return await statusCommand(input);\n case \"evidence\":\n return await evidenceCommand(input);\n case \"stats\":\n return await statsCommand(input);\n case \"mcp\": {\n if (positionals[0] !== \"serve\") {\n io.stderr(\"Usage: sotto mcp serve\");\n return EXIT.usage;\n }\n if (options.mcpStreams === undefined) {\n io.stderr(\"MCP stdio streams are unavailable in this environment.\");\n return EXIT.failure;\n }\n await serveMcp(env, options.mcpStreams);\n return EXIT.ok;\n }\n default:\n io.stderr(`Unknown command: ${command}. Run \\`sotto --help\\`.`);\n return EXIT.usage;\n }\n } catch (error) {\n return mapError(io, error);\n }\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@usesotto/cli",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"private": false,
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "Apache-2.0",
|
|
7
|
+
"description": "Sotto CLI and buyer MCP server for Canton x402 APIs — search, inspect, purchase with human wallet approval, and audit evidence. Never holds a key.",
|
|
8
|
+
"bin": {
|
|
9
|
+
"sotto": "dist/bin.js"
|
|
10
|
+
},
|
|
11
|
+
"main": "./dist/index.cjs",
|
|
12
|
+
"module": "./dist/index.js",
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"import": "./dist/index.js",
|
|
18
|
+
"require": "./dist/index.cjs"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist"
|
|
23
|
+
],
|
|
24
|
+
"publishConfig": {
|
|
25
|
+
"access": "public"
|
|
26
|
+
},
|
|
27
|
+
"repository": {
|
|
28
|
+
"type": "git",
|
|
29
|
+
"url": "git+https://github.com/Blockchain-Oracle/sotto.git",
|
|
30
|
+
"directory": "packages/cli"
|
|
31
|
+
},
|
|
32
|
+
"homepage": "https://usesotto.xyz",
|
|
33
|
+
"keywords": [
|
|
34
|
+
"canton",
|
|
35
|
+
"x402",
|
|
36
|
+
"mcp",
|
|
37
|
+
"payments",
|
|
38
|
+
"cli"
|
|
39
|
+
],
|
|
40
|
+
"scripts": {
|
|
41
|
+
"build": "tsup && node ../../scripts/verify-package.mjs"
|
|
42
|
+
},
|
|
43
|
+
"devDependencies": {
|
|
44
|
+
"@sotto/purchase-client": "workspace:*",
|
|
45
|
+
"tsup": "catalog:"
|
|
46
|
+
}
|
|
47
|
+
}
|