@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.
Files changed (155) hide show
  1. package/README.md +8 -7
  2. package/dist/_shared/abi.d.ts.map +1 -1
  3. package/dist/_shared/abi.js +6 -3
  4. package/dist/_shared/abi.js.map +1 -1
  5. package/dist/_shared/chains.d.ts +4 -6
  6. package/dist/_shared/chains.d.ts.map +1 -1
  7. package/dist/_shared/chains.js +1 -2
  8. package/dist/_shared/chains.js.map +1 -1
  9. package/dist/_shared/keccak256.d.ts +6 -6
  10. package/dist/_shared/keccak256.js +6 -6
  11. package/dist/_shared/keccak256.js.map +1 -1
  12. package/dist/_shared/result.d.ts +5 -6
  13. package/dist/_shared/result.d.ts.map +1 -1
  14. package/dist/_shared/result.js +5 -6
  15. package/dist/_shared/result.js.map +1 -1
  16. package/dist/cli/client-config.d.ts +4 -5
  17. package/dist/cli/client-config.d.ts.map +1 -1
  18. package/dist/cli/client-config.js +4 -5
  19. package/dist/cli/client-config.js.map +1 -1
  20. package/dist/cli/connect.d.ts +1 -3
  21. package/dist/cli/connect.d.ts.map +1 -1
  22. package/dist/cli/connect.js +1 -3
  23. package/dist/cli/connect.js.map +1 -1
  24. package/dist/cli/doctor.d.ts +1 -3
  25. package/dist/cli/doctor.d.ts.map +1 -1
  26. package/dist/cli/doctor.js +1 -3
  27. package/dist/cli/doctor.js.map +1 -1
  28. package/dist/cli/index.d.ts +1 -1
  29. package/dist/cli/index.js +1 -1
  30. package/dist/cli/index.js.map +1 -1
  31. package/dist/cli/main.d.ts +1 -3
  32. package/dist/cli/main.d.ts.map +1 -1
  33. package/dist/cli/main.js +2 -4
  34. package/dist/cli/main.js.map +1 -1
  35. package/dist/errors.d.ts +2 -4
  36. package/dist/errors.d.ts.map +1 -1
  37. package/dist/errors.js +2 -4
  38. package/dist/errors.js.map +1 -1
  39. package/dist/http/client-402.d.ts +11 -13
  40. package/dist/http/client-402.d.ts.map +1 -1
  41. package/dist/http/client-402.js +12 -14
  42. package/dist/http/client-402.js.map +1 -1
  43. package/dist/http/headers.d.ts +9 -11
  44. package/dist/http/headers.d.ts.map +1 -1
  45. package/dist/http/headers.js +9 -11
  46. package/dist/http/headers.js.map +1 -1
  47. package/dist/http/index.d.ts +0 -2
  48. package/dist/http/index.d.ts.map +1 -1
  49. package/dist/http/index.js +0 -2
  50. package/dist/http/index.js.map +1 -1
  51. package/dist/http/metering-claim.d.ts +0 -2
  52. package/dist/http/metering-claim.d.ts.map +1 -1
  53. package/dist/http/metering-claim.js +0 -2
  54. package/dist/http/metering-claim.js.map +1 -1
  55. package/dist/index.d.ts +15 -12
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +15 -12
  58. package/dist/index.js.map +1 -1
  59. package/dist/logger.d.ts +1 -4
  60. package/dist/logger.d.ts.map +1 -1
  61. package/dist/logger.js +1 -4
  62. package/dist/logger.js.map +1 -1
  63. package/dist/mcp/index.d.ts +1 -1
  64. package/dist/mcp/index.js +1 -1
  65. package/dist/mcp/index.js.map +1 -1
  66. package/dist/mcp/json-schema.d.ts +1 -3
  67. package/dist/mcp/json-schema.d.ts.map +1 -1
  68. package/dist/mcp/json-schema.js +1 -3
  69. package/dist/mcp/json-schema.js.map +1 -1
  70. package/dist/mcp/json.d.ts +0 -2
  71. package/dist/mcp/json.d.ts.map +1 -1
  72. package/dist/mcp/json.js +0 -2
  73. package/dist/mcp/json.js.map +1 -1
  74. package/dist/mcp/registry-client.d.ts +0 -2
  75. package/dist/mcp/registry-client.d.ts.map +1 -1
  76. package/dist/mcp/registry-client.js +3 -4
  77. package/dist/mcp/registry-client.js.map +1 -1
  78. package/dist/mcp/schemas.d.ts +10 -8
  79. package/dist/mcp/schemas.d.ts.map +1 -1
  80. package/dist/mcp/schemas.js +5 -7
  81. package/dist/mcp/schemas.js.map +1 -1
  82. package/dist/mcp/server.d.ts +0 -2
  83. package/dist/mcp/server.d.ts.map +1 -1
  84. package/dist/mcp/server.js +4 -7
  85. package/dist/mcp/server.js.map +1 -1
  86. package/dist/mcp/settings.d.ts +0 -2
  87. package/dist/mcp/settings.d.ts.map +1 -1
  88. package/dist/mcp/settings.js +0 -2
  89. package/dist/mcp/settings.js.map +1 -1
  90. package/dist/mcp/toolset.d.ts +2 -5
  91. package/dist/mcp/toolset.d.ts.map +1 -1
  92. package/dist/mcp/toolset.js +3 -6
  93. package/dist/mcp/toolset.js.map +1 -1
  94. package/dist/payments/config.d.ts +6 -8
  95. package/dist/payments/config.d.ts.map +1 -1
  96. package/dist/payments/config.js +5 -7
  97. package/dist/payments/config.js.map +1 -1
  98. package/dist/payments/index.d.ts +0 -2
  99. package/dist/payments/index.d.ts.map +1 -1
  100. package/dist/payments/index.js +0 -2
  101. package/dist/payments/index.js.map +1 -1
  102. package/dist/payments/registry.d.ts +11 -12
  103. package/dist/payments/registry.d.ts.map +1 -1
  104. package/dist/payments/registry.js +11 -12
  105. package/dist/payments/registry.js.map +1 -1
  106. package/dist/payments/strategy.d.ts +9 -5
  107. package/dist/payments/strategy.d.ts.map +1 -1
  108. package/dist/payments/strategy.js +9 -5
  109. package/dist/payments/strategy.js.map +1 -1
  110. package/dist/proxy/hooks.d.ts +3 -5
  111. package/dist/proxy/hooks.d.ts.map +1 -1
  112. package/dist/proxy/hooks.js +2 -4
  113. package/dist/proxy/hooks.js.map +1 -1
  114. package/dist/proxy/index.d.ts +2 -2
  115. package/dist/proxy/index.js +2 -2
  116. package/dist/proxy/index.js.map +1 -1
  117. package/dist/proxy/proxy.d.ts +3 -5
  118. package/dist/proxy/proxy.d.ts.map +1 -1
  119. package/dist/proxy/proxy.js +2 -4
  120. package/dist/proxy/proxy.js.map +1 -1
  121. package/dist/server/adapters/express.d.ts +0 -2
  122. package/dist/server/adapters/express.d.ts.map +1 -1
  123. package/dist/server/adapters/express.js +0 -2
  124. package/dist/server/adapters/express.js.map +1 -1
  125. package/dist/server/adapters/hono.d.ts +0 -2
  126. package/dist/server/adapters/hono.d.ts.map +1 -1
  127. package/dist/server/adapters/hono.js +0 -2
  128. package/dist/server/adapters/hono.js.map +1 -1
  129. package/dist/server/adapters/next.d.ts +0 -2
  130. package/dist/server/adapters/next.d.ts.map +1 -1
  131. package/dist/server/adapters/next.js +0 -2
  132. package/dist/server/adapters/next.js.map +1 -1
  133. package/dist/server/index.d.ts +5 -5
  134. package/dist/server/index.js +5 -5
  135. package/dist/server/index.js.map +1 -1
  136. package/dist/server/metering.d.ts +9 -11
  137. package/dist/server/metering.d.ts.map +1 -1
  138. package/dist/server/metering.js +6 -8
  139. package/dist/server/metering.js.map +1 -1
  140. package/dist/server/post-paid.d.ts +8 -10
  141. package/dist/server/post-paid.d.ts.map +1 -1
  142. package/dist/server/post-paid.js +7 -9
  143. package/dist/server/post-paid.js.map +1 -1
  144. package/dist/x402/client.d.ts +5 -6
  145. package/dist/x402/client.d.ts.map +1 -1
  146. package/dist/x402/client.js +6 -7
  147. package/dist/x402/client.js.map +1 -1
  148. package/dist/x402/server.d.ts +5 -5
  149. package/dist/x402/server.d.ts.map +1 -1
  150. package/dist/x402/server.js +2 -2
  151. package/dist/x402/server.js.map +1 -1
  152. package/dist/x402/wire.d.ts +1 -1
  153. package/dist/x402/wire.js +1 -1
  154. package/dist/x402/wire.js.map +1 -1
  155. package/package.json +1 -1
@@ -4,7 +4,7 @@
4
4
  * The MCP protocol wiring lives next door in `server.ts`. This file is the
5
5
  * behaviour, and it is separate so the tools can be exercised without a
6
6
  * transport: every test in `test/mcp-tools.test.mjs` calls these directly, which
7
- * is what lets task 16.3 validate every output against its declared schema
7
+ * is what lets the suite validate every output against its declared schema
8
8
  * without standing a server up.
9
9
  *
10
10
  * ## Nothing here throws, including into the transport
@@ -18,11 +18,10 @@
18
18
  * the payload, and for `tab_call` and `tab_settle` it is `ok: false` beside it.
19
19
  *
20
20
  * `LIMIT_EXCEEDED` is the case that earns the discipline. An Agent out of
21
- * headroom is not an error in the Agent, the Service, or the call -- it is the
21
+ * headroom is not an error in the Agent, the Service, or the call: it is the
22
22
  * credit facility working. The tool answers `ok: false` with
23
23
  * `requiredBaseUnits` and `headroomBaseUnits` both filled in, so the model can
24
24
  * settle the difference and call again instead of retrying into the same wall.
25
- * (R21.5)
26
25
  *
27
26
  * ## Every input is validated against the schema that was published
28
27
  *
@@ -30,8 +29,6 @@
30
29
  * the declared defaults and {@link validateJsonValue} enforces the same document
31
30
  * `tools/list` served, so a `limit` of 500 is refused with the same bound the
32
31
  * model was shown.
33
- *
34
- * Requirements: 21.5, 25.1, 25.2, 25.3, 25.4
35
32
  */
36
33
  import { isAddress, ok } from "../_shared/index.js";
37
34
  import { decodeBytes32String, encodeBytes32String } from "ethers";
@@ -213,7 +210,7 @@ export function createTabToolset(options) {
213
210
  ...(settings.x402 === undefined ? {} : { x402: { signer: settings.x402, chainId: BigInt(chainId) } }),
214
211
  });
215
212
  // A Service meters its tools under `/meter/<tool>` off its published
216
- // endpoint, the shape the reference gateway serves and the Dashboard calls,
213
+ // endpoint, the shape Tab's gateway serves and the Dashboard calls,
217
214
  // so the endpoint in the directory is the Service's root and `/hub/<prefix>`
218
215
  // sits beside the tools rather than under them.
219
216
  const url = `${entry.endpoint.replace(/\/+$/, "")}/meter/${encodeURIComponent(input.value.tool)}`;
