@tabai/sdk 0.2.3 → 0.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -7
- package/dist/_shared/abi.d.ts.map +1 -1
- package/dist/_shared/abi.js +6 -3
- package/dist/_shared/abi.js.map +1 -1
- package/dist/_shared/chains.d.ts +4 -6
- package/dist/_shared/chains.d.ts.map +1 -1
- package/dist/_shared/chains.js +1 -2
- package/dist/_shared/chains.js.map +1 -1
- package/dist/_shared/keccak256.d.ts +6 -6
- package/dist/_shared/keccak256.js +6 -6
- package/dist/_shared/keccak256.js.map +1 -1
- package/dist/_shared/result.d.ts +5 -6
- package/dist/_shared/result.d.ts.map +1 -1
- package/dist/_shared/result.js +5 -6
- package/dist/_shared/result.js.map +1 -1
- package/dist/cli/client-config.d.ts +4 -5
- package/dist/cli/client-config.d.ts.map +1 -1
- package/dist/cli/client-config.js +4 -5
- package/dist/cli/client-config.js.map +1 -1
- package/dist/cli/connect.d.ts +1 -3
- package/dist/cli/connect.d.ts.map +1 -1
- package/dist/cli/connect.js +1 -3
- package/dist/cli/connect.js.map +1 -1
- package/dist/cli/doctor.d.ts +1 -3
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +1 -3
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.js +1 -1
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/main.d.ts +1 -3
- package/dist/cli/main.d.ts.map +1 -1
- package/dist/cli/main.js +2 -4
- package/dist/cli/main.js.map +1 -1
- package/dist/errors.d.ts +2 -4
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +2 -4
- package/dist/errors.js.map +1 -1
- package/dist/http/client-402.d.ts +11 -13
- package/dist/http/client-402.d.ts.map +1 -1
- package/dist/http/client-402.js +12 -14
- package/dist/http/client-402.js.map +1 -1
- package/dist/http/headers.d.ts +9 -11
- package/dist/http/headers.d.ts.map +1 -1
- package/dist/http/headers.js +9 -11
- package/dist/http/headers.js.map +1 -1
- package/dist/http/index.d.ts +0 -2
- package/dist/http/index.d.ts.map +1 -1
- package/dist/http/index.js +0 -2
- package/dist/http/index.js.map +1 -1
- package/dist/http/metering-claim.d.ts +0 -2
- package/dist/http/metering-claim.d.ts.map +1 -1
- package/dist/http/metering-claim.js +0 -2
- package/dist/http/metering-claim.js.map +1 -1
- package/dist/index.d.ts +15 -12
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +15 -12
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts +1 -4
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +1 -4
- package/dist/logger.js.map +1 -1
- package/dist/mcp/index.d.ts +1 -1
- package/dist/mcp/index.js +1 -1
- package/dist/mcp/index.js.map +1 -1
- package/dist/mcp/json-schema.d.ts +1 -3
- package/dist/mcp/json-schema.d.ts.map +1 -1
- package/dist/mcp/json-schema.js +1 -3
- package/dist/mcp/json-schema.js.map +1 -1
- package/dist/mcp/json.d.ts +0 -2
- package/dist/mcp/json.d.ts.map +1 -1
- package/dist/mcp/json.js +0 -2
- package/dist/mcp/json.js.map +1 -1
- package/dist/mcp/registry-client.d.ts +0 -2
- package/dist/mcp/registry-client.d.ts.map +1 -1
- package/dist/mcp/registry-client.js +3 -4
- package/dist/mcp/registry-client.js.map +1 -1
- package/dist/mcp/schemas.d.ts +10 -8
- package/dist/mcp/schemas.d.ts.map +1 -1
- package/dist/mcp/schemas.js +5 -7
- package/dist/mcp/schemas.js.map +1 -1
- package/dist/mcp/server.d.ts +0 -2
- package/dist/mcp/server.d.ts.map +1 -1
- package/dist/mcp/server.js +4 -7
- package/dist/mcp/server.js.map +1 -1
- package/dist/mcp/settings.d.ts +0 -2
- package/dist/mcp/settings.d.ts.map +1 -1
- package/dist/mcp/settings.js +0 -2
- package/dist/mcp/settings.js.map +1 -1
- package/dist/mcp/toolset.d.ts +2 -5
- package/dist/mcp/toolset.d.ts.map +1 -1
- package/dist/mcp/toolset.js +3 -6
- package/dist/mcp/toolset.js.map +1 -1
- package/dist/payments/config.d.ts +6 -8
- package/dist/payments/config.d.ts.map +1 -1
- package/dist/payments/config.js +5 -7
- package/dist/payments/config.js.map +1 -1
- package/dist/payments/index.d.ts +0 -2
- package/dist/payments/index.d.ts.map +1 -1
- package/dist/payments/index.js +0 -2
- package/dist/payments/index.js.map +1 -1
- package/dist/payments/registry.d.ts +11 -12
- package/dist/payments/registry.d.ts.map +1 -1
- package/dist/payments/registry.js +11 -12
- package/dist/payments/registry.js.map +1 -1
- package/dist/payments/strategy.d.ts +9 -5
- package/dist/payments/strategy.d.ts.map +1 -1
- package/dist/payments/strategy.js +9 -5
- package/dist/payments/strategy.js.map +1 -1
- package/dist/proxy/hooks.d.ts +3 -5
- package/dist/proxy/hooks.d.ts.map +1 -1
- package/dist/proxy/hooks.js +2 -4
- package/dist/proxy/hooks.js.map +1 -1
- package/dist/proxy/index.d.ts +2 -2
- package/dist/proxy/index.js +2 -2
- package/dist/proxy/index.js.map +1 -1
- package/dist/proxy/proxy.d.ts +3 -5
- package/dist/proxy/proxy.d.ts.map +1 -1
- package/dist/proxy/proxy.js +2 -4
- package/dist/proxy/proxy.js.map +1 -1
- package/dist/server/adapters/express.d.ts +0 -2
- package/dist/server/adapters/express.d.ts.map +1 -1
- package/dist/server/adapters/express.js +0 -2
- package/dist/server/adapters/express.js.map +1 -1
- package/dist/server/adapters/hono.d.ts +0 -2
- package/dist/server/adapters/hono.d.ts.map +1 -1
- package/dist/server/adapters/hono.js +0 -2
- package/dist/server/adapters/hono.js.map +1 -1
- package/dist/server/adapters/next.d.ts +0 -2
- package/dist/server/adapters/next.d.ts.map +1 -1
- package/dist/server/adapters/next.js +0 -2
- package/dist/server/adapters/next.js.map +1 -1
- package/dist/server/index.d.ts +5 -5
- package/dist/server/index.js +5 -5
- package/dist/server/index.js.map +1 -1
- package/dist/server/metering.d.ts +9 -11
- package/dist/server/metering.d.ts.map +1 -1
- package/dist/server/metering.js +6 -8
- package/dist/server/metering.js.map +1 -1
- package/dist/server/post-paid.d.ts +8 -10
- package/dist/server/post-paid.d.ts.map +1 -1
- package/dist/server/post-paid.js +7 -9
- package/dist/server/post-paid.js.map +1 -1
- package/dist/x402/client.d.ts +5 -6
- package/dist/x402/client.d.ts.map +1 -1
- package/dist/x402/client.js +6 -7
- package/dist/x402/client.js.map +1 -1
- package/dist/x402/server.d.ts +5 -5
- package/dist/x402/server.d.ts.map +1 -1
- package/dist/x402/server.js +2 -2
- package/dist/x402/server.js.map +1 -1
- package/dist/x402/wire.d.ts +1 -1
- package/dist/x402/wire.js +1 -1
- package/dist/x402/wire.js.map +1 -1
- package/package.json +1 -1
package/dist/cli/main.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `tab`: the executable entry point of this package.\n *\n * Five commands. `mcp` serves the four tools, and is what the `mcpServers`\n * stanza launches. `connect` writes that stanza. `doctor` checks the whole\n * installation without a key. `status` and `settle` are the two tools a person\n * reaches for outside a model, one to see what is owed and one to pay it.\n *\n * ## stdout belongs to the protocol\n *\n * Under `mcp` the process speaks MCP over stdout, so this file writes every\n * human-readable line to stderr and every machine-readable payload to stdout,\n * and the two never mix. `--json` on `status`, `settle` and `doctor` puts a\n * single JSON document on stdout and nothing else, which is what makes the\n * commands scriptable.\n *\n * ## `settle` does not broadcast unless it is told to\n *\n * A Settlement spends real funds, and a command that spends by default is a\n * command somebody runs to see what it does. So `tab settle` is a dry run unless\n * `--broadcast` is passed: it resolves the strategy, the Collection Address and\n * the surface, reports exactly what would be sent, and sends nothing. The MCP\n * tool has the same `dryRun` field for the same reason, defaulted the other way\n * because a model calling `tab_settle` has already decided.\n *\n * Requirements: 25.5, 25.6\n */\n\nimport type { Result } from \"../_shared/index.js\";\nimport { ok } from \"../_shared/index.js\";\n\nimport { validationError } from \"../errors.js\";\nimport { createTabMcpServer, stderrLogger } from \"../mcp/server.js\";\nimport { resolveTabMcpSettings, type TabMcpSettings } from \"../mcp/settings.js\";\nimport { detectMcpClients } from \"./client-config.js\";\nimport { runConnect } from \"./connect.js\";\nimport { runDoctor, type CheckStatus, type DoctorReport } from \"./doctor.js\";\n\n/** The name the help text uses. `npx @tabai/sdk` resolves to this. */\nexport const CLI_NAME = \"tab\";\n\nexport interface CliIo {\n /** Machine-readable output. Under `mcp` this is the protocol stream and nothing else writes to it. */\n out(line: string): void;\n /** Everything a person reads. */\n err(line: string): void;\n}\n\nconst processIo: CliIo = {\n out: (line) => process.stdout.write(`${line}\\n`),\n err: (line) => process.stderr.write(`${line}\\n`),\n};\n\nexport interface CliOptions {\n readonly io?: CliIo;\n readonly env?: NodeJS.ProcessEnv;\n readonly cwd?: string;\n /** Blocks the two commands that would spend, so a test can never broadcast. */\n readonly allowBroadcast?: boolean;\n}\n\n// ---------------------------------------------------------------- flags\n\n/** A flag parse. Everything is `--name value` or `--name` for a boolean. */\ninterface Flags {\n readonly positional: readonly string[];\n readonly values: Readonly<Record<string, string>>;\n readonly booleans: ReadonlySet<string>;\n}\n\nconst BOOLEAN_FLAGS = new Set([\"help\", \"version\", \"json\", \"dry-run\", \"broadcast\", \"http\"]);\n\nfunction parseFlags(argv: readonly string[]): Result<Flags> {\n const positional: string[] = [];\n const values: Record<string, string> = {};\n const booleans = new Set<string>();\n\n for (let index = 0; index < argv.length; index += 1) {\n const token = argv[index]!;\n if (!token.startsWith(\"--\")) {\n positional.push(token);\n continue;\n }\n const body = token.slice(2);\n const equals = body.indexOf(\"=\");\n if (equals >= 0) {\n values[body.slice(0, equals)] = body.slice(equals + 1);\n continue;\n }\n const next = argv[index + 1];\n if (BOOLEAN_FLAGS.has(body) && (next === undefined || next.startsWith(\"--\"))) {\n booleans.add(body);\n continue;\n }\n if (next === undefined || next.startsWith(\"--\")) {\n if (BOOLEAN_FLAGS.has(body)) {\n booleans.add(body);\n continue;\n }\n return validationError(\"FLAG_VALUE_MISSING\", `\\`--${body}\\` needs a value`, { details: { flag: body } });\n }\n values[body] = next;\n index += 1;\n }\n return ok({ positional, values, booleans });\n}\n\n// ---------------------------------------------------------------- rendering\n\n/** Fixed-width so the check names line up in a terminal. */\nconst markOf = (status: CheckStatus): string =>\n status === \"pass\" ? \" ok \" : status === \"warn\" ? \" warn \" : status === \"fail\" ? \" FAIL \" : \" skip \";\n\nfunction renderDoctor(report: DoctorReport, io: CliIo): void {\n io.err(\"\");\n for (const check of report.checks) {\n io.err(`[${markOf(check.status)}] ${check.name}: ${check.detail}`);\n if (check.hint !== undefined) io.err(` ${check.hint}`);\n }\n io.err(\"\");\n io.err(\n `${report.counts.pass} passed, ${report.counts.warn} warned, ${report.counts.fail} failed, ${report.counts.skip} skipped`,\n );\n io.err(report.ok ? \"This installation can read the deployment.\" : \"This installation is not usable as configured.\");\n}\n\nconst HELP = `${CLI_NAME} - post-paid billing for autonomous agents on Monad\n\nUsage\n npx -y @tabai/sdk <command> [options]\n\nCommands\n mcp Serve the four Tab tools over MCP. This is what an MCP client launches.\n connect Write the tab server into an MCP client's config. Never writes a key.\n doctor Check the installation. Every check is a keyless read.\n status What the Agent owes, may still spend, and has settled.\n settle Pay down an Open Tab. A dry run unless --broadcast is given.\n\nOptions\n mcp --http [--port <n>] [--host <h>] [--endpoint <p>] serve streamable HTTP instead of stdio\n connect --client <id> | --config <path> | --dry-run\n clients: ${detectMcpClients()\n .filter((target) => target.configPath !== undefined)\n .map((target) => target.id)\n .join(\", \")}\n doctor --client <id> | --config <path> | --json\n status --agent <0x..> --asset <chainId:0x..> --history-limit <n> --json\n settle --service <0x..> --asset <chainId:0x..> --amount <baseUnits>\n --strategy <id> --broadcast --json\n\nEnvironment\n MONAD_RPC_URL the Monad JSON-RPC endpoint\n MONAD_CHAIN_ID 143 for Mainnet, 10143 for Testnet\n NEXT_PUBLIC_REGISTRY_API_URL the Tab registry read API, which serves discovery and status\n AGENT_PRIVATE_KEY read only when a Settlement is signed, and never written anywhere\n\nConfiguration\n tab.config.ts beside your project declares the Agent address, the registry URL,\n the Service endpoints, and the payment strategies. The chain records no Service\n endpoint, so tab_call needs one from there.\n`;\n\n// ---------------------------------------------------------------- commands\n\nasync function settingsFor(flags: Flags, options: CliOptions): Promise<TabMcpSettings> {\n return resolveTabMcpSettings({\n ...(flags.values[\"agent\"] === undefined ? {} : { agent: flags.values[\"agent\"] }),\n ...(flags.values[\"registry-url\"] === undefined ? {} : { registryUrl: flags.values[\"registry-url\"] }),\n ...(flags.values[\"rpc-url\"] === undefined ? {} : { rpcUrl: flags.values[\"rpc-url\"] }),\n ...(options.cwd === undefined ? {} : { cwd: options.cwd }),\n ...(options.env === undefined ? {} : { env: options.env }),\n logger: stderrLogger,\n });\n}\n\nasync function commandMcp(flags: Flags, options: CliOptions): Promise<number> {\n const io = options.io ?? processIo;\n const server = await createTabMcpServer({\n ...(options.cwd === undefined ? {} : { cwd: options.cwd }),\n ...(options.env === undefined ? {} : { env: options.env }),\n logger: stderrLogger,\n });\n\n if (flags.booleans.has(\"http\") || flags.values[\"port\"] !== undefined) {\n const port = Number.parseInt(flags.values[\"port\"] ?? \"8790\", 10);\n if (!Number.isInteger(port) || port < 1 || port > 65_535) {\n io.err(`tab: --port must be a TCP port, received \\`${flags.values[\"port\"] ?? \"\"}\\``);\n return 1;\n }\n const served = await server.serveHttp({\n port,\n ...(flags.values[\"host\"] === undefined ? {} : { host: flags.values[\"host\"] }),\n ...(flags.values[\"endpoint\"] === undefined ? {} : { endpoint: flags.values[\"endpoint\"] }),\n });\n if (!served.ok) {\n io.err(`tab: ${served.error.message}`);\n return 1;\n }\n io.err(`tab: MCP over streamable HTTP at http://${served.value.host}:${served.value.port}${served.value.endpoint}`);\n // Held open by the listening socket. The process exits when it is closed.\n return 0;\n }\n\n const served = await server.serveStdio();\n if (!served.ok) {\n io.err(`tab: ${served.error.message}`);\n return 1;\n }\n return 0;\n}\n\nasync function commandConnect(flags: Flags, options: CliOptions): Promise<number> {\n const io = options.io ?? processIo;\n const settings = await settingsFor(flags, options);\n const report = await runConnect({\n settings,\n ...(flags.values[\"client\"] === undefined ? {} : { client: flags.values[\"client\"] }),\n ...(flags.values[\"config\"] === undefined ? {} : { configPath: flags.values[\"config\"] }),\n ...(options.env === undefined ? {} : { env: options.env }),\n ...(options.cwd === undefined ? {} : { cwd: options.cwd }),\n dryRun: flags.booleans.has(\"dry-run\"),\n logger: stderrLogger,\n });\n\n if (!report.ok) {\n io.err(`tab connect: ${report.error.message}`);\n return 1;\n }\n\n const value = report.value;\n io.err(\"\");\n io.err(`Client ${value.client}`);\n io.err(`Config ${value.configPath}`);\n io.err(`Registry ${value.preflight.registryUrl ?? \"not configured\"}`);\n io.err(` ${value.preflight.note}`);\n io.err(\"\");\n\n if (!value.changed) {\n io.err(`Already connected. \\`${value.configPath}\\` already runs the tab server, so nothing was written.`);\n } else if (value.dryRun) {\n io.err(\"Dry run. Nothing was written. This is the change that would be made:\");\n io.err(\"\");\n io.err(value.diff);\n } else {\n io.err(value.hadStanza ? \"Updated the tab server stanza.\" : \"Added the tab server stanza.\");\n if (value.backupPath !== undefined) io.err(`Backed up the previous config to ${value.backupPath}`);\n io.err(\"\");\n io.err(value.diff);\n }\n\n io.err(\"\");\n io.err(\"No private key was written. Settlement signing keys are read from the environment at run time.\");\n io.err(\"\");\n io.err(\"Next\");\n io.err(\n value.client === \"custom\"\n ? \" 1. Restart the client that reads that file, so it picks up the new server.\"\n : ` 1. Restart ${value.client} so it picks up the new server.`,\n );\n io.err(\" 2. Ask it to run tab_discover, which lists the Services registered on Monad.\");\n io.err(` 3. Check the whole installation with: npx -y @tabai/sdk doctor --config ${value.configPath}`);\n return 0;\n}\n\nasync function commandDoctor(flags: Flags, options: CliOptions): Promise<number> {\n const io = options.io ?? processIo;\n const settings = await settingsFor(flags, options);\n\n let clientConfigPath = flags.values[\"config\"];\n if (clientConfigPath === undefined) {\n const detected = detectMcpClients({\n ...(options.env === undefined ? {} : { env: options.env }),\n ...(options.cwd === undefined ? {} : { cwd: options.cwd }),\n });\n const named = flags.values[\"client\"];\n const chosen = named === undefined ? detected.find((t) => t.present) : detected.find((t) => t.id === named);\n clientConfigPath = chosen?.configPath;\n }\n\n const report = await runDoctor({\n settings,\n ...(options.env === undefined ? {} : { env: options.env }),\n ...(clientConfigPath === undefined ? {} : { clientConfigPath }),\n logger: stderrLogger,\n });\n\n if (flags.booleans.has(\"json\")) {\n io.out(JSON.stringify(report, null, 2));\n } else {\n renderDoctor(report, io);\n }\n return report.ok ? 0 : 1;\n}\n\nasync function commandStatus(flags: Flags, options: CliOptions): Promise<number> {\n const io = options.io ?? processIo;\n const settings = await settingsFor(flags, options);\n const server = await createTabMcpServer({ settings, logger: stderrLogger });\n\n const output = await server.toolset.status({\n ...(flags.values[\"agent\"] === undefined ? {} : { agent: flags.values[\"agent\"] }),\n ...(flags.values[\"asset\"] === undefined ? {} : { asset: flags.values[\"asset\"] }),\n ...(flags.values[\"history-limit\"] === undefined\n ? {}\n : { historyLimit: Number.parseInt(flags.values[\"history-limit\"], 10) }),\n });\n\n if (flags.booleans.has(\"json\")) {\n io.out(JSON.stringify(output, null, 2));\n return output.error === undefined ? 0 : 1;\n }\n\n io.err(\"\");\n io.err(`Agent ${output.agent}`);\n if (output.error !== undefined) {\n io.err(` ${output.error.code}: ${output.error.message}`);\n return 1;\n }\n if (output.perAsset.length === 0) io.err(\" no Asset activity is indexed for this Agent\");\n for (const entry of output.perAsset) {\n io.err(` ${entry.asset}`);\n io.err(` credit limit ${entry.creditLimitBaseUnits ?? \"withheld\"}`);\n io.err(` open tab ${entry.openTabBaseUnits}`);\n io.err(` headroom ${entry.headroomBaseUnits ?? \"withheld\"}`);\n io.err(` delinquent ${String(entry.delinquent)}`);\n }\n io.err(` settlements ${output.settlements?.length ?? 0}`);\n for (const settlement of output.settlements ?? []) {\n io.err(` ${settlement.txHash} ${settlement.amountBaseUnits} ${settlement.asset}`);\n }\n return 0;\n}\n\nasync function commandSettle(flags: Flags, options: CliOptions): Promise<number> {\n const io = options.io ?? processIo;\n const broadcast = flags.booleans.has(\"broadcast\");\n\n if (broadcast && options.allowBroadcast === false) {\n io.err(\"tab settle: broadcasting is disabled in this process\");\n return 1;\n }\n\n // The strategy comes from `tab.config`, loaded by the toolset the first time a\n // Settlement needs one. Nothing is loaded here, so a dry run that fails for\n // another reason never touches a signer.\n const settings = await settingsFor(flags, options);\n const server = await createTabMcpServer({\n settings,\n ...(options.cwd === undefined ? {} : { cwd: options.cwd }),\n logger: stderrLogger,\n });\n\n const output = await server.toolset.settle({\n ...(flags.values[\"service\"] === undefined ? {} : { serviceId: flags.values[\"service\"] }),\n ...(flags.values[\"asset\"] === undefined ? {} : { asset: flags.values[\"asset\"] }),\n ...(flags.values[\"amount\"] === undefined ? {} : { amountBaseUnits: flags.values[\"amount\"] }),\n ...(flags.values[\"strategy\"] === undefined ? {} : { strategyId: flags.values[\"strategy\"] }),\n dryRun: !broadcast,\n });\n\n if (flags.booleans.has(\"json\")) {\n io.out(JSON.stringify(output, null, 2));\n return output.ok ? 0 : 1;\n }\n\n io.err(\"\");\n if (!output.ok) {\n io.err(`tab settle: ${output.error?.code ?? \"FAILED\"}: ${output.error?.message ?? \"the Settlement was not built\"}`);\n return 1;\n }\n if (output.dryRun) {\n io.err(\"Dry run. Nothing was broadcast.\");\n io.err(` chain id ${String(output.chainId)}`);\n io.err(` amount ${output.amountBaseUnits}`);\n io.err(\"\");\n io.err(\"Add --broadcast to send it. This spends real funds.\");\n return 0;\n }\n io.err(\"Broadcast.\");\n io.err(` tx ${output.txHash ?? \"unknown\"}`);\n io.err(` amount ${output.amountBaseUnits}`);\n io.err(` applied ${output.appliedBaseUnits ?? \"pending\"}`);\n io.err(` prepaid ${output.prepaidBaseUnits ?? \"pending\"}`);\n io.err(` explorer ${output.explorerUrl ?? \"unknown\"}`);\n return 0;\n}\n\n// ---------------------------------------------------------------- entry\n\n/** Runs one invocation and answers a process exit code. Never throws. */\nexport async function runCli(argv: readonly string[], options: CliOptions = {}): Promise<number> {\n const io = options.io ?? processIo;\n const parsed = parseFlags(argv);\n if (!parsed.ok) {\n io.err(`tab: ${parsed.error.message}`);\n return 1;\n }\n const flags = parsed.value;\n const command = flags.positional[0];\n\n if (flags.booleans.has(\"version\")) {\n io.out(\"0.0.0\");\n return 0;\n }\n if (command === undefined || flags.booleans.has(\"help\") || command === \"help\") {\n io.err(HELP);\n return command === undefined || command === \"help\" || flags.booleans.has(\"help\") ? 0 : 1;\n }\n\n try {\n switch (command) {\n case \"mcp\":\n return await commandMcp(flags, options);\n case \"connect\":\n return await commandConnect(flags, options);\n case \"doctor\":\n return await commandDoctor(flags, options);\n case \"status\":\n return await commandStatus(flags, options);\n case \"settle\":\n return await commandSettle(flags, options);\n default:\n io.err(`tab: \\`${command}\\` is not a command. Run \\`${CLI_NAME} help\\` for the list.`);\n return 1;\n }\n } catch (error) {\n // The commands are written not to reach here. A bug that does should still\n // leave a message and an exit code rather than an unhandled rejection.\n io.err(`tab: ${command} failed unexpectedly: ${error instanceof Error ? error.message : String(error)}`);\n return 1;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"main.js","sourceRoot":"","sources":["../../src/cli/main.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * `tab`: the executable entry point of this package.\n *\n * Five commands. `mcp` serves the four tools, and is what the `mcpServers`\n * stanza launches. `connect` writes that stanza. `doctor` checks the whole\n * installation without a key. `status` and `settle` are the two tools a person\n * reaches for outside a model, one to see what is owed and one to pay it.\n *\n * ## stdout belongs to the protocol\n *\n * Under `mcp` the process speaks MCP over stdout, so this file writes every\n * human-readable line to stderr and every machine-readable payload to stdout,\n * and the two never mix. `--json` on `status`, `settle` and `doctor` puts a\n * single JSON document on stdout and nothing else, which is what makes the\n * commands scriptable.\n *\n * ## `settle` does not broadcast unless it is told to\n *\n * A Settlement spends real funds, and a command that spends by default is a\n * command somebody runs to see what it does. So `tab settle` is a dry run unless\n * `--broadcast` is passed: it resolves the strategy, the Collection Address and\n * the surface, reports exactly what would be sent, and sends nothing. The MCP\n * tool has the same `dryRun` field for the same reason, defaulted the other way\n * because a model calling `tab_settle` has already decided.\n */\n\nimport type { Result } from \"../_shared/index.js\";\nimport { ok } from \"../_shared/index.js\";\n\nimport { validationError } from \"../errors.js\";\nimport { TAB_MCP_SERVER_INFO, createTabMcpServer, stderrLogger } from \"../mcp/server.js\";\nimport { resolveTabMcpSettings, type TabMcpSettings } from \"../mcp/settings.js\";\nimport { detectMcpClients } from \"./client-config.js\";\nimport { runConnect } from \"./connect.js\";\nimport { runDoctor, type CheckStatus, type DoctorReport } from \"./doctor.js\";\n\n/** The name the help text uses. `npx @tabai/sdk` resolves to this. */\nexport const CLI_NAME = \"tab\";\n\nexport interface CliIo {\n /** Machine-readable output. Under `mcp` this is the protocol stream and nothing else writes to it. */\n out(line: string): void;\n /** Everything a person reads. */\n err(line: string): void;\n}\n\nconst processIo: CliIo = {\n out: (line) => process.stdout.write(`${line}\\n`),\n err: (line) => process.stderr.write(`${line}\\n`),\n};\n\nexport interface CliOptions {\n readonly io?: CliIo;\n readonly env?: NodeJS.ProcessEnv;\n readonly cwd?: string;\n /** Blocks `settle --broadcast`, the one command that spends, so a test can never broadcast. */\n readonly allowBroadcast?: boolean;\n}\n\n// ---------------------------------------------------------------- flags\n\n/** A flag parse. Everything is `--name value` or `--name` for a boolean. */\ninterface Flags {\n readonly positional: readonly string[];\n readonly values: Readonly<Record<string, string>>;\n readonly booleans: ReadonlySet<string>;\n}\n\nconst BOOLEAN_FLAGS = new Set([\"help\", \"version\", \"json\", \"dry-run\", \"broadcast\", \"http\"]);\n\nfunction parseFlags(argv: readonly string[]): Result<Flags> {\n const positional: string[] = [];\n const values: Record<string, string> = {};\n const booleans = new Set<string>();\n\n for (let index = 0; index < argv.length; index += 1) {\n const token = argv[index]!;\n if (!token.startsWith(\"--\")) {\n positional.push(token);\n continue;\n }\n const body = token.slice(2);\n const equals = body.indexOf(\"=\");\n if (equals >= 0) {\n values[body.slice(0, equals)] = body.slice(equals + 1);\n continue;\n }\n const next = argv[index + 1];\n if (BOOLEAN_FLAGS.has(body) && (next === undefined || next.startsWith(\"--\"))) {\n booleans.add(body);\n continue;\n }\n if (next === undefined || next.startsWith(\"--\")) {\n if (BOOLEAN_FLAGS.has(body)) {\n booleans.add(body);\n continue;\n }\n return validationError(\"FLAG_VALUE_MISSING\", `\\`--${body}\\` needs a value`, { details: { flag: body } });\n }\n values[body] = next;\n index += 1;\n }\n return ok({ positional, values, booleans });\n}\n\n// ---------------------------------------------------------------- rendering\n\n/** Fixed-width so the check names line up in a terminal. */\nconst markOf = (status: CheckStatus): string =>\n status === \"pass\" ? \" ok \" : status === \"warn\" ? \" warn \" : status === \"fail\" ? \" FAIL \" : \" skip \";\n\nfunction renderDoctor(report: DoctorReport, io: CliIo): void {\n io.err(\"\");\n for (const check of report.checks) {\n io.err(`[${markOf(check.status)}] ${check.name}: ${check.detail}`);\n if (check.hint !== undefined) io.err(` ${check.hint}`);\n }\n io.err(\"\");\n io.err(\n `${report.counts.pass} passed, ${report.counts.warn} warned, ${report.counts.fail} failed, ${report.counts.skip} skipped`,\n );\n io.err(report.ok ? \"This installation can read the deployment.\" : \"This installation is not usable as configured.\");\n}\n\nconst HELP = `${CLI_NAME} - post-paid billing for autonomous agents on Monad\n\nUsage\n npx -y @tabai/sdk <command> [options]\n\nCommands\n mcp Serve the four Tab tools over MCP. This is what an MCP client launches.\n connect Write the tab server into an MCP client's config. Never writes a key.\n doctor Check the installation. Every check is a keyless read.\n status What the Agent owes, may still spend, and has settled.\n settle Pay down an Open Tab. A dry run unless --broadcast is given.\n\nOptions\n mcp --http [--port <n>] [--host <h>] [--endpoint <p>] serve streamable HTTP instead of stdio\n connect --client <id> | --config <path> | --dry-run\n clients: ${detectMcpClients()\n .filter((target) => target.configPath !== undefined)\n .map((target) => target.id)\n .join(\", \")}\n doctor --client <id> | --config <path> | --json\n status --agent <0x..> --asset <chainId:0x..> --history-limit <n> --json\n settle --service <0x..> --asset <chainId:0x..> --amount <baseUnits>\n --strategy <id> --broadcast --json\n\nEnvironment\n MONAD_RPC_URL the Monad JSON-RPC endpoint\n MONAD_CHAIN_ID 143 for Mainnet, 10143 for Testnet\n NEXT_PUBLIC_REGISTRY_API_URL the Tab registry read API, which serves discovery and status\n AGENT_PRIVATE_KEY read only when a Settlement is signed, and never written anywhere\n\nConfiguration\n tab.config.ts beside your project declares the Agent address, the registry URL,\n the Service endpoints, and the payment strategies. The chain records no Service\n endpoint, so tab_call needs one from there.\n`;\n\n// ---------------------------------------------------------------- commands\n\nasync function settingsFor(flags: Flags, options: CliOptions): Promise<TabMcpSettings> {\n return resolveTabMcpSettings({\n ...(flags.values[\"agent\"] === undefined ? {} : { agent: flags.values[\"agent\"] }),\n ...(flags.values[\"registry-url\"] === undefined ? {} : { registryUrl: flags.values[\"registry-url\"] }),\n ...(flags.values[\"rpc-url\"] === undefined ? {} : { rpcUrl: flags.values[\"rpc-url\"] }),\n ...(options.cwd === undefined ? {} : { cwd: options.cwd }),\n ...(options.env === undefined ? {} : { env: options.env }),\n logger: stderrLogger,\n });\n}\n\nasync function commandMcp(flags: Flags, options: CliOptions): Promise<number> {\n const io = options.io ?? processIo;\n const server = await createTabMcpServer({\n ...(options.cwd === undefined ? {} : { cwd: options.cwd }),\n ...(options.env === undefined ? {} : { env: options.env }),\n logger: stderrLogger,\n });\n\n if (flags.booleans.has(\"http\") || flags.values[\"port\"] !== undefined) {\n const port = Number.parseInt(flags.values[\"port\"] ?? \"8790\", 10);\n if (!Number.isInteger(port) || port < 1 || port > 65_535) {\n io.err(`tab: --port must be a TCP port, received \\`${flags.values[\"port\"] ?? \"\"}\\``);\n return 1;\n }\n const served = await server.serveHttp({\n port,\n ...(flags.values[\"host\"] === undefined ? {} : { host: flags.values[\"host\"] }),\n ...(flags.values[\"endpoint\"] === undefined ? {} : { endpoint: flags.values[\"endpoint\"] }),\n });\n if (!served.ok) {\n io.err(`tab: ${served.error.message}`);\n return 1;\n }\n io.err(`tab: MCP over streamable HTTP at http://${served.value.host}:${served.value.port}${served.value.endpoint}`);\n // Held open by the listening socket. The process exits when it is closed.\n return 0;\n }\n\n const served = await server.serveStdio();\n if (!served.ok) {\n io.err(`tab: ${served.error.message}`);\n return 1;\n }\n return 0;\n}\n\nasync function commandConnect(flags: Flags, options: CliOptions): Promise<number> {\n const io = options.io ?? processIo;\n const settings = await settingsFor(flags, options);\n const report = await runConnect({\n settings,\n ...(flags.values[\"client\"] === undefined ? {} : { client: flags.values[\"client\"] }),\n ...(flags.values[\"config\"] === undefined ? {} : { configPath: flags.values[\"config\"] }),\n ...(options.env === undefined ? {} : { env: options.env }),\n ...(options.cwd === undefined ? {} : { cwd: options.cwd }),\n dryRun: flags.booleans.has(\"dry-run\"),\n logger: stderrLogger,\n });\n\n if (!report.ok) {\n io.err(`tab connect: ${report.error.message}`);\n return 1;\n }\n\n const value = report.value;\n io.err(\"\");\n io.err(`Client ${value.client}`);\n io.err(`Config ${value.configPath}`);\n io.err(`Registry ${value.preflight.registryUrl ?? \"not configured\"}`);\n io.err(` ${value.preflight.note}`);\n io.err(\"\");\n\n if (!value.changed) {\n io.err(`Already connected. \\`${value.configPath}\\` already runs the tab server, so nothing was written.`);\n } else if (value.dryRun) {\n io.err(\"Dry run. Nothing was written. This is the change that would be made:\");\n io.err(\"\");\n io.err(value.diff);\n } else {\n io.err(value.hadStanza ? \"Updated the tab server stanza.\" : \"Added the tab server stanza.\");\n if (value.backupPath !== undefined) io.err(`Backed up the previous config to ${value.backupPath}`);\n io.err(\"\");\n io.err(value.diff);\n }\n\n io.err(\"\");\n io.err(\"No private key was written. Settlement signing keys are read from the environment at run time.\");\n io.err(\"\");\n io.err(\"Next\");\n io.err(\n value.client === \"custom\"\n ? \" 1. Restart the client that reads that file, so it picks up the new server.\"\n : ` 1. Restart ${value.client} so it picks up the new server.`,\n );\n io.err(\" 2. Ask it to run tab_discover, which lists the Services registered on Monad.\");\n io.err(` 3. Check the whole installation with: npx -y @tabai/sdk doctor --config ${value.configPath}`);\n return 0;\n}\n\nasync function commandDoctor(flags: Flags, options: CliOptions): Promise<number> {\n const io = options.io ?? processIo;\n const settings = await settingsFor(flags, options);\n\n let clientConfigPath = flags.values[\"config\"];\n if (clientConfigPath === undefined) {\n const detected = detectMcpClients({\n ...(options.env === undefined ? {} : { env: options.env }),\n ...(options.cwd === undefined ? {} : { cwd: options.cwd }),\n });\n const named = flags.values[\"client\"];\n const chosen = named === undefined ? detected.find((t) => t.present) : detected.find((t) => t.id === named);\n clientConfigPath = chosen?.configPath;\n }\n\n const report = await runDoctor({\n settings,\n ...(options.env === undefined ? {} : { env: options.env }),\n ...(clientConfigPath === undefined ? {} : { clientConfigPath }),\n logger: stderrLogger,\n });\n\n if (flags.booleans.has(\"json\")) {\n io.out(JSON.stringify(report, null, 2));\n } else {\n renderDoctor(report, io);\n }\n return report.ok ? 0 : 1;\n}\n\nasync function commandStatus(flags: Flags, options: CliOptions): Promise<number> {\n const io = options.io ?? processIo;\n const settings = await settingsFor(flags, options);\n const server = await createTabMcpServer({ settings, logger: stderrLogger });\n\n const output = await server.toolset.status({\n ...(flags.values[\"agent\"] === undefined ? {} : { agent: flags.values[\"agent\"] }),\n ...(flags.values[\"asset\"] === undefined ? {} : { asset: flags.values[\"asset\"] }),\n ...(flags.values[\"history-limit\"] === undefined\n ? {}\n : { historyLimit: Number.parseInt(flags.values[\"history-limit\"], 10) }),\n });\n\n if (flags.booleans.has(\"json\")) {\n io.out(JSON.stringify(output, null, 2));\n return output.error === undefined ? 0 : 1;\n }\n\n io.err(\"\");\n io.err(`Agent ${output.agent}`);\n if (output.error !== undefined) {\n io.err(` ${output.error.code}: ${output.error.message}`);\n return 1;\n }\n if (output.perAsset.length === 0) io.err(\" no Asset activity is indexed for this Agent\");\n for (const entry of output.perAsset) {\n io.err(` ${entry.asset}`);\n io.err(` credit limit ${entry.creditLimitBaseUnits ?? \"withheld\"}`);\n io.err(` open tab ${entry.openTabBaseUnits}`);\n io.err(` headroom ${entry.headroomBaseUnits ?? \"withheld\"}`);\n io.err(` delinquent ${String(entry.delinquent)}`);\n }\n io.err(` settlements ${output.settlements?.length ?? 0}`);\n for (const settlement of output.settlements ?? []) {\n io.err(` ${settlement.txHash} ${settlement.amountBaseUnits} ${settlement.asset}`);\n }\n return 0;\n}\n\nasync function commandSettle(flags: Flags, options: CliOptions): Promise<number> {\n const io = options.io ?? processIo;\n const broadcast = flags.booleans.has(\"broadcast\");\n\n if (broadcast && options.allowBroadcast === false) {\n io.err(\"tab settle: broadcasting is disabled in this process\");\n return 1;\n }\n\n // The strategy comes from `tab.config`, loaded by the toolset the first time a\n // Settlement needs one. Nothing is loaded here, so a dry run that fails for\n // another reason never touches a signer.\n const settings = await settingsFor(flags, options);\n const server = await createTabMcpServer({\n settings,\n ...(options.cwd === undefined ? {} : { cwd: options.cwd }),\n logger: stderrLogger,\n });\n\n const output = await server.toolset.settle({\n ...(flags.values[\"service\"] === undefined ? {} : { serviceId: flags.values[\"service\"] }),\n ...(flags.values[\"asset\"] === undefined ? {} : { asset: flags.values[\"asset\"] }),\n ...(flags.values[\"amount\"] === undefined ? {} : { amountBaseUnits: flags.values[\"amount\"] }),\n ...(flags.values[\"strategy\"] === undefined ? {} : { strategyId: flags.values[\"strategy\"] }),\n dryRun: !broadcast,\n });\n\n if (flags.booleans.has(\"json\")) {\n io.out(JSON.stringify(output, null, 2));\n return output.ok ? 0 : 1;\n }\n\n io.err(\"\");\n if (!output.ok) {\n io.err(`tab settle: ${output.error?.code ?? \"FAILED\"}: ${output.error?.message ?? \"the Settlement was not built\"}`);\n return 1;\n }\n if (output.dryRun) {\n io.err(\"Dry run. Nothing was broadcast.\");\n io.err(` chain id ${String(output.chainId)}`);\n io.err(` amount ${output.amountBaseUnits}`);\n io.err(\"\");\n io.err(\"Add --broadcast to send it. This spends real funds.\");\n return 0;\n }\n io.err(\"Broadcast.\");\n io.err(` tx ${output.txHash ?? \"unknown\"}`);\n io.err(` amount ${output.amountBaseUnits}`);\n io.err(` applied ${output.appliedBaseUnits ?? \"pending\"}`);\n io.err(` prepaid ${output.prepaidBaseUnits ?? \"pending\"}`);\n io.err(` explorer ${output.explorerUrl ?? \"unknown\"}`);\n return 0;\n}\n\n// ---------------------------------------------------------------- entry\n\n/** Runs one invocation and answers a process exit code. Never throws. */\nexport async function runCli(argv: readonly string[], options: CliOptions = {}): Promise<number> {\n const io = options.io ?? processIo;\n const parsed = parseFlags(argv);\n if (!parsed.ok) {\n io.err(`tab: ${parsed.error.message}`);\n return 1;\n }\n const flags = parsed.value;\n const command = flags.positional[0];\n\n if (flags.booleans.has(\"version\")) {\n io.out(TAB_MCP_SERVER_INFO.version);\n return 0;\n }\n if (command === undefined || flags.booleans.has(\"help\") || command === \"help\") {\n io.err(HELP);\n return command === undefined || command === \"help\" || flags.booleans.has(\"help\") ? 0 : 1;\n }\n\n try {\n switch (command) {\n case \"mcp\":\n return await commandMcp(flags, options);\n case \"connect\":\n return await commandConnect(flags, options);\n case \"doctor\":\n return await commandDoctor(flags, options);\n case \"status\":\n return await commandStatus(flags, options);\n case \"settle\":\n return await commandSettle(flags, options);\n default:\n io.err(`tab: \\`${command}\\` is not a command. Run \\`${CLI_NAME} help\\` for the list.`);\n return 1;\n }\n } catch (error) {\n // The commands are written not to reach here. A bug that does should still\n // leave a message and an exit code rather than an unhandled rejection.\n io.err(`tab: ${command} failed unexpectedly: ${error instanceof Error ? error.message : String(error)}`);\n return 1;\n }\n}\n"]}
|
package/dist/errors.d.ts
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Error constructors for the SDK.
|
|
3
3
|
*
|
|
4
|
-
* Nothing exported from this package throws
|
|
5
|
-
*
|
|
4
|
+
* Nothing exported from this package throws, so every fallible call ends in one
|
|
5
|
+
* of these. The categories, codes, and the
|
|
6
6
|
* status each category maps to all come from `./_shared/index.js`; this module only
|
|
7
7
|
* saves every call site from writing the same object literal.
|
|
8
|
-
*
|
|
9
|
-
* Requirements: 21.5
|
|
10
8
|
*/
|
|
11
9
|
import { type ErrorCategory, type Result, type TabError } from "./_shared/index.js";
|
|
12
10
|
/** The optional half of a `TabError`, so a call site names only what it knows. */
|
package/dist/errors.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAO,KAAK,aAAa,EAAE,KAAK,MAAM,EAAE,KAAK,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEpF,kFAAkF;AAClF,MAAM,MAAM,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,EAAE,WAAW,GAAG,cAAc,GAAG,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC;AAEtG;;;GAGG;AACH,wBAAgB,QAAQ,CACtB,QAAQ,EAAE,aAAa,EACvB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,MAAM,GAAE,WAAgB,GACvB,QAAQ,CAUV;AAED,uDAAuD;AACvD,eAAO,MAAM,IAAI,GACf,UAAU,aAAa,EACvB,MAAM,MAAM,EACZ,SAAS,MAAM,EACf,SAAQ,WAAgB,KACvB,MAAM,CAAC,KAAK,CAAmD,CAAC;AAEnE,oDAAoD;AACpD,eAAO,MAAM,eAAe,GAAI,MAAM,MAAM,EAAE,SAAS,MAAM,EAAE,SAAS,WAAW,KAAG,MAAM,CAAC,KAAK,CACvD,CAAC;AAE5C,kEAAkE;AAClE,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,EAAE,SAAS,MAAM,EAAE,SAAS,WAAW,KAAG,MAAM,CAAC,KAAK,CACtD,CAAC;AAE3C,0FAA0F;AAC1F,eAAO,MAAM,aAAa,GAAI,MAAM,MAAM,EAAE,SAAS,MAAM,EAAE,SAAS,WAAW,KAAG,MAAM,CAAC,KAAK,CACvD,CAAC;AAE1C,sDAAsD;AACtD,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,EAAE,SAAS,MAAM,EAAE,SAAS,WAAW,KAAG,MAAM,CAAC,KAAK,CACvD,CAAC"}
|
package/dist/errors.js
CHANGED
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Error constructors for the SDK.
|
|
3
3
|
*
|
|
4
|
-
* Nothing exported from this package throws
|
|
5
|
-
*
|
|
4
|
+
* Nothing exported from this package throws, so every fallible call ends in one
|
|
5
|
+
* of these. The categories, codes, and the
|
|
6
6
|
* status each category maps to all come from `./_shared/index.js`; this module only
|
|
7
7
|
* saves every call site from writing the same object literal.
|
|
8
|
-
*
|
|
9
|
-
* Requirements: 21.5
|
|
10
8
|
*/
|
|
11
9
|
import { err } from "./_shared/index.js";
|
|
12
10
|
/**
|
package/dist/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,GAAG,EAAkD,MAAM,eAAe,CAAC;AAKpF;;;GAGG;AACH,MAAM,UAAU,QAAQ,CACtB,QAAuB,EACvB,IAAY,EACZ,OAAe,EACf,SAAsB,EAAE;IAExB,OAAO;QACL,QAAQ;QACR,IAAI;QACJ,OAAO;QACP,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,KAAK;QACpC,GAAG,CAAC,MAAM,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC;QACnF,GAAG,CAAC,MAAM,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;QACpE,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;KAC/D,CAAC;AACJ,CAAC;AAED,uDAAuD;AACvD,MAAM,CAAC,MAAM,IAAI,GAAG,CAClB,QAAuB,EACvB,IAAY,EACZ,OAAe,EACf,SAAsB,EAAE,EACT,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;AAEnE,oDAAoD;AACpD,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,IAAY,EAAE,OAAe,EAAE,MAAoB,EAAiB,EAAE,CACpG,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAE5C,kEAAkE;AAClE,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,OAAe,EAAE,MAAoB,EAAiB,EAAE,CAClG,IAAI,CAAC,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAE3C,0FAA0F;AAC1F,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,IAAY,EAAE,OAAe,EAAE,MAAoB,EAAiB,EAAE,CAClG,IAAI,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;AAE1C,sDAAsD;AACtD,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,OAAe,EAAE,MAAoB,EAAiB,EAAE,CAC/F,IAAI,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC","sourcesContent":["/**\n * Error constructors for the SDK.\n *\n * Nothing exported from this package throws, so every fallible call ends in one\n * of these. The categories, codes, and the\n * status each category maps to all come from `./_shared/index.js`; this module only\n * saves every call site from writing the same object literal.\n */\n\nimport { err, type ErrorCategory, type Result, type TabError } from \"./_shared/index.js\";\n\n/** The optional half of a `TabError`, so a call site names only what it knows. */\nexport type ErrorExtras = Partial<Pick<TabError, \"retryable\" | \"retryAfterMs\" | \"details\" | \"cause\">>;\n\n/**\n * Builds a `TabError`. `retryable` defaults to false: a caller that retries an\n * error nobody marked retryable is the failure mode worth defaulting against.\n */\nexport function tabError(\n category: ErrorCategory,\n code: string,\n message: string,\n extras: ErrorExtras = {},\n): TabError {\n return {\n category,\n code,\n message,\n retryable: extras.retryable ?? false,\n ...(extras.retryAfterMs === undefined ? {} : { retryAfterMs: extras.retryAfterMs }),\n ...(extras.details === undefined ? {} : { details: extras.details }),\n ...(extras.cause === undefined ? {} : { cause: extras.cause }),\n };\n}\n\n/** `tabError` already wrapped as a failed `Result`. */\nexport const fail = (\n category: ErrorCategory,\n code: string,\n message: string,\n extras: ErrorExtras = {},\n): Result<never> => err(tabError(category, code, message, extras));\n\n/** Caller-supplied input is malformed. HTTP 400. */\nexport const validationError = (code: string, message: string, extras?: ErrorExtras): Result<never> =>\n fail(\"VALIDATION\", code, message, extras);\n\n/** Unknown strategy, asset, service, or config file. HTTP 404. */\nexport const notFoundError = (code: string, message: string, extras?: ErrorExtras): Result<never> =>\n fail(\"NOT_FOUND\", code, message, extras);\n\n/** An RPC endpoint, a module loader, or a consumer-supplied callback failed. HTTP 502. */\nexport const upstreamError = (code: string, message: string, extras?: ErrorExtras): Result<never> =>\n fail(\"UPSTREAM\", code, message, extras);\n\n/** A Monad transaction failed to submit. HTTP 500. */\nexport const chainError = (code: string, message: string, extras?: ErrorExtras): Result<never> =>\n fail(\"CHAIN\", code, message, extras);\n"]}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The HTTP 402 client wrapper
|
|
2
|
+
* The HTTP 402 client wrapper.
|
|
3
3
|
*
|
|
4
4
|
* ## Tab is post-paid, so a 402 is not a demand for prepayment
|
|
5
5
|
*
|
|
6
6
|
* This is the one thing to understand about this file. A `402` from a Tab Service
|
|
7
7
|
* does not mean "pay now and I will then serve you". Work is delivered first and
|
|
8
|
-
* metered after
|
|
9
|
-
* Agent settles later, asynchronously, on
|
|
8
|
+
* metered after; the charge lands on the Open Tab as an accrual, and the
|
|
9
|
+
* Agent settles later, asynchronously, on Monad, with its own keys, through
|
|
10
10
|
* the payment-strategy seam. So:
|
|
11
11
|
*
|
|
12
12
|
* - the **normal** metered response is a `200` carrying the charge block, and
|
|
13
13
|
* this client records the accrual and hands the response straight back;
|
|
14
|
-
* - a `402` is issued on `LimitExceeded` alone
|
|
14
|
+
* - a `402` is issued on `LimitExceeded` alone: the Agent has no headroom left
|
|
15
15
|
* for that Asset. It is a credit decision, not an invoice;
|
|
16
16
|
* - on a `402` the client records what the Service says the call requires, sends
|
|
17
17
|
* the original request **once** more carrying `Tab-Agent` and
|
|
@@ -25,11 +25,11 @@
|
|
|
25
25
|
* ## Why a repeat at all, if the charge already landed
|
|
26
26
|
*
|
|
27
27
|
* Two cases, and the repeat serves both. On the ordinary path the first attempt
|
|
28
|
-
* may have reached a Service that could not identify the Agent
|
|
29
|
-
* built its own headers or a proxy that dropped them, and the repeat carries the
|
|
28
|
+
* may have reached a Service that could not identify the Agent (a caller that
|
|
29
|
+
* built its own headers, or a proxy that dropped them), and the repeat carries the
|
|
30
30
|
* identity headers explicitly. On the `LimitExceeded` path a Settlement may have
|
|
31
31
|
* landed between the two attempts: `TabSettlement` restores headroom in the
|
|
32
|
-
* same block it moves the Asset
|
|
32
|
+
* same block it moves the Asset, so the second attempt is genuinely a
|
|
33
33
|
* different question rather than the same one asked louder. Exactly one repeat,
|
|
34
34
|
* because a second `402` means the
|
|
35
35
|
* headroom is not coming back within the life of this request, and looping would
|
|
@@ -48,14 +48,12 @@
|
|
|
48
48
|
*
|
|
49
49
|
* ## Zero-throw, everywhere
|
|
50
50
|
*
|
|
51
|
-
* Every fallible call returns a `Result
|
|
51
|
+
* Every fallible call returns a `Result`. A transport
|
|
52
52
|
* failure, a response object that is not one, a malformed header, a partial charge
|
|
53
53
|
* block, an unreplayable request body, a `402` that stands after the repeat: all
|
|
54
54
|
* of them are `err` values carrying an error category. Nothing here throws,
|
|
55
55
|
* including the consumer's own `onCharge` callback, which is called inside a guard
|
|
56
56
|
* so a consumer's bug cannot fail a request that succeeded.
|
|
57
|
-
*
|
|
58
|
-
* Requirements: 23.2, 21.5
|
|
59
57
|
*/
|
|
60
58
|
import { type Address, type Bytes32, type Result } from "../_shared/index.js";
|
|
61
59
|
import { type Logger } from "../logger.js";
|
|
@@ -234,10 +232,10 @@ export interface Tab402Client<Res extends Tab402Response = Tab402Response> {
|
|
|
234
232
|
* Builds the client.
|
|
235
233
|
*
|
|
236
234
|
* Construction is total: it cannot fail and returns a client, not a `Result`.
|
|
237
|
-
* Every fallible thing
|
|
238
|
-
* address, a host with no `fetch
|
|
235
|
+
* Every fallible thing (an unusable `baseUrl`, an `agent` that is not an
|
|
236
|
+
* address, a host with no `fetch`) is reported by the call that needs it, which
|
|
239
237
|
* is the only place a caller can act on it. This matches
|
|
240
|
-
* `
|
|
238
|
+
* `createMonadStrategy` and keeps the SDK's two factories the same shape.
|
|
241
239
|
*/
|
|
242
240
|
export declare function createTab402Client<Res extends Tab402Response = Tab402Response>(options: Tab402ClientOptions<Res>): Tab402Client<Res>;
|
|
243
241
|
//# sourceMappingURL=client-402.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client-402.d.ts","sourceRoot":"","sources":["../../src/http/client-402.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"client-402.d.ts","sourceRoot":"","sources":["../../src/http/client-402.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwDG;AAEH,OAAO,EAA2C,KAAK,OAAO,EAAE,KAAK,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,eAAe,CAAC;AACjH,OAAO,EAAiB,KAAK,MAAM,EAAE,MAAM,cAAc,CAAC;AAE1D,OAAO,EAML,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,YAAY,EAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAuC,KAAK,kBAAkB,EAAE,KAAK,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAGxH;;;;;;;;GAQG;AACH,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,sFAAsF;IACtF,QAAQ,CAAC,OAAO,CAAC,EAAE,YAAY,GAAG,YAAY,GAAG,SAAS,CAAC,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EAAE,CAAC;IACxF,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;CACpC;AAED,iGAAiG;AACjG,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC;CACpC;AAED;;;;;;;;;GASG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,YAAY,CAAC;IAC9C,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED,+EAA+E;AAC/E,MAAM,MAAM,WAAW,CAAC,GAAG,SAAS,cAAc,IAAI,CACpD,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,eAAe,KAClB,OAAO,CAAC,GAAG,CAAC,CAAC;AAElB,sEAAsE;AACtE,MAAM,MAAM,aAAa;AACvB,6EAA6E;AAC3E,SAAS;AACX;;;GAGG;GACD,UAAU,CAAC;AAEf,0EAA0E;AAC1E,MAAM,WAAW,aAAa;IAC5B,+CAA+C;IAC/C,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,wCAAwC;IACxC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;IAChC,8EAA8E;IAC9E,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,yDAAyD;IACzD,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,kEAAkE;IAClE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC;;;;OAIG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,wDAAwD;IACxD,QAAQ,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;IACxB,8DAA8D;IAC9D,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,2EAA2E;AAC3E,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC;IAC7B,0DAA0D;IAC1D,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,0DAA0D;IAC1D,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,qEAAqE;IACrE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,uFAAuF;IACvF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAED,MAAM,WAAW,mBAAmB,CAAC,GAAG,SAAS,cAAc,GAAG,cAAc;IAC9E,gFAAgF;IAChF,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,sDAAsD;IACtD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,+EAA+E;IAC/E,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC,kFAAkF;IAClF,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,IAAI,CAAC;IACpD;;;;;;;OAOG;IACH,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IAC5B,yFAAyF;IACzF,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;;OAKG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,iBAAiB,CAAC;IAClC,6CAA6C;IAC7C,QAAQ,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC;IACtC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,6EAA6E;IAC7E,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B;;;;;OAKG;IACH,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;CACpC;AAED,wCAAwC;AACxC,MAAM,WAAW,iBAAiB;IAChC;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,8EAA8E;IAC9E,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,oEAAoE;IACpE,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,6EAA6E;IAC7E,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,kBAAkB,KAAK,IAAI,CAAC;CAC5D;AAED,MAAM,WAAW,YAAY,CAAC,GAAG,SAAS,cAAc,GAAG,cAAc;IACvE;;;;;;;;;OASG;IACH,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,iBAAiB,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACrE,uEAAuE;IACvE,OAAO,IAAI,SAAS,aAAa,EAAE,CAAC;IACpC,wDAAwD;IACxD,IAAI,IAAI,SAAS,WAAW,EAAE,CAAC;IAC/B,KAAK,CAAC,KAAK,EAAE,YAAY,GAAG,WAAW,GAAG,SAAS,CAAC;IACpD,iFAAiF;IACjF,QAAQ,IAAI,SAAS,kBAAkB,EAAE,CAAC;CAC3C;AAaD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,SAAS,cAAc,GAAG,cAAc,EAC5E,OAAO,EAAE,mBAAmB,CAAC,GAAG,CAAC,GAChC,YAAY,CAAC,GAAG,CAAC,CA8RnB"}
|
package/dist/http/client-402.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The HTTP 402 client wrapper
|
|
2
|
+
* The HTTP 402 client wrapper.
|
|
3
3
|
*
|
|
4
4
|
* ## Tab is post-paid, so a 402 is not a demand for prepayment
|
|
5
5
|
*
|
|
6
6
|
* This is the one thing to understand about this file. A `402` from a Tab Service
|
|
7
7
|
* does not mean "pay now and I will then serve you". Work is delivered first and
|
|
8
|
-
* metered after
|
|
9
|
-
* Agent settles later, asynchronously, on
|
|
8
|
+
* metered after; the charge lands on the Open Tab as an accrual, and the
|
|
9
|
+
* Agent settles later, asynchronously, on Monad, with its own keys, through
|
|
10
10
|
* the payment-strategy seam. So:
|
|
11
11
|
*
|
|
12
12
|
* - the **normal** metered response is a `200` carrying the charge block, and
|
|
13
13
|
* this client records the accrual and hands the response straight back;
|
|
14
|
-
* - a `402` is issued on `LimitExceeded` alone
|
|
14
|
+
* - a `402` is issued on `LimitExceeded` alone: the Agent has no headroom left
|
|
15
15
|
* for that Asset. It is a credit decision, not an invoice;
|
|
16
16
|
* - on a `402` the client records what the Service says the call requires, sends
|
|
17
17
|
* the original request **once** more carrying `Tab-Agent` and
|
|
@@ -25,11 +25,11 @@
|
|
|
25
25
|
* ## Why a repeat at all, if the charge already landed
|
|
26
26
|
*
|
|
27
27
|
* Two cases, and the repeat serves both. On the ordinary path the first attempt
|
|
28
|
-
* may have reached a Service that could not identify the Agent
|
|
29
|
-
* built its own headers or a proxy that dropped them, and the repeat carries the
|
|
28
|
+
* may have reached a Service that could not identify the Agent (a caller that
|
|
29
|
+
* built its own headers, or a proxy that dropped them), and the repeat carries the
|
|
30
30
|
* identity headers explicitly. On the `LimitExceeded` path a Settlement may have
|
|
31
31
|
* landed between the two attempts: `TabSettlement` restores headroom in the
|
|
32
|
-
* same block it moves the Asset
|
|
32
|
+
* same block it moves the Asset, so the second attempt is genuinely a
|
|
33
33
|
* different question rather than the same one asked louder. Exactly one repeat,
|
|
34
34
|
* because a second `402` means the
|
|
35
35
|
* headroom is not coming back within the life of this request, and looping would
|
|
@@ -48,14 +48,12 @@
|
|
|
48
48
|
*
|
|
49
49
|
* ## Zero-throw, everywhere
|
|
50
50
|
*
|
|
51
|
-
* Every fallible call returns a `Result
|
|
51
|
+
* Every fallible call returns a `Result`. A transport
|
|
52
52
|
* failure, a response object that is not one, a malformed header, a partial charge
|
|
53
53
|
* block, an unreplayable request body, a `402` that stands after the repeat: all
|
|
54
54
|
* of them are `err` values carrying an error category. Nothing here throws,
|
|
55
55
|
* including the consumer's own `onCharge` callback, which is called inside a guard
|
|
56
56
|
* so a consumer's bug cannot fail a request that succeeded.
|
|
57
|
-
*
|
|
58
|
-
* Requirements: 23.2, 21.5
|
|
59
57
|
*/
|
|
60
58
|
import { causeOf, isAddress, isBytes32, ok, wrap } from "../_shared/index.js";
|
|
61
59
|
import { defaultLogger } from "../logger.js";
|
|
@@ -67,10 +65,10 @@ import { readPaymentRequired } from "../x402/wire.js";
|
|
|
67
65
|
* Builds the client.
|
|
68
66
|
*
|
|
69
67
|
* Construction is total: it cannot fail and returns a client, not a `Result`.
|
|
70
|
-
* Every fallible thing
|
|
71
|
-
* address, a host with no `fetch
|
|
68
|
+
* Every fallible thing (an unusable `baseUrl`, an `agent` that is not an
|
|
69
|
+
* address, a host with no `fetch`) is reported by the call that needs it, which
|
|
72
70
|
* is the only place a caller can act on it. This matches
|
|
73
|
-
* `
|
|
71
|
+
* `createMonadStrategy` and keeps the SDK's two factories the same shape.
|
|
74
72
|
*/
|
|
75
73
|
export function createTab402Client(options) {
|
|
76
74
|
const logger = options.logger ?? defaultLogger;
|
|
@@ -336,7 +334,7 @@ function hasPaymentRequired(headers) {
|
|
|
336
334
|
* `retryable` is false, and deliberately: the condition does clear, but it clears
|
|
337
335
|
* when the Agent settles and the registry indexes it, not after an interval. A
|
|
338
336
|
* caller told to retry would spin against a Service that is answering correctly.
|
|
339
|
-
* The detail keys are the ones the MCP tools report on `LIMIT_EXCEEDED
|
|
337
|
+
* The detail keys are the ones the MCP tools report on `LIMIT_EXCEEDED`.
|
|
340
338
|
*/
|
|
341
339
|
function limitExceeded(url, charge, attempts) {
|
|
342
340
|
const detail = charge === undefined
|