diff --git a/biome.json b/biome.json index bf946f79..c22f1e5b 100644 --- a/biome.json +++ b/biome.json @@ -51,5 +51,17 @@ "organizeImports": "on" } } - } + }, + "overrides": [ + { + "includes": ["**/*.test.ts"], + "linter": { + "rules": { + "suspicious": { + "noExplicitAny": "off" + } + } + } + } + ] } diff --git a/schemas/services.ts b/schemas/services.ts index 795bf3b2..ae75b661 100644 --- a/schemas/services.ts +++ b/schemas/services.ts @@ -6597,4 +6597,47 @@ export const services: ServiceDef[] = [ }, ], }, + + // ── AlgoVoi ──────────────────────────────────────────────────────────────────── + { + id: "algovoi", + name: "AlgoVoi", + url: "https://api.algovoi.co.uk", + serviceUrl: "https://api.algovoi.co.uk", + description: + "Multi-chain crypto payment gateway for e-commerce and AI agents. USDC.e on Tempo, plus Algorand, VOI, Hedera, Stellar, Base, and Solana on a single endpoint.", + + categories: ["blockchain", "web"], + integration: "third-party", + tags: [ + "payments", + "usdc", + "multi-chain", + "algorand", + "tempo", + "x402", + "mpp", + "e-commerce", + "ai-agents", + ], + docs: { + homepage: "https://docs.algovoi.co.uk", + }, + provider: { name: "AlgoVoi", url: "https://algovoi.co.uk" }, + realm: "api.algovoi.co.uk", + intent: "charge", + payments: [TEMPO_PAYMENT], + endpoints: [ + { + route: "GET /mpp/:resource_id", + desc: "MPP-gated resource — 401 Payment challenge then 200 content", + amount: "10000", + }, + { + route: "POST /mpp/challenge", + desc: "Explicit challenge pre-fetch for pipeline agents", + amount: "0", + }, + ], + }, ]; diff --git a/src/pages/_api/api/demo/chat.ts b/src/pages/_api/api/demo/chat.ts index 036a8910..e93e7334 100644 --- a/src/pages/_api/api/demo/chat.ts +++ b/src/pages/_api/api/demo/chat.ts @@ -114,11 +114,13 @@ export default async function handler(request: Request) { const text = content.replaceAll("\n", "\t"); const tokens = tokenize(text); + // biome-ignore lint/suspicious/noExplicitAny: mppx withReceipt stream type not yet exported return result.withReceipt(async function* (stream: any) { for (const token of tokens) { await stream.charge(); yield token; } + // biome-ignore lint/suspicious/noExplicitAny: mppx withReceipt callback cast required } as any); } console.warn( @@ -151,10 +153,12 @@ export default async function handler(request: Request) { ].join("\t"); const tokens = tokenize(text); + // biome-ignore lint/suspicious/noExplicitAny: mppx withReceipt stream type not yet exported return result.withReceipt(async function* (stream: any) { for (const token of tokens) { await stream.charge(); yield token; } + // biome-ignore lint/suspicious/noExplicitAny: mppx withReceipt callback cast required } as any); } diff --git a/src/pages/_api/api/demo/poem.ts b/src/pages/_api/api/demo/poem.ts index 1d55034e..75187287 100644 --- a/src/pages/_api/api/demo/poem.ts +++ b/src/pages/_api/api/demo/poem.ts @@ -111,10 +111,12 @@ export default async function handler(request: Request) { const text = poem.join("\t"); const tokens = tokenize(text); + // biome-ignore lint/suspicious/noExplicitAny: mppx withReceipt stream type not yet exported return result.withReceipt(async function* (stream: any) { for (const token of tokens) { await stream.charge(); yield token; } + // biome-ignore lint/suspicious/noExplicitAny: mppx withReceipt callback cast required } as any); } diff --git a/src/pages/_api/api/sessions/poem.ts b/src/pages/_api/api/sessions/poem.ts index 715a90db..e8a69f96 100644 --- a/src/pages/_api/api/sessions/poem.ts +++ b/src/pages/_api/api/sessions/poem.ts @@ -69,11 +69,13 @@ export default async function handler(request: Request) { const poem = poems[Math.floor(Math.random() * poems.length)]; const words = poem.lines.flatMap((line) => [...line.split(" "), "\\n"]); + // biome-ignore lint/suspicious/noExplicitAny: mppx withReceipt stream type not yet exported return result.withReceipt(async function* (stream: any) { yield JSON.stringify({ title: poem.title, author: poem.author }); for (const word of words) { await stream.charge(); yield word; } + // biome-ignore lint/suspicious/noExplicitAny: mppx withReceipt callback cast required } as any); } diff --git a/src/shiki-style-to-class.test.ts b/src/shiki-style-to-class.test.ts index 8126aa0f..0b0237bb 100644 --- a/src/shiki-style-to-class.test.ts +++ b/src/shiki-style-to-class.test.ts @@ -1,7 +1,6 @@ import { describe, expect, it } from "vitest"; import { shikiStyleToClass } from "./shiki-style-to-class.js"; -// biome-ignore lint/suspicious/noExplicitAny: test helpers function makeRoot(spans: { style: string }[]): any { return { type: "root",