@@ -1 +1 @@
1
- {"version":3,"file":"toolset.js","sourceRoot":"","sources":["../../src/mcp/toolset.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The four Tab tools, as functions.\n *\n * The MCP protocol wiring lives next door in `server.ts`. This file is the\n * behaviour, and it is separate so the tools can be exercised without a\n * transport: every test in `test/mcp-tools.test.mjs` calls these directly, which\n * is what lets task 16.3 validate every output against its declared schema\n * without standing a server up.\n *\n * ## Nothing here throws, including into the transport\n *\n * A tool that throws over stdio does not produce a bad answer, it produces no\n * answer: the MCP client sees a protocol error, the model sees nothing it can\n * reason about, and a long-running server can lose its transport to one\n * malformed argument. So every entry point below returns a value that validates\n * against the tool's declared output schema, on every path, including the paths\n * where the work failed. A failure is `error: { category, code, message }` in\n * the payload, and for `tab_call` and `tab_settle` it is `ok: false` beside it.\n *\n * `LIMIT_EXCEEDED` is the case that earns the discipline. An Agent out of\n * headroom is not an error in the Agent, the Service, or the call -- it is the\n * credit facility working. The tool answers `ok: false` with\n * `requiredBaseUnits` and `headroomBaseUnits` both filled in, so the model can\n * settle the difference and call again instead of retrying into the same wall.\n * (R21.5)\n *\n * ## Every input is validated against the schema that was published\n *\n * Not a hand-written check that resembles it. {@link applyJsonDefaults} fills in\n * the declared defaults and {@link validateJsonValue} enforces the same document\n * `tools/list` served, so a `limit` of 500 is refused with the same bound the\n * model was shown.\n *\n * Requirements: 21.5, 25.1, 25.2, 25.3, 25.4\n */\n\nimport type { Address, Bytes32, Result, TabError } from \"../_shared/index.js\";\nimport { isAddress, ok } from \"../_shared/index.js\";\nimport { decodeBytes32String, encodeBytes32String } from \"ethers\";\n\nimport { fail, notFoundError, tabError, upstreamError, validationError } from \"../errors.js\";\nimport { createTab402Client, type Tab402Fetch, type Tab402Response } from \"../http/client-402.js\";\nimport { defaultLogger, type Logger } from \"../logger.js\";\nimport type { ServiceHeaderRequest, TabServiceEntry } from \"../payments/config.js\";\nimport { loadTabConfig } from \"../payments/config.js\";\nimport { moduleStrategyRegistry, type StrategyRegistry } from \"../payments/registry.js\";\nimport type { AssetRef, PaymentStrategy, SettleRequest } from \"../payments/strategy.js\";\nimport { assetFacts, assetStringOf, formatAsset, parseAsset } from \"./assets.js\";\nimport { applyJsonDefaults, validateJsonValue } from \"./json-schema.js\";\nimport {\n asArray,\n asBoolean,\n asDigits,\n asDigitsOrNull,\n asNumber,\n asRecord,\n asString,\n asStringOrNull,\n field,\n isRecord,\n path as jsonPath,\n secondsToIso,\n} from \"./json.js\";\nimport { createRegistryReadClient, type RegistryFetch, type RegistryReadClient } from \"./registry-client.js\";\nimport { fetchHubManifest, type HubFetch } from \"../x402/hub.js\";\nimport {\n TAB_CALL_INPUT,\n TAB_DISCOVER_INPUT,\n TAB_SETTLE_INPUT,\n TAB_STATUS_INPUT,\n tabToolByName,\n} from \"./schemas.js\";\nimport type { TabMcpSettings } from \"./settings.js\";\n\n// ---------------------------------------------------------------- output types\n\n/** The error block every output can carry. */\nexport interface TabToolError {\n readonly category: TabError[\"category\"];\n readonly code: string;\n readonly message: string;\n readonly retryable: boolean;\n readonly requiredBaseUnits?: string;\n readonly headroomBaseUnits?: string;\n}\n\nexport interface DiscoveredAsset {\n readonly chainId: number;\n readonly address: string;\n readonly symbol: string | null;\n readonly decimals: number | null;\n readonly collectionAddress: string | null;\n readonly curatedAsset: boolean;\n}\n\nexport interface DiscoveredTool {\n readonly tool: string;\n readonly toolName: string | null;\n readonly asset: string;\n readonly priceBaseUnits: string;\n}\n\nexport interface DiscoveredBond {\n readonly asset: string;\n readonly stakedBaseUnits: string;\n readonly freeBaseUnits: string;\n}\n\nexport interface DiscoveredHubEndpoint {\n readonly endpoint: string;\n readonly name: string | null;\n readonly description: string | null;\n readonly priceType: string;\n readonly priceUsd: string | null;\n readonly priceBaseUnits: string | null;\n readonly networks: readonly string[];\n}\n\n/** The API Hub provider a Service fronts, with its endpoints as the Service's tools. */\nexport interface DiscoveredHub {\n readonly provider: string;\n readonly prefix: string;\n readonly endpoints: readonly DiscoveredHubEndpoint[];\n readonly total: number;\n /** Present when the manifest could not be read; `endpoints` is then empty. */\n readonly error?: TabToolError;\n}\n\nexport interface DiscoveredService {\n readonly serviceId: string;\n readonly name: string | null;\n readonly endpoint: string | null;\n readonly tier: \"curated\" | \"permissionless\" | \"unknown\";\n readonly settlementWindowSeconds: number;\n readonly assets: readonly DiscoveredAsset[];\n readonly tools: readonly DiscoveredTool[];\n readonly bonds: readonly DiscoveredBond[];\n readonly pendingChange: { readonly changeId: string; readonly kind: string | null; readonly etaIso: string | null } | null;\n readonly hub?: DiscoveredHub;\n}\n\nexport interface TabDiscoverOutput {\n readonly services: readonly DiscoveredService[];\n readonly error?: TabToolError;\n}\n\n/** The prepaid receipt a call carries when x402 paid for it instead of the Open Tab. */\nexport interface TabCallX402Block {\n readonly txHash: string;\n readonly network: string;\n readonly amountBaseUnits: string;\n readonly asset: string;\n readonly payTo: string;\n readonly payer: string;\n readonly explorerUrl: string | null;\n}\n\nexport interface TabCallOutput {\n readonly ok: boolean;\n readonly result?: unknown;\n readonly charge?: { readonly amountBaseUnits: string; readonly asset: string; readonly tool: string };\n readonly tab?: {\n readonly openTabBaseUnits: string;\n readonly headroomBaseUnits: string;\n readonly creditLimitBaseUnits?: string;\n readonly asset: string;\n readonly settlementDueIso?: string | null;\n };\n readonly x402?: TabCallX402Block;\n readonly error?: TabToolError;\n}\n\nexport interface TabStatusOutput {\n readonly agent: string;\n /**\n * The Monad block every figure here is as at, from the index that served them.\n *\n * A Settlement in a later block is not yet reflected; the index reaches it\n * within a few blocks. Null when the index has never ticked or the read failed.\n */\n readonly indexedBlock: number | null;\n readonly perAsset: readonly {\n readonly asset: string;\n readonly creditLimitBaseUnits: string | null;\n readonly openTabBaseUnits: string;\n readonly prepaidBaseUnits: string | null;\n readonly headroomBaseUnits: string | null;\n readonly delinquent: boolean;\n readonly tabs: readonly {\n readonly tabId: string | null;\n readonly serviceId: string;\n readonly openBaseUnits: string;\n readonly dueIso: string | null;\n }[];\n }[];\n readonly settlements?: readonly {\n readonly settlementId: string;\n readonly txHash: string;\n readonly serviceId: string;\n readonly asset: string;\n readonly amountBaseUnits: string;\n readonly appliedBaseUnits: string;\n readonly prepaidBaseUnits: string;\n readonly explorerUrl: string | null;\n }[];\n readonly error?: TabToolError;\n}\n\nexport interface TabSettleOutput {\n readonly ok: boolean;\n readonly dryRun: boolean;\n readonly txHash?: string | null;\n readonly chainId?: number | null;\n readonly amountBaseUnits: string;\n readonly settlementId?: string | null;\n readonly appliedBaseUnits?: string | null;\n readonly prepaidBaseUnits?: string | null;\n readonly explorerUrl?: string | null;\n readonly error?: TabToolError;\n}\n\n// ---------------------------------------------------------------- the toolset\n\nexport interface TabToolsetOptions {\n readonly settings: TabMcpSettings;\n /** Overrides the client built from `settings.registryUrl`. A test hands in a stub. */\n readonly registry?: RegistryReadClient;\n /** The `fetch` `tab_call` sends Service requests with. Defaults to the host's. */\n readonly fetchImpl?: Tab402Fetch<Tab402Response>;\n /**\n * The `fetch` the registry read client uses, when one is built from settings.\n *\n * Separate from {@link TabToolsetOptions.fetchImpl} because the two talk to\n * different things: one to a third party's Service, one to the read API. A\n * test that stubs a Service should not silently start answering registry\n * reads too.\n */\n readonly registryFetch?: RegistryFetch;\n /** The `fetch` `tab_discover` reads API Hub manifests with. Defaults to the host's. */\n readonly hubFetch?: HubFetch;\n /**\n * Where `tab_settle` resolves a strategy.\n *\n * Absent, the module-level registry is used, and `tab_settle` fills it from\n * `tab.config` the first time it is called. See {@link TabToolset.settle} for\n * why that load is deferred rather than done at startup.\n */\n readonly strategies?: StrategyRegistry;\n /** Where the deferred `tab.config` load walks from. Defaults to the working directory. */\n readonly cwd?: string;\n readonly logger?: Logger;\n readonly now?: () => number;\n /**\n * The environment the Asset table is read from: on Testnet `MOCK_USDC_ADDRESS`\n * names the token this deployment settles in. Defaults to the process\n * environment; a test passes its own so a machine's configuration cannot\n * change a result.\n */\n readonly env?: NodeJS.ProcessEnv;\n}\n\n/** The four tools, plus a dispatcher the MCP server calls by name. */\nexport interface TabToolset {\n discover(input: unknown): Promise<TabDiscoverOutput>;\n call(input: unknown): Promise<TabCallOutput>;\n status(input: unknown): Promise<TabStatusOutput>;\n settle(input: unknown): Promise<TabSettleOutput>;\n /** Dispatches by MCP tool name. `NOT_FOUND` for a name this package does not declare. */\n invoke(name: string, input: unknown): Promise<Result<unknown>>;\n}\n\nconst errorOf = (error: TabError): TabToolError => {\n const details = asRecord(error.details);\n const required = asDigitsOrNull(details[\"requiredBaseUnits\"]);\n const headroom = asDigitsOrNull(details[\"headroomBaseUnits\"]);\n return {\n category: error.category,\n code: error.code,\n message: error.message,\n retryable: error.retryable,\n ...(required === null ? {} : { requiredBaseUnits: required }),\n ...(headroom === null ? {} : { headroomBaseUnits: headroom }),\n };\n};\n\n/** Validates a tool input against the schema that was published for it. */\nfunction readInput<T>(toolName: string, raw: unknown): Result<T> {\n const declaration = tabToolByName(toolName);\n if (declaration === undefined) {\n return notFoundError(\"TOOL_UNKNOWN\", `\\`${toolName}\\` is not a tool this server declares`, {\n details: { tool: toolName },\n });\n }\n const supplied = raw === undefined || raw === null ? {} : raw;\n return validateJsonValue<T>(\n declaration.inputSchema,\n applyJsonDefaults(declaration.inputSchema, supplied),\n `${toolName} input`,\n \"INPUT_INVALID\",\n );\n}\n\n/** The ascii a 32-byte word decodes to, or null when it is not padded ascii. */\nfunction wordToName(word: string): string | null {\n try {\n const decoded = decodeBytes32String(word);\n return /^[\\x20-\\x7e]+$/.test(decoded) ? decoded : null;\n } catch {\n return null;\n }\n}\n\n/** A tool name as its 32-byte key: a hex word passes through, ascii is padded. */\nfunction toolKeyOf(tool: string): Result<Bytes32> {\n if (/^0x[a-fA-F0-9]{64}$/.test(tool)) return ok(tool.toLowerCase() as Bytes32);\n try {\n return ok(encodeBytes32String(tool).toLowerCase() as Bytes32);\n } catch {\n return validationError(\n \"TOOL_NAME_TOO_LONG\",\n `\\`${tool}\\` cannot be a tool key: a tool name is stored as 31 bytes of ascii, zero-padded, or given as a 32-byte hex word`,\n { details: { tool } },\n );\n }\n}\n\nconst ZERO_WORD = `0x${\"00\".repeat(32)}` as Bytes32;\n\nexport function createTabToolset(options: TabToolsetOptions): TabToolset {\n const settings = options.settings;\n const logger = options.logger ?? defaultLogger;\n const now = options.now ?? (() => Date.now());\n const env = options.env ?? process.env;\n const chainId = settings.chainId;\n\n /**\n * The strategy registry, filled from `tab.config` on first use.\n *\n * Deferred, and this is the one piece of laziness in the package that is not\n * an optimisation. Resolving a strategy entry runs consumer code: a factory in\n * a config file typically builds a signer, and a signer is built from a key.\n * Doing that at startup would mean `tab_discover`, `tab_status` and `tab\n * doctor` -- three surfaces whose whole claim is that they need no key --\n * loading one every time the server starts. So the load happens inside\n * `tab_settle`, the only tool that signs, at the moment it needs a strategy.\n *\n * Memoised, so a second Settlement does not re-import the config, and\n * registration is idempotent by strategy id in any case.\n */\n let loading: Promise<StrategyRegistry> | undefined;\n const strategiesFor = (): Promise<StrategyRegistry> => {\n if (options.strategies !== undefined) return Promise.resolve(options.strategies);\n loading ??= (async () => {\n const registry = moduleStrategyRegistry(logger);\n if (registry.list().length > 0) return registry;\n const loaded = await loadTabConfig({\n ...(options.cwd === undefined ? {} : { cwd: options.cwd }),\n registry,\n logger,\n });\n if (!loaded.ok) {\n logger.warn(\"tab.config could not be loaded, so no payment strategy is registered\", {\n code: loaded.error.code,\n message: loaded.error.message,\n });\n }\n return registry;\n })();\n return loading;\n };\n\n const directory = new Map<string, TabServiceEntry>(\n settings.services.map((entry) => [entry.serviceId.toLowerCase(), entry]),\n );\n\n /** The registry client, or the one failure that stands in for it. */\n const registryOf = (): Result<RegistryReadClient> => {\n if (options.registry !== undefined) return ok(options.registry);\n if (settings.registryUrl === undefined) {\n return upstreamError(\n \"REGISTRY_UNCONFIGURED\",\n \"no Tab registry read API is configured, so on-chain discovery and status cannot be read; set NEXT_PUBLIC_REGISTRY_API_URL, or registryUrl in tab.config\",\n );\n }\n return ok(\n createRegistryReadClient({\n baseUrl: settings.registryUrl,\n ...(options.registryFetch === undefined ? {} : { fetchImpl: options.registryFetch }),\n logger,\n }),\n );\n };\n\n // ------------------------------------------------------------- tab_discover\n\n const discover = async (raw: unknown): Promise<TabDiscoverOutput> => {\n const input = readInput<{ asset?: string; tier: string; search?: string; limit: number }>(\"tab_discover\", raw);\n if (!input.ok) return { services: [], error: errorOf(input.error) };\n\n let wanted: AssetRef | undefined;\n if (input.value.asset !== undefined) {\n const parsed = parseAsset(input.value.asset);\n if (!parsed.ok) return { services: [], error: errorOf(parsed.error) };\n wanted = parsed.value;\n }\n\n const registry = registryOf();\n if (!registry.ok) return { services: [], error: errorOf(registry.error) };\n\n // A filtered request has to over-fetch: the read API pages by registration\n // order and filters nothing, so asking for `limit` rows would return `limit`\n // rows before the filter and fewer after it.\n const filtered = wanted !== undefined || input.value.search !== undefined || input.value.tier !== \"any\";\n const body = await registry.value.services(filtered ? 200 : input.value.limit);\n if (!body.ok) return { services: [], error: errorOf(body.error) };\n\n const services = await Promise.all(\n asArray(field(body.value, \"services\"))\n .map((entry) => toDiscoveredService(entry, directory, chainId, env))\n .filter((service) => matches(service, input.value.tier, input.value.search, wanted))\n .slice(0, input.value.limit)\n .map((service) => withHub(service, directory.get(service.serviceId), options.hubFetch)),\n );\n\n return { services };\n };\n\n // ---------------------------------------------------------------- tab_call\n\n const call = async (raw: unknown): Promise<TabCallOutput> => {\n const input = readInput<{\n serviceId: string;\n tool: string;\n asset?: string;\n arguments?: Record<string, unknown>;\n timeoutMs: number;\n }>(\"tab_call\", raw);\n if (!input.ok) return { ok: false, error: errorOf(input.error) };\n\n if (settings.agent === undefined) return { ok: false, error: errorOf(agentUnconfigured()) };\n\n const serviceId = input.value.serviceId.toLowerCase();\n const entry = directory.get(serviceId);\n if (entry === undefined) {\n return {\n ok: false,\n error: errorOf(\n tabError(\n \"NOT_FOUND\",\n \"SERVICE_ENDPOINT_UNKNOWN\",\n `no endpoint is configured for Service ${serviceId}; the chain records no URL, so add it to the \\`services\\` list in tab.config`,\n { details: { serviceId, configured: [...directory.keys()].join(\", \") } },\n ),\n ),\n };\n }\n\n const toolKey = toolKeyOf(input.value.tool);\n if (!toolKey.ok) return { ok: false, error: errorOf(toolKey.error) };\n\n const client = createTab402Client({\n baseUrl: entry.endpoint,\n agent: settings.agent,\n // The credit decision is the Service's, and this tool reports it rather than\n // arguing with it. A repeat would meter the same call twice on the path where\n // the first attempt was declined, so the repeat is off.\n maxRetries: 0,\n logger,\n now,\n ...(options.fetchImpl === undefined ? {} : { fetchImpl: options.fetchImpl }),\n ...(settings.strategyId === undefined ? {} : { strategyId: settings.strategyId }),\n // The prepaid fallback, only when tab.config declared a signer factory. The\n // factory is called at the moment a refusal carries an x402 offer and not\n // before, which is what keeps this tool keyless on every other path.\n ...(settings.x402 === undefined ? {} : { x402: { signer: settings.x402, chainId: BigInt(chainId) } }),\n });\n\n // A Service meters its tools under `/meter/<tool>` off its published\n // endpoint, the shape the reference gateway serves and the Dashboard calls,\n // so the endpoint in the directory is the Service's root and `/hub/<prefix>`\n // sits beside the tools rather than under them.\n const url = `${entry.endpoint.replace(/\\/+$/, \"\")}/meter/${encodeURIComponent(input.value.tool)}`;\n\n const supplied = await serviceHeaders(entry, {\n method: \"POST\",\n url,\n tool: input.value.tool,\n agent: settings.agent,\n serviceId,\n });\n if (!supplied.ok) return { ok: false, error: errorOf(supplied.error) };\n\n const response = await client.fetch(url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", ...supplied.value },\n body: JSON.stringify(input.value.arguments ?? {}),\n signal: timeoutSignal(input.value.timeoutMs),\n });\n\n const charges = client.charges();\n const charge = charges.at(-1);\n const payment = client.payments().at(-1);\n const x402Block: TabCallX402Block | undefined =\n payment === undefined\n ? undefined\n : {\n txHash: payment.txHash,\n network: payment.network,\n amountBaseUnits: payment.amount.toString(10),\n asset: formatAsset(Number(payment.chainId), payment.asset),\n payTo: payment.payTo,\n payer: payment.payer,\n explorerUrl: explorerTx(settings.explorerUrl, payment.txHash),\n };\n const chargeBlock =\n charge === undefined\n ? undefined\n : {\n amountBaseUnits: charge.amount.toString(10),\n asset: formatAsset(charge.asset.chainId, charge.asset.address),\n tool: charge.tool,\n };\n const tabBlock =\n charge === undefined\n ? undefined\n : {\n openTabBaseUnits: charge.openTab.toString(10),\n headroomBaseUnits: charge.headroom.toString(10),\n asset: formatAsset(charge.asset.chainId, charge.asset.address),\n settlementDueIso: null,\n };\n\n if (!response.ok) {\n // A 402 that still stands is the headroom case, and it is the one failure\n // this tool restates rather than passes through: the model needs both\n // figures side by side to decide whether to settle. A standing 402 that\n // an x402 signer tried and failed to pay keeps the payment error instead,\n // because \"the facilitator refused the signature\" is the actionable fact.\n if (charge !== undefined && charge.outcome === \"declined\" && response.error.code === \"LIMIT_EXCEEDED\") {\n return {\n ok: false,\n ...(chargeBlock === undefined ? {} : { charge: chargeBlock }),\n ...(tabBlock === undefined ? {} : { tab: tabBlock }),\n error: {\n // `LIMIT` and not `CONFLICT`: the category maps to HTTP 402 everywhere\n // else in Tab, which is exactly what the Service answered.\n category: \"LIMIT\",\n code: \"LIMIT_EXCEEDED\",\n message: `this call needs ${charge.amount.toString(10)} base units and the Agent has ${charge.headroom.toString(10)} of headroom for the Asset; settle with tab_settle and call again`,\n retryable: false,\n requiredBaseUnits: charge.amount.toString(10),\n headroomBaseUnits: charge.headroom.toString(10),\n },\n };\n }\n return {\n ok: false,\n ...(chargeBlock === undefined ? {} : { charge: chargeBlock }),\n ...(tabBlock === undefined ? {} : { tab: tabBlock }),\n error: errorOf(response.error),\n };\n }\n\n const status = response.value.status;\n const body = await readBody(response.value);\n if (status < 200 || status >= 300) {\n return {\n ok: false,\n ...(chargeBlock === undefined ? {} : { charge: chargeBlock }),\n ...(tabBlock === undefined ? {} : { tab: tabBlock }),\n ...(x402Block === undefined ? {} : { x402: x402Block }),\n error: serviceRefusal(status, body, input.value.tool),\n };\n }\n\n const result = body;\n return {\n ok: true,\n result,\n // A prepaid call carries the credit refusal it was answered with, so the\n // model sees both what the tab could not cover and what paid for it.\n ...(chargeBlock === undefined ? {} : { charge: chargeBlock }),\n ...(tabBlock === undefined ? {} : { tab: tabBlock }),\n ...(x402Block === undefined ? {} : { x402: x402Block }),\n };\n };\n\n // -------------------------------------------------------------- tab_status\n\n const status = async (raw: unknown): Promise<TabStatusOutput> => {\n const input = readInput<{ agent?: string; asset?: string; historyLimit: number }>(\"tab_status\", raw);\n const agent = (input.ok ? input.value.agent : undefined) ?? settings.agent;\n const subject = agent ?? \"0x0000000000000000000000000000000000000000\";\n\n if (!input.ok) return { agent: subject, indexedBlock: null, perAsset: [], error: errorOf(input.error) };\n if (agent === undefined) {\n return { agent: subject, indexedBlock: null, perAsset: [], error: errorOf(agentUnconfigured()) };\n }\n\n let assetFilter: string | undefined;\n if (input.value.asset !== undefined) {\n const parsed = parseAsset(input.value.asset);\n if (!parsed.ok) return { agent: agent.toLowerCase(), indexedBlock: null, perAsset: [], error: errorOf(parsed.error) };\n assetFilter = parsed.value.address.toLowerCase();\n }\n\n const registry = registryOf();\n if (!registry.ok) return { agent: agent.toLowerCase(), indexedBlock: null, perAsset: [], error: errorOf(registry.error) };\n\n const body = await registry.value.agent(agent);\n if (!body.ok) return { agent: agent.toLowerCase(), indexedBlock: null, perAsset: [], error: errorOf(body.error) };\n\n // The block the index had read to when it answered. Stated, because a\n // Settlement the Agent sent a moment ago sits in a later block and an\n // answer that looked current while omitting it would be the misleading kind.\n const horizon = jsonPath(body.value, \"index\", \"lastBlock\");\n const indexedBlock = typeof horizon === \"number\" && Number.isInteger(horizon) && horizon >= 0 ? horizon : null;\n\n const perAsset = asArray(field(body.value, \"assets\"))\n .map((entry) => toPerAsset(entry, input.value.historyLimit, chainId))\n .filter((entry): entry is NonNullable<typeof entry> => entry !== null)\n .filter((entry) => assetFilter === undefined || entry.assetAddress === assetFilter)\n .map(({ assetAddress: _assetAddress, ...rest }) => rest);\n let settlements: TabStatusOutput[\"settlements\"] = [];\n if (input.value.historyLimit > 0) {\n const settled = await registry.value.settlements({\n agent,\n ...(assetFilter === undefined ? {} : { asset: assetFilter }),\n limit: input.value.historyLimit,\n });\n if (settled.ok) {\n settlements = asArray(field(settled.value, \"settlements\")).map((row) =>\n toSettlementRow(row, settings.explorerUrl, chainId),\n );\n } else {\n logger.warn(\"the settlement feed could not be read; status reports credit without history\", {\n code: settled.error.code,\n });\n }\n }\n return { agent: agent.toLowerCase(), indexedBlock, perAsset, settlements };\n };\n\n // -------------------------------------------------------------- tab_settle\n\n const settle = async (raw: unknown): Promise<TabSettleOutput> => {\n const input = readInput<{\n serviceId: string;\n asset: string;\n amountBaseUnits: string;\n strategyId?: string;\n dryRun: boolean;\n }>(\"tab_settle\", raw);\n if (!input.ok) return { ok: false, dryRun: false, amountBaseUnits: \"0\", error: errorOf(input.error) };\n const dryRun = input.value.dryRun;\n const amountBaseUnits = input.value.amountBaseUnits;\n const failure = (error: TabError): TabSettleOutput => ({\n ok: false,\n dryRun,\n amountBaseUnits,\n error: errorOf(error),\n });\n if (settings.agent === undefined) return failure(agentUnconfigured());\n const asset = parseAsset(input.value.asset, \"asset\", env);\n if (!asset.ok) return failure(asset.error);\n const amount = BigInt(amountBaseUnits);\n if (amount === 0n) {\n return failure(\n tabError(\"VALIDATION\", \"AMOUNT_ZERO\", \"a Settlement of zero base units moves nothing and proves nothing\"),\n );\n }\n // The strategy is resolved before the Service is read, because it is a local\n // lookup and the Service is a network read: an Agent with no strategy for the\n // Asset should be told that, not made to wait for a read it could not use.\n const strategy = resolveStrategy(\n await strategiesFor(),\n input.value.strategyId ?? settings.strategyId,\n asset.value,\n );\n if (!strategy.ok) return failure(strategy.error);\n const serviceId = input.value.serviceId.toLowerCase();\n const accepted = await serviceAcceptsAsset(registryOf(), serviceId, asset.value);\n if (!accepted.ok) return failure(accepted.error);\n const request: SettleRequest = {\n agent: settings.agent,\n serviceId: serviceId as Bytes32,\n asset: asset.value,\n amount,\n };\n if (dryRun) {\n const quote = await strategy.value.quote(request);\n if (!quote.ok) return failure(quote.error);\n return {\n ok: true,\n dryRun: true,\n txHash: null,\n chainId: Number(asset.value.chainId),\n amountBaseUnits,\n settlementId: null,\n appliedBaseUnits: null,\n prepaidBaseUnits: null,\n explorerUrl: null,\n };\n }\n const receipt = await strategy.value.settle(request);\n if (!receipt.ok) return failure(receipt.error);\n return {\n ok: true,\n dryRun: false,\n txHash: receipt.value.txHash,\n chainId: Number(receipt.value.chainId),\n amountBaseUnits: receipt.value.amount.toString(10),\n settlementId: receipt.value.settlementId,\n appliedBaseUnits: receipt.value.applied === null ? null : receipt.value.applied.toString(10),\n prepaidBaseUnits: receipt.value.toPrepaid === null ? null : receipt.value.toPrepaid.toString(10),\n explorerUrl: explorerTx(settings.explorerUrl, receipt.value.txHash),\n };\n };\n\n // -------------------------------------------------------------- dispatch\n\n const invoke = async (name: string, input: unknown): Promise<Result<unknown>> => {\n switch (name) {\n case \"tab_discover\":\n return ok(await discover(input));\n case \"tab_call\":\n return ok(await call(input));\n case \"tab_status\":\n return ok(await status(input));\n case \"tab_settle\":\n return ok(await settle(input));\n default:\n return notFoundError(\"TOOL_UNKNOWN\", `\\`${name}\\` is not a tool this server declares`, {\n details: { tool: name },\n });\n }\n };\n\n return { discover, call, status, settle, invoke };\n}\n\n// ---------------------------------------------------------------- mapping\n\n/**\n * The one setting no tool that touches a tab can proceed without.\n *\n * An Agent address, never a key. Deriving the address from a signing key would\n * mean this process holds one, and the whole point of the split is that\n * discovery, calling and status hold none.\n */\nconst agentUnconfigured = (): TabError =>\n tabError(\n \"VALIDATION\",\n \"AGENT_UNCONFIGURED\",\n \"no Agent address is configured, so there is no Open Tab to meter against; set `agent` in tab.config, or pass it to this tool where the schema allows it\",\n );\n\n/**\n * Names an Asset the index reports as a bare address.\n *\n * `TabBook` keys an Asset by token address alone, one ledger per address and no\n * chain column, while everything that crosses the MCP boundary is\n * `chainId:address`, because the SDK may be pointed at Mainnet or Testnet and a\n * bare address is ambiguous between the two. The chain id is the one the\n * settings resolved, which is the one the registry this toolset reads indexes.\n */\nconst assetStringFor = (address: string, chainId: number): string => formatAsset(chainId, address.toLowerCase());\n\n/** A transaction link on the configured explorer, or null for anything that is not a hash. */\nconst explorerTx = (explorerUrl: string, txHash: string): string | null =>\n /^0x[a-fA-F0-9]{64}$/.test(txHash) ? `${explorerUrl.replace(/\\/+$/, \"\")}/tx/${txHash}` : null;\n\nfunction toDiscoveredService(\n entry: unknown,\n directory: Map<string, TabServiceEntry>,\n chainId: number,\n env: NodeJS.ProcessEnv,\n): DiscoveredService {\n const serviceId = asString(field(entry, \"serviceId\"), \"\").toLowerCase();\n const configured = directory.get(serviceId);\n\n const assets: DiscoveredAsset[] = [];\n for (const accepted of asArray(field(entry, \"acceptedAssets\"))) {\n const address = asString(field(accepted, \"asset\"), \"\").toLowerCase();\n if (!isAddress(address)) continue;\n const collection = asStringOrNull(field(accepted, \"collection\"));\n const facts = assetFacts(chainId, address, env);\n assets.push({\n chainId,\n address,\n symbol: facts.symbol,\n decimals: facts.decimals,\n collectionAddress: collection === null ? null : collection.toLowerCase(),\n curatedAsset: facts.curatedAsset,\n });\n }\n\n const nameAsset = (address: string): string => formatAsset(chainId, address);\n\n const tools: DiscoveredTool[] = asArray(field(entry, \"prices\")).map((price) => {\n const tool = asString(field(price, \"tool\"), ZERO_WORD).toLowerCase();\n return {\n tool,\n toolName: wordToName(tool),\n asset: nameAsset(asString(field(price, \"asset\"), \"\")),\n priceBaseUnits: asDigits(field(price, \"baseUnits\"), \"0\"),\n };\n });\n\n const bonds: DiscoveredBond[] = asArray(field(entry, \"bond\")).map((bond) => ({\n asset: nameAsset(asString(field(bond, \"asset\"), \"\")),\n stakedBaseUnits: asDigits(field(bond, \"staked\"), \"0\"),\n freeBaseUnits: asDigits(field(bond, \"free\"), \"0\"),\n }));\n\n const pending = asArray(field(entry, \"pendingChanges\"))[0];\n const pendingChange =\n pending === undefined\n ? null\n : {\n changeId: asString(field(pending, \"changeId\"), ZERO_WORD).toLowerCase(),\n kind: asStringOrNull(field(pending, \"kindName\")),\n etaIso: asStringOrNull(field(pending, \"etaIso\")),\n };\n\n const tierName = asString(jsonPath(entry, \"tier\", \"name\"), \"\").toLowerCase();\n\n return {\n serviceId,\n name: configured?.name ?? wordToName(serviceId),\n endpoint: configured?.endpoint ?? null,\n tier: tierName === \"curated\" ? \"curated\" : tierName === \"permissionless\" ? \"permissionless\" : \"unknown\",\n settlementWindowSeconds: asNumber(jsonPath(entry, \"settlementWindowSeconds\", \"value\"), 0),\n assets,\n tools,\n bonds,\n pendingChange,\n };\n}\n\n/**\n * Attaches the fronted API Hub provider's endpoints to a discovered Service.\n *\n * A manifest that cannot be read is reported inside the `hub` block rather than\n * failing discovery: the Service is still real and its on-chain tools are still\n * listed, and the Hub's catalogue is an addition the chain does not carry.\n */\nasync function withHub(\n service: DiscoveredService,\n configured: TabServiceEntry | undefined,\n hubFetch: HubFetch | undefined,\n): Promise<DiscoveredService> {\n const hub = configured?.hub;\n if (hub === undefined) return service;\n const prefix = (hub.prefix ?? hub.provider).replace(/^\\/+|\\/+$/g, \"\");\n const manifest = await fetchHubManifest({\n provider: hub.provider,\n ...(hub.manifestUrl === undefined ? {} : { manifestUrl: hub.manifestUrl }),\n ...(hubFetch === undefined ? {} : { fetchImpl: hubFetch }),\n });\n if (!manifest.ok) {\n return { ...service, hub: { provider: hub.provider, prefix, endpoints: [], total: 0, error: errorOf(manifest.error) } };\n }\n return {\n ...service,\n hub: {\n provider: manifest.value.provider,\n prefix,\n endpoints: manifest.value.endpoints.map((endpoint) => ({\n endpoint: endpoint.endpoint,\n name: endpoint.name,\n description: endpoint.description,\n priceType: endpoint.priceType,\n priceUsd: endpoint.priceUsd,\n priceBaseUnits: endpoint.priceBaseUnits,\n networks: endpoint.networks,\n })),\n total: manifest.value.total,\n },\n };\n}\n\nfunction matches(\n service: DiscoveredService,\n tier: string,\n search: string | undefined,\n asset: AssetRef | undefined,\n): boolean {\n if (tier !== \"any\" && service.tier !== tier) return false;\n if (asset !== undefined) {\n const wanted = assetStringOf(asset);\n if (!service.assets.some((entry) => formatAsset(entry.chainId, entry.address) === wanted)) return false;\n }\n if (search !== undefined) {\n const needle = search.toLowerCase();\n const haystack = `${service.serviceId} ${service.name ?? \"\"}`.toLowerCase();\n if (!haystack.includes(needle)) return false;\n }\n return true;\n}\n\nfunction toPerAsset(\n entry: unknown,\n historyLimit: number,\n chainId: number,\n): (TabStatusOutput[\"perAsset\"][number] & { readonly assetAddress: string }) | null {\n const address = asString(field(entry, \"asset\"), \"\").toLowerCase();\n if (!isAddress(address)) return null;\n\n const openTab =\n asDigitsOrNull(jsonPath(entry, \"headroom\", \"openTab\")) ?? asDigits(jsonPath(entry, \"openTab\", \"observed\"), \"0\");\n\n const tabs = asArray(jsonPath(entry, \"openTab\", \"tabs\"))\n .slice(0, historyLimit)\n .map((tab) => {\n // The index keys a tab observation by Agent, Service and Asset, not by the\n // `TabBook` tabId, so the identity is often genuinely absent. Reporting the\n // zero word here would name a tab that does not exist.\n const tabId = asStringOrNull(field(tab, \"tabId\"));\n return {\n tabId: tabId !== null && /^0x[a-fA-F0-9]{64}$/.test(tabId) ? tabId.toLowerCase() : null,\n serviceId: asString(field(tab, \"serviceId\"), ZERO_WORD).toLowerCase(),\n openBaseUnits: asDigits(field(tab, \"openAfter\"), \"0\"),\n dueIso: null,\n };\n });\n\n return {\n assetAddress: address,\n asset: assetStringFor(address, chainId),\n creditLimitBaseUnits: asDigitsOrNull(jsonPath(entry, \"creditLimit\", \"value\")),\n openTabBaseUnits: openTab,\n prepaidBaseUnits: asDigitsOrNull(jsonPath(entry, \"settlements\", \"prepaidTotal\")),\n headroomBaseUnits: asDigitsOrNull(jsonPath(entry, \"headroom\", \"value\")),\n delinquent: asBoolean(jsonPath(entry, \"delinquency\", \"delinquent\"), false),\n tabs,\n };\n}\n\nfunction toSettlementRow(\n row: unknown,\n explorerUrl: string,\n chainId: number,\n): NonNullable<TabStatusOutput[\"settlements\"]>[number] {\n const txHash = asString(jsonPath(row, \"monad\", \"txHash\"), \"\");\n return {\n settlementId: asString(field(row, \"settlementId\"), ZERO_WORD).toLowerCase(),\n txHash: txHash.toLowerCase(),\n serviceId: asString(field(row, \"serviceId\"), ZERO_WORD).toLowerCase(),\n asset: formatAsset(chainId, asString(field(row, \"asset\"), \"\")),\n amountBaseUnits: asDigits(field(row, \"amount\"), \"0\"),\n appliedBaseUnits: asDigits(field(row, \"applied\"), \"0\"),\n prepaidBaseUnits: asDigits(field(row, \"toPrepaid\"), \"0\"),\n explorerUrl: explorerTx(explorerUrl, txHash),\n };\n}\n\nconst SERVICE_CATEGORIES: readonly TabError[\"category\"][] = [\n \"VALIDATION\",\n \"AUTHORISATION\",\n \"NOT_FOUND\",\n \"LIMIT\",\n \"CHAIN\",\n \"UPSTREAM\",\n \"CONFLICT\",\n \"UNAVAILABLE\",\n \"INTERNAL\",\n];\n\n/**\n * What a Service's refusal means, in this package's vocabulary.\n *\n * A Service that speaks Tab answers `{ error: { category, code, message } }` in\n * the same vocabulary, and that is passed through unchanged: a model told\n * `METERING_SIGNATURE_ABSENT` can act on it, where a flattened\n * \"the Service answered 403\" leaves it guessing. A Service that answers\n * something else has its status mapped, which is the most that can be said about\n * a body this package cannot read.\n */\nfunction serviceRefusal(status: number, body: unknown, tool: string): TabToolError {\n const declared = field(body, \"error\");\n if (isRecord(declared)) {\n const category = asString(declared[\"category\"], \"\");\n if ((SERVICE_CATEGORIES as readonly string[]).includes(category)) {\n return {\n category: category as TabError[\"category\"],\n code: asString(declared[\"code\"], \"SERVICE_REFUSED\"),\n message: asString(declared[\"message\"], `the Service answered ${status} for ${tool}`),\n retryable: asBoolean(declared[\"retryable\"], status >= 500),\n };\n }\n }\n const category: TabError[\"category\"] =\n status === 401 || status === 403\n ? \"AUTHORISATION\"\n : status === 402\n ? \"LIMIT\"\n : status === 404\n ? \"NOT_FOUND\"\n : status === 409\n ? \"CONFLICT\"\n : status === 408 || status === 429 || status === 503 || status === 504\n ? \"UNAVAILABLE\"\n : status >= 500\n ? \"UPSTREAM\"\n : \"VALIDATION\";\n return {\n category,\n code: \"SERVICE_REFUSED\",\n message: `the Service answered ${status} for ${tool}`,\n retryable: status >= 500 || status === 408 || status === 429,\n };\n}\n\n/**\n * The headers one Service requires for one call.\n *\n * A provider is consumer code, so it is called inside a `catch`: a config file\n * that throws becomes a failed tool call carrying the reason, not an unhandled\n * rejection that takes the transport with it.\n */\nasync function serviceHeaders(\n entry: TabServiceEntry,\n request: ServiceHeaderRequest,\n): Promise<Result<Readonly<Record<string, string>>>> {\n const declared = entry.headers;\n if (declared === undefined) return ok({});\n if (typeof declared !== \"function\") return ok(declared);\n try {\n return ok(await declared(request));\n } catch (error) {\n return fail(\n \"UPSTREAM\",\n \"SERVICE_HEADERS_FAILED\",\n `the header provider configured for Service ${request.serviceId} failed, so the call was not sent`,\n {\n details: { serviceId: request.serviceId },\n cause: { code: \"PROVIDER_THREW\", message: error instanceof Error ? error.message : String(error) },\n },\n );\n }\n}\n\n/** Reads the body of whatever the Service answered, without assuming a `Response`. */\nasync function readBody(response: Tab402Response): Promise<unknown> {\n const candidate = response as { json?: unknown; text?: unknown; body?: unknown };\n if (typeof candidate.json === \"function\") {\n try {\n return await (candidate.json as () => Promise<unknown>)();\n } catch {\n // fall through to text\n }\n }\n if (typeof candidate.text === \"function\") {\n try {\n return await (candidate.text as () => Promise<string>)();\n } catch {\n return null;\n }\n }\n return candidate.body ?? null;\n}\n\n/** An abort signal for one call, described structurally because there are no DOM types here. */\nfunction timeoutSignal(ms: number): unknown {\n const ctor = (globalThis as { AbortSignal?: { timeout?: (ms: number) => unknown } }).AbortSignal;\n return typeof ctor?.timeout === \"function\" ? ctor.timeout(ms) : undefined;\n}\n\n/**\n * Checks that the Service accepts the Asset before a transaction is built.\n *\n * `TabSettlement` would refuse it anyway, but a revert costs the Agent gas and\n * says less than this does. The registry read is keyless and one request.\n */\nasync function serviceAcceptsAsset(\n registry: Result<RegistryReadClient>,\n serviceId: string,\n asset: AssetRef,\n): Promise<Result<void>> {\n if (!registry.ok) return registry;\n const body = await registry.value.service(serviceId);\n if (!body.ok) return body;\n const wanted = asset.address.toLowerCase();\n for (const accepted of asArray(jsonPath(body.value, \"service\", \"acceptedAssets\"))) {\n if (asString(field(accepted, \"asset\"), \"\").toLowerCase() === wanted) return ok(undefined);\n }\n return notFoundError(\n \"ASSET_NOT_ACCEPTED\",\n `Service ${serviceId} does not accept ${assetStringOf(asset)}, so a Settlement in it would be refused`,\n { details: { serviceId, asset: assetStringOf(asset) } },\n );\n}\n\nfunction resolveStrategy(\n registry: StrategyRegistry,\n strategyId: string | undefined,\n asset: AssetRef,\n): Result<PaymentStrategy> {\n const resolved: Result<PaymentStrategy> = registry.resolve({\n ...(strategyId === undefined ? {} : { strategyId }),\n asset,\n });\n if (resolved.ok) return resolved;\n const cause = resolved.error;\n return fail(\n cause.category,\n cause.code,\n `${cause.message}; tab_settle signs with the Agent's own key through a payment strategy, so one must be registered for ${assetStringOf(asset)} before a Settlement can be built`,\n { details: { asset: assetStringOf(asset), ...(strategyId === undefined ? {} : { strategyId }) } },\n );\n}\n\n"]}
1
+ {"version":3,"file":"toolset.js","sourceRoot":"","sources":["../../src/mcp/toolset.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * The four Tab tools, as functions.\n *\n * The MCP protocol wiring lives next door in `server.ts`. This file is the\n * behaviour, and it is separate so the tools can be exercised without a\n * transport: every test in `test/mcp-tools.test.mjs` calls these directly, which\n * is what lets the suite validate every output against its declared schema\n * without standing a server up.\n *\n * ## Nothing here throws, including into the transport\n *\n * A tool that throws over stdio does not produce a bad answer, it produces no\n * answer: the MCP client sees a protocol error, the model sees nothing it can\n * reason about, and a long-running server can lose its transport to one\n * malformed argument. So every entry point below returns a value that validates\n * against the tool's declared output schema, on every path, including the paths\n * where the work failed. A failure is `error: { category, code, message }` in\n * the payload, and for `tab_call` and `tab_settle` it is `ok: false` beside it.\n *\n * `LIMIT_EXCEEDED` is the case that earns the discipline. An Agent out of\n * headroom is not an error in the Agent, the Service, or the call: it is the\n * credit facility working. The tool answers `ok: false` with\n * `requiredBaseUnits` and `headroomBaseUnits` both filled in, so the model can\n * settle the difference and call again instead of retrying into the same wall.\n *\n * ## Every input is validated against the schema that was published\n *\n * Not a hand-written check that resembles it. {@link applyJsonDefaults} fills in\n * the declared defaults and {@link validateJsonValue} enforces the same document\n * `tools/list` served, so a `limit` of 500 is refused with the same bound the\n * model was shown.\n */\n\nimport type { Address, Bytes32, Result, TabError } from \"../_shared/index.js\";\nimport { isAddress, ok } from \"../_shared/index.js\";\nimport { decodeBytes32String, encodeBytes32String } from \"ethers\";\n\nimport { fail, notFoundError, tabError, upstreamError, validationError } from \"../errors.js\";\nimport { createTab402Client, type Tab402Fetch, type Tab402Response } from \"../http/client-402.js\";\nimport { defaultLogger, type Logger } from \"../logger.js\";\nimport type { ServiceHeaderRequest, TabServiceEntry } from \"../payments/config.js\";\nimport { loadTabConfig } from \"../payments/config.js\";\nimport { moduleStrategyRegistry, type StrategyRegistry } from \"../payments/registry.js\";\nimport type { AssetRef, PaymentStrategy, SettleRequest } from \"../payments/strategy.js\";\nimport { assetFacts, assetStringOf, formatAsset, parseAsset } from \"./assets.js\";\nimport { applyJsonDefaults, validateJsonValue } from \"./json-schema.js\";\nimport {\n asArray,\n asBoolean,\n asDigits,\n asDigitsOrNull,\n asNumber,\n asRecord,\n asString,\n asStringOrNull,\n field,\n isRecord,\n path as jsonPath,\n secondsToIso,\n} from \"./json.js\";\nimport { createRegistryReadClient, type RegistryFetch, type RegistryReadClient } from \"./registry-client.js\";\nimport { fetchHubManifest, type HubFetch } from \"../x402/hub.js\";\nimport {\n TAB_CALL_INPUT,\n TAB_DISCOVER_INPUT,\n TAB_SETTLE_INPUT,\n TAB_STATUS_INPUT,\n tabToolByName,\n} from \"./schemas.js\";\nimport type { TabMcpSettings } from \"./settings.js\";\n\n// ---------------------------------------------------------------- output types\n\n/** The error block every output can carry. */\nexport interface TabToolError {\n readonly category: TabError[\"category\"];\n readonly code: string;\n readonly message: string;\n readonly retryable: boolean;\n readonly requiredBaseUnits?: string;\n readonly headroomBaseUnits?: string;\n}\n\nexport interface DiscoveredAsset {\n readonly chainId: number;\n readonly address: string;\n readonly symbol: string | null;\n readonly decimals: number | null;\n readonly collectionAddress: string | null;\n readonly curatedAsset: boolean;\n}\n\nexport interface DiscoveredTool {\n readonly tool: string;\n readonly toolName: string | null;\n readonly asset: string;\n readonly priceBaseUnits: string;\n}\n\nexport interface DiscoveredBond {\n readonly asset: string;\n readonly stakedBaseUnits: string;\n readonly freeBaseUnits: string;\n}\n\nexport interface DiscoveredHubEndpoint {\n readonly endpoint: string;\n readonly name: string | null;\n readonly description: string | null;\n readonly priceType: string;\n readonly priceUsd: string | null;\n readonly priceBaseUnits: string | null;\n readonly networks: readonly string[];\n}\n\n/** The API Hub provider a Service fronts, with its endpoints as the Service's tools. */\nexport interface DiscoveredHub {\n readonly provider: string;\n readonly prefix: string;\n readonly endpoints: readonly DiscoveredHubEndpoint[];\n readonly total: number;\n /** Present when the manifest could not be read; `endpoints` is then empty. */\n readonly error?: TabToolError;\n}\n\nexport interface DiscoveredService {\n readonly serviceId: string;\n readonly name: string | null;\n readonly endpoint: string | null;\n readonly tier: \"curated\" | \"permissionless\" | \"unknown\";\n readonly settlementWindowSeconds: number;\n readonly assets: readonly DiscoveredAsset[];\n readonly tools: readonly DiscoveredTool[];\n readonly bonds: readonly DiscoveredBond[];\n readonly pendingChange: { readonly changeId: string; readonly kind: string | null; readonly etaIso: string | null } | null;\n readonly hub?: DiscoveredHub;\n}\n\nexport interface TabDiscoverOutput {\n readonly services: readonly DiscoveredService[];\n readonly error?: TabToolError;\n}\n\n/** The prepaid receipt a call carries when x402 paid for it instead of the Open Tab. */\nexport interface TabCallX402Block {\n readonly txHash: string;\n readonly network: string;\n readonly amountBaseUnits: string;\n readonly asset: string;\n readonly payTo: string;\n readonly payer: string;\n readonly explorerUrl: string | null;\n}\n\nexport interface TabCallOutput {\n readonly ok: boolean;\n readonly result?: unknown;\n readonly charge?: { readonly amountBaseUnits: string; readonly asset: string; readonly tool: string };\n readonly tab?: {\n readonly openTabBaseUnits: string;\n readonly headroomBaseUnits: string;\n readonly creditLimitBaseUnits?: string;\n readonly asset: string;\n readonly settlementDueIso?: string | null;\n };\n readonly x402?: TabCallX402Block;\n readonly error?: TabToolError;\n}\n\nexport interface TabStatusOutput {\n readonly agent: string;\n /**\n * The Monad block every figure here is as at, from the index that served them.\n *\n * A Settlement in a later block is not yet reflected; the index reaches it\n * within a few blocks. Null when the index has never ticked or the read failed.\n */\n readonly indexedBlock: number | null;\n readonly perAsset: readonly {\n readonly asset: string;\n readonly creditLimitBaseUnits: string | null;\n readonly openTabBaseUnits: string;\n readonly prepaidBaseUnits: string | null;\n readonly headroomBaseUnits: string | null;\n readonly delinquent: boolean;\n readonly tabs: readonly {\n readonly tabId: string | null;\n readonly serviceId: string;\n readonly openBaseUnits: string;\n readonly dueIso: string | null;\n }[];\n }[];\n readonly settlements?: readonly {\n readonly settlementId: string;\n readonly txHash: string;\n readonly serviceId: string;\n readonly asset: string;\n readonly amountBaseUnits: string;\n readonly appliedBaseUnits: string;\n readonly prepaidBaseUnits: string;\n readonly explorerUrl: string | null;\n }[];\n readonly error?: TabToolError;\n}\n\nexport interface TabSettleOutput {\n readonly ok: boolean;\n readonly dryRun: boolean;\n readonly txHash?: string | null;\n readonly chainId?: number | null;\n readonly amountBaseUnits: string;\n readonly settlementId?: string | null;\n readonly appliedBaseUnits?: string | null;\n readonly prepaidBaseUnits?: string | null;\n readonly explorerUrl?: string | null;\n readonly error?: TabToolError;\n}\n\n// ---------------------------------------------------------------- the toolset\n\nexport interface TabToolsetOptions {\n readonly settings: TabMcpSettings;\n /** Overrides the client built from `settings.registryUrl`. A test hands in a stub. */\n readonly registry?: RegistryReadClient;\n /** The `fetch` `tab_call` sends Service requests with. Defaults to the host's. */\n readonly fetchImpl?: Tab402Fetch<Tab402Response>;\n /**\n * The `fetch` the registry read client uses, when one is built from settings.\n *\n * Separate from {@link TabToolsetOptions.fetchImpl} because the two talk to\n * different things: one to a third party's Service, one to the read API. A\n * test that stubs a Service should not silently start answering registry\n * reads too.\n */\n readonly registryFetch?: RegistryFetch;\n /** The `fetch` `tab_discover` reads API Hub manifests with. Defaults to the host's. */\n readonly hubFetch?: HubFetch;\n /**\n * Where `tab_settle` resolves a strategy.\n *\n * Absent, the module-level registry is used, and `tab_settle` fills it from\n * `tab.config` the first time it is called. See {@link TabToolset.settle} for\n * why that load is deferred rather than done at startup.\n */\n readonly strategies?: StrategyRegistry;\n /** Where the deferred `tab.config` load walks from. Defaults to the working directory. */\n readonly cwd?: string;\n readonly logger?: Logger;\n readonly now?: () => number;\n /**\n * The environment the Asset table is read from: on Testnet `MOCK_USDC_ADDRESS`\n * names the token this deployment settles in. Defaults to the process\n * environment; a test passes its own so a machine's configuration cannot\n * change a result.\n */\n readonly env?: NodeJS.ProcessEnv;\n}\n\n/** The four tools, plus a dispatcher the MCP server calls by name. */\nexport interface TabToolset {\n discover(input: unknown): Promise<TabDiscoverOutput>;\n call(input: unknown): Promise<TabCallOutput>;\n status(input: unknown): Promise<TabStatusOutput>;\n settle(input: unknown): Promise<TabSettleOutput>;\n /** Dispatches by MCP tool name. `NOT_FOUND` for a name this package does not declare. */\n invoke(name: string, input: unknown): Promise<Result<unknown>>;\n}\n\nconst errorOf = (error: TabError): TabToolError => {\n const details = asRecord(error.details);\n const required = asDigitsOrNull(details[\"requiredBaseUnits\"]);\n const headroom = asDigitsOrNull(details[\"headroomBaseUnits\"]);\n return {\n category: error.category,\n code: error.code,\n message: error.message,\n retryable: error.retryable,\n ...(required === null ? {} : { requiredBaseUnits: required }),\n ...(headroom === null ? {} : { headroomBaseUnits: headroom }),\n };\n};\n\n/** Validates a tool input against the schema that was published for it. */\nfunction readInput<T>(toolName: string, raw: unknown): Result<T> {\n const declaration = tabToolByName(toolName);\n if (declaration === undefined) {\n return notFoundError(\"TOOL_UNKNOWN\", `\\`${toolName}\\` is not a tool this server declares`, {\n details: { tool: toolName },\n });\n }\n const supplied = raw === undefined || raw === null ? {} : raw;\n return validateJsonValue<T>(\n declaration.inputSchema,\n applyJsonDefaults(declaration.inputSchema, supplied),\n `${toolName} input`,\n \"INPUT_INVALID\",\n );\n}\n\n/** The ascii a 32-byte word decodes to, or null when it is not padded ascii. */\nfunction wordToName(word: string): string | null {\n try {\n const decoded = decodeBytes32String(word);\n return /^[\\x20-\\x7e]+$/.test(decoded) ? decoded : null;\n } catch {\n return null;\n }\n}\n\n/** A tool name as its 32-byte key: a hex word passes through, ascii is padded. */\nfunction toolKeyOf(tool: string): Result<Bytes32> {\n if (/^0x[a-fA-F0-9]{64}$/.test(tool)) return ok(tool.toLowerCase() as Bytes32);\n try {\n return ok(encodeBytes32String(tool).toLowerCase() as Bytes32);\n } catch {\n return validationError(\n \"TOOL_NAME_TOO_LONG\",\n `\\`${tool}\\` cannot be a tool key: a tool name is stored as 31 bytes of ascii, zero-padded, or given as a 32-byte hex word`,\n { details: { tool } },\n );\n }\n}\n\nconst ZERO_WORD = `0x${\"00\".repeat(32)}` as Bytes32;\n\nexport function createTabToolset(options: TabToolsetOptions): TabToolset {\n const settings = options.settings;\n const logger = options.logger ?? defaultLogger;\n const now = options.now ?? (() => Date.now());\n const env = options.env ?? process.env;\n const chainId = settings.chainId;\n\n /**\n * The strategy registry, filled from `tab.config` on first use.\n *\n * Deferred, and this is the one piece of laziness in the package that is not\n * an optimisation. Resolving a strategy entry runs consumer code: a factory in\n * a config file typically builds a signer, and a signer is built from a key.\n * Doing that at startup would mean `tab_discover`, `tab_status` and `tab\n * doctor` -- three surfaces whose whole claim is that they need no key --\n * loading one every time the server starts. So the load happens inside\n * `tab_settle`, the only tool that signs, at the moment it needs a strategy.\n *\n * Memoised, so a second Settlement does not re-import the config, and\n * registration is idempotent by strategy id in any case.\n */\n let loading: Promise<StrategyRegistry> | undefined;\n const strategiesFor = (): Promise<StrategyRegistry> => {\n if (options.strategies !== undefined) return Promise.resolve(options.strategies);\n loading ??= (async () => {\n const registry = moduleStrategyRegistry(logger);\n if (registry.list().length > 0) return registry;\n const loaded = await loadTabConfig({\n ...(options.cwd === undefined ? {} : { cwd: options.cwd }),\n registry,\n logger,\n });\n if (!loaded.ok) {\n logger.warn(\"tab.config could not be loaded, so no payment strategy is registered\", {\n code: loaded.error.code,\n message: loaded.error.message,\n });\n }\n return registry;\n })();\n return loading;\n };\n\n const directory = new Map<string, TabServiceEntry>(\n settings.services.map((entry) => [entry.serviceId.toLowerCase(), entry]),\n );\n\n /** The registry client, or the one failure that stands in for it. */\n const registryOf = (): Result<RegistryReadClient> => {\n if (options.registry !== undefined) return ok(options.registry);\n if (settings.registryUrl === undefined) {\n return upstreamError(\n \"REGISTRY_UNCONFIGURED\",\n \"no Tab registry read API is configured, so on-chain discovery and status cannot be read; set NEXT_PUBLIC_REGISTRY_API_URL, or registryUrl in tab.config\",\n );\n }\n return ok(\n createRegistryReadClient({\n baseUrl: settings.registryUrl,\n ...(options.registryFetch === undefined ? {} : { fetchImpl: options.registryFetch }),\n logger,\n }),\n );\n };\n\n // ------------------------------------------------------------- tab_discover\n\n const discover = async (raw: unknown): Promise<TabDiscoverOutput> => {\n const input = readInput<{ asset?: string; tier: string; search?: string; limit: number }>(\"tab_discover\", raw);\n if (!input.ok) return { services: [], error: errorOf(input.error) };\n\n let wanted: AssetRef | undefined;\n if (input.value.asset !== undefined) {\n const parsed = parseAsset(input.value.asset);\n if (!parsed.ok) return { services: [], error: errorOf(parsed.error) };\n wanted = parsed.value;\n }\n\n const registry = registryOf();\n if (!registry.ok) return { services: [], error: errorOf(registry.error) };\n\n // A filtered request has to over-fetch: the read API pages by registration\n // order and filters nothing, so asking for `limit` rows would return `limit`\n // rows before the filter and fewer after it.\n const filtered = wanted !== undefined || input.value.search !== undefined || input.value.tier !== \"any\";\n const body = await registry.value.services(filtered ? 200 : input.value.limit);\n if (!body.ok) return { services: [], error: errorOf(body.error) };\n\n const services = await Promise.all(\n asArray(field(body.value, \"services\"))\n .map((entry) => toDiscoveredService(entry, directory, chainId, env))\n .filter((service) => matches(service, input.value.tier, input.value.search, wanted))\n .slice(0, input.value.limit)\n .map((service) => withHub(service, directory.get(service.serviceId), options.hubFetch)),\n );\n\n return { services };\n };\n\n // ---------------------------------------------------------------- tab_call\n\n const call = async (raw: unknown): Promise<TabCallOutput> => {\n const input = readInput<{\n serviceId: string;\n tool: string;\n asset?: string;\n arguments?: Record<string, unknown>;\n timeoutMs: number;\n }>(\"tab_call\", raw);\n if (!input.ok) return { ok: false, error: errorOf(input.error) };\n\n if (settings.agent === undefined) return { ok: false, error: errorOf(agentUnconfigured()) };\n\n const serviceId = input.value.serviceId.toLowerCase();\n const entry = directory.get(serviceId);\n if (entry === undefined) {\n return {\n ok: false,\n error: errorOf(\n tabError(\n \"NOT_FOUND\",\n \"SERVICE_ENDPOINT_UNKNOWN\",\n `no endpoint is configured for Service ${serviceId}; the chain records no URL, so add it to the \\`services\\` list in tab.config`,\n { details: { serviceId, configured: [...directory.keys()].join(\", \") } },\n ),\n ),\n };\n }\n\n const toolKey = toolKeyOf(input.value.tool);\n if (!toolKey.ok) return { ok: false, error: errorOf(toolKey.error) };\n\n const client = createTab402Client({\n baseUrl: entry.endpoint,\n agent: settings.agent,\n // The credit decision is the Service's, and this tool reports it rather than\n // arguing with it. A repeat would meter the same call twice on the path where\n // the first attempt was declined, so the repeat is off.\n maxRetries: 0,\n logger,\n now,\n ...(options.fetchImpl === undefined ? {} : { fetchImpl: options.fetchImpl }),\n ...(settings.strategyId === undefined ? {} : { strategyId: settings.strategyId }),\n // The prepaid fallback, only when tab.config declared a signer factory. The\n // factory is called at the moment a refusal carries an x402 offer and not\n // before, which is what keeps this tool keyless on every other path.\n ...(settings.x402 === undefined ? {} : { x402: { signer: settings.x402, chainId: BigInt(chainId) } }),\n });\n\n // A Service meters its tools under `/meter/<tool>` off its published\n // endpoint, the shape Tab's gateway serves and the Dashboard calls,\n // so the endpoint in the directory is the Service's root and `/hub/<prefix>`\n // sits beside the tools rather than under them.\n const url = `${entry.endpoint.replace(/\\/+$/, \"\")}/meter/${encodeURIComponent(input.value.tool)}`;\n\n const supplied = await serviceHeaders(entry, {\n method: \"POST\",\n url,\n tool: input.value.tool,\n agent: settings.agent,\n serviceId,\n });\n if (!supplied.ok) return { ok: false, error: errorOf(supplied.error) };\n\n const response = await client.fetch(url, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\", ...supplied.value },\n body: JSON.stringify(input.value.arguments ?? {}),\n signal: timeoutSignal(input.value.timeoutMs),\n });\n\n const charges = client.charges();\n const charge = charges.at(-1);\n const payment = client.payments().at(-1);\n const x402Block: TabCallX402Block | undefined =\n payment === undefined\n ? undefined\n : {\n txHash: payment.txHash,\n network: payment.network,\n amountBaseUnits: payment.amount.toString(10),\n asset: formatAsset(Number(payment.chainId), payment.asset),\n payTo: payment.payTo,\n payer: payment.payer,\n explorerUrl: explorerTx(settings.explorerUrl, payment.txHash),\n };\n const chargeBlock =\n charge === undefined\n ? undefined\n : {\n amountBaseUnits: charge.amount.toString(10),\n asset: formatAsset(charge.asset.chainId, charge.asset.address),\n tool: charge.tool,\n };\n const tabBlock =\n charge === undefined\n ? undefined\n : {\n openTabBaseUnits: charge.openTab.toString(10),\n headroomBaseUnits: charge.headroom.toString(10),\n asset: formatAsset(charge.asset.chainId, charge.asset.address),\n settlementDueIso: null,\n };\n\n if (!response.ok) {\n // A 402 that still stands is the headroom case, and it is the one failure\n // this tool restates rather than passes through: the model needs both\n // figures side by side to decide whether to settle. A standing 402 that\n // an x402 signer tried and failed to pay keeps the payment error instead,\n // because \"the facilitator refused the signature\" is the actionable fact.\n if (charge !== undefined && charge.outcome === \"declined\" && response.error.code === \"LIMIT_EXCEEDED\") {\n return {\n ok: false,\n ...(chargeBlock === undefined ? {} : { charge: chargeBlock }),\n ...(tabBlock === undefined ? {} : { tab: tabBlock }),\n error: {\n // `LIMIT` and not `CONFLICT`: the category maps to HTTP 402 everywhere\n // else in Tab, which is exactly what the Service answered.\n category: \"LIMIT\",\n code: \"LIMIT_EXCEEDED\",\n message: `this call needs ${charge.amount.toString(10)} base units and the Agent has ${charge.headroom.toString(10)} of headroom for the Asset; settle with tab_settle and call again`,\n retryable: false,\n requiredBaseUnits: charge.amount.toString(10),\n headroomBaseUnits: charge.headroom.toString(10),\n },\n };\n }\n return {\n ok: false,\n ...(chargeBlock === undefined ? {} : { charge: chargeBlock }),\n ...(tabBlock === undefined ? {} : { tab: tabBlock }),\n error: errorOf(response.error),\n };\n }\n\n const status = response.value.status;\n const body = await readBody(response.value);\n if (status < 200 || status >= 300) {\n return {\n ok: false,\n ...(chargeBlock === undefined ? {} : { charge: chargeBlock }),\n ...(tabBlock === undefined ? {} : { tab: tabBlock }),\n ...(x402Block === undefined ? {} : { x402: x402Block }),\n error: serviceRefusal(status, body, input.value.tool),\n };\n }\n\n const result = body;\n return {\n ok: true,\n result,\n // A prepaid call carries the credit refusal it was answered with, so the\n // model sees both what the tab could not cover and what paid for it.\n ...(chargeBlock === undefined ? {} : { charge: chargeBlock }),\n ...(tabBlock === undefined ? {} : { tab: tabBlock }),\n ...(x402Block === undefined ? {} : { x402: x402Block }),\n };\n };\n\n // -------------------------------------------------------------- tab_status\n\n const status = async (raw: unknown): Promise<TabStatusOutput> => {\n const input = readInput<{ agent?: string; asset?: string; historyLimit: number }>(\"tab_status\", raw);\n const agent = (input.ok ? input.value.agent : undefined) ?? settings.agent;\n const subject = agent ?? \"0x0000000000000000000000000000000000000000\";\n\n if (!input.ok) return { agent: subject, indexedBlock: null, perAsset: [], error: errorOf(input.error) };\n if (agent === undefined) {\n return { agent: subject, indexedBlock: null, perAsset: [], error: errorOf(agentUnconfigured()) };\n }\n\n let assetFilter: string | undefined;\n if (input.value.asset !== undefined) {\n const parsed = parseAsset(input.value.asset);\n if (!parsed.ok) return { agent: agent.toLowerCase(), indexedBlock: null, perAsset: [], error: errorOf(parsed.error) };\n assetFilter = parsed.value.address.toLowerCase();\n }\n\n const registry = registryOf();\n if (!registry.ok) return { agent: agent.toLowerCase(), indexedBlock: null, perAsset: [], error: errorOf(registry.error) };\n\n const body = await registry.value.agent(agent);\n if (!body.ok) return { agent: agent.toLowerCase(), indexedBlock: null, perAsset: [], error: errorOf(body.error) };\n\n // The block the index had read to when it answered. Stated, because a\n // Settlement the Agent sent a moment ago sits in a later block and an\n // answer that looked current while omitting it would be the misleading kind.\n const horizon = jsonPath(body.value, \"index\", \"lastBlock\");\n const indexedBlock = typeof horizon === \"number\" && Number.isInteger(horizon) && horizon >= 0 ? horizon : null;\n\n const perAsset = asArray(field(body.value, \"assets\"))\n .map((entry) => toPerAsset(entry, input.value.historyLimit, chainId))\n .filter((entry): entry is NonNullable<typeof entry> => entry !== null)\n .filter((entry) => assetFilter === undefined || entry.assetAddress === assetFilter)\n .map(({ assetAddress: _assetAddress, ...rest }) => rest);\n let settlements: TabStatusOutput[\"settlements\"] = [];\n if (input.value.historyLimit > 0) {\n const settled = await registry.value.settlements({\n agent,\n ...(assetFilter === undefined ? {} : { asset: assetFilter }),\n limit: input.value.historyLimit,\n });\n if (settled.ok) {\n settlements = asArray(field(settled.value, \"settlements\")).map((row) =>\n toSettlementRow(row, settings.explorerUrl, chainId),\n );\n } else {\n logger.warn(\"the settlement feed could not be read; status reports credit without history\", {\n code: settled.error.code,\n });\n }\n }\n return { agent: agent.toLowerCase(), indexedBlock, perAsset, settlements };\n };\n\n // -------------------------------------------------------------- tab_settle\n\n const settle = async (raw: unknown): Promise<TabSettleOutput> => {\n const input = readInput<{\n serviceId: string;\n asset: string;\n amountBaseUnits: string;\n strategyId?: string;\n dryRun: boolean;\n }>(\"tab_settle\", raw);\n if (!input.ok) return { ok: false, dryRun: false, amountBaseUnits: \"0\", error: errorOf(input.error) };\n const dryRun = input.value.dryRun;\n const amountBaseUnits = input.value.amountBaseUnits;\n const failure = (error: TabError): TabSettleOutput => ({\n ok: false,\n dryRun,\n amountBaseUnits,\n error: errorOf(error),\n });\n if (settings.agent === undefined) return failure(agentUnconfigured());\n const asset = parseAsset(input.value.asset, \"asset\", env);\n if (!asset.ok) return failure(asset.error);\n const amount = BigInt(amountBaseUnits);\n if (amount === 0n) {\n return failure(\n tabError(\"VALIDATION\", \"AMOUNT_ZERO\", \"a Settlement of zero base units moves nothing and proves nothing\"),\n );\n }\n // The strategy is resolved before the Service is read, because it is a local\n // lookup and the Service is a network read: an Agent with no strategy for the\n // Asset should be told that, not made to wait for a read it could not use.\n const strategy = resolveStrategy(\n await strategiesFor(),\n input.value.strategyId ?? settings.strategyId,\n asset.value,\n );\n if (!strategy.ok) return failure(strategy.error);\n const serviceId = input.value.serviceId.toLowerCase();\n const accepted = await serviceAcceptsAsset(registryOf(), serviceId, asset.value);\n if (!accepted.ok) return failure(accepted.error);\n const request: SettleRequest = {\n agent: settings.agent,\n serviceId: serviceId as Bytes32,\n asset: asset.value,\n amount,\n };\n if (dryRun) {\n const quote = await strategy.value.quote(request);\n if (!quote.ok) return failure(quote.error);\n return {\n ok: true,\n dryRun: true,\n txHash: null,\n chainId: Number(asset.value.chainId),\n amountBaseUnits,\n settlementId: null,\n appliedBaseUnits: null,\n prepaidBaseUnits: null,\n explorerUrl: null,\n };\n }\n const receipt = await strategy.value.settle(request);\n if (!receipt.ok) return failure(receipt.error);\n return {\n ok: true,\n dryRun: false,\n txHash: receipt.value.txHash,\n chainId: Number(receipt.value.chainId),\n amountBaseUnits: receipt.value.amount.toString(10),\n settlementId: receipt.value.settlementId,\n appliedBaseUnits: receipt.value.applied === null ? null : receipt.value.applied.toString(10),\n prepaidBaseUnits: receipt.value.toPrepaid === null ? null : receipt.value.toPrepaid.toString(10),\n explorerUrl: explorerTx(settings.explorerUrl, receipt.value.txHash),\n };\n };\n\n // -------------------------------------------------------------- dispatch\n\n const invoke = async (name: string, input: unknown): Promise<Result<unknown>> => {\n switch (name) {\n case \"tab_discover\":\n return ok(await discover(input));\n case \"tab_call\":\n return ok(await call(input));\n case \"tab_status\":\n return ok(await status(input));\n case \"tab_settle\":\n return ok(await settle(input));\n default:\n return notFoundError(\"TOOL_UNKNOWN\", `\\`${name}\\` is not a tool this server declares`, {\n details: { tool: name },\n });\n }\n };\n\n return { discover, call, status, settle, invoke };\n}\n\n// ---------------------------------------------------------------- mapping\n\n/**\n * The one setting no tool that touches a tab can proceed without.\n *\n * An Agent address, never a key. Deriving the address from a signing key would\n * mean this process holds one, and the whole point of the split is that\n * discovery, calling and status hold none.\n */\nconst agentUnconfigured = (): TabError =>\n tabError(\n \"VALIDATION\",\n \"AGENT_UNCONFIGURED\",\n \"no Agent address is configured, so there is no Open Tab to meter against; set `agent` in tab.config, or pass it to this tool where the schema allows it\",\n );\n\n/**\n * Names an Asset the index reports as a bare address.\n *\n * `TabBook` keys an Asset by token address alone, one ledger per address and no\n * chain column, while everything that crosses the MCP boundary is\n * `chainId:address`, because the SDK may be pointed at Mainnet or Testnet and a\n * bare address is ambiguous between the two. The chain id is the one the\n * settings resolved, which is the one the registry this toolset reads indexes.\n */\nconst assetStringFor = (address: string, chainId: number): string => formatAsset(chainId, address.toLowerCase());\n\n/** A transaction link on the configured explorer, or null for anything that is not a hash. */\nconst explorerTx = (explorerUrl: string, txHash: string): string | null =>\n /^0x[a-fA-F0-9]{64}$/.test(txHash) ? `${explorerUrl.replace(/\\/+$/, \"\")}/tx/${txHash}` : null;\n\nfunction toDiscoveredService(\n entry: unknown,\n directory: Map<string, TabServiceEntry>,\n chainId: number,\n env: NodeJS.ProcessEnv,\n): DiscoveredService {\n const serviceId = asString(field(entry, \"serviceId\"), \"\").toLowerCase();\n const configured = directory.get(serviceId);\n\n const assets: DiscoveredAsset[] = [];\n for (const accepted of asArray(field(entry, \"acceptedAssets\"))) {\n const address = asString(field(accepted, \"asset\"), \"\").toLowerCase();\n if (!isAddress(address)) continue;\n const collection = asStringOrNull(field(accepted, \"collection\"));\n const facts = assetFacts(chainId, address, env);\n assets.push({\n chainId,\n address,\n symbol: facts.symbol,\n decimals: facts.decimals,\n collectionAddress: collection === null ? null : collection.toLowerCase(),\n curatedAsset: facts.curatedAsset,\n });\n }\n\n const nameAsset = (address: string): string => formatAsset(chainId, address);\n\n const tools: DiscoveredTool[] = asArray(field(entry, \"prices\")).map((price) => {\n const tool = asString(field(price, \"tool\"), ZERO_WORD).toLowerCase();\n return {\n tool,\n toolName: wordToName(tool),\n asset: nameAsset(asString(field(price, \"asset\"), \"\")),\n priceBaseUnits: asDigits(field(price, \"baseUnits\"), \"0\"),\n };\n });\n\n const bonds: DiscoveredBond[] = asArray(field(entry, \"bond\")).map((bond) => ({\n asset: nameAsset(asString(field(bond, \"asset\"), \"\")),\n stakedBaseUnits: asDigits(field(bond, \"staked\"), \"0\"),\n freeBaseUnits: asDigits(field(bond, \"free\"), \"0\"),\n }));\n\n const pending = asArray(field(entry, \"pendingChanges\"))[0];\n const pendingChange =\n pending === undefined\n ? null\n : {\n changeId: asString(field(pending, \"changeId\"), ZERO_WORD).toLowerCase(),\n kind: asStringOrNull(field(pending, \"kindName\")),\n etaIso: asStringOrNull(field(pending, \"etaIso\")),\n };\n\n const tierName = asString(jsonPath(entry, \"tier\", \"name\"), \"\").toLowerCase();\n\n return {\n serviceId,\n name: configured?.name ?? wordToName(serviceId),\n endpoint: configured?.endpoint ?? null,\n tier: tierName === \"curated\" ? \"curated\" : tierName === \"permissionless\" ? \"permissionless\" : \"unknown\",\n settlementWindowSeconds: asNumber(jsonPath(entry, \"settlementWindowSeconds\", \"value\"), 0),\n assets,\n tools,\n bonds,\n pendingChange,\n };\n}\n\n/**\n * Attaches the fronted API Hub provider's endpoints to a discovered Service.\n *\n * A manifest that cannot be read is reported inside the `hub` block rather than\n * failing discovery: the Service is still real and its on-chain tools are still\n * listed, and the Hub's catalogue is an addition the chain does not carry.\n */\nasync function withHub(\n service: DiscoveredService,\n configured: TabServiceEntry | undefined,\n hubFetch: HubFetch | undefined,\n): Promise<DiscoveredService> {\n const hub = configured?.hub;\n if (hub === undefined) return service;\n const prefix = (hub.prefix ?? hub.provider).replace(/^\\/+|\\/+$/g, \"\");\n const manifest = await fetchHubManifest({\n provider: hub.provider,\n ...(hub.manifestUrl === undefined ? {} : { manifestUrl: hub.manifestUrl }),\n ...(hubFetch === undefined ? {} : { fetchImpl: hubFetch }),\n });\n if (!manifest.ok) {\n return { ...service, hub: { provider: hub.provider, prefix, endpoints: [], total: 0, error: errorOf(manifest.error) } };\n }\n return {\n ...service,\n hub: {\n provider: manifest.value.provider,\n prefix,\n endpoints: manifest.value.endpoints.map((endpoint) => ({\n endpoint: endpoint.endpoint,\n name: endpoint.name,\n description: endpoint.description,\n priceType: endpoint.priceType,\n priceUsd: endpoint.priceUsd,\n priceBaseUnits: endpoint.priceBaseUnits,\n networks: endpoint.networks,\n })),\n total: manifest.value.total,\n },\n };\n}\n\nfunction matches(\n service: DiscoveredService,\n tier: string,\n search: string | undefined,\n asset: AssetRef | undefined,\n): boolean {\n if (tier !== \"any\" && service.tier !== tier) return false;\n if (asset !== undefined) {\n const wanted = assetStringOf(asset);\n if (!service.assets.some((entry) => formatAsset(entry.chainId, entry.address) === wanted)) return false;\n }\n if (search !== undefined) {\n const needle = search.toLowerCase();\n const haystack = `${service.serviceId} ${service.name ?? \"\"}`.toLowerCase();\n if (!haystack.includes(needle)) return false;\n }\n return true;\n}\n\nfunction toPerAsset(\n entry: unknown,\n historyLimit: number,\n chainId: number,\n): (TabStatusOutput[\"perAsset\"][number] & { readonly assetAddress: string }) | null {\n const address = asString(field(entry, \"asset\"), \"\").toLowerCase();\n if (!isAddress(address)) return null;\n\n const openTab =\n asDigitsOrNull(jsonPath(entry, \"headroom\", \"openTab\")) ?? asDigits(jsonPath(entry, \"openTab\", \"observed\"), \"0\");\n\n const tabs = asArray(jsonPath(entry, \"openTab\", \"tabs\"))\n .slice(0, historyLimit)\n .map((tab) => {\n // The index keys a tab observation by Agent, Service and Asset, not by the\n // `TabBook` tabId, so the identity is often genuinely absent. Reporting the\n // zero word here would name a tab that does not exist.\n const tabId = asStringOrNull(field(tab, \"tabId\"));\n return {\n tabId: tabId !== null && /^0x[a-fA-F0-9]{64}$/.test(tabId) ? tabId.toLowerCase() : null,\n serviceId: asString(field(tab, \"serviceId\"), ZERO_WORD).toLowerCase(),\n openBaseUnits: asDigits(field(tab, \"openAfter\"), \"0\"),\n dueIso: null,\n };\n });\n\n return {\n assetAddress: address,\n asset: assetStringFor(address, chainId),\n creditLimitBaseUnits: asDigitsOrNull(jsonPath(entry, \"creditLimit\", \"value\")),\n openTabBaseUnits: openTab,\n prepaidBaseUnits: asDigitsOrNull(jsonPath(entry, \"settlements\", \"prepaidTotal\")),\n headroomBaseUnits: asDigitsOrNull(jsonPath(entry, \"headroom\", \"value\")),\n delinquent: asBoolean(jsonPath(entry, \"delinquency\", \"delinquent\"), false),\n tabs,\n };\n}\n\nfunction toSettlementRow(\n row: unknown,\n explorerUrl: string,\n chainId: number,\n): NonNullable<TabStatusOutput[\"settlements\"]>[number] {\n const txHash = asString(jsonPath(row, \"monad\", \"txHash\"), \"\");\n return {\n settlementId: asString(field(row, \"settlementId\"), ZERO_WORD).toLowerCase(),\n txHash: txHash.toLowerCase(),\n serviceId: asString(field(row, \"serviceId\"), ZERO_WORD).toLowerCase(),\n asset: formatAsset(chainId, asString(field(row, \"asset\"), \"\")),\n amountBaseUnits: asDigits(field(row, \"amount\"), \"0\"),\n appliedBaseUnits: asDigits(field(row, \"applied\"), \"0\"),\n prepaidBaseUnits: asDigits(field(row, \"toPrepaid\"), \"0\"),\n explorerUrl: explorerTx(explorerUrl, txHash),\n };\n}\n\nconst SERVICE_CATEGORIES: readonly TabError[\"category\"][] = [\n \"VALIDATION\",\n \"AUTHORISATION\",\n \"NOT_FOUND\",\n \"LIMIT\",\n \"CHAIN\",\n \"UPSTREAM\",\n \"CONFLICT\",\n \"UNAVAILABLE\",\n \"INTERNAL\",\n];\n\n/**\n * What a Service's refusal means, in this package's vocabulary.\n *\n * A Service that speaks Tab answers `{ error: { category, code, message } }` in\n * the same vocabulary, and that is passed through unchanged: a model told\n * `METERING_SIGNATURE_ABSENT` can act on it, where a flattened\n * \"the Service answered 403\" leaves it guessing. A Service that answers\n * something else has its status mapped, which is the most that can be said about\n * a body this package cannot read.\n */\nfunction serviceRefusal(status: number, body: unknown, tool: string): TabToolError {\n const declared = field(body, \"error\");\n if (isRecord(declared)) {\n const category = asString(declared[\"category\"], \"\");\n if ((SERVICE_CATEGORIES as readonly string[]).includes(category)) {\n return {\n category: category as TabError[\"category\"],\n code: asString(declared[\"code\"], \"SERVICE_REFUSED\"),\n message: asString(declared[\"message\"], `the Service answered ${status} for ${tool}`),\n retryable: asBoolean(declared[\"retryable\"], status >= 500),\n };\n }\n }\n const category: TabError[\"category\"] =\n status === 401 || status === 403\n ? \"AUTHORISATION\"\n : status === 402\n ? \"LIMIT\"\n : status === 404\n ? \"NOT_FOUND\"\n : status === 409\n ? \"CONFLICT\"\n : status === 408 || status === 429 || status === 503 || status === 504\n ? \"UNAVAILABLE\"\n : status >= 500\n ? \"UPSTREAM\"\n : \"VALIDATION\";\n return {\n category,\n code: \"SERVICE_REFUSED\",\n message: `the Service answered ${status} for ${tool}`,\n retryable: status >= 500 || status === 408 || status === 429,\n };\n}\n\n/**\n * The headers one Service requires for one call.\n *\n * A provider is consumer code, so it is called inside a `catch`: a config file\n * that throws becomes a failed tool call carrying the reason, not an unhandled\n * rejection that takes the transport with it.\n */\nasync function serviceHeaders(\n entry: TabServiceEntry,\n request: ServiceHeaderRequest,\n): Promise<Result<Readonly<Record<string, string>>>> {\n const declared = entry.headers;\n if (declared === undefined) return ok({});\n if (typeof declared !== \"function\") return ok(declared);\n try {\n return ok(await declared(request));\n } catch (error) {\n return fail(\n \"UPSTREAM\",\n \"SERVICE_HEADERS_FAILED\",\n `the header provider configured for Service ${request.serviceId} failed, so the call was not sent`,\n {\n details: { serviceId: request.serviceId },\n cause: { code: \"PROVIDER_THREW\", message: error instanceof Error ? error.message : String(error) },\n },\n );\n }\n}\n\n/** Reads the body of whatever the Service answered, without assuming a `Response`. */\nasync function readBody(response: Tab402Response): Promise<unknown> {\n const candidate = response as { json?: unknown; text?: unknown; body?: unknown };\n if (typeof candidate.json === \"function\") {\n try {\n return await (candidate.json as () => Promise<unknown>)();\n } catch {\n // fall through to text\n }\n }\n if (typeof candidate.text === \"function\") {\n try {\n return await (candidate.text as () => Promise<string>)();\n } catch {\n return null;\n }\n }\n return candidate.body ?? null;\n}\n\n/** An abort signal for one call, described structurally because there are no DOM types here. */\nfunction timeoutSignal(ms: number): unknown {\n const ctor = (globalThis as { AbortSignal?: { timeout?: (ms: number) => unknown } }).AbortSignal;\n return typeof ctor?.timeout === \"function\" ? ctor.timeout(ms) : undefined;\n}\n\n/**\n * Checks that the Service accepts the Asset before a transaction is built.\n *\n * `TabSettlement` would refuse it anyway, but a revert costs the Agent gas and\n * says less than this does. The registry read is keyless and one request.\n */\nasync function serviceAcceptsAsset(\n registry: Result<RegistryReadClient>,\n serviceId: string,\n asset: AssetRef,\n): Promise<Result<void>> {\n if (!registry.ok) return registry;\n const body = await registry.value.service(serviceId);\n if (!body.ok) return body;\n const wanted = asset.address.toLowerCase();\n for (const accepted of asArray(jsonPath(body.value, \"service\", \"acceptedAssets\"))) {\n if (asString(field(accepted, \"asset\"), \"\").toLowerCase() === wanted) return ok(undefined);\n }\n return notFoundError(\n \"ASSET_NOT_ACCEPTED\",\n `Service ${serviceId} does not accept ${assetStringOf(asset)}, so a Settlement in it would be refused`,\n { details: { serviceId, asset: assetStringOf(asset) } },\n );\n}\n\nfunction resolveStrategy(\n registry: StrategyRegistry,\n strategyId: string | undefined,\n asset: AssetRef,\n): Result<PaymentStrategy> {\n const resolved: Result<PaymentStrategy> = registry.resolve({\n ...(strategyId === undefined ? {} : { strategyId }),\n asset,\n });\n if (resolved.ok) return resolved;\n const cause = resolved.error;\n return fail(\n cause.category,\n cause.code,\n `${cause.message}; tab_settle signs with the Agent's own key through a payment strategy, so one must be registered for ${assetStringOf(asset)} before a Settlement can be built`,\n { details: { asset: assetStringOf(asset), ...(strategyId === undefined ? {} : { strategyId }) } },\n );\n}\n\n"]}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * `tab.config.ts` discovery: mechanism three of R23.6.
2
+ * `tab.config.ts` discovery: the zero-code way to add a payment strategy.
3
3
  *
4
4
  * Zero-code wiring. A consumer writes a config file naming strategies as module
5
5
  * specifiers, and the strategies register themselves at startup with no
@@ -8,7 +8,7 @@
8
8
  * ```ts
9
9
  * // tab.config.ts, at the consumer's project root
10
10
  * import { defineTabConfig } from "@tabai/sdk";
11
- * export default defineTabConfig({ strategies: ["@acme/tab-strategy-solana"] });
11
+ * export default defineTabConfig({ strategies: ["@acme/tab-strategy-session-key"] });
12
12
  * ```
13
13
  *
14
14
  * ## What an entry may be
@@ -20,7 +20,7 @@
20
20
  *
21
21
  * ## Where a specifier resolves from
22
22
  *
23
- * From the **config file**, not from this package. `@acme/tab-strategy-solana` is
23
+ * From the **config file**, not from this package. `@acme/tab-strategy-session-key` is
24
24
  * the consumer's dependency and under pnpm it is not visible from inside
25
25
  * `@tabai/sdk` at all, so resolving relative to this module would fail for the
26
26
  * exact layout the workspace uses. `createRequire(configFileUrl)` resolves the
@@ -30,13 +30,11 @@
30
30
  * ## The `.ts` config file and the host runtime
31
31
  *
32
32
  * This module imports the config file; it does not compile it. A `.ts` config
33
- * loads under a runtime that strips types, `tsx`, `node --experimental-strip-types`,
34
- * a bundler's dev server, and fails under one that does not. That failure comes
33
+ * loads under a runtime that strips types (`tsx`, `node --experimental-strip-types`,
34
+ * a bundler's dev server) and fails under one that does not. That failure comes
35
35
  * back as a `Result` naming the file and the requirement rather than as a stack
36
36
  * trace, and `tab.config.js` and `tab.config.mjs` are discovered too so a
37
37
  * consumer with a plain Node process has a first-class option.
38
- *
39
- * Requirements: 23.6, 21.5
40
38
  */
41
39
  import { type Result } from "../_shared/index.js";
42
40
  import { type Logger } from "../logger.js";
@@ -88,7 +86,7 @@ export interface TabServiceEntry {
88
86
  * Headers sent with every call to this Service.
89
87
  *
90
88
  * A record for a Service that gates on something fixed, such as an API key. A
91
- * function for one that gates on something per request: the reference metering
89
+ * function for one that gates on something per request: Tab's metering
92
90
  * gateway, for instance, requires a claim over the method, the path, the Agent
93
91
  * and the tool, which no static header can satisfy. Tab defines neither scheme
94
92
  * and validates neither -- this is the seam through which a Service's own
@@ -1 +1 @@
1
- {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/payments/config.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/payments/config.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  /**
2
- * `tab.config.ts` discovery: mechanism three of R23.6.
2
+ * `tab.config.ts` discovery: the zero-code way to add a payment strategy.
3
3
  *
4
4
  * Zero-code wiring. A consumer writes a config file naming strategies as module
5
5
  * specifiers, and the strategies register themselves at startup with no
@@ -8,7 +8,7 @@
8
8
  * ```ts
9
9
  * // tab.config.ts, at the consumer's project root
10
10
  * import { defineTabConfig } from "@tabai/sdk";
11
- * export default defineTabConfig({ strategies: ["@acme/tab-strategy-solana"] });
11
+ * export default defineTabConfig({ strategies: ["@acme/tab-strategy-session-key"] });
12
12
  * ```
13
13
  *
14
14
  * ## What an entry may be
@@ -20,7 +20,7 @@
20
20
  *
21
21
  * ## Where a specifier resolves from
22
22
  *
23
- * From the **config file**, not from this package. `@acme/tab-strategy-solana` is
23
+ * From the **config file**, not from this package. `@acme/tab-strategy-session-key` is
24
24
  * the consumer's dependency and under pnpm it is not visible from inside
25
25
  * `@tabai/sdk` at all, so resolving relative to this module would fail for the
26
26
  * exact layout the workspace uses. `createRequire(configFileUrl)` resolves the
@@ -30,13 +30,11 @@
30
30
  * ## The `.ts` config file and the host runtime
31
31
  *
32
32
  * This module imports the config file; it does not compile it. A `.ts` config
33
- * loads under a runtime that strips types, `tsx`, `node --experimental-strip-types`,
34
- * a bundler's dev server, and fails under one that does not. That failure comes
33
+ * loads under a runtime that strips types (`tsx`, `node --experimental-strip-types`,
34
+ * a bundler's dev server) and fails under one that does not. That failure comes
35
35
  * back as a `Result` naming the file and the requirement rather than as a stack
36
36
  * trace, and `tab.config.js` and `tab.config.mjs` are discovered too so a
37
37
  * consumer with a plain Node process has a first-class option.
38
- *
39
- * Requirements: 23.6, 21.5
40
38
  */
41
39
  import { existsSync, statSync } from "node:fs";
42
40
  import { createRequire } from "node:module";