From f3b3fab59aca06ffa223b3a6dcf67e65ba1f9cec Mon Sep 17 00:00:00 2001 From: fretchen Date: Thu, 15 Oct 2026 07:43:44 +0200 Subject: [PATCH 1/6] new tool for train search --- website/components/AssistantChat.tsx | 136 +- website/locales/de.ts | 16 + website/locales/en.ts | 16 + website/prompts/tool-contract.md | 3 +- website/test/AssistantChat.test.tsx | 153 +- website/test/fixtures/transitous/geocode.json | 554 ++++++ website/test/fixtures/transitous/plan.json | 1757 +++++++++++++++++ .../test/fixtures/transitous/stoptimes.json | 830 ++++++++ website/test/prompts.test.ts | 1 + website/test/transitous.test.ts | 207 ++ website/tools/transitous.ts | 310 +++ 11 files changed, 3980 insertions(+), 3 deletions(-) create mode 100644 website/test/fixtures/transitous/geocode.json create mode 100644 website/test/fixtures/transitous/plan.json create mode 100644 website/test/fixtures/transitous/stoptimes.json create mode 100644 website/test/transitous.test.ts create mode 100644 website/tools/transitous.ts diff --git a/website/components/AssistantChat.tsx b/website/components/AssistantChat.tsx index 66efb4398..be7f99662 100644 --- a/website/components/AssistantChat.tsx +++ b/website/components/AssistantChat.tsx @@ -36,6 +36,18 @@ import { fetchFailed, type BundestaktResult, } from "../tools/bundestakt"; +import { + searchStopTool, + planJourneyTool, + getDeparturesTool, + fetchGeocode, + fetchStoptimes, + fetchPlan, + selectStops, + selectBoard, + selectJourneys, + type TransitousResult, +} from "../tools/transitous"; import { getAnalyticsTool, fetchStats, @@ -95,7 +107,7 @@ import { PaymentError, readChargedTotal } from "../utils/x402PaidFetch"; * requirement; analytics is about honesty — a figure about this site should say it was looked up * rather than read as something the model knew. */ -type ToolSource = "bundestakt" | "analytics" | "brave"; +type ToolSource = "bundestakt" | "transitous" | "analytics" | "brave"; /** * Everything offered to the model, with what the chat loop needs to know about a tool besides its @@ -161,6 +173,41 @@ export const TOOL_REGISTRY = [ paid: false, source: "bundestakt", }, + // Transitous, the same UX decision as the Bundestakt pair above: three tools and schemas + // the model calls separately, one shared row for the visitor (labelled by the group key's + // locale value, "Mit Zug & Bus"/"Train & bus" — modes, not the project name, which says + // nothing to a visitor), collapsed by `group`. The row's description comes from the first + // member (see `toolSelectorOptions`), so `searchStopTool`'s pair below stands for all three. + { + tool: searchStopTool, + label: "assistent.toolTransitSearch", + description: "assistent.toolTransitSearchDesc", + group: "assistent.capTransitous", + ownerScope: null, + defaultAgentOnly: false, + paid: false, + source: "transitous", + }, + { + tool: planJourneyTool, + label: "assistent.toolTransitPlan", + description: "assistent.toolTransitPlanDesc", + group: "assistent.capTransitous", + ownerScope: null, + defaultAgentOnly: false, + paid: false, + source: "transitous", + }, + { + tool: getDeparturesTool, + label: "assistent.toolTransitDepartures", + description: "assistent.toolTransitDeparturesDesc", + group: "assistent.capTransitous", + ownerScope: null, + defaultAgentOnly: false, + paid: false, + source: "transitous", + }, { tool: getPageTool, label: "assistent.toolSiteContent", @@ -466,9 +513,12 @@ export function AssistantChat() { const bundestaktSourceLabel = useLocale({ label: "assistent.bundestaktSource" }); const analyticsSourceLabel = useLocale({ label: "assistent.analyticsSource" }); const braveSourceLabel = useLocale({ label: "assistent.braveSource" }); + const transitousSourceLabel = useLocale({ label: "assistent.transitousSource" }); // Here rather than at module scope because the labels are translated per render. const sourceLinks: Record = { bundestakt: { href: "https://www.bundestakt.de", label: bundestaktSourceLabel }, + // Transitous's usage policy asks for visible attribution — this citation line is it. + transitous: { href: "https://transitous.org", label: transitousSourceLabel }, analytics: { href: "/analytics", label: analyticsSourceLabel }, brave: { href: "https://search.brave.com", label: braveSourceLabel }, }; @@ -812,6 +862,87 @@ export function AssistantChat() { } } + /** + * Fetches and projects one Transitous endpoint (stop search, departure board, routing). + * `tools/transitous.ts` is stateless, so the caching policy lives here: geocode answers + * change rarely (24 h), a board goes stale within a minute (60 s), routing answers are + * keyed by the exact query (5 min) — politeness, not latency, since Transitous answers in + * well under a second. Unlike Bundestakt's `not_found`, a stop search without hits is + * still `status: "ok"` (empty list), so the tool stays on offer for a corrected spelling. + */ + /** + * A tool argument the model sent as a non-string (or omitted) coerces to the empty string + * rather than to "[object Object]" — the empty-argument guards below turn that into a + * correctable bad_query answer instead of a request for a nonsense name. + */ + const argString = (v: unknown): string => (typeof v === "string" ? v : ""); + + async function loadTransitous(kind: "geocode" | "stoptimes" | "plan", args: Record): Promise { + // An empty required argument is an answer the model can act on, not a malfunction: fetching + // anyway would 4xx at the API, `fetch_failed` would withdraw the tool for the rest of the + // turn, and with it the one thing that fixes the mistake — a corrected query, a real stop + // id from search_stop. `recoverable` keeps the tool on offer for the retry. + if (kind === "geocode" && !argString(args.query)) { + return { + result: { status: "bad_query", reason: "search_stop needs a non-empty stop or station name to search for." }, + recoverable: true, + }; + } + if (kind === "stoptimes" && !argString(args.stop_id)) { + return { + result: { status: "bad_query", reason: "get_departures needs a stop id from search_stop." }, + recoverable: true, + }; + } + if (kind === "plan" && (!argString(args.from) || !argString(args.to))) { + return { + result: { status: "bad_query", reason: "plan_journey needs from and to stop ids from search_stop." }, + recoverable: true, + }; + } + try { + let result: TransitousResult; + if (kind === "geocode") { + const query = argString(args.query); + const raw = await queryClient.fetchQuery({ + queryKey: ["transitous", "geocode", query], + queryFn: () => fetchGeocode(query), + staleTime: 24 * 60 * 60_000, + retry: 0, + }); + result = selectStops(raw); + } else if (kind === "stoptimes") { + const stopId = argString(args.stop_id); + const time = typeof args.time === "string" ? args.time : undefined; + const raw = await queryClient.fetchQuery({ + queryKey: ["transitous", "stoptimes", stopId, time ?? null], + queryFn: () => fetchStoptimes(stopId, undefined, time), + staleTime: 60_000, + retry: 0, + }); + result = selectBoard(raw); + } else { + const from = argString(args.from); + const to = argString(args.to); + const departure = typeof args.departure === "string" ? args.departure : undefined; + const arriveBy = args.arrive_by === true; + const railOnly = args.rail_only === true; + const raw = await queryClient.fetchQuery({ + queryKey: ["transitous", "plan", from, to, departure ?? null, arriveBy, railOnly], + queryFn: () => + fetchPlan({ from, to, time: departure, arriveBy, transitModes: railOnly ? "RAIL" : undefined }), + staleTime: 5 * 60_000, + retry: 0, + }); + result = selectJourneys(raw); + } + return { result }; + } catch (err) { + // fetchQuery rethrows the fetcher's error; the module owns the wire-level failure shape. + return { result: fetchFailed(err) }; + } + } + /** * Reads the site's own traffic figures. `GET /stats` takes no range and always returns the * trailing year, so it is fetched once and every `range` is a local slice of that one payload. @@ -987,6 +1118,9 @@ export function AssistantChat() { toolRunners[generateImageTool.function.name] = runImageToolHere; toolRunners[getSitzungenTool.function.name] = (args) => loadBundestakt("sitzungen", args); toolRunners[searchClaimsTool.function.name] = (args) => loadBundestakt("claims", args); + toolRunners[searchStopTool.function.name] = (args) => loadTransitous("geocode", args); + toolRunners[planJourneyTool.function.name] = (args) => loadTransitous("plan", args); + toolRunners[getDeparturesTool.function.name] = (args) => loadTransitous("stoptimes", args); toolRunners[getPageTool.function.name] = loadPage; toolRunners[searchWebTool.function.name] = loadSearch; toolRunners[fetchUrlTool.function.name] = loadFetch; diff --git a/website/locales/de.ts b/website/locales/de.ts index 4e46bba65..da1d61866 100644 --- a/website/locales/de.ts +++ b/website/locales/de.ts @@ -98,6 +98,9 @@ export default { toolWebSearch: "Im Web suchen", toolFetchUrl: "Links öffnen", toolSiteAnalytics: "Website-Statistik", + toolTransitSearch: "Haltestellen suchen", + toolTransitPlan: "Verbindungen planen", + toolTransitDepartures: "Abfahrten", // Eine Zeile pro Fähigkeit — der Anlass war ein Test, in dem jemand nicht wusste, was // "Bundestagssitzungen" bedeutet. Kurz und konkret, keine Fachbegriffe ohne Erklärung. toolImageGenerationDesc: "Erstellt ein Bild aus deiner Beschreibung.", @@ -110,10 +113,22 @@ export default { toolWebSearchDesc: "Sucht aktuelle Informationen im Internet.", toolFetchUrlDesc: "Liest eine Seite, die du verlinkst.", toolSiteAnalyticsDesc: "Wie oft diese Website besucht wird.", + // Die hier ist die, die tatsächlich angezeigt wird: die zusammengefasste Fahrplan-Zeile + // in ToolSelector kommt vom ersten Eintrag der Gruppe (siehe TOOL_REGISTRY), und das + // ist dieser — sie beschreibt deshalb die ganze Fähigkeit und nennt die Verkehrsmittel, + // weil das Zeilenlabel ("Fahrplan") bewusst gattungsneutral bleibt. + toolTransitSearchDesc: "Züge, Busse und Fähren in ganz Europa – Verbindungen und Abfahrten, mit Echtzeit, wo Betreiber sie liefern.", + toolTransitPlanDesc: "Plant eine Verbindung von Tür zu Tür – Züge, Busse, Fähren.", + toolTransitDeparturesDesc: "Die nächsten Abfahrten einer Haltestelle.", // Zeilentitel für die zusammengefasste Zeile in ToolSelector (get_sitzungen + // search_claims). Eigener Name statt "Bundestagssitzungen": kurz, ein Eigenname, den // niemand nachschlagen muss — die Beschreibung darunter erklärt, was es tut. capBundestag: "Bundestag", + // Zeilentitel für die zusammengefasste Zeile (search_stop + plan_journey + + // get_departures). Bewusst kein Eigenname wie bei capBundestag ("Bundestag" kennt jeder, + // "Transitous" niemand) und auch nicht "Fahrplan" — ein Zeitplan ist auch das Konzert- + // Programm; "Mit Zug & Bus" nennt die Verkehrsmittel, die Fähre nennt die Beschreibung. + capTransitous: "Mit Zug & Bus", emptyState: "Starte eine Unterhaltung, indem du unten eine Nachricht eingibst.", doorIntro: "Hallo — ich bin der KI-Assistent dieser Website.", doorCan: @@ -161,6 +176,7 @@ export default { bundestaktSource: "Quelle: Bundestakt", analyticsSource: "Quelle: Analytics", braveSource: "Quelle: Brave Search", + transitousSource: "Quelle: Transitous", errorPrefix: "Fehler:", unknownError: "Unbekannter Fehler", loading: "Lädt...", diff --git a/website/locales/en.ts b/website/locales/en.ts index 451a7ba63..a5303751a 100644 --- a/website/locales/en.ts +++ b/website/locales/en.ts @@ -99,6 +99,9 @@ export default { toolWebSearch: "Web search", toolFetchUrl: "Fetch URL", toolSiteAnalytics: "Site analytics", + toolTransitSearch: "Find stops", + toolTransitPlan: "Plan journeys", + toolTransitDepartures: "Departures", toolImageGenerationDesc: "Creates a picture from your description.", // The one actually shown: the grouped Bundestag row's description comes from the first // entry in that group (see TOOL_REGISTRY), and that is this one. @@ -108,7 +111,19 @@ export default { toolWebSearchDesc: "Looks up current information on the web.", toolFetchUrlDesc: "Reads a page you link.", toolSiteAnalyticsDesc: "How often this website is visited.", + // The one actually shown: the grouped timetable row's description comes from the first + // entry in that group (see TOOL_REGISTRY), so this describes the whole capability and + // names the modes — the row label stays deliberately generic. + toolTransitSearchDesc: "Trains, buses and ferries across Europe — journeys and departures, with live times where operators publish them.", + toolTransitPlanDesc: "Plans a door-to-door journey — trains, buses, ferries.", + toolTransitDeparturesDesc: "The next departures from a stop.", capBundestag: "Bundestag", + // Row title for the collapsed timetable row (search_stop + plan_journey + + // get_departures). Deliberately not a proper name like capBundestag ("Bundestag" needs + // no lookup, "Transitous" needs one for everyone) and not "Timetables" either — a + // schedule is also a concert programme; "Train & bus" names the modes, the ferry is + // named by the description. The citation names the data source. + capTransitous: "Train & bus", emptyState: "Start a conversation by typing a message below.", // The greeting a first-time visitor sees from the default agent: what this is, what it // assumes and costs, where it can be wrong (IDENTITY.md → welcoming, honest). @@ -152,6 +167,7 @@ export default { bundestaktSource: "Source: Bundestakt", analyticsSource: "Source: Analytics", braveSource: "Source: Brave Search", + transitousSource: "Source: Transitous", errorPrefix: "Error:", unknownError: "Unknown error", loading: "Loading...", diff --git a/website/prompts/tool-contract.md b/website/prompts/tool-contract.md index 1095513a6..db23a56c4 100644 --- a/website/prompts/tool-contract.md +++ b/website/prompts/tool-contract.md @@ -1,6 +1,6 @@ --- name: tool-contract -description: The assistant's base system prompt — the tool contract. Routing rules for the Bundestakt, analytics, site-content and web-research tools, the fetch_url injection defence, and date-relative questions. +description: The assistant's base system prompt — the tool contract. Routing rules for the Bundestakt, transit, analytics, site-content and web-research tools, the fetch_url injection defence, and date-relative questions. --- You are a helpful assistant. You answer from live tool data wherever a tool exists for it, and you say so plainly whenever it does not. @@ -8,6 +8,7 @@ You are a helpful assistant. You answer from live tool data wherever a tool exis ## Tool routing - **Bundestag sessions, speaking time, fact-checks of MP statements** — use `get_sitzungen` and `search_claims`. Call `get_sitzungen` without a slug first to find the right session, then again with its slug for the details. That data comes from bundestakt.de, an AI-assisted analysis of official transcripts and not an official record itself. Always link the `url` from the tool result in your answer. +- **Journeys, departures and connections in Europe** — use `search_stop` first to resolve a named place to a stop id, then `plan_journey` or `get_departures` with that id. If several stops match, take the obvious hub or ask the user. All times come back in UTC — convert them to the user's local timezone before presenting. When a result has `realTime=false`, present its times as scheduled and say so. That data comes from transitous.org, schedules only: prices and booking are out of scope. - **How this site or one of its posts is doing** — visitors, most-read pages, trends — use `get_analytics`. When its result sets `hasHistoric`, the window reaches into figures backfilled from a different tool that counted differently; say so instead of comparing the two eras as one number. - **What this site itself says** — a blog post, a lecture, a project page — use `get_page`. Call it with the url when you already know it, such as /blog/36/, and otherwise without arguments first to list the pages. If that result sets `truncated`, call once more with a heading from its outline. - **Anything current or off this site** — news, other people's writing, documentation — use `search_web`, and link the url of every result you rely on. To read one of those results in full, or a link the user gives you, use `fetch_url`. diff --git a/website/test/AssistantChat.test.tsx b/website/test/AssistantChat.test.tsx index 252fc6314..5eb1beefc 100644 --- a/website/test/AssistantChat.test.tsx +++ b/website/test/AssistantChat.test.tsx @@ -22,6 +22,9 @@ const mockGenerateImage = vi.fn(); const { mockFetchSitzungen, mockFetchClaims, + mockFetchGeocode, + mockFetchStoptimes, + mockFetchPlan, mockFetchStats, mockFetchContentIndex, mockFetchPageHtml, @@ -31,6 +34,9 @@ const { } = vi.hoisted(() => ({ mockFetchSitzungen: vi.fn(), mockFetchClaims: vi.fn(), + mockFetchGeocode: vi.fn(), + mockFetchStoptimes: vi.fn(), + mockFetchPlan: vi.fn(), mockFetchStats: vi.fn(), mockFetchContentIndex: vi.fn(), mockFetchPageHtml: vi.fn(), @@ -125,6 +131,17 @@ vi.mock("../tools/bundestakt", async (importOriginal) => { return { ...actual, fetchSitzungen: mockFetchSitzungen, fetchClaims: mockFetchClaims }; }); +// Same for transitous: real selectors, stubbed fetchers. +vi.mock("../tools/transitous", async (importOriginal) => { + const actual = await importOriginal(); + return { + ...actual, + fetchGeocode: mockFetchGeocode, + fetchStoptimes: mockFetchStoptimes, + fetchPlan: mockFetchPlan, + }; +}); + // Same treatment for analytics: real selector, stubbed fetcher. vi.mock("../tools/analytics", async (importOriginal) => { const actual = await importOriginal(); @@ -156,6 +173,9 @@ import { useWalletConnection } from "../hooks/useWalletConnection"; import { useAutoNetwork } from "../hooks/useAutoNetwork"; import sitzungenFixture from "./fixtures/bundestakt/sitzungen.json"; import claimsFixture from "./fixtures/bundestakt/claims.json"; +import transitousGeocodeFixture from "./fixtures/transitous/geocode.json"; +import transitousStoptimesFixture from "./fixtures/transitous/stoptimes.json"; +import transitousPlanFixture from "./fixtures/transitous/plan.json"; import { OWNER_SCOPES } from "../utils/getChain"; import { PaymentError } from "../utils/x402PaidFetch"; import { MAX_HOPS } from "../utils/toolLoop"; @@ -222,6 +242,9 @@ describe("AssistantChat", () => { mockSwitchImageIfNeeded.mockResolvedValue(true); mockFetchSitzungen.mockResolvedValue(sitzungenFixture); mockFetchClaims.mockResolvedValue(claimsFixture); + mockFetchGeocode.mockResolvedValue(transitousGeocodeFixture); + mockFetchStoptimes.mockResolvedValue(transitousStoptimesFixture); + mockFetchPlan.mockResolvedValue(transitousPlanFixture); mockFetchStats.mockResolvedValue(statsFixture()); mockFetchContentIndex.mockResolvedValue([{ url: "/blog/36/", title: "My static site got a tool loop" }]); mockFetchSearch.mockResolvedValue({ @@ -777,6 +800,126 @@ describe("AssistantChat", () => { expect(mockFetchSitzungen).toHaveBeenCalledTimes(1); }); + it("runs the Transitous search-then-plan chain silently and feeds the projection back", async () => { + // Free and read-only, like the Bundestakt lookups: no confirm card, no wallet gate. + mockSendMessage + .mockResolvedValueOnce(toolCallResponse("search_stop", { query: "Heidelberg Hbf" })) + .mockResolvedValueOnce( + toolCallResponse("plan_journey", { from: "de-DELFI_de:08221:1160", to: "it-trenitalia_01700:station" }), + ) + .mockResolvedValueOnce(textResponse("The direct EC to Milano leaves at 20:07.")); + + renderWithQuery(); + sendUserMessage("How do I get from Heidelberg Hbf to Milano Centrale tomorrow?"); + + await waitFor(() => expect(mockSendMessage).toHaveBeenCalledTimes(3)); + expect(screen.queryByRole("button", { name: /assistent\.toolConfirmGenerate/ })).not.toBeInTheDocument(); + expect(mockFetchGeocode).toHaveBeenCalledTimes(1); + expect(mockFetchPlan).toHaveBeenCalledTimes(1); + + // The tool turns carry the projected answers, not MOTIS's raw multi-hundred-KB reply. + const thirdConvo = mockSendMessage.mock.calls[2][0] as { role: string; content: string }[]; + const toolResults = thirdConvo.filter((m) => m.role === "tool"); + expect(toolResults).toHaveLength(2); + const stops = JSON.parse(toolResults[0].content) as { status: string; stops: { id: string }[] }; + expect(stops.status).toBe("ok"); + expect(stops.stops.length).toBeGreaterThan(0); + const journeys = JSON.parse(toolResults[1].content) as { + status: string; + itineraries: { legs: Record[] }[]; + }; + expect(journeys.status).toBe("ok"); + expect(journeys.itineraries.length).toBeGreaterThan(0); + for (const leg of journeys.itineraries.flatMap((it) => it.legs)) { + expect(leg.legGeometry).toBeUndefined(); + } + }); + + it("withdraws a failed Transitous tool but keeps its siblings on offer", async () => { + mockFetchPlan.mockRejectedValue(new Error("Failed to fetch")); + mockSendMessage + .mockResolvedValueOnce(toolCallResponse("plan_journey", { from: "a", to: "b" })) + .mockResolvedValueOnce(textResponse("I could not reach the timetable.")); + + renderWithQuery(); + sendUserMessage("How do I get to Milano?"); + + await waitFor(() => expect(mockSendMessage).toHaveBeenCalledTimes(2)); + const offered = (mockSendMessage.mock.calls[1][1] as { tools: { function: { name: string } }[] }).tools; + const names = offered.map((t) => t.function.name); + expect(names).not.toContain("plan_journey"); + expect(names).toContain("search_stop"); + expect(names).toContain("get_departures"); + }); + + it("answers an empty Transitous argument with a recoverable bad_query, not a withdrawal", async () => { + // An empty required argument is the model's mistake to correct, not a malfunction of the + // tool: withdrawing search_stop would take away the one thing that fixes the next call. + mockSendMessage + .mockResolvedValueOnce(toolCallResponse("search_stop", {})) + .mockResolvedValueOnce(textResponse("Which station did you mean?")); + + renderWithQuery(); + sendUserMessage("When does the next train leave?"); + + await waitFor(() => expect(mockSendMessage).toHaveBeenCalledTimes(2)); + expect(mockFetchGeocode).not.toHaveBeenCalled(); + + const secondConvo = mockSendMessage.mock.calls[1][0] as { role: string; content: string }[]; + const toolResult = secondConvo.find((m) => m.role === "tool"); + expect(JSON.parse(toolResult!.content)).toMatchObject({ status: "bad_query" }); + + const offered = (mockSendMessage.mock.calls[1][1] as { tools: { function: { name: string } }[] }).tools; + expect(offered.map((t) => t.function.name)).toContain("search_stop"); + }); + + it("credits Transitous after a successful lookup, but not after a failed one", async () => { + // Transitous's usage policy asks for visible attribution, so this line is an obligation, + // and equally one not to show when nothing was actually retrieved. + mockSendMessage + .mockResolvedValueOnce(toolCallResponse("search_stop", { query: "Heidelberg Hbf" })) + .mockResolvedValueOnce(textResponse("Heidelberg Hbf is Heidelberg's main station.")); + + const { unmount } = renderWithQuery(); + sendUserMessage("Where is Heidelberg Hbf?"); + await waitFor(() => expect(screen.getByText("assistent.transitousSource")).toBeInTheDocument()); + unmount(); + + vi.clearAllMocks(); + mockSwitchIfNeeded.mockResolvedValue(true); + mockFetchGeocode.mockRejectedValue(new Error("Failed to fetch")); + mockSendMessage + .mockResolvedValueOnce(toolCallResponse("search_stop", { query: "Heidelberg Hbf" })) + .mockResolvedValueOnce(textResponse("I could not reach the timetable.")); + + renderWithQuery(); + sendUserMessage("Where is Heidelberg Hbf?"); + + await waitFor(() => expect(screen.getByText("I could not reach the timetable.")).toBeInTheDocument()); + expect(screen.queryByText("assistent.transitousSource")).not.toBeInTheDocument(); + }); + + it("switching the Transitous row off persists and reaches the next request", async () => { + renderWithQuery(); + + // search_stop, plan_journey and get_departures present as one merged "Train & bus" row + // (TOOL_REGISTRY's `group`, whose locale value is the row label), so one click + // switches off all three wire names at once. + fireEvent.click(screen.getAllByLabelText("Train & bus")[0]); + expect(window.localStorage.getItem("x402-chat-disabled-tools")).toBe( + "search_stop,plan_journey,get_departures", + ); + + sendUserMessage("Hi"); + await waitFor(() => expect(mockSendMessage).toHaveBeenCalledOnce()); + const names = (mockSendMessage.mock.calls[0][1] as { tools: { function: { name: string } }[] }).tools.map( + (t) => t.function.name, + ); + expect(names).not.toContain("search_stop"); + expect(names).not.toContain("plan_journey"); + expect(names).not.toContain("get_departures"); + }); + it("keeps the image tool on offer when a Bundestakt lookup fails", async () => { // The regression this guards: a single shared `toolFailed` flag would have disabled // generate_image for the rest of the turn because an unrelated, free lookup failed. @@ -801,13 +944,18 @@ describe("AssistantChat", () => { // be sent as `tools: []`. "Nothing left to offer" has to mean the key is absent. mockFetchSitzungen.mockRejectedValue(new Error("down")); mockFetchClaims.mockRejectedValue(new Error("down")); + mockFetchGeocode.mockRejectedValue(new Error("down")); + mockFetchStoptimes.mockRejectedValue(new Error("down")); + mockFetchPlan.mockRejectedValue(new Error("down")); // get_page, search_web and fetch_url are switched off rather than failed: every one of their // failures is recoverable by design — a different url, a different query, a different section // — so they are never withdrawn, and "everything on offer has failed" can only be reached // with them off the table to begin with. window.localStorage.setItem("x402-chat-disabled-tools", "get_page,search_web,fetch_url"); - // All three in one hop: the two lookups fail on their own, the image tool via a cancel. + // All six in one hop: the five lookups fail on their own, the image tool via a cancel. + // The Transitous calls carry well-formed arguments, because an empty one would be a + // recoverable bad_query answer, not a failure — and the tool would stay on offer. mockSendMessage.mockResolvedValue({ choices: [ { @@ -818,6 +966,9 @@ describe("AssistantChat", () => { { id: "a", type: "function", function: { name: "get_sitzungen", arguments: "{}" } }, { id: "b", type: "function", function: { name: "search_claims", arguments: "{}" } }, { id: "c", type: "function", function: { name: "generate_image", arguments: "{}" } }, + { id: "d", type: "function", function: { name: "search_stop", arguments: '{"query":"x"}' } }, + { id: "e", type: "function", function: { name: "plan_journey", arguments: '{"from":"a","to":"b"}' } }, + { id: "f", type: "function", function: { name: "get_departures", arguments: '{"stop_id":"x"}' } }, ], }, finish_reason: "tool_calls", diff --git a/website/test/fixtures/transitous/geocode.json b/website/test/fixtures/transitous/geocode.json new file mode 100644 index 000000000..c9b4bb187 --- /dev/null +++ b/website/test/fixtures/transitous/geocode.json @@ -0,0 +1,554 @@ +[ + { + "type": "STOP", + "name": "Heidelberg Hbf", + "id": "de-DELFI_de:08221:1160", + "lat": 49.40357, + "lon": 8.675442000000002, + "country": "DE", + "zip": "69115", + "tz": "Europe/Berlin", + "areas": [ + { + "name": "Deutschland", + "adminLevel": 2, + "matched": false, + "unique": false, + "default": false + }, + { + "name": "Baden-Württemberg", + "adminLevel": 4, + "matched": false, + "unique": false, + "default": false + }, + { + "name": "Regierungsbezirk Karlsruhe", + "adminLevel": 5, + "matched": false, + "unique": false, + "default": false + }, + { + "name": "Heidelberg", + "adminLevel": 6, + "matched": false, + "unique": true, + "default": true + }, + { + "name": "Weststadt", + "adminLevel": 9, + "matched": false, + "unique": false, + "default": false + } + ], + "score": -32.124732971191406, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "COACH", + "RIDE_SHARING", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS", + "ODM" + ], + "importance": 0.003857618197798729 + }, + { + "type": "PLACE", + "category": "hotel_16", + "name": "ibis Heidelberg Hauptbahnhof", + "id": "way/[87645977]", + "lat": 49.4036051, + "lon": 8.6767446, + "country": "DE", + "zip": "69115", + "tz": "Europe/Berlin", + "areas": [ + { + "name": "Deutschland", + "adminLevel": 2, + "matched": false, + "unique": false, + "default": false + }, + { + "name": "Baden-Württemberg", + "adminLevel": 4, + "matched": false, + "unique": false, + "default": false + }, + { + "name": "Regierungsbezirk Karlsruhe", + "adminLevel": 5, + "matched": false, + "unique": false, + "default": false + }, + { + "name": "Heidelberg", + "adminLevel": 6, + "matched": false, + "unique": true, + "default": true + }, + { + "name": "Weststadt", + "adminLevel": 9, + "matched": false, + "unique": false, + "default": false + } + ], + "score": -27.5 + }, + { + "type": "STOP", + "name": "Bahnstadt, Hauptbahnhof Süd", + "id": "de-DELFI_de:08221:4272:1:TrRiO", + "lat": 49.40181, + "lon": 8.674195, + "country": "DE", + "zip": "69115", + "tz": "Europe/Berlin", + "areas": [ + { + "name": "Deutschland", + "adminLevel": 2, + "matched": false, + "unique": false, + "default": false + }, + { + "name": "Baden-Württemberg", + "adminLevel": 4, + "matched": false, + "unique": false, + "default": false + }, + { + "name": "Regierungsbezirk Karlsruhe", + "adminLevel": 5, + "matched": false, + "unique": false, + "default": false + }, + { + "name": "Heidelberg", + "adminLevel": 6, + "matched": true, + "unique": true, + "default": true + }, + { + "name": "Bahnstadt", + "adminLevel": 9, + "matched": false, + "unique": false, + "default": false + } + ], + "score": -26.631120681762695, + "modes": [ + "TRAM", + "BUS" + ], + "importance": 0.000045373457396635786 + }, + { + "type": "PLACE", + "category": "hotel_16", + "name": "Meininger Heidelberg Hauptbahnhof", + "id": "way/[753509904]", + "lat": 49.3987481, + "lon": 8.677719, + "country": "DE", + "zip": "69115", + "tz": "Europe/Berlin", + "areas": [ + { + "name": "Deutschland", + "adminLevel": 2, + "matched": false, + "unique": false, + "default": false + }, + { + "name": "Baden-Württemberg", + "adminLevel": 4, + "matched": false, + "unique": false, + "default": false + }, + { + "name": "Regierungsbezirk Karlsruhe", + "adminLevel": 5, + "matched": false, + "unique": false, + "default": false + }, + { + "name": "Heidelberg", + "adminLevel": 6, + "matched": false, + "unique": true, + "default": true + }, + { + "name": "Weststadt", + "adminLevel": 9, + "matched": false, + "unique": false, + "default": false + } + ], + "score": -26.25 + }, + { + "type": "PLACE", + "category": "none", + "name": "Heidelberg Hauptbahnhof Ost", + "id": "node/[5795035409]", + "lat": 49.4044187, + "lon": 8.6780409, + "country": "DE", + "zip": "69115", + "tz": "Europe/Berlin", + "areas": [ + { + "name": "Deutschland", + "adminLevel": 2, + "matched": false, + "unique": false, + "default": false + }, + { + "name": "Baden-Württemberg", + "adminLevel": 4, + "matched": false, + "unique": false, + "default": false + }, + { + "name": "Regierungsbezirk Karlsruhe", + "adminLevel": 5, + "matched": false, + "unique": false, + "default": false + }, + { + "name": "Heidelberg", + "adminLevel": 6, + "matched": false, + "unique": true, + "default": true + }, + { + "name": "Bergheim", + "adminLevel": 9, + "matched": false, + "unique": false, + "default": false + } + ], + "score": -24.75 + }, + { + "type": "STOP", + "name": "Hauptbahnhof Süd", + "id": "at-Railway-Current-Reference-Data-2026_de:09162:100:11:11", + "lat": 48.13988, + "lon": 11.557491, + "country": "DE", + "zip": "80335", + "tz": "Europe/Berlin", + "areas": [ + { + "name": "Deutschland", + "adminLevel": 2, + "matched": false, + "unique": false, + "default": false + }, + { + "name": "Bayern", + "adminLevel": 4, + "matched": false, + "unique": false, + "default": false + }, + { + "name": "Oberbayern", + "adminLevel": 5, + "matched": false, + "unique": false, + "default": false + }, + { + "name": "München", + "adminLevel": 6, + "matched": false, + "unique": true, + "default": true + }, + { + "name": "Ludwigsvorstadt-Isarvorstadt", + "adminLevel": 9, + "matched": false, + "unique": false, + "default": false + } + ], + "score": -18.81806755065918, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "NIGHT_RAIL", + "REGIONAL_RAIL", + "SUBURBAN", + "SUBWAY", + "TRAM", + "BUS" + ], + "importance": 0.021757638081908226 + }, + { + "type": "STOP", + "name": "Hauptbahnhof/ZOB", + "id": "at-Railway-Current-Reference-Data-2026_de:02000:10950:11:1", + "lat": 53.552475, + "lon": 10.008094999999999, + "level": -1, + "country": "DE", + "zip": "20099", + "tz": "Europe/Berlin", + "areas": [ + { + "name": "Deutschland", + "adminLevel": 2, + "matched": false, + "unique": false, + "default": false + }, + { + "name": "Hamburg", + "adminLevel": 4, + "matched": false, + "unique": true, + "default": true + }, + { + "name": "Hamburg-Mitte", + "adminLevel": 9, + "matched": false, + "unique": false, + "default": false + }, + { + "name": "St. Georg", + "adminLevel": 10, + "matched": false, + "unique": false, + "default": false + } + ], + "score": -18.813016891479492, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "COACH", + "NIGHT_RAIL", + "REGIONAL_RAIL", + "SUBURBAN", + "SUBWAY", + "BUS" + ], + "importance": 0.021419377997517586 + }, + { + "type": "STOP", + "name": "Hauptbahnhof (tief)", + "id": "at-Railway-Current-Reference-Data-2026_de:08111:6115:1:1", + "lat": 48.784748, + "lon": 9.183216999999999, + "country": "DE", + "zip": "70173", + "tz": "Europe/Berlin", + "areas": [ + { + "name": "Deutschland", + "adminLevel": 2, + "matched": false, + "unique": false, + "default": false + }, + { + "name": "Baden-Württemberg", + "adminLevel": 4, + "matched": false, + "unique": false, + "default": false + }, + { + "name": "Regierungsbezirk Stuttgart", + "adminLevel": 5, + "matched": false, + "unique": false, + "default": false + }, + { + "name": "Stuttgart", + "adminLevel": 6, + "matched": false, + "unique": true, + "default": true + }, + { + "name": "Stuttgart-Mitte", + "adminLevel": 9, + "matched": false, + "unique": false, + "default": false + }, + { + "name": "Hauptbahnhof", + "adminLevel": 10, + "matched": false, + "unique": false, + "default": false + } + ], + "score": -18.504125595092773, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "NIGHT_RAIL", + "RIDE_SHARING", + "REGIONAL_RAIL", + "SUBURBAN", + "SUBWAY", + "TRAM", + "BUS" + ], + "importance": 0.019253002479672432 + }, + { + "type": "STOP", + "name": "Wien Hauptbahnhof", + "id": "at-Railway-Current-Reference-Data-2026_Pat:49:1349", + "lat": 48.185190000000006, + "lon": 16.376413, + "level": 1, + "country": "AT", + "zip": "1100", + "tz": "Europe/Vienna", + "areas": [ + { + "name": "Österreich", + "adminLevel": 2, + "matched": false, + "unique": false, + "default": false + }, + { + "name": "Wien", + "adminLevel": 4, + "matched": false, + "unique": true, + "default": true + }, + { + "name": "Favoriten", + "adminLevel": 9, + "matched": false, + "unique": false, + "default": false + }, + { + "name": "Katastralgemeinde Favoriten", + "adminLevel": 10, + "matched": false, + "unique": false, + "default": false + } + ], + "score": -18.438060760498047, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "COACH", + "NIGHT_RAIL", + "REGIONAL_RAIL", + "SUBURBAN", + "SUBWAY", + "TRAM", + "BUS" + ], + "importance": 0.017061332240700722 + }, + { + "type": "STOP", + "name": "Ulm Hauptbahnhof", + "id": "at-Railway-Current-Reference-Data-2026_de:08421:1008:31:1", + "lat": 48.399345000000004, + "lon": 9.982933000000001, + "country": "DE", + "zip": "89073", + "tz": "Europe/Berlin", + "areas": [ + { + "name": "Deutschland", + "adminLevel": 2, + "matched": false, + "unique": false, + "default": false + }, + { + "name": "Baden-Württemberg", + "adminLevel": 4, + "matched": false, + "unique": false, + "default": false + }, + { + "name": "Regierungsbezirk Tübingen", + "adminLevel": 5, + "matched": false, + "unique": false, + "default": false + }, + { + "name": "Ulm", + "adminLevel": 6, + "matched": false, + "unique": true, + "default": true + }, + { + "name": "Mitte", + "adminLevel": 10, + "matched": false, + "unique": false, + "default": false + } + ], + "score": -18.104284286499023, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "COACH", + "NIGHT_RAIL", + "RIDE_SHARING", + "REGIONAL_RAIL", + "TRAM", + "BUS" + ], + "importance": 0.005886611994355917 + } +] \ No newline at end of file diff --git a/website/test/fixtures/transitous/plan.json b/website/test/fixtures/transitous/plan.json new file mode 100644 index 000000000..d109ec472 --- /dev/null +++ b/website/test/fixtures/transitous/plan.json @@ -0,0 +1,1757 @@ +{ + "requestParameters": {}, + "from": { + "name": "Heidelberg, Hauptbahnhof", + "stopId": "de-DELFI_de:08221:1160", + "importance": 0.003857618197798729, + "lat": 49.40357, + "lon": 8.675442000000002, + "level": 0, + "tz": "Europe/Berlin", + "vertexType": "TRANSIT", + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "COACH", + "RIDE_SHARING", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS", + "ODM" + ] + }, + "to": { + "name": "MILANO CENTRALE", + "stopId": "it-trenitalia_01700:station", + "importance": 0.010967501439154148, + "lat": 45.486340999999996, + "lon": 9.204544, + "level": 2, + "tz": "Europe/Rome", + "vertexType": "TRANSIT", + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "NIGHT_RAIL", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS" + ] + }, + "direct": [], + "itineraries": [ + { + "duration": 27420, + "startTime": "2026-10-15T05:13:00Z", + "endTime": "2026-10-15T12:50:00Z", + "transfers": 2, + "id": "Cq4BCgJTMxIiMjAyNjEwMTVfMDY6MjFfZGUtREVMRklfMzQ0MDQ3ODQyMhoaZGUtREVMRklfZGU6MDgyMjE6MTE2MDozOjMh+NueILGzSEAp3pIcsKtZIUAyGmRlLURFTEZJX2RlOjA4MjIyOjI0MTc6MToxOT3QCgxZvUhAQeMBZVOu8CBASNzBwdYGUJzJwdYGWghTVUJVUkJBTmABaQAAAAAAAPC/cQAAAAAAAAAACoIBGhpkZS1ERUxGSV9kZTowODIyMjoyNDE3OjE6MSE90AoMWb1IQCnjAWVTrvAgQDIaZGUtREVMRklfZGU6MDgyMjI6MjQxNzo1OjQ5NSbEXFK9SEBBcQM+P4zwIEBIlMrB1gZQjMvB1gZaBFdBTEtgAWkAAAAAAAAAAHEAAAAAAAAAAAq3AQoHSUNFIDI3NRIiMjAyNjEwMTVfMDY6NTBfZGUtREVMRklfMzQ0MDY3OTgyMxoaZGUtREVMRklfZGU6MDgyMjI6MjQxNzo1OjQhNSbEXFK9SEApcQM+P4zwIEAyGGRlLURFTEZJX2NoOjE6c2xvaWQ6MzAwMDmKCP8iaLBHQEFB0NGqlhQhQEj8zMHWBlDErcLWBloOSElHSFNQRUVEX1JBSUxgAWkAAAAAAAAAAHEAAAAAAAAAAAp9GhhkZS1ERUxGSV9jaDoxOnNsb2lkOjMwMDAhigj/ImiwR0ApQdDRqpYUIUAyF2l0LXRyZW5pdGFsaWFfODUwMDAzMDAwOT4HliNksEdAQRSuR+F6FCFASJCswtYGULyuwtYGWgRXQUxLYAFpAAAAAAAAAABxAAAAAAAAAAAK0gEKAkVDEksyMDI2MTAxNV8xMTozM19pdC10cmVuaXRhbGlhXzAwODNfNjAwODNfMF92XzYtMTktNEEyRS0wMDgzX3ZfNi0xOS00QTJFLTAwODMaF2l0LXRyZW5pdGFsaWFfODUwMDAzMDAwIT4HliNksEdAKRSuR+F6FCFAMhNpdC10cmVuaXRhbGlhXzAxNzAwORraAGxAvkZAQaEvvf25aCJASMy7wtYGUPiXw9YGWg1MT05HX0RJU1RBTkNFYAFpAAAAAAAAAABxAAAAAAAAAEA=", + "legs": [ + { + "mode": "METRO", + "from": { + "name": "Heidelberg, Hauptbahnhof", + "stopId": "de-DELFI_de:08221:1160:3:3", + "parentId": "de-DELFI_de:08221:1160_G", + "importance": 0.003857618197798729, + "lat": 49.403842999999995, + "lon": 8.675138, + "level": -1, + "tz": "Europe/Berlin", + "departure": "2026-10-15T05:13:00Z", + "scheduledDeparture": "2026-10-15T05:13:00Z", + "scheduledTrack": "3", + "track": "3", + "description": "Gleis 2, Gleis 3", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "COACH", + "RIDE_SHARING", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS", + "ODM" + ] + }, + "to": { + "name": "Mannheim, Hauptbahnhof", + "stopId": "de-DELFI_de:08222:2417:1:1", + "parentId": "de-DELFI_de:08222:2417", + "importance": 0.0067779431119561195, + "lat": 49.479279999999996, + "lon": 8.470080000000001, + "level": 0, + "tz": "Europe/Berlin", + "arrival": "2026-10-15T05:31:00Z", + "scheduledArrival": "2026-10-15T05:29:00Z", + "scheduledTrack": "1", + "track": "1", + "description": "Gleis 1", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "COACH", + "NIGHT_RAIL", + "RIDE_SHARING", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS" + ] + }, + "duration": 1080, + "startTime": "2026-10-15T05:13:00Z", + "endTime": "2026-10-15T05:31:00Z", + "scheduledStartTime": "2026-10-15T05:13:00Z", + "scheduledEndTime": "2026-10-15T05:29:00Z", + "realTime": true, + "scheduled": true, + "interlineWithPreviousLeg": false, + "headsign": "Mannheim Hbf", + "tripFrom": { + "name": "Karlsruhe Hauptbahnhof", + "stopId": "de-DELFI_de:08212:90:4:6", + "parentId": "de-DELFI_de:08212:90", + "importance": 0.010275337845087051, + "lat": 48.993366, + "lon": 8.401277999999998, + "level": 0, + "tz": "Europe/Berlin", + "departure": "2026-10-15T04:21:00Z", + "scheduledDeparture": "2026-10-15T04:21:00Z", + "scheduledTrack": "6", + "track": "6", + "description": "Gleis 5+6", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "COACH", + "NIGHT_RAIL", + "RIDE_SHARING", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS" + ] + }, + "tripTo": { + "name": "Germersheim", + "stopId": "de-DELFI_de:07334:32637:4:5", + "importance": 0.0008799014030955732, + "lat": 49.225640000000006, + "lon": 8.364806000000002, + "level": 0, + "tz": "Europe/Berlin", + "arrival": "2026-10-15T06:12:00Z", + "scheduledArrival": "2026-10-15T06:12:00Z", + "scheduledTrack": "5", + "track": "5", + "description": "Gleis 4+5", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "REGIONAL_RAIL", + "SUBURBAN", + "BUS" + ] + }, + "routeId": "de-DELFI_de:rlp:s3:_109", + "routeUrl": "", + "directionId": "1", + "routeColor": "fddd04", + "routeTextColor": "231f20", + "routeType": 109, + "agencyName": "DB Regio AG Mitte Region Südwest", + "agencyUrl": "", + "agencyFareUrl": "", + "agencyId": "10449", + "tripId": "20261015_06:21_de-DELFI_3440478422", + "routeShortName": "S3", + "routeLongName": "", + "tripShortName": "038310", + "displayName": "S3", + "cancelled": false, + "source": "de_DELFI.gtfs.zip/stop_times.txt:40919793:40919824", + "intermediateStops": [ + { + "name": "HD-Pfaffengrund/Wieblingen", + "stopId": "de-DELFI_de:08221:1454:1:1", + "parentId": "de-DELFI_de:08221:1454", + "importance": 0.000958796648774296, + "lat": 49.41197, + "lon": 8.641532999999999, + "level": 0, + "tz": "Europe/Berlin", + "arrival": "2026-10-15T05:16:00Z", + "departure": "2026-10-15T05:17:00Z", + "scheduledArrival": "2026-10-15T05:16:00Z", + "scheduledDeparture": "2026-10-15T05:17:00Z", + "scheduledTrack": "1", + "track": "1", + "description": "Gleis 1", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "REGIONAL_RAIL", + "SUBURBAN", + "BUS", + "ODM" + ] + }, + { + "name": "MA-Friedrichsfeld, Südbahnhof", + "stopId": "de-DELFI_de:08222:2334:1:1", + "parentId": "de-DELFI_de:08222:2334", + "importance": 0.000713150657247752, + "lat": 49.438103000000005, + "lon": 8.572569000000001, + "level": 0, + "tz": "Europe/Berlin", + "arrival": "2026-10-15T05:21:00Z", + "departure": "2026-10-15T05:22:00Z", + "scheduledArrival": "2026-10-15T05:21:00Z", + "scheduledDeparture": "2026-10-15T05:22:00Z", + "scheduledTrack": "1", + "track": "1", + "description": "Zug->Mannheim", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "SUBURBAN", + "BUS", + "ODM" + ] + } + ], + "legGeometry": { + "points": "u~sqF}dceAu@" + }, + "bikesAllowed": false, + "wheelchairAccessible": "NOT_ACCESSIBLE", + "reservation": "NONE", + "alternatives": [], + "steps": [] + }, + { + "mode": "WALK", + "from": { + "name": "Mannheim, Hauptbahnhof", + "stopId": "de-DELFI_de:08222:2417:1:1", + "parentId": "de-DELFI_de:08222:2417", + "importance": 0.0067779431119561195, + "lat": 49.479279999999996, + "lon": 8.470080000000001, + "level": 0, + "tz": "Europe/Berlin", + "arrival": "2026-10-15T05:31:00Z", + "departure": "2026-10-15T05:31:00Z", + "scheduledArrival": "2026-10-15T05:29:00Z", + "scheduledDeparture": "2026-10-15T05:31:00Z", + "scheduledTrack": "1", + "track": "1", + "description": "Gleis 1", + "vertexType": "TRANSIT", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "COACH", + "NIGHT_RAIL", + "RIDE_SHARING", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS" + ] + }, + "to": { + "name": "Mannheim, Hauptbahnhof", + "stopId": "de-DELFI_de:08222:2417:5:4", + "parentId": "de-DELFI_de:08222:2417", + "importance": 0.0067779431119561195, + "lat": 49.479076, + "lon": 8.46982, + "level": 0, + "tz": "Europe/Berlin", + "arrival": "2026-10-15T05:33:00Z", + "scheduledArrival": "2026-10-15T05:33:00Z", + "scheduledTrack": "4", + "track": "4", + "description": "Gleis 4, Gleis 5", + "vertexType": "TRANSIT", + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "COACH", + "NIGHT_RAIL", + "RIDE_SHARING", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS" + ] + }, + "duration": 120, + "startTime": "2026-10-15T05:31:00Z", + "endTime": "2026-10-15T05:33:00Z", + "scheduledStartTime": "2026-10-15T05:31:00Z", + "scheduledEndTime": "2026-10-15T05:33:00Z", + "realTime": false, + "scheduled": false, + "distance": 77, + "legGeometry": { + "points": "u~sqF}dceAu@" + }, + "steps": [], + "intermediateStops": [] + }, + { + "mode": "HIGHSPEED_RAIL", + "from": { + "name": "Mannheim, Hauptbahnhof", + "stopId": "de-DELFI_de:08222:2417:5:4", + "parentId": "de-DELFI_de:08222:2417", + "importance": 0.0067779431119561195, + "lat": 49.479076, + "lon": 8.46982, + "level": 0, + "tz": "Europe/Berlin", + "departure": "2026-10-15T05:37:00Z", + "scheduledDeparture": "2026-10-15T05:37:00Z", + "scheduledTrack": "4", + "track": "4", + "description": "Gleis 4, Gleis 5", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "COACH", + "NIGHT_RAIL", + "RIDE_SHARING", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS" + ] + }, + "to": { + "name": "Zürich HB", + "stopId": "de-DELFI_ch:1:sloid:3000", + "importance": 0.07083380967378616, + "lat": 47.378178000000005, + "lon": 8.540211999999999, + "level": 0, + "tz": "Europe/Zurich", + "arrival": "2026-10-15T09:00:00Z", + "scheduledArrival": "2026-10-15T09:03:00Z", + "track": "10", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "NIGHT_RAIL", + "REGIONAL_RAIL", + "SUBURBAN" + ] + }, + "duration": 12180, + "startTime": "2026-10-15T05:37:00Z", + "endTime": "2026-10-15T09:00:00Z", + "scheduledStartTime": "2026-10-15T05:37:00Z", + "scheduledEndTime": "2026-10-15T09:03:00Z", + "realTime": true, + "scheduled": true, + "interlineWithPreviousLeg": false, + "headsign": "Zürich HB", + "tripFrom": { + "name": "Basel SBB", + "stopId": "de-DELFI_ch:1:sloid:10", + "importance": 0.03557715564966202, + "lat": 47.547413, + "lon": 7.589563000000001, + "level": 0, + "tz": "Europe/Zurich", + "departure": "2026-10-15T08:07:00Z", + "scheduledDeparture": "2026-10-15T08:07:00Z", + "track": "4", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "NIGHT_RAIL", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS" + ] + }, + "tripTo": { + "name": "Basel SBB", + "stopId": "de-DELFI_ch:1:sloid:10", + "importance": 0.03557715564966202, + "lat": 47.547413, + "lon": 7.589563000000001, + "level": 0, + "tz": "Europe/Zurich", + "arrival": "2026-10-15T07:47:00Z", + "scheduledArrival": "2026-10-15T07:48:00Z", + "track": "4", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "NIGHT_RAIL", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS" + ] + }, + "routeId": "de-DELFI_162290_101", + "routeUrl": "", + "directionId": "1", + "routeType": 101, + "agencyName": "DB Fernverkehr AG", + "agencyUrl": "", + "agencyFareUrl": "", + "agencyId": "12681", + "tripId": "20261015_06:50_de-DELFI_3440679823", + "routeShortName": "ICE 275", + "routeLongName": "", + "tripShortName": "ICE 275", + "displayName": "ICE 275", + "cancelled": false, + "source": "de_DELFI.gtfs.zip/stop_times.txt:39893110:39893116", + "intermediateStops": [ + { + "name": "Karlsruhe Hauptbahnhof", + "stopId": "de-DELFI_de:08212:90:2:2", + "parentId": "de-DELFI_de:08212:90", + "importance": 0.010275337845087051, + "lat": 48.99373200000001, + "lon": 8.401070999999998, + "level": 1, + "tz": "Europe/Berlin", + "arrival": "2026-10-15T05:59:00Z", + "departure": "2026-10-15T06:01:00Z", + "scheduledArrival": "2026-10-15T05:59:00Z", + "scheduledDeparture": "2026-10-15T06:01:00Z", + "scheduledTrack": "2", + "track": "2", + "description": "Gleis 1+2", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "COACH", + "NIGHT_RAIL", + "RIDE_SHARING", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS" + ] + }, + { + "name": "Offenburg Bahnhof", + "stopId": "de-DELFI_de:08317:14506:1:1", + "parentId": "de-DELFI_de:08317:14506", + "importance": 0.002785325516015291, + "lat": 48.47649, + "lon": 7.946129000000001, + "level": 0, + "tz": "Europe/Berlin", + "arrival": "2026-10-15T06:29:00Z", + "departure": "2026-10-15T06:30:00Z", + "scheduledArrival": "2026-10-15T06:29:00Z", + "scheduledDeparture": "2026-10-15T06:30:00Z", + "scheduledTrack": "1", + "track": "1", + "description": "Gleis 1+2", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "NIGHT_RAIL", + "REGIONAL_RAIL", + "BUS" + ] + } + ], + "legGeometry": { + "points": "u~sqF}dceAu@" + }, + "bikesAllowed": false, + "wheelchairAccessible": "NOT_ACCESSIBLE", + "reservation": "NONE", + "alternatives": [], + "steps": [] + }, + { + "mode": "WALK", + "from": { + "name": "Zürich HB", + "stopId": "de-DELFI_ch:1:sloid:3000", + "importance": 0.07083380967378616, + "lat": 47.378178000000005, + "lon": 8.540211999999999, + "level": 0, + "tz": "Europe/Zurich", + "arrival": "2026-10-15T09:00:00Z", + "departure": "2026-10-15T09:00:00Z", + "scheduledArrival": "2026-10-15T09:03:00Z", + "scheduledDeparture": "2026-10-15T09:00:00Z", + "track": "10", + "vertexType": "TRANSIT", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "NIGHT_RAIL", + "REGIONAL_RAIL", + "SUBURBAN" + ] + }, + "to": { + "name": "ZUERICH HB", + "stopId": "it-trenitalia_850003000", + "parentId": "it-trenitalia_850003000:station", + "importance": 0.07083380967378616, + "lat": 47.378056, + "lon": 8.54, + "level": 0, + "tz": "Europe/Zurich", + "arrival": "2026-10-15T09:05:00Z", + "scheduledArrival": "2026-10-15T09:05:00Z", + "vertexType": "TRANSIT", + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "NIGHT_RAIL", + "REGIONAL_RAIL", + "SUBURBAN" + ] + }, + "duration": 300, + "startTime": "2026-10-15T09:00:00Z", + "endTime": "2026-10-15T09:05:00Z", + "scheduledStartTime": "2026-10-15T09:00:00Z", + "scheduledEndTime": "2026-10-15T09:05:00Z", + "realTime": false, + "scheduled": false, + "distance": 117, + "legGeometry": { + "points": "u~sqF}dceAu@" + }, + "steps": [], + "intermediateStops": [] + }, + { + "mode": "LONG_DISTANCE", + "from": { + "name": "ZUERICH HB", + "stopId": "it-trenitalia_850003000", + "parentId": "it-trenitalia_850003000:station", + "importance": 0.07083380967378616, + "lat": 47.378056, + "lon": 8.54, + "level": 0, + "tz": "Europe/Zurich", + "departure": "2026-10-15T09:33:00Z", + "scheduledDeparture": "2026-10-15T09:33:00Z", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "NIGHT_RAIL", + "REGIONAL_RAIL", + "SUBURBAN" + ] + }, + "to": { + "name": "MILANO CENTRALE", + "stopId": "it-trenitalia_01700", + "parentId": "it-trenitalia_01700:station", + "importance": 0.010967501439154148, + "lat": 45.486340999999996, + "lon": 9.204544, + "level": 2, + "tz": "Europe/Rome", + "arrival": "2026-10-15T12:50:00Z", + "scheduledArrival": "2026-10-15T12:50:00Z", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "NIGHT_RAIL", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS" + ] + }, + "duration": 11820, + "startTime": "2026-10-15T09:33:00Z", + "endTime": "2026-10-15T12:50:00Z", + "scheduledStartTime": "2026-10-15T09:33:00Z", + "scheduledEndTime": "2026-10-15T12:50:00Z", + "realTime": false, + "scheduled": true, + "interlineWithPreviousLeg": false, + "headsign": "MILANO CENTRALE", + "tripFrom": { + "name": "ZUERICH HB", + "stopId": "it-trenitalia_850003000", + "parentId": "it-trenitalia_850003000:station", + "importance": 0.07083380967378616, + "lat": 47.378056, + "lon": 8.54, + "level": 0, + "tz": "Europe/Zurich", + "departure": "2026-10-15T09:33:00Z", + "scheduledDeparture": "2026-10-15T09:33:00Z", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "NIGHT_RAIL", + "REGIONAL_RAIL", + "SUBURBAN" + ] + }, + "tripTo": { + "name": "MILANO CENTRALE", + "stopId": "it-trenitalia_01700", + "parentId": "it-trenitalia_01700:station", + "importance": 0.010967501439154148, + "lat": 45.486340999999996, + "lon": 9.204544, + "level": 2, + "tz": "Europe/Rome", + "arrival": "2026-10-15T12:50:00Z", + "scheduledArrival": "2026-10-15T12:50:00Z", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "NIGHT_RAIL", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS" + ] + }, + "routeId": "it-trenitalia_60083_7cf9622d2ca9dab7", + "routeUrl": "", + "directionId": "1", + "routeColor": "1f6fb2", + "routeTextColor": "ffffff", + "routeType": 102, + "agencyName": "TRENITALIA", + "agencyUrl": "http://www.trenitalia.com", + "agencyFareUrl": "", + "agencyId": "TRENITALIA", + "tripId": "20261015_11:33_it-trenitalia_0083_60083_0_v_6-19-4A2E-0083_v_6-19-4A2E-0083", + "routeShortName": "EC", + "routeLongName": "Eurocity", + "tripShortName": "19", + "displayName": "EC", + "cancelled": false, + "source": "it_trenitalia.gtfs.zip/stop_times.txt:116621:116628", + "intermediateStops": [ + { + "name": "ZUG(CH)", + "stopId": "it-trenitalia_850002204", + "parentId": "it-trenitalia_850002204:station", + "importance": 0.0008505891892127693, + "lat": 47.173611, + "lon": 8.515277999999999, + "level": 1, + "tz": "Europe/Zurich", + "arrival": "2026-10-15T09:59:00Z", + "departure": "2026-10-15T10:00:00Z", + "scheduledArrival": "2026-10-15T09:59:00Z", + "scheduledDeparture": "2026-10-15T10:00:00Z", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "LONG_DISTANCE", + "REGIONAL_RAIL" + ] + }, + { + "name": "ARTH-GOLDAU", + "stopId": "it-trenitalia_850005004", + "parentId": "it-trenitalia_850005004:station", + "importance": 0.010756864212453365, + "lat": 47.048888999999996, + "lon": 8.549444000000001, + "level": 0, + "tz": "Europe/Zurich", + "arrival": "2026-10-15T10:16:00Z", + "departure": "2026-10-15T10:18:00Z", + "scheduledArrival": "2026-10-15T10:16:00Z", + "scheduledDeparture": "2026-10-15T10:18:00Z", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "LONG_DISTANCE", + "NIGHT_RAIL", + "REGIONAL_RAIL", + "SUBURBAN", + "BUS", + "FUNICULAR" + ] + } + ], + "legGeometry": { + "points": "u~sqF}dceAu@" + }, + "bikesAllowed": false, + "wheelchairAccessible": "NOT_ACCESSIBLE", + "reservation": "NONE", + "alternatives": [], + "steps": [] + } + ] + }, + { + "duration": 25440, + "startTime": "2026-10-15T05:13:00Z", + "endTime": "2026-10-15T12:17:00Z", + "transfers": 3, + "id": "Cq4BCgJTMxIiMjAyNjEwMTVfMDY6MjFfZGUtREVMRklfMzQ0MDQ3ODQyMhoaZGUtREVMRklfZGU6MDgyMjE6MTE2MDozOjMh+NueILGzSEAp3pIcsKtZIUAyGmRlLURFTEZJX2RlOjA4MjIyOjI0MTc6MToxOT3QCgxZvUhAQeMBZVOu8CBASNzBwdYGUJzJwdYGWghTVUJVUkJBTmABaQAAAAAAAPC/cQAAAAAAAAAACoIBGhpkZS1ERUxGSV9kZTowODIyMjoyNDE3OjE6MSE90AoMWb1IQCnjAWVTrvAgQDIaZGUtREVMRklfZGU6MDgyMjI6MjQxNzo1OjQ5NSbEXFK9SEBBcQM+P4zwIEBIlMrB1gZQjMvB1gZaBFdBTEtgAWkAAAAAAAAAAHEAAAAAAAAAAAq3AQoHSUNFIDI3NRIiMjAyNjEwMTVfMDY6NTBfZGUtREVMRklfMzQ0MDY3OTgyMxoaZGUtREVMRklfZGU6MDgyMjI6MjQxNzo1OjQhNSbEXFK9SEApcQM+P4zwIEAyGGRlLURFTEZJX2NoOjE6c2xvaWQ6MzAwMDmKCP8iaLBHQEFB0NGqlhQhQEj8zMHWBlDErcLWBloOSElHSFNQRUVEX1JBSUxgAWkAAAAAAAAAAHEAAAAAAAAAAAqVARoYZGUtREVMRklfY2g6MTpzbG9pZDozMDAwIYoI/yJosEdAKUHQ0aqWFCFAMi9jaC1vcGVudHJhbnNwb3J0ZGF0YXN3aXNzMjZfY2g6MTpzbG9pZDozMDAwOjU6ODmwHCEDebBHQEGBQGfSphIhQEiQrMLWBlC8rsLWBloEV0FMS2ABaQAAAAAAAAAAcQAAAAAAAAAACvYBCgNJQzISQzIwMjYxMDE1XzExOjA1X2NoLW9wZW50cmFuc3BvcnRkYXRhc3dpc3MyNl8ub2pwLTkxLTItRy4xLlRBLjE2NC5qMjYaL2NoLW9wZW50cmFuc3BvcnRkYXRhc3dpc3MyNl9jaDoxOnNsb2lkOjMwMDA6NTo4IbAcIQN5sEdAKYFAZ9KmEiFAMi9jaC1vcGVudHJhbnNwb3J0ZGF0YXN3aXNzMjZfY2g6MTpzbG9pZDo1MzAwOjI6Mjkq/1peuQBHQEEff2lRn+QhQEi8rsLWBlC448LWBloNTE9OR19ESVNUQU5DRWABaQAAAAAAAAAACpoBGi9jaC1vcGVudHJhbnNwb3J0ZGF0YXN3aXNzMjZfY2g6MTpzbG9pZDo1MzAwOjI6MiEq/1peuQBHQCkff2lRn+QhQDIvY2gtb3BlbnRyYW5zcG9ydGRhdGFzd2lzczI2X2NoOjE6c2xvaWQ6NTMwMDoxOjE5ct9qnbgAR0BBSMfVyK7kIUBIuOPC1gZQqOXC1gZaBFdBTEtgAQrqAQoEUkU4MBJCMjAyNjEwMTVfMTI6MjJfY2gtb3BlbnRyYW5zcG9ydGRhdGFzd2lzczI2Xy5vanAtOTEtODAuMS5UQS45MTUuajI2Gi9jaC1vcGVudHJhbnNwb3J0ZGF0YXN3aXNzMjZfY2g6MTpzbG9pZDo1MzAwOjE6MSFy32qduABHQClIx9XIruQhQDIjY2gtb3BlbnRyYW5zcG9ydGRhdGFzd2lzczI2XzgzMDE3MDA59dVVgVq+RkBBqwDfbd5oIkBIqOXC1gZQvIjD1gZaDVJFR0lPTkFMX1JBSUxgAXEAAAAAAAAAQA==", + "legs": [ + { + "mode": "METRO", + "from": { + "name": "Heidelberg, Hauptbahnhof", + "stopId": "de-DELFI_de:08221:1160:3:3", + "parentId": "de-DELFI_de:08221:1160_G", + "importance": 0.003857618197798729, + "lat": 49.403842999999995, + "lon": 8.675138, + "level": -1, + "tz": "Europe/Berlin", + "departure": "2026-10-15T05:13:00Z", + "scheduledDeparture": "2026-10-15T05:13:00Z", + "scheduledTrack": "3", + "track": "3", + "description": "Gleis 2, Gleis 3", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "COACH", + "RIDE_SHARING", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS", + "ODM" + ] + }, + "to": { + "name": "Mannheim, Hauptbahnhof", + "stopId": "de-DELFI_de:08222:2417:1:1", + "parentId": "de-DELFI_de:08222:2417", + "importance": 0.0067779431119561195, + "lat": 49.479279999999996, + "lon": 8.470080000000001, + "level": 0, + "tz": "Europe/Berlin", + "arrival": "2026-10-15T05:31:00Z", + "scheduledArrival": "2026-10-15T05:29:00Z", + "scheduledTrack": "1", + "track": "1", + "description": "Gleis 1", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "COACH", + "NIGHT_RAIL", + "RIDE_SHARING", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS" + ] + }, + "duration": 1080, + "startTime": "2026-10-15T05:13:00Z", + "endTime": "2026-10-15T05:31:00Z", + "scheduledStartTime": "2026-10-15T05:13:00Z", + "scheduledEndTime": "2026-10-15T05:29:00Z", + "realTime": true, + "scheduled": true, + "interlineWithPreviousLeg": false, + "headsign": "Mannheim Hbf", + "tripFrom": { + "name": "Karlsruhe Hauptbahnhof", + "stopId": "de-DELFI_de:08212:90:4:6", + "parentId": "de-DELFI_de:08212:90", + "importance": 0.010275337845087051, + "lat": 48.993366, + "lon": 8.401277999999998, + "level": 0, + "tz": "Europe/Berlin", + "departure": "2026-10-15T04:21:00Z", + "scheduledDeparture": "2026-10-15T04:21:00Z", + "scheduledTrack": "6", + "track": "6", + "description": "Gleis 5+6", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "COACH", + "NIGHT_RAIL", + "RIDE_SHARING", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS" + ] + }, + "tripTo": { + "name": "Germersheim", + "stopId": "de-DELFI_de:07334:32637:4:5", + "importance": 0.0008799014030955732, + "lat": 49.225640000000006, + "lon": 8.364806000000002, + "level": 0, + "tz": "Europe/Berlin", + "arrival": "2026-10-15T06:12:00Z", + "scheduledArrival": "2026-10-15T06:12:00Z", + "scheduledTrack": "5", + "track": "5", + "description": "Gleis 4+5", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "REGIONAL_RAIL", + "SUBURBAN", + "BUS" + ] + }, + "routeId": "de-DELFI_de:rlp:s3:_109", + "routeUrl": "", + "directionId": "1", + "routeColor": "fddd04", + "routeTextColor": "231f20", + "routeType": 109, + "agencyName": "DB Regio AG Mitte Region Südwest", + "agencyUrl": "", + "agencyFareUrl": "", + "agencyId": "10449", + "tripId": "20261015_06:21_de-DELFI_3440478422", + "routeShortName": "S3", + "routeLongName": "", + "tripShortName": "038310", + "displayName": "S3", + "cancelled": false, + "source": "de_DELFI.gtfs.zip/stop_times.txt:40919793:40919824", + "intermediateStops": [ + { + "name": "HD-Pfaffengrund/Wieblingen", + "stopId": "de-DELFI_de:08221:1454:1:1", + "parentId": "de-DELFI_de:08221:1454", + "importance": 0.000958796648774296, + "lat": 49.41197, + "lon": 8.641532999999999, + "level": 0, + "tz": "Europe/Berlin", + "arrival": "2026-10-15T05:16:00Z", + "departure": "2026-10-15T05:17:00Z", + "scheduledArrival": "2026-10-15T05:16:00Z", + "scheduledDeparture": "2026-10-15T05:17:00Z", + "scheduledTrack": "1", + "track": "1", + "description": "Gleis 1", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "REGIONAL_RAIL", + "SUBURBAN", + "BUS", + "ODM" + ] + }, + { + "name": "MA-Friedrichsfeld, Südbahnhof", + "stopId": "de-DELFI_de:08222:2334:1:1", + "parentId": "de-DELFI_de:08222:2334", + "importance": 0.000713150657247752, + "lat": 49.438103000000005, + "lon": 8.572569000000001, + "level": 0, + "tz": "Europe/Berlin", + "arrival": "2026-10-15T05:21:00Z", + "departure": "2026-10-15T05:22:00Z", + "scheduledArrival": "2026-10-15T05:21:00Z", + "scheduledDeparture": "2026-10-15T05:22:00Z", + "scheduledTrack": "1", + "track": "1", + "description": "Zug->Mannheim", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "SUBURBAN", + "BUS", + "ODM" + ] + } + ], + "legGeometry": { + "points": "u~sqF}dceAu@" + }, + "bikesAllowed": false, + "wheelchairAccessible": "NOT_ACCESSIBLE", + "reservation": "NONE", + "alternatives": [], + "steps": [] + }, + { + "mode": "WALK", + "from": { + "name": "Mannheim, Hauptbahnhof", + "stopId": "de-DELFI_de:08222:2417:1:1", + "parentId": "de-DELFI_de:08222:2417", + "importance": 0.0067779431119561195, + "lat": 49.479279999999996, + "lon": 8.470080000000001, + "level": 0, + "tz": "Europe/Berlin", + "arrival": "2026-10-15T05:31:00Z", + "departure": "2026-10-15T05:31:00Z", + "scheduledArrival": "2026-10-15T05:29:00Z", + "scheduledDeparture": "2026-10-15T05:31:00Z", + "scheduledTrack": "1", + "track": "1", + "description": "Gleis 1", + "vertexType": "TRANSIT", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "COACH", + "NIGHT_RAIL", + "RIDE_SHARING", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS" + ] + }, + "to": { + "name": "Mannheim, Hauptbahnhof", + "stopId": "de-DELFI_de:08222:2417:5:4", + "parentId": "de-DELFI_de:08222:2417", + "importance": 0.0067779431119561195, + "lat": 49.479076, + "lon": 8.46982, + "level": 0, + "tz": "Europe/Berlin", + "arrival": "2026-10-15T05:33:00Z", + "scheduledArrival": "2026-10-15T05:33:00Z", + "scheduledTrack": "4", + "track": "4", + "description": "Gleis 4, Gleis 5", + "vertexType": "TRANSIT", + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "COACH", + "NIGHT_RAIL", + "RIDE_SHARING", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS" + ] + }, + "duration": 120, + "startTime": "2026-10-15T05:31:00Z", + "endTime": "2026-10-15T05:33:00Z", + "scheduledStartTime": "2026-10-15T05:31:00Z", + "scheduledEndTime": "2026-10-15T05:33:00Z", + "realTime": false, + "scheduled": false, + "distance": 77, + "legGeometry": { + "points": "u~sqF}dceAu@" + }, + "steps": [], + "intermediateStops": [] + }, + { + "mode": "HIGHSPEED_RAIL", + "from": { + "name": "Mannheim, Hauptbahnhof", + "stopId": "de-DELFI_de:08222:2417:5:4", + "parentId": "de-DELFI_de:08222:2417", + "importance": 0.0067779431119561195, + "lat": 49.479076, + "lon": 8.46982, + "level": 0, + "tz": "Europe/Berlin", + "departure": "2026-10-15T05:37:00Z", + "scheduledDeparture": "2026-10-15T05:37:00Z", + "scheduledTrack": "4", + "track": "4", + "description": "Gleis 4, Gleis 5", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "COACH", + "NIGHT_RAIL", + "RIDE_SHARING", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS" + ] + }, + "to": { + "name": "Zürich HB", + "stopId": "de-DELFI_ch:1:sloid:3000", + "importance": 0.07083380967378616, + "lat": 47.378178000000005, + "lon": 8.540211999999999, + "level": 0, + "tz": "Europe/Zurich", + "arrival": "2026-10-15T09:00:00Z", + "scheduledArrival": "2026-10-15T09:03:00Z", + "track": "10", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "NIGHT_RAIL", + "REGIONAL_RAIL", + "SUBURBAN" + ] + }, + "duration": 12180, + "startTime": "2026-10-15T05:37:00Z", + "endTime": "2026-10-15T09:00:00Z", + "scheduledStartTime": "2026-10-15T05:37:00Z", + "scheduledEndTime": "2026-10-15T09:03:00Z", + "realTime": true, + "scheduled": true, + "interlineWithPreviousLeg": false, + "headsign": "Zürich HB", + "tripFrom": { + "name": "Basel SBB", + "stopId": "de-DELFI_ch:1:sloid:10", + "importance": 0.03557715564966202, + "lat": 47.547413, + "lon": 7.589563000000001, + "level": 0, + "tz": "Europe/Zurich", + "departure": "2026-10-15T08:07:00Z", + "scheduledDeparture": "2026-10-15T08:07:00Z", + "track": "4", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "NIGHT_RAIL", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS" + ] + }, + "tripTo": { + "name": "Basel SBB", + "stopId": "de-DELFI_ch:1:sloid:10", + "importance": 0.03557715564966202, + "lat": 47.547413, + "lon": 7.589563000000001, + "level": 0, + "tz": "Europe/Zurich", + "arrival": "2026-10-15T07:47:00Z", + "scheduledArrival": "2026-10-15T07:48:00Z", + "track": "4", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "NIGHT_RAIL", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS" + ] + }, + "routeId": "de-DELFI_162290_101", + "routeUrl": "", + "directionId": "1", + "routeType": 101, + "agencyName": "DB Fernverkehr AG", + "agencyUrl": "", + "agencyFareUrl": "", + "agencyId": "12681", + "tripId": "20261015_06:50_de-DELFI_3440679823", + "routeShortName": "ICE 275", + "routeLongName": "", + "tripShortName": "ICE 275", + "displayName": "ICE 275", + "cancelled": false, + "source": "de_DELFI.gtfs.zip/stop_times.txt:39893110:39893116", + "intermediateStops": [ + { + "name": "Karlsruhe Hauptbahnhof", + "stopId": "de-DELFI_de:08212:90:2:2", + "parentId": "de-DELFI_de:08212:90", + "importance": 0.010275337845087051, + "lat": 48.99373200000001, + "lon": 8.401070999999998, + "level": 1, + "tz": "Europe/Berlin", + "arrival": "2026-10-15T05:59:00Z", + "departure": "2026-10-15T06:01:00Z", + "scheduledArrival": "2026-10-15T05:59:00Z", + "scheduledDeparture": "2026-10-15T06:01:00Z", + "scheduledTrack": "2", + "track": "2", + "description": "Gleis 1+2", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "COACH", + "NIGHT_RAIL", + "RIDE_SHARING", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS" + ] + }, + { + "name": "Offenburg Bahnhof", + "stopId": "de-DELFI_de:08317:14506:1:1", + "parentId": "de-DELFI_de:08317:14506", + "importance": 0.002785325516015291, + "lat": 48.47649, + "lon": 7.946129000000001, + "level": 0, + "tz": "Europe/Berlin", + "arrival": "2026-10-15T06:29:00Z", + "departure": "2026-10-15T06:30:00Z", + "scheduledArrival": "2026-10-15T06:29:00Z", + "scheduledDeparture": "2026-10-15T06:30:00Z", + "scheduledTrack": "1", + "track": "1", + "description": "Gleis 1+2", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "NIGHT_RAIL", + "REGIONAL_RAIL", + "BUS" + ] + } + ], + "legGeometry": { + "points": "u~sqF}dceAu@" + }, + "bikesAllowed": false, + "wheelchairAccessible": "NOT_ACCESSIBLE", + "reservation": "NONE", + "alternatives": [], + "steps": [] + }, + { + "mode": "WALK", + "from": { + "name": "Zürich HB", + "stopId": "de-DELFI_ch:1:sloid:3000", + "importance": 0.07083380967378616, + "lat": 47.378178000000005, + "lon": 8.540211999999999, + "level": 0, + "tz": "Europe/Zurich", + "arrival": "2026-10-15T09:00:00Z", + "departure": "2026-10-15T09:00:00Z", + "scheduledArrival": "2026-10-15T09:03:00Z", + "scheduledDeparture": "2026-10-15T09:00:00Z", + "track": "10", + "vertexType": "TRANSIT", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "NIGHT_RAIL", + "REGIONAL_RAIL", + "SUBURBAN" + ] + }, + "to": { + "name": "Zürich HB", + "stopId": "ch-opentransportdataswiss26_ch:1:sloid:3000:5:8", + "parentId": "ch-opentransportdataswiss26_Parentch:1:sloid:3000", + "importance": 0.07083380967378616, + "lat": 47.378693, + "lon": 8.536429, + "level": 0, + "tz": "Europe/Zurich", + "arrival": "2026-10-15T09:05:00Z", + "scheduledArrival": "2026-10-15T09:05:00Z", + "scheduledTrack": "8", + "track": "8", + "vertexType": "TRANSIT", + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "NIGHT_RAIL", + "REGIONAL_RAIL", + "SUBURBAN" + ] + }, + "duration": 300, + "startTime": "2026-10-15T09:00:00Z", + "endTime": "2026-10-15T09:05:00Z", + "scheduledStartTime": "2026-10-15T09:00:00Z", + "scheduledEndTime": "2026-10-15T09:05:00Z", + "realTime": false, + "scheduled": false, + "distance": 421, + "legGeometry": { + "points": "u~sqF}dceAu@" + }, + "steps": [], + "intermediateStops": [] + }, + { + "mode": "LONG_DISTANCE", + "from": { + "name": "Zürich HB", + "stopId": "ch-opentransportdataswiss26_ch:1:sloid:3000:5:8", + "parentId": "ch-opentransportdataswiss26_Parentch:1:sloid:3000", + "importance": 0.07083380967378616, + "lat": 47.378693, + "lon": 8.536429, + "level": 0, + "tz": "Europe/Zurich", + "departure": "2026-10-15T09:05:00Z", + "scheduledDeparture": "2026-10-15T09:05:00Z", + "scheduledTrack": "8", + "track": "8", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "NIGHT_RAIL", + "REGIONAL_RAIL", + "SUBURBAN" + ] + }, + "to": { + "name": "Lugano", + "stopId": "ch-opentransportdataswiss26_ch:1:sloid:5300:2:2", + "parentId": "ch-opentransportdataswiss26_Parentch:1:sloid:5300", + "importance": 0.013114487752318382, + "lat": 46.005657, + "lon": 8.946527999999999, + "level": 0, + "tz": "Europe/Zurich", + "arrival": "2026-10-15T10:58:00Z", + "scheduledArrival": "2026-10-15T10:58:00Z", + "scheduledTrack": "2", + "track": "2", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "LONG_DISTANCE", + "NIGHT_RAIL", + "REGIONAL_RAIL", + "SUBURBAN" + ] + }, + "duration": 6780, + "startTime": "2026-10-15T09:05:00Z", + "endTime": "2026-10-15T10:58:00Z", + "scheduledStartTime": "2026-10-15T09:05:00Z", + "scheduledEndTime": "2026-10-15T10:58:00Z", + "realTime": false, + "scheduled": true, + "interlineWithPreviousLeg": false, + "headsign": "Lugano", + "tripFrom": { + "name": "Zürich HB", + "stopId": "ch-opentransportdataswiss26_ch:1:sloid:3000:5:8", + "parentId": "ch-opentransportdataswiss26_Parentch:1:sloid:3000", + "importance": 0.07083380967378616, + "lat": 47.378693, + "lon": 8.536429, + "level": 0, + "tz": "Europe/Zurich", + "departure": "2026-10-15T09:05:00Z", + "scheduledDeparture": "2026-10-15T09:05:00Z", + "scheduledTrack": "8", + "track": "8", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "NIGHT_RAIL", + "REGIONAL_RAIL", + "SUBURBAN" + ] + }, + "tripTo": { + "name": "Lugano", + "stopId": "ch-opentransportdataswiss26_ch:1:sloid:5300:2:2", + "parentId": "ch-opentransportdataswiss26_Parentch:1:sloid:5300", + "importance": 0.013114487752318382, + "lat": 46.005657, + "lon": 8.946527999999999, + "level": 0, + "tz": "Europe/Zurich", + "arrival": "2026-10-15T10:58:00Z", + "scheduledArrival": "2026-10-15T10:58:00Z", + "scheduledTrack": "2", + "track": "2", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "LONG_DISTANCE", + "NIGHT_RAIL", + "REGIONAL_RAIL", + "SUBURBAN" + ] + }, + "routeId": "ch-opentransportdataswiss26_91-2-G-j26-1", + "routeUrl": "", + "directionId": "0", + "routeType": 102, + "agencyName": "Schweizerische Bundesbahnen SBB", + "agencyUrl": "https://sbb.ch", + "agencyFareUrl": "", + "agencyId": "11", + "tripId": "20261015_11:05_ch-opentransportdataswiss26_.ojp-91-2-G.1.TA.164.j26", + "routeShortName": "IC2", + "routeLongName": "", + "tripShortName": "869", + "displayName": "IC2", + "cancelled": false, + "source": "ch_opentransportdataswiss26.gtfs.zip/stop_times.txt:108396:108401", + "intermediateStops": [ + { + "name": "Zug", + "stopId": "ch-opentransportdataswiss26_ch:1:sloid:2204:1:2", + "parentId": "ch-opentransportdataswiss26_Parentch:1:sloid:2204", + "importance": 0.014396363869309425, + "lat": 47.174859999999995, + "lon": 8.515957, + "level": 1, + "tz": "Europe/Zurich", + "arrival": "2026-10-15T09:29:00Z", + "departure": "2026-10-15T09:30:00Z", + "scheduledArrival": "2026-10-15T09:29:00Z", + "scheduledDeparture": "2026-10-15T09:30:00Z", + "scheduledTrack": "2", + "track": "2", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "LONG_DISTANCE", + "REGIONAL_RAIL", + "SUBURBAN" + ] + }, + { + "name": "Arth-Goldau", + "stopId": "ch-opentransportdataswiss26_ch:1:sloid:5004:2:4", + "parentId": "ch-opentransportdataswiss26_Parentch:1:sloid:5004", + "importance": 0.010756864212453365, + "lat": 47.049150000000004, + "lon": 8.550308, + "level": 0, + "tz": "Europe/Zurich", + "arrival": "2026-10-15T09:45:00Z", + "departure": "2026-10-15T09:49:00Z", + "scheduledArrival": "2026-10-15T09:45:00Z", + "scheduledDeparture": "2026-10-15T09:49:00Z", + "scheduledTrack": "4", + "track": "4", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "LONG_DISTANCE", + "NIGHT_RAIL", + "REGIONAL_RAIL", + "SUBURBAN", + "BUS", + "FUNICULAR" + ] + } + ], + "legGeometry": { + "points": "u~sqF}dceAu@" + }, + "bikesAllowed": false, + "wheelchairAccessible": "NOT_ACCESSIBLE", + "reservation": "NONE", + "alternatives": [], + "steps": [] + }, + { + "mode": "WALK", + "from": { + "name": "Lugano", + "stopId": "ch-opentransportdataswiss26_ch:1:sloid:5300:2:2", + "parentId": "ch-opentransportdataswiss26_Parentch:1:sloid:5300", + "importance": 0.013114487752318382, + "lat": 46.005657, + "lon": 8.946527999999999, + "level": 0, + "tz": "Europe/Zurich", + "arrival": "2026-10-15T10:58:00Z", + "departure": "2026-10-15T10:58:00Z", + "scheduledArrival": "2026-10-15T10:58:00Z", + "scheduledDeparture": "2026-10-15T10:58:00Z", + "scheduledTrack": "2", + "track": "2", + "vertexType": "TRANSIT", + "cancelled": false, + "modes": [ + "LONG_DISTANCE", + "NIGHT_RAIL", + "REGIONAL_RAIL", + "SUBURBAN" + ] + }, + "to": { + "name": "Lugano", + "stopId": "ch-opentransportdataswiss26_ch:1:sloid:5300:1:1", + "parentId": "ch-opentransportdataswiss26_Parentch:1:sloid:5300", + "importance": 0.013114487752318382, + "lat": 46.005634, + "lon": 8.946646000000001, + "level": 0, + "tz": "Europe/Zurich", + "arrival": "2026-10-15T11:02:00Z", + "scheduledArrival": "2026-10-15T11:02:00Z", + "scheduledTrack": "1", + "track": "1", + "vertexType": "TRANSIT", + "modes": [ + "LONG_DISTANCE", + "NIGHT_RAIL", + "REGIONAL_RAIL", + "SUBURBAN" + ] + }, + "duration": 240, + "startTime": "2026-10-15T10:58:00Z", + "endTime": "2026-10-15T11:02:00Z", + "scheduledStartTime": "2026-10-15T10:58:00Z", + "scheduledEndTime": "2026-10-15T11:02:00Z", + "realTime": false, + "scheduled": false, + "distance": 461, + "legGeometry": { + "points": "u~sqF}dceAu@" + }, + "steps": [], + "intermediateStops": [] + }, + { + "mode": "REGIONAL_RAIL", + "from": { + "name": "Lugano", + "stopId": "ch-opentransportdataswiss26_ch:1:sloid:5300:1:1", + "parentId": "ch-opentransportdataswiss26_Parentch:1:sloid:5300", + "importance": 0.013114487752318382, + "lat": 46.005634, + "lon": 8.946646000000001, + "level": 0, + "tz": "Europe/Zurich", + "departure": "2026-10-15T11:02:00Z", + "scheduledDeparture": "2026-10-15T11:02:00Z", + "scheduledTrack": "1", + "track": "1", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "LONG_DISTANCE", + "NIGHT_RAIL", + "REGIONAL_RAIL", + "SUBURBAN" + ] + }, + "to": { + "name": "Milano Centrale", + "stopId": "ch-opentransportdataswiss26_8301700", + "parentId": "ch-opentransportdataswiss26_Parent8301700", + "importance": 0.010967501439154148, + "lat": 45.487137, + "lon": 9.204821999999998, + "level": 2, + "tz": "Europe/Rome", + "arrival": "2026-10-15T12:17:00Z", + "scheduledArrival": "2026-10-15T12:17:00Z", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "NIGHT_RAIL", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS" + ] + }, + "duration": 4500, + "startTime": "2026-10-15T11:02:00Z", + "endTime": "2026-10-15T12:17:00Z", + "scheduledStartTime": "2026-10-15T11:02:00Z", + "scheduledEndTime": "2026-10-15T12:17:00Z", + "realTime": false, + "scheduled": true, + "interlineWithPreviousLeg": false, + "headsign": "Milano Centrale", + "tripFrom": { + "name": "Locarno", + "stopId": "ch-opentransportdataswiss26_ch:1:sloid:5400:1:1", + "parentId": "ch-opentransportdataswiss26_Parentch:1:sloid:5400", + "importance": 0.004943060223013163, + "lat": 46.17233300000001, + "lon": 8.802816000000002, + "level": 0, + "tz": "Europe/Zurich", + "departure": "2026-10-15T10:22:00Z", + "scheduledDeparture": "2026-10-15T10:22:00Z", + "scheduledTrack": "1", + "track": "1", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "LONG_DISTANCE", + "REGIONAL_RAIL", + "SUBURBAN" + ] + }, + "tripTo": { + "name": "Milano Centrale", + "stopId": "ch-opentransportdataswiss26_8301700", + "parentId": "ch-opentransportdataswiss26_Parent8301700", + "importance": 0.010967501439154148, + "lat": 45.487137, + "lon": 9.204821999999998, + "level": 2, + "tz": "Europe/Rome", + "arrival": "2026-10-15T12:17:00Z", + "scheduledArrival": "2026-10-15T12:17:00Z", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "NIGHT_RAIL", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS" + ] + }, + "routeId": "ch-opentransportdataswiss26_91-80-j26-1", + "routeUrl": "", + "directionId": "0", + "routeType": 106, + "agencyName": "Schweizerische Bundesbahnen SBB", + "agencyUrl": "https://sbb.ch", + "agencyFareUrl": "", + "agencyId": "11", + "tripId": "20261015_12:22_ch-opentransportdataswiss26_.ojp-91-80.1.TA.915.j26", + "routeShortName": "RE80", + "routeLongName": "", + "tripShortName": "25521", + "displayName": "RE80", + "cancelled": false, + "source": "ch_opentransportdataswiss26.gtfs.zip/stop_times.txt:925419:925434", + "intermediateStops": [ + { + "name": "Paradiso", + "stopId": "ch-opentransportdataswiss26_ch:1:sloid:5301:1:1", + "parentId": "ch-opentransportdataswiss26_Parentch:1:sloid:5301", + "importance": 0.005389102268964052, + "lat": 45.98940699999999, + "lon": 8.946888, + "level": 0, + "tz": "Europe/Zurich", + "arrival": "2026-10-15T11:05:00Z", + "departure": "2026-10-15T11:05:00Z", + "scheduledArrival": "2026-10-15T11:05:00Z", + "scheduledDeparture": "2026-10-15T11:05:00Z", + "scheduledTrack": "1", + "track": "1", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "REGIONAL_RAIL", + "SUBURBAN" + ] + }, + { + "name": "Mendrisio", + "stopId": "ch-opentransportdataswiss26_ch:1:sloid:5305:2:2", + "parentId": "ch-opentransportdataswiss26_Parentch:1:sloid:5305", + "importance": 0.0074639697559177876, + "lat": 45.869205, + "lon": 8.978509, + "level": 0, + "tz": "Europe/Zurich", + "arrival": "2026-10-15T11:18:00Z", + "departure": "2026-10-15T11:18:00Z", + "scheduledArrival": "2026-10-15T11:18:00Z", + "scheduledDeparture": "2026-10-15T11:18:00Z", + "scheduledTrack": "2", + "track": "2", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "LONG_DISTANCE", + "REGIONAL_RAIL", + "SUBURBAN" + ] + } + ], + "legGeometry": { + "points": "u~sqF}dceAu@" + }, + "bikesAllowed": false, + "wheelchairAccessible": "NOT_ACCESSIBLE", + "reservation": "NONE", + "alternatives": [], + "steps": [] + } + ] + } + ], + "previousPageCursor": "EARLIER|1792038420", + "nextPageCursor": "LATER|1792045500" +} \ No newline at end of file diff --git a/website/test/fixtures/transitous/stoptimes.json b/website/test/fixtures/transitous/stoptimes.json new file mode 100644 index 000000000..474b7d95b --- /dev/null +++ b/website/test/fixtures/transitous/stoptimes.json @@ -0,0 +1,830 @@ +{ + "stopTimes": [ + { + "place": { + "name": "Heidelberg, Hauptbahnhof", + "stopId": "de-DELFI_de:08221:1160:1:D", + "importance": 0.003857618197798729, + "lat": 49.404906999999994, + "lon": 8.675713, + "level": 0, + "tz": "Europe/Berlin", + "arrival": "2026-10-15T04:26:00Z", + "departure": "2026-10-15T04:27:00Z", + "scheduledArrival": "2026-10-15T04:26:00Z", + "scheduledDeparture": "2026-10-15T04:27:00Z", + "scheduledTrack": "D", + "track": "D", + "description": "Tram/Bus", + "vertexType": "TRANSIT", + "pickupType": "NOT_ALLOWED", + "dropoffType": "NOT_ALLOWED", + "cancelled": true, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "COACH", + "RIDE_SHARING", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS", + "ODM" + ] + }, + "mode": "TRAM", + "realTime": true, + "headsign": "Edingen", + "tripFrom": { + "name": "Käfertal, Bahnhof (RNV)", + "stopId": "de-DELFI_de:08222:5547:1:3", + "importance": 0.00008580861322116107, + "lat": 49.510146999999996, + "lon": 8.518570999999998, + "level": 0, + "tz": "Europe/Berlin", + "scheduledTrack": "G1", + "track": "G4", + "description": "Tram", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "TRAM", + "BUS" + ] + }, + "tripTo": { + "name": "Viernheim, Bahnhof", + "stopId": "de-DELFI_de:06431:3851:2:TrRiO", + "importance": 0.00004391103720990941, + "lat": 49.535397, + "lon": 8.582630000000002, + "level": 0, + "tz": "Europe/Berlin", + "scheduledTrack": "3", + "track": "3", + "description": "Tram", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "TRAM", + "BUS", + "ODM" + ] + }, + "agencyId": "7911", + "agencyName": "RNV HD-MA-Weinheim (Strab)", + "agencyUrl": "", + "routeId": "de-DELFI_de:vrn:02005:_0", + "routeUrl": "", + "directionId": "1", + "routeColor": "00965e", + "routeTextColor": "ffffff", + "tripId": "20261015_05:41_de-DELFI_3436853287", + "routeType": 0, + "routeShortName": "RNV 5", + "routeLongName": "", + "tripShortName": "5200093", + "displayName": "RNV 5", + "pickupDropoffType": "NOT_ALLOWED", + "cancelled": true, + "tripCancelled": false, + "bikesAllowed": false, + "wheelchairAccessible": "NOT_ACCESSIBLE", + "reservation": "NONE", + "source": "de_DELFI.gtfs.zip/stop_times.txt:5163314:5163355" + }, + { + "place": { + "name": "Heidelberg, Hauptbahnhof", + "stopId": "de-DELFI_de:08221:1160:1:P", + "importance": 0.003857618197798729, + "lat": 49.404163, + "lon": 8.677789, + "level": 0, + "tz": "Europe/Berlin", + "arrival": "2026-10-15T04:26:00Z", + "departure": "2026-10-15T04:27:00Z", + "scheduledArrival": "2026-10-15T04:26:00Z", + "scheduledDeparture": "2026-10-15T04:27:00Z", + "scheduledTrack": "P", + "track": "P", + "description": "Bus Ost", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "COACH", + "RIDE_SHARING", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS", + "ODM" + ] + }, + "mode": "BUS", + "realTime": true, + "headsign": "Heidelberg, Universitätsplatz", + "tripFrom": { + "name": "Emmertsgrund, Endstelle", + "stopId": "de-DELFI_de:08221:1127:0:11", + "importance": 0.00002280418630107306, + "lat": 49.358936, + "lon": 8.704378999999998, + "level": 0, + "tz": "Europe/Berlin", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "BUS" + ] + }, + "tripTo": { + "name": "Heidelberg, Universitätsplatz", + "stopId": "de-DELFI_de:08221:1198:0:11", + "importance": 0.00001679499473539181, + "lat": 49.4111, + "lon": 8.705789000000001, + "level": 0, + "tz": "Europe/Berlin", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "BUS" + ] + }, + "agencyId": "7915", + "agencyName": "RNV Heidelberg (Bus)", + "agencyUrl": "", + "routeId": "de-DELFI_de:vrn:02033:_3", + "routeUrl": "", + "directionId": "1", + "routeColor": "e3000b", + "routeTextColor": "ffffff", + "tripId": "20261015_05:48_de-DELFI_3429190890", + "routeType": 3, + "routeShortName": "RNV 33", + "routeLongName": "", + "tripShortName": "2200057", + "displayName": "RNV 33", + "pickupDropoffType": "NORMAL", + "cancelled": false, + "tripCancelled": false, + "bikesAllowed": false, + "wheelchairAccessible": "NOT_ACCESSIBLE", + "reservation": "NONE", + "source": "de_DELFI.gtfs.zip/stop_times.txt:21177333:21177365" + }, + { + "place": { + "name": "Heidelberg, Hauptbahnhof", + "stopId": "de-DELFI_de:08221:1160:1:P", + "importance": 0.003857618197798729, + "lat": 49.404163, + "lon": 8.677789, + "level": 0, + "tz": "Europe/Berlin", + "arrival": "2026-10-15T04:28:00Z", + "departure": "2026-10-15T04:28:00Z", + "scheduledArrival": "2026-10-15T04:30:00Z", + "scheduledDeparture": "2026-10-15T04:30:00Z", + "scheduledTrack": "P", + "track": "P", + "description": "Bus Ost", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "COACH", + "RIDE_SHARING", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS", + "ODM" + ] + }, + "mode": "BUS", + "realTime": true, + "headsign": "Neuenheim, Schwimmbad", + "tripFrom": { + "name": "Emmertsgrund, Mombertplatz", + "stopId": "de-DELFI_de:08221:1130:0:A", + "importance": 0.00003534605275490321, + "lat": 49.369510000000005, + "lon": 8.704046, + "level": 0, + "tz": "Europe/Berlin", + "scheduledTrack": "A", + "track": "A", + "description": "Bus", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "BUS" + ] + }, + "tripTo": { + "name": "Neuenheim, Schwimmbad", + "stopId": "de-DELFI_de:08221:1240:0:12", + "importance": 0.00001845390215748921, + "lat": 49.420383, + "lon": 8.659337, + "level": 0, + "tz": "Europe/Berlin", + "scheduledTrack": "B", + "track": "B", + "description": "Neuenheim, Schwimmbad", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "BUS" + ] + }, + "agencyId": "7915", + "agencyName": "RNV Heidelberg (Bus)", + "agencyUrl": "", + "routeId": "de-DELFI_de:vrn:02028:_3", + "routeUrl": "", + "directionId": "1", + "routeColor": "b09fcd", + "routeTextColor": "ffffff", + "tripId": "20261015_06:00_de-DELFI_3436862110", + "routeType": 3, + "routeShortName": "RNV 28", + "routeLongName": "", + "tripShortName": "4200024", + "displayName": "RNV 28", + "pickupDropoffType": "NORMAL", + "cancelled": false, + "tripCancelled": false, + "bikesAllowed": false, + "wheelchairAccessible": "NOT_ACCESSIBLE", + "reservation": "NONE", + "source": "de_DELFI.gtfs.zip/stop_times.txt:28457739:28457763" + }, + { + "place": { + "name": "Heidelberg, Hauptbahnhof", + "stopId": "de-DELFI_de:08221:1160:2:Ri NW", + "importance": 0.003857618197798729, + "lat": 49.404635999999996, + "lon": 8.676513, + "level": 0, + "tz": "Europe/Berlin", + "arrival": "2026-10-15T04:28:00Z", + "departure": "2026-10-15T04:29:00Z", + "scheduledArrival": "2026-10-15T04:27:00Z", + "scheduledDeparture": "2026-10-15T04:28:00Z", + "scheduledTrack": "B", + "track": "B", + "description": "Tram/Bus", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "COACH", + "RIDE_SHARING", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS", + "ODM" + ] + }, + "mode": "TRAM", + "realTime": true, + "headsign": "Heidelberg Bismarckplatz", + "tripFrom": { + "name": "Weinheim, Alter OEG-Bahnhof", + "stopId": "de-DELFI_de:08226:4146:1:TrRiN", + "importance": 0.00001689577584329527, + "lat": 49.549206, + "lon": 8.665032000000002, + "level": 0, + "tz": "Europe/Berlin", + "scheduledTrack": "TrRiN", + "track": "TrRiN", + "description": "TrRiN Bahnhof DB", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "RIDE_SHARING", + "TRAM", + "BUS", + "ODM" + ] + }, + "tripTo": { + "name": "Weinheim, Alter OEG-Bahnhof", + "stopId": "de-DELFI_de:08226:4146:1:TrRiN", + "importance": 0.00001689577584329527, + "lat": 49.549206, + "lon": 8.665032000000002, + "level": 0, + "tz": "Europe/Berlin", + "scheduledTrack": "TrRiN", + "track": "TrRiN", + "description": "TrRiN Bahnhof DB", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "RIDE_SHARING", + "TRAM", + "BUS", + "ODM" + ] + }, + "agencyId": "7911", + "agencyName": "RNV HD-MA-Weinheim (Strab)", + "agencyUrl": "", + "routeId": "de-DELFI_de:vrn:02005:_0", + "routeUrl": "", + "directionId": "0", + "routeColor": "00965e", + "routeTextColor": "ffffff", + "tripId": "20261015_04:55_de-DELFI_3436853968", + "routeType": 0, + "routeShortName": "RNV 5", + "routeLongName": "", + "tripShortName": "5200068", + "displayName": "RNV 5", + "pickupDropoffType": "NORMAL", + "cancelled": false, + "tripCancelled": false, + "bikesAllowed": false, + "wheelchairAccessible": "NOT_ACCESSIBLE", + "reservation": "NONE", + "source": "de_DELFI.gtfs.zip/stop_times.txt:5190985:5191057" + }, + { + "place": { + "name": "Heidelberg, Hauptbahnhof", + "stopId": "de-DELFI_de:08221:1160:6:BusO1", + "importance": 0.003857618197798729, + "lat": 49.40441, + "lon": 8.676772999999999, + "level": 0, + "tz": "Europe/Berlin", + "departure": "2026-10-15T04:29:00Z", + "scheduledDeparture": "2026-10-15T04:29:00Z", + "scheduledTrack": "K", + "track": "K", + "description": "Bus W.-Brandt-Pl.", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "COACH", + "RIDE_SHARING", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS", + "ODM" + ] + }, + "mode": "BUS", + "realTime": true, + "headsign": "Schatthausen, Kirche", + "tripFrom": { + "name": "Heidelberg, Hauptbahnhof", + "stopId": "de-DELFI_de:08221:1160:6:BusO1", + "importance": 0.003857618197798729, + "lat": 49.40441, + "lon": 8.676772999999999, + "level": 0, + "tz": "Europe/Berlin", + "scheduledTrack": "K", + "track": "K", + "description": "Bus W.-Brandt-Pl.", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "COACH", + "RIDE_SHARING", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS", + "ODM" + ] + }, + "tripTo": { + "name": "Schatthausen, Kirche", + "stopId": "de-DELFI_de:08226:4247:0:RiN", + "importance": 0.000016631132893962786, + "lat": 49.31796599999999, + "lon": 8.757945, + "level": 0, + "tz": "Europe/Berlin", + "scheduledTrack": "RiO", + "track": "RiO", + "description": "Schatthausen, Kirche", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "BUS", + "ODM" + ] + }, + "agencyId": "7927", + "agencyName": "Busverkehr-Rhein-Neckar", + "agencyUrl": "", + "routeId": "de-DELFI_de:vrn:02757:_3", + "routeUrl": "", + "directionId": "0", + "routeColor": "6c91a7", + "routeTextColor": "ffffff", + "tripId": "20261015_06:29_de-DELFI_3429202375", + "routeType": 3, + "routeShortName": "757", + "routeLongName": "", + "tripShortName": "3200101", + "displayName": "757", + "pickupDropoffType": "NORMAL", + "cancelled": false, + "tripCancelled": false, + "bikesAllowed": false, + "wheelchairAccessible": "NOT_ACCESSIBLE", + "reservation": "NONE", + "source": "de_DELFI.gtfs.zip/stop_times.txt:33185171:33185190" + }, + { + "place": { + "name": "Heidelberg, Hauptbahnhof", + "stopId": "de-DELFI_de:08221:1160:8:10", + "parentId": "de-DELFI_de:08221:1160_G", + "importance": 0.003857618197798729, + "lat": 49.403503, + "lon": 8.674374999999998, + "level": -1, + "tz": "Europe/Berlin", + "arrival": "2026-10-15T04:31:00Z", + "departure": "2026-10-15T04:32:00Z", + "scheduledArrival": "2026-10-15T04:30:00Z", + "scheduledDeparture": "2026-10-15T04:31:00Z", + "scheduledTrack": "10", + "track": "10", + "description": "Gleis 9, Gleis 10", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "COACH", + "RIDE_SHARING", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS", + "ODM" + ] + }, + "mode": "METRO", + "realTime": true, + "headsign": "Karlsruhe Hauptbahnhof", + "tripFrom": { + "name": "Kaiserslautern, Hbf", + "stopId": "de-DELFI_de:07312:9035:4:5", + "parentId": "de-DELFI_de:07312:9035", + "importance": 0.0021683480590581894, + "lat": 49.43573800000001, + "lon": 7.768622000000001, + "level": 0, + "tz": "Europe/Berlin", + "scheduledTrack": "5", + "track": "5", + "description": "Gl4/5", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "COACH", + "REGIONAL_RAIL", + "SUBURBAN", + "BUS", + "ODM" + ] + }, + "tripTo": { + "name": "Karlsruhe Hauptbahnhof", + "stopId": "de-DELFI_de:08212:90:4:6", + "parentId": "de-DELFI_de:08212:90", + "importance": 0.010275337845087051, + "lat": 48.993366, + "lon": 8.401277999999998, + "level": 0, + "tz": "Europe/Berlin", + "scheduledTrack": "6", + "track": "6", + "description": "Gleis 5+6", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "COACH", + "NIGHT_RAIL", + "RIDE_SHARING", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS" + ] + }, + "agencyId": "10449", + "agencyName": "DB Regio AG Mitte Region Südwest", + "agencyUrl": "", + "routeId": "de-DELFI_de:rlp:s3:_109", + "routeUrl": "", + "directionId": "0", + "routeColor": "fddd04", + "routeTextColor": "231f20", + "tripId": "20261015_04:55_de-DELFI_3440478632", + "routeType": 109, + "routeShortName": "S3", + "routeLongName": "", + "tripShortName": "038315", + "displayName": "S3", + "pickupDropoffType": "NORMAL", + "cancelled": false, + "tripCancelled": false, + "bikesAllowed": false, + "wheelchairAccessible": "NOT_ACCESSIBLE", + "reservation": "NONE", + "source": "de_DELFI.gtfs.zip/stop_times.txt:41039226:41039260" + }, + { + "place": { + "name": "Heidelberg, Hauptbahnhof", + "stopId": "de-DELFI_de:08221:1160:2:RiO", + "importance": 0.003857618197798729, + "lat": 49.40467999999999, + "lon": 8.676531, + "level": 0, + "tz": "Europe/Berlin", + "arrival": "2026-10-15T04:31:00Z", + "departure": "2026-10-15T04:32:00Z", + "scheduledArrival": "2026-10-15T04:31:00Z", + "scheduledDeparture": "2026-10-15T04:32:00Z", + "scheduledTrack": "C", + "track": "C", + "description": "Tram/Bus", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "COACH", + "RIDE_SHARING", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS", + "ODM" + ] + }, + "mode": "TRAM", + "realTime": true, + "headsign": "Rohrbach, Süd", + "tripFrom": { + "name": "Handschuh., Heiligenbergschule", + "stopId": "de-DELFI_de:08221:1333:1:Tram", + "importance": 0.0000730760584701784, + "lat": 49.423320000000004, + "lon": 8.678964999999998, + "level": 0, + "tz": "Europe/Berlin", + "scheduledTrack": "A", + "track": "A", + "description": "Ri Technologie", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "TRAM" + ] + }, + "tripTo": { + "name": "Rohrbach, Süd", + "stopId": "de-DELFI_de:08221:1278:1:TrRiS", + "importance": 0.00008212682587327436, + "lat": 49.365837, + "lon": 8.688694, + "level": 0, + "tz": "Europe/Berlin", + "scheduledTrack": "A", + "track": "A", + "description": "Tram", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "TRAM", + "BUS" + ] + }, + "agencyId": "7910", + "agencyName": "RNV Heidelberg (Strab)", + "agencyUrl": "", + "routeId": "de-DELFI_de:vrn:02024:_0", + "routeUrl": "", + "directionId": "0", + "routeColor": "8c1d75", + "routeTextColor": "ffffff", + "tripId": "20261015_06:23_de-DELFI_3429231255", + "routeType": 0, + "routeShortName": "RNV 24", + "routeLongName": "", + "tripShortName": "1200102", + "displayName": "RNV 24", + "pickupDropoffType": "NORMAL", + "cancelled": false, + "tripCancelled": false, + "bikesAllowed": false, + "wheelchairAccessible": "NOT_ACCESSIBLE", + "reservation": "NONE", + "source": "de_DELFI.gtfs.zip/stop_times.txt:4428863:4428881" + }, + { + "place": { + "name": "Heidelberg, Hauptbahnhof", + "stopId": "de-DELFI_de:08221:1160:4:5", + "parentId": "de-DELFI_de:08221:1160_G", + "importance": 0.003857618197798729, + "lat": 49.403819999999996, + "lon": 8.674716, + "level": -1, + "tz": "Europe/Berlin", + "arrival": "2026-10-15T04:31:00Z", + "departure": "2026-10-15T04:33:00Z", + "scheduledArrival": "2026-10-15T04:28:00Z", + "scheduledDeparture": "2026-10-15T04:31:00Z", + "scheduledTrack": "5", + "track": "5", + "description": "Gleis 4, Gleis 5", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "COACH", + "RIDE_SHARING", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS", + "ODM" + ] + }, + "mode": "METRO", + "realTime": true, + "headsign": "Kaiserslautern, Hbf", + "tripFrom": { + "name": "Karlsruhe Hauptbahnhof", + "stopId": "de-DELFI_de:08212:90:4:6", + "parentId": "de-DELFI_de:08212:90", + "importance": 0.010275337845087051, + "lat": 48.993366, + "lon": 8.401277999999998, + "level": 0, + "tz": "Europe/Berlin", + "scheduledTrack": "6", + "track": "6", + "description": "Gleis 5+6", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "COACH", + "NIGHT_RAIL", + "RIDE_SHARING", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS" + ] + }, + "tripTo": { + "name": "Kaiserslautern, Hbf", + "stopId": "de-DELFI_de:07312:9035:3:3", + "parentId": "de-DELFI_de:07312:9035", + "importance": 0.0021683480590581894, + "lat": 49.435905000000005, + "lon": 7.7685319999999995, + "level": 0, + "tz": "Europe/Berlin", + "scheduledTrack": "3", + "track": "3", + "description": "Gl2/3", + "vertexType": "TRANSIT", + "pickupType": "NORMAL", + "dropoffType": "NORMAL", + "cancelled": false, + "modes": [ + "HIGHSPEED_RAIL", + "COACH", + "REGIONAL_RAIL", + "SUBURBAN", + "BUS", + "ODM" + ] + }, + "agencyId": "10449", + "agencyName": "DB Regio AG Mitte Region Südwest", + "agencyUrl": "", + "routeId": "de-DELFI_de:rlp:s2:_109", + "routeUrl": "", + "directionId": "1", + "routeColor": "1575c5", + "routeTextColor": "ffffff", + "tripId": "20261015_05:40_de-DELFI_3440478785", + "routeType": 109, + "routeShortName": "S2", + "routeLongName": "", + "tripShortName": "038204", + "displayName": "S2", + "pickupDropoffType": "NORMAL", + "cancelled": false, + "tripCancelled": false, + "bikesAllowed": false, + "wheelchairAccessible": "NOT_ACCESSIBLE", + "reservation": "NONE", + "source": "de_DELFI.gtfs.zip/stop_times.txt:41033856:41033888" + } + ], + "place": { + "name": "Heidelberg, Hauptbahnhof", + "stopId": "de-DELFI_de:08221:1160", + "importance": 0.003857618197798729, + "lat": 49.40357, + "lon": 8.675442000000002, + "level": 0, + "tz": "Europe/Berlin", + "vertexType": "TRANSIT", + "modes": [ + "HIGHSPEED_RAIL", + "LONG_DISTANCE", + "COACH", + "RIDE_SHARING", + "REGIONAL_RAIL", + "SUBURBAN", + "TRAM", + "BUS", + "ODM" + ] + }, + "previousPageCursor": "EARLIER|1792038360", + "nextPageCursor": "LATER|1792038840" +} \ No newline at end of file diff --git a/website/test/prompts.test.ts b/website/test/prompts.test.ts index cffd68f17..a4506f2aa 100644 --- a/website/test/prompts.test.ts +++ b/website/test/prompts.test.ts @@ -20,6 +20,7 @@ describe("prompt files", () => { it("carries the tool contract's known content", () => { // A stable marker per prompt, so a file/getter mix-up cannot pass silently. expect(toolContractPrompt.body).toContain("bundestakt.de"); + expect(toolContractPrompt.body).toContain("transitous.org"); expect(teenPrompt.body).toContain("teenagers"); expect(researchPrompt.body).toContain("note_findings"); }); diff --git a/website/test/transitous.test.ts b/website/test/transitous.test.ts new file mode 100644 index 000000000..f4bf21077 --- /dev/null +++ b/website/test/transitous.test.ts @@ -0,0 +1,207 @@ +/** + * Fixtures are literal copies of the live API responses, captured 2026-10-13 against + * api.transitous.org — see tools/transitous.ts's header. Trimmed only where a field is + * unbounded per leg (intermediateStops cut to 2 entries; legGeometry/steps kept but + * minimal, so the selectors' dropping them is asserted against a response that really + * carries them). Most tests here are pure function tests against them: no fetch mocking, + * no cache to reset, because the module has neither. + */ +import { describe, it, expect, vi, afterEach } from "vitest"; +import { + selectStops, + selectBoard, + selectJourneys, + fetchGeocode, + fetchStoptimes, + fetchPlan, + fetchFailed, + type TransitousResult, +} from "../tools/transitous"; +import geocodeFixture from "./fixtures/transitous/geocode.json"; +import stoptimesFixture from "./fixtures/transitous/stoptimes.json"; +import planFixture from "./fixtures/transitous/plan.json"; + +afterEach(() => { + vi.unstubAllGlobals(); +}); + +/** Narrows the result union to its "ok" shape, asserting that status along the way. */ +function assertOk(result: TransitousResult): asserts result is { status: "ok" } & T { + expect(result.status).toBe("ok"); +} + +/** Fixture rows carry 7 STOP and 3 PLACE entries, so filter and cap are both exercised. */ +describe("selectStops", () => { + it("keeps only STOP entries and caps the list at six", () => { + const result = selectStops(geocodeFixture); + assertOk<{ stops: { id: string; type?: string }[] }>(result); + + expect(result.stops).toHaveLength(6); + for (const stop of result.stops) { + expect(typeof stop.id).toBe("string"); + expect(stop.type).toBeUndefined(); + } + }); + + it("projects each stop to exactly name, id and modes", () => { + const result = selectStops(geocodeFixture); + assertOk<{ stops: Record[] }>(result); + + expect(Object.keys(result.stops[0]).sort()).toEqual(["id", "modes", "name"]); + }); + + it("returns an empty list, not an error, when nothing matches", () => { + const result = selectStops([{ type: "PLACE", name: "Somewhere", id: "node/1", modes: [] }]); + + expect(result).toEqual({ status: "ok", stops: [] }); + }); +}); + +describe("selectBoard", () => { + it("projects each departure to the board row and drops the stop name the API does not send", () => { + const result = selectBoard(stoptimesFixture); + assertOk<{ departures: Record[]; stop?: unknown }>(result); + + expect(result.stop).toBeUndefined(); + expect(result.departures).toHaveLength(8); + expect(Object.keys(result.departures[0]).sort()).toEqual([ + "cancelled", + "delayMin", + "headsign", + "line", + "realTime", + "time", + "track", + "train", + ]); + }); + + it("keeps the delay's sign: late is positive, early is negative", () => { + const result = selectBoard(stoptimesFixture); + assertOk<{ departures: { delayMin: number; realTime: boolean }[] }>(result); + + // The fixture board has a delayed S2 (+2), a delayed S3 (+1) and an early RNV 28 (-2). + expect(result.departures.some((d) => d.delayMin > 0)).toBe(true); + expect(result.departures.some((d) => d.delayMin < 0)).toBe(true); + expect(result.departures.some((d) => d.realTime)).toBe(true); + }); + + it("projects the whole board inside the byte budget of a tool result", () => { + const result = selectBoard(stoptimesFixture); + + expect(new TextEncoder().encode(JSON.stringify(result)).length).toBeLessThanOrEqual(2048); + }); +}); + +describe("selectJourneys", () => { + it("caps the itinerary list at three", () => { + const raw = { itineraries: [...planFixture.itineraries, ...planFixture.itineraries, ...planFixture.itineraries] }; + const result = selectJourneys(raw); + assertOk<{ itineraries: unknown[] }>(result); + + expect(result.itineraries).toHaveLength(3); + }); + + it("projects an itinerary to start, end, durationMin, transfers, realTime and legs", () => { + const result = selectJourneys(planFixture); + assertOk<{ itineraries: Record[] }>(result); + + expect(result.itineraries).toHaveLength(2); + expect(Object.keys(result.itineraries[0]).sort()).toEqual([ + "durationMin", + "end", + "legs", + "realTime", + "start", + "transfers", + ]); + expect(typeof result.itineraries[0].transfers).toBe("number"); + expect(result.itineraries[0].realTime).toBe(true); + }); + + it("aggregates realTime over transit legs only", () => { + const raw = JSON.parse(JSON.stringify(planFixture)); + for (const itinerary of raw.itineraries) { + for (const leg of itinerary.legs) leg.realTime = false; + } + const result = selectJourneys(raw); + assertOk<{ itineraries: { realTime: boolean }[] }>(result); + + expect(result.itineraries.every((it) => it.realTime === false)).toBe(true); + }); + + it("renders WALK legs as a single walkMin field", () => { + const result = selectJourneys(planFixture); + assertOk<{ itineraries: { legs: Record[] }[] }>(result); + + const walkLegs = result.itineraries.flatMap((it) => it.legs).filter((leg) => leg.walkMin !== undefined); + expect(walkLegs.length).toBeGreaterThan(0); + for (const leg of walkLegs) expect(Object.keys(leg)).toEqual(["walkMin"]); + }); + + it("drops the per-leg baggage the model must not pay for", () => { + const result = selectJourneys(planFixture); + assertOk<{ itineraries: { legs: Record[] }[] }>(result); + + const transitLegs = result.itineraries.flatMap((it) => it.legs).filter((leg) => leg.mode !== undefined); + expect(transitLegs.length).toBeGreaterThan(0); + for (const leg of transitLegs) { + expect(Object.keys(leg).sort()).toEqual([ + "agency", + "cancelled", + "from", + "headsign", + "line", + "mode", + "realTime", + "to", + "train", + ]); + expect(leg.intermediateStops).toBeUndefined(); + expect(leg.legGeometry).toBeUndefined(); + expect(leg.steps).toBeUndefined(); + } + }); + + it("projects the whole plan inside the byte budget of a tool result", () => { + const result = selectJourneys(planFixture); + + expect(new TextEncoder().encode(JSON.stringify(result)).length).toBeLessThanOrEqual(4096); + }); +}); + +describe("fetchers", () => { + it("throw a TransitousError with the HTTP status when the API answers non-OK", async () => { + vi.stubGlobal("fetch", vi.fn().mockResolvedValue({ ok: false, status: 503 })); + + await expect(fetchGeocode("Heidelberg Hbf")).rejects.toMatchObject({ name: "TransitousError", status: 503 }); + await expect(fetchStoptimes("de-DELFI_de:08221:1160")).rejects.toMatchObject({ status: 503 }); + await expect(fetchPlan({ from: "a", to: "b" })).rejects.toMatchObject({ status: 503 }); + }); + + it("sends the query as URL parameters and reads the JSON body", async () => { + const mockFetch = vi.fn().mockResolvedValue({ ok: true, json: () => Promise.resolve({ stopTimes: [] }) }); + vi.stubGlobal("fetch", mockFetch); + + await fetchGeocode("Heidelberg Hbf"); + + const url = new URL(vi.mocked(mockFetch).mock.calls[0][0] as string); + expect(url).toMatchObject({ origin: "https://api.transitous.org", pathname: "/api/v1/geocode" }); + expect(url.searchParams.get("text")).toBe("Heidelberg Hbf"); + + await fetchStoptimes("de-DELFI_de:08221:1160", undefined, "2026-10-16T08:00:00Z"); + + const boardUrl = new URL(vi.mocked(mockFetch).mock.calls[1][0] as string); + expect(boardUrl.pathname).toBe("/api/v1/stoptimes"); + expect(boardUrl.searchParams.get("stopId")).toBe("de-DELFI_de:08221:1160"); + expect(boardUrl.searchParams.get("n")).toBe("8"); + expect(boardUrl.searchParams.get("time")).toBe("2026-10-16T08:00:00Z"); + }); + + it("exports the shared failure shape for the runner's catch", () => { + expect(fetchFailed(new Error("Transitous answered 503"))).toEqual({ + status: "fetch_failed", + reason: "Transitous answered 503", + }); + }); +}); diff --git a/website/tools/transitous.ts b/website/tools/transitous.ts new file mode 100644 index 000000000..696abb820 --- /dev/null +++ b/website/tools/transitous.ts @@ -0,0 +1,310 @@ +import type { X402Tool } from "../types/x402"; + +/** + * Transitous (api.transitous.org, MOTIS 2 API) as tools for the chat model — stop search, + * departure boards and journey planning across Europe. Free, keyless, open CORS. Verified + * live against the API on 2026-10-13: an empty User-Agent gets a 403, but a browser's own + * UA is accepted — and browsers cannot set the header anyway (it is a forbidden header name + * in fetch, silently dropped), so no attempt is made here. The usage policy's identifiability + * intent is met by the Origin/Referer of the requests plus the visible citation line + * (`source: "transitous"` in AssistantChat's `sourceLinks`); it also asks for a heads-up in + * their Matrix channel before regular use of the routing endpoint, which is a merge + * precondition rather than a code concern. + * + * Deliberately stateless and React-free — see the fetch/select split below — so a future MCP + * server can import the fetchers and selectors directly and bring its own caching policy, + * instead of duplicating this logic or inheriting caching it doesn't want. + * + * `fetchGeocode`/`fetchStoptimes`/`fetchPlan` are dumb fetch wrappers that throw; + * `selectStops`/`selectBoard`/`selectJourneys` are pure functions over already-parsed JSON. + * The wiring lives in AssistantChat.tsx via `queryClient.fetchQuery` for caching and dedup — + * this module has no cache of its own. + */ + +const BASE = "https://api.transitous.org/api"; + +// Tool results are input tokens on every later hop of a metered chat endpoint, so projection +// is mandatory, not a nicety: a raw single-itinerary /v1/plan response measures ~232 KB +// (legGeometry, steps, intermediateStops); the projected result is ~1 KB. Coordinates are +// dropped everywhere — maps are out of scope, and they are the single biggest token sink in +// MOTIS responses after the per-leg baggage. +const MAX_STOPS = 6; +const MAX_ITINERARIES = 3; +const MAX_LEGS = 8; +const MAX_BOARD_ROWS = 8; +const MAX_NAME_CHARS = 60; + +// --- Tool definitions (OpenAI function-calling shape) ------------------------------------- + +export const searchStopTool: X402Tool = { + type: "function", + function: { + name: "search_stop", + description: + "Find stops and stations by name (Transitous, Europe-wide). Call this first when a " + + "journey or board request names a place, then pass a returned stop id to plan_journey " + + "or get_departures. If several stops match, pick with the user or take the obvious " + + "hub (e.g. 'Milano Centrale' over 'Milano Romolo').", + parameters: { + type: "object", + properties: { + query: { + type: "string", + description: "Stop or station name, e.g. 'Heidelberg Hbf', 'Milano Centrale'.", + }, + }, + required: ["query"], + }, + }, +}; + +export const planJourneyTool: X402Tool = { + type: "function", + function: { + name: "plan_journey", + description: + "Plan door-to-door journeys between two European stops (Transitous/MOTIS) by train, " + + "bus, coach, ferry or a mix; rail_only restricts to trains. from and to are stop ids " + + "from search_stop. Returns up to 3 itineraries with legs and live delays where " + + "operators publish them. All times are UTC ISO — convert to the user's local timezone " + + "before presenting. Schedules only: prices and booking are out of scope; when an " + + "itinerary has realTime=false, present times as scheduled and say so.", + parameters: { + type: "object", + properties: { + from: { type: "string", description: "Departure stop id from search_stop." }, + to: { type: "string", description: "Arrival stop id from search_stop." }, + departure: { type: "string", description: "ISO datetime; omit for 'now'." }, + arrive_by: { + type: "boolean", + description: "Treat `departure` as the required arrival time instead of the departure time.", + }, + rail_only: { + type: "boolean", + description: "Trains only, excludes buses and long-distance coaches. Default false.", + }, + }, + required: ["from", "to"], + }, + }, +}; + +export const getDeparturesTool: X402Tool = { + type: "function", + function: { + name: "get_departures", + description: + "Next departures from a stop with live delays (Transitous/MOTIS). Use for questions " + + "like 'what leaves from X in the next hour', or from a later moment ('tomorrow " + + "morning') by passing `time`. stop_id comes from search_stop. All times are UTC ISO " + + "— convert to the user's local timezone before presenting.", + parameters: { + type: "object", + properties: { + stop_id: { type: "string", description: "Stop id from search_stop." }, + time: { + type: "string", + description: "ISO datetime the board starts from; omit for 'now'.", + }, + }, + required: ["stop_id"], + }, + }, +}; + +// --- Wire shapes (only the fields we read) ------------------------------------------------- + +interface RawGeocodeRow { + type?: string; + name?: string; + id?: string; + modes?: string[]; +} + +interface RawPlace { + name?: string; + arrival?: string; + departure?: string; + scheduledArrival?: string; + scheduledDeparture?: string; + track?: string; + scheduledTrack?: string; +} + +interface RawStoptime { + place?: RawPlace; + routeShortName?: string; + displayName?: string; + tripShortName?: string; + headsign?: string; + cancelled?: boolean; + realTime?: boolean; +} + +interface RawStoptimesResponse { + stopTimes?: RawStoptime[]; +} + +interface RawLeg { + mode?: string; + duration?: number; + routeShortName?: string; + displayName?: string; + tripShortName?: string; + headsign?: string; + agencyName?: string; + from?: RawPlace; + to?: RawPlace; + cancelled?: boolean; + realTime?: boolean; +} + +interface RawItinerary { + startTime?: string; + endTime?: string; + duration?: number; + transfers?: number; + legs?: RawLeg[]; +} + +interface RawPlanResponse { + itineraries?: RawItinerary[]; +} + +// --- Result contract ------------------------------------------------------------------------ + +export type TransitousResult = + | { status: "ok"; [key: string]: unknown } + | { status: "bad_query"; reason: string } + | { status: "fetch_failed"; reason: string }; + +/** Turns a fetch-time error (thrown by the fetchers) into a result. */ +export { fetchFailed } from "./failure"; + +// --- Fetchers: plain fetch, no cache, throw on failure --------------------------------------- + +export class TransitousError extends Error { + constructor(message: string, readonly status: number | null = null) { + super(message); + this.name = "TransitousError"; + } +} + +async function get(path: string, params: Record): Promise { + const q = new URLSearchParams(); + for (const [k, v] of Object.entries(params)) if (v) q.set(k, v); + const res = await fetch(`${BASE}${path}?${q}`, { headers: { accept: "application/json" } }); + if (!res.ok) throw new TransitousError(`Transitous answered ${res.status}`, res.status); + return res.json() as Promise; +} + +export const fetchGeocode = (query: string): Promise => + get("/v1/geocode", { text: query }); + +export const fetchStoptimes = (stopId: string, n = MAX_BOARD_ROWS, time?: string): Promise => + get("/v1/stoptimes", { stopId, n: String(n), time }); + +export const fetchPlan = (args: { + from: string; + to: string; + time?: string; + arriveBy?: boolean; + transitModes?: string; +}): Promise => + get("/v1/plan", { + fromPlace: args.from, + toPlace: args.to, + numItineraries: String(MAX_ITINERARIES), + time: args.time, + arriveBy: args.arriveBy ? "true" : undefined, + transitModes: args.transitModes, + }); + +// --- Selectors: pure, synchronous, operate on already-parsed JSON --------------------------- + +const minutesBetween = (a?: string, b?: string) => + a && b ? Math.round((Date.parse(a) - Date.parse(b)) / 60000) : 0; + +const clip = (s: unknown, n = MAX_NAME_CHARS): string | null => { + if (typeof s !== "string" || !s) return null; + return s.length > n ? s.slice(0, n - 1) + "…" : s; +}; + +/** One board/leg endpoint: name, the live time, the delay in minutes and the track. */ +const place = (p: RawPlace = {}) => { + const time = p.departure ?? p.arrival; + const scheduled = p.scheduledDeparture ?? p.scheduledArrival; + return { + name: clip(p.name), + time: time ?? null, + // The one number users act on. Positive = late; the sign must survive projection. + delayMin: minutesBetween(time, scheduled), + track: clip(p.track ?? p.scheduledTrack, 8), + }; +}; + +/** [{name, id, modes}] — ids survive because the next call needs them. */ +export function selectStops(raw: unknown): TransitousResult { + const rows = (Array.isArray(raw) ? raw : []) as RawGeocodeRow[]; + return { + status: "ok", + stops: rows + .filter((r) => r?.type === "STOP") + .slice(0, MAX_STOPS) + .map((r) => ({ name: clip(r.name), id: r.id, modes: r.modes ?? [] })), + }; +} + +/** Board rows only, no stop name: /v1/stoptimes has no top-level place field, and the model + * already knows the stop — it picked the id via search_stop. */ +export function selectBoard(raw: unknown): TransitousResult { + const board = (raw as RawStoptimesResponse | null) ?? {}; + return { + status: "ok", + departures: (board.stopTimes ?? []).slice(0, MAX_BOARD_ROWS).map((s) => ({ + line: clip(s.routeShortName ?? s.displayName, 16), + train: clip(s.tripShortName, 12), + headsign: clip(s.headsign), + time: s.place?.departure ?? null, + delayMin: minutesBetween(s.place?.departure, s.place?.scheduledDeparture), + track: clip(s.place?.track ?? s.place?.scheduledTrack, 8), + cancelled: !!s.cancelled, + // false = the operator publishes no live feed for this trip; the schedule is all we have. + realTime: !!s.realTime, + })), + }; +} + +export function selectJourneys(raw: unknown): TransitousResult { + const plan = (raw as RawPlanResponse | null) ?? {}; + return { + status: "ok", + itineraries: (plan.itineraries ?? []).slice(0, MAX_ITINERARIES).map((it) => { + const legs = (it.legs ?? []).slice(0, MAX_LEGS).map((l) => + l.mode === "WALK" + ? { walkMin: Math.round((l.duration ?? 0) / 60) } + : { + mode: l.mode ?? null, + line: clip(l.routeShortName ?? l.displayName, 16), + train: clip(l.tripShortName, 12), + headsign: clip(l.headsign), + agency: clip(l.agencyName, 30), + from: place(l.from), + to: place(l.to), + cancelled: !!l.cancelled, + realTime: !!l.realTime, + }, + ); + const rides = (it.legs ?? []).filter((l) => l.mode !== "WALK"); + return { + start: it.startTime ?? null, + end: it.endTime ?? null, + durationMin: Math.round((it.duration ?? 0) / 60), + transfers: it.transfers ?? Math.max(0, rides.length - 1), + // No live feed anywhere on the route -> the model must say "scheduled times". + realTime: rides.some((l) => l.realTime), + legs, + }; + }), + }; +} From 51c2ed617f010a0740189c961ce3efbbecdd823a Mon Sep 17 00:00:00 2001 From: fretchen Date: Thu, 15 Oct 2026 07:46:38 +0200 Subject: [PATCH 2/6] prettier --- website/components/AssistantChat.tsx | 5 +- website/locales/de.ts | 3 +- website/locales/en.ts | 3 +- website/test/AssistantChat.test.tsx | 4 +- website/test/fixtures/transitous/geocode.json | 40 +-- website/test/fixtures/transitous/plan.json | 307 +++--------------- .../test/fixtures/transitous/stoptimes.json | 75 +---- website/tools/transitous.ts | 11 +- 8 files changed, 74 insertions(+), 374 deletions(-) diff --git a/website/components/AssistantChat.tsx b/website/components/AssistantChat.tsx index be7f99662..44b2ac115 100644 --- a/website/components/AssistantChat.tsx +++ b/website/components/AssistantChat.tsx @@ -877,7 +877,10 @@ export function AssistantChat() { */ const argString = (v: unknown): string => (typeof v === "string" ? v : ""); - async function loadTransitous(kind: "geocode" | "stoptimes" | "plan", args: Record): Promise { + async function loadTransitous( + kind: "geocode" | "stoptimes" | "plan", + args: Record, + ): Promise { // An empty required argument is an answer the model can act on, not a malfunction: fetching // anyway would 4xx at the API, `fetch_failed` would withdraw the tool for the rest of the // turn, and with it the one thing that fixes the mistake — a corrected query, a real stop diff --git a/website/locales/de.ts b/website/locales/de.ts index da1d61866..04357b6a9 100644 --- a/website/locales/de.ts +++ b/website/locales/de.ts @@ -117,7 +117,8 @@ export default { // in ToolSelector kommt vom ersten Eintrag der Gruppe (siehe TOOL_REGISTRY), und das // ist dieser — sie beschreibt deshalb die ganze Fähigkeit und nennt die Verkehrsmittel, // weil das Zeilenlabel ("Fahrplan") bewusst gattungsneutral bleibt. - toolTransitSearchDesc: "Züge, Busse und Fähren in ganz Europa – Verbindungen und Abfahrten, mit Echtzeit, wo Betreiber sie liefern.", + toolTransitSearchDesc: + "Züge, Busse und Fähren in ganz Europa – Verbindungen und Abfahrten, mit Echtzeit, wo Betreiber sie liefern.", toolTransitPlanDesc: "Plant eine Verbindung von Tür zu Tür – Züge, Busse, Fähren.", toolTransitDeparturesDesc: "Die nächsten Abfahrten einer Haltestelle.", // Zeilentitel für die zusammengefasste Zeile in ToolSelector (get_sitzungen + diff --git a/website/locales/en.ts b/website/locales/en.ts index a5303751a..a55a24d34 100644 --- a/website/locales/en.ts +++ b/website/locales/en.ts @@ -114,7 +114,8 @@ export default { // The one actually shown: the grouped timetable row's description comes from the first // entry in that group (see TOOL_REGISTRY), so this describes the whole capability and // names the modes — the row label stays deliberately generic. - toolTransitSearchDesc: "Trains, buses and ferries across Europe — journeys and departures, with live times where operators publish them.", + toolTransitSearchDesc: + "Trains, buses and ferries across Europe — journeys and departures, with live times where operators publish them.", toolTransitPlanDesc: "Plans a door-to-door journey — trains, buses, ferries.", toolTransitDeparturesDesc: "The next departures from a stop.", capBundestag: "Bundestag", diff --git a/website/test/AssistantChat.test.tsx b/website/test/AssistantChat.test.tsx index 5eb1beefc..205ba1839 100644 --- a/website/test/AssistantChat.test.tsx +++ b/website/test/AssistantChat.test.tsx @@ -906,9 +906,7 @@ describe("AssistantChat", () => { // (TOOL_REGISTRY's `group`, whose locale value is the row label), so one click // switches off all three wire names at once. fireEvent.click(screen.getAllByLabelText("Train & bus")[0]); - expect(window.localStorage.getItem("x402-chat-disabled-tools")).toBe( - "search_stop,plan_journey,get_departures", - ); + expect(window.localStorage.getItem("x402-chat-disabled-tools")).toBe("search_stop,plan_journey,get_departures"); sendUserMessage("Hi"); await waitFor(() => expect(mockSendMessage).toHaveBeenCalledOnce()); diff --git a/website/test/fixtures/transitous/geocode.json b/website/test/fixtures/transitous/geocode.json index c9b4bb187..5399171c2 100644 --- a/website/test/fixtures/transitous/geocode.json +++ b/website/test/fixtures/transitous/geocode.json @@ -155,10 +155,7 @@ } ], "score": -26.631120681762695, - "modes": [ - "TRAM", - "BUS" - ], + "modes": ["TRAM", "BUS"], "importance": 0.000045373457396635786 }, { @@ -306,16 +303,7 @@ } ], "score": -18.81806755065918, - "modes": [ - "HIGHSPEED_RAIL", - "LONG_DISTANCE", - "NIGHT_RAIL", - "REGIONAL_RAIL", - "SUBURBAN", - "SUBWAY", - "TRAM", - "BUS" - ], + "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN", "SUBWAY", "TRAM", "BUS"], "importance": 0.021757638081908226 }, { @@ -359,16 +347,7 @@ } ], "score": -18.813016891479492, - "modes": [ - "HIGHSPEED_RAIL", - "LONG_DISTANCE", - "COACH", - "NIGHT_RAIL", - "REGIONAL_RAIL", - "SUBURBAN", - "SUBWAY", - "BUS" - ], + "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "COACH", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN", "SUBWAY", "BUS"], "importance": 0.021419377997517586 }, { @@ -539,16 +518,7 @@ } ], "score": -18.104284286499023, - "modes": [ - "HIGHSPEED_RAIL", - "LONG_DISTANCE", - "COACH", - "NIGHT_RAIL", - "RIDE_SHARING", - "REGIONAL_RAIL", - "TRAM", - "BUS" - ], + "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "COACH", "NIGHT_RAIL", "RIDE_SHARING", "REGIONAL_RAIL", "TRAM", "BUS"], "importance": 0.005886611994355917 } -] \ No newline at end of file +] diff --git a/website/test/fixtures/transitous/plan.json b/website/test/fixtures/transitous/plan.json index d109ec472..a66f0ca97 100644 --- a/website/test/fixtures/transitous/plan.json +++ b/website/test/fixtures/transitous/plan.json @@ -30,15 +30,7 @@ "level": 2, "tz": "Europe/Rome", "vertexType": "TRANSIT", - "modes": [ - "HIGHSPEED_RAIL", - "LONG_DISTANCE", - "NIGHT_RAIL", - "REGIONAL_RAIL", - "SUBURBAN", - "TRAM", - "BUS" - ] + "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN", "TRAM", "BUS"] }, "direct": [], "itineraries": [ @@ -167,11 +159,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "REGIONAL_RAIL", - "SUBURBAN", - "BUS" - ] + "modes": ["REGIONAL_RAIL", "SUBURBAN", "BUS"] }, "routeId": "de-DELFI_de:rlp:s3:_109", "routeUrl": "", @@ -211,12 +199,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "REGIONAL_RAIL", - "SUBURBAN", - "BUS", - "ODM" - ] + "modes": ["REGIONAL_RAIL", "SUBURBAN", "BUS", "ODM"] }, { "name": "MA-Friedrichsfeld, Südbahnhof", @@ -238,11 +221,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "SUBURBAN", - "BUS", - "ODM" - ] + "modes": ["SUBURBAN", "BUS", "ODM"] } ], "legGeometry": { @@ -374,13 +353,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "HIGHSPEED_RAIL", - "LONG_DISTANCE", - "NIGHT_RAIL", - "REGIONAL_RAIL", - "SUBURBAN" - ] + "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN"] }, "duration": 12180, "startTime": "2026-10-15T05:37:00Z", @@ -406,15 +379,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "HIGHSPEED_RAIL", - "LONG_DISTANCE", - "NIGHT_RAIL", - "REGIONAL_RAIL", - "SUBURBAN", - "TRAM", - "BUS" - ] + "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN", "TRAM", "BUS"] }, "tripTo": { "name": "Basel SBB", @@ -431,15 +396,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "HIGHSPEED_RAIL", - "LONG_DISTANCE", - "NIGHT_RAIL", - "REGIONAL_RAIL", - "SUBURBAN", - "TRAM", - "BUS" - ] + "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN", "TRAM", "BUS"] }, "routeId": "de-DELFI_162290_101", "routeUrl": "", @@ -509,13 +466,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "HIGHSPEED_RAIL", - "LONG_DISTANCE", - "NIGHT_RAIL", - "REGIONAL_RAIL", - "BUS" - ] + "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "BUS"] } ], "legGeometry": { @@ -544,13 +495,7 @@ "track": "10", "vertexType": "TRANSIT", "cancelled": false, - "modes": [ - "HIGHSPEED_RAIL", - "LONG_DISTANCE", - "NIGHT_RAIL", - "REGIONAL_RAIL", - "SUBURBAN" - ] + "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN"] }, "to": { "name": "ZUERICH HB", @@ -564,13 +509,7 @@ "arrival": "2026-10-15T09:05:00Z", "scheduledArrival": "2026-10-15T09:05:00Z", "vertexType": "TRANSIT", - "modes": [ - "HIGHSPEED_RAIL", - "LONG_DISTANCE", - "NIGHT_RAIL", - "REGIONAL_RAIL", - "SUBURBAN" - ] + "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN"] }, "duration": 300, "startTime": "2026-10-15T09:00:00Z", @@ -603,13 +542,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "HIGHSPEED_RAIL", - "LONG_DISTANCE", - "NIGHT_RAIL", - "REGIONAL_RAIL", - "SUBURBAN" - ] + "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN"] }, "to": { "name": "MILANO CENTRALE", @@ -626,15 +559,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "HIGHSPEED_RAIL", - "LONG_DISTANCE", - "NIGHT_RAIL", - "REGIONAL_RAIL", - "SUBURBAN", - "TRAM", - "BUS" - ] + "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN", "TRAM", "BUS"] }, "duration": 11820, "startTime": "2026-10-15T09:33:00Z", @@ -660,13 +585,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "HIGHSPEED_RAIL", - "LONG_DISTANCE", - "NIGHT_RAIL", - "REGIONAL_RAIL", - "SUBURBAN" - ] + "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN"] }, "tripTo": { "name": "MILANO CENTRALE", @@ -683,15 +602,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "HIGHSPEED_RAIL", - "LONG_DISTANCE", - "NIGHT_RAIL", - "REGIONAL_RAIL", - "SUBURBAN", - "TRAM", - "BUS" - ] + "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN", "TRAM", "BUS"] }, "routeId": "it-trenitalia_60083_7cf9622d2ca9dab7", "routeUrl": "", @@ -728,10 +639,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "LONG_DISTANCE", - "REGIONAL_RAIL" - ] + "modes": ["LONG_DISTANCE", "REGIONAL_RAIL"] }, { "name": "ARTH-GOLDAU", @@ -750,14 +658,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "LONG_DISTANCE", - "NIGHT_RAIL", - "REGIONAL_RAIL", - "SUBURBAN", - "BUS", - "FUNICULAR" - ] + "modes": ["LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN", "BUS", "FUNICULAR"] } ], "legGeometry": { @@ -896,11 +797,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "REGIONAL_RAIL", - "SUBURBAN", - "BUS" - ] + "modes": ["REGIONAL_RAIL", "SUBURBAN", "BUS"] }, "routeId": "de-DELFI_de:rlp:s3:_109", "routeUrl": "", @@ -940,12 +837,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "REGIONAL_RAIL", - "SUBURBAN", - "BUS", - "ODM" - ] + "modes": ["REGIONAL_RAIL", "SUBURBAN", "BUS", "ODM"] }, { "name": "MA-Friedrichsfeld, Südbahnhof", @@ -967,11 +859,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "SUBURBAN", - "BUS", - "ODM" - ] + "modes": ["SUBURBAN", "BUS", "ODM"] } ], "legGeometry": { @@ -1103,13 +991,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "HIGHSPEED_RAIL", - "LONG_DISTANCE", - "NIGHT_RAIL", - "REGIONAL_RAIL", - "SUBURBAN" - ] + "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN"] }, "duration": 12180, "startTime": "2026-10-15T05:37:00Z", @@ -1135,15 +1017,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "HIGHSPEED_RAIL", - "LONG_DISTANCE", - "NIGHT_RAIL", - "REGIONAL_RAIL", - "SUBURBAN", - "TRAM", - "BUS" - ] + "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN", "TRAM", "BUS"] }, "tripTo": { "name": "Basel SBB", @@ -1160,15 +1034,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "HIGHSPEED_RAIL", - "LONG_DISTANCE", - "NIGHT_RAIL", - "REGIONAL_RAIL", - "SUBURBAN", - "TRAM", - "BUS" - ] + "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN", "TRAM", "BUS"] }, "routeId": "de-DELFI_162290_101", "routeUrl": "", @@ -1238,13 +1104,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "HIGHSPEED_RAIL", - "LONG_DISTANCE", - "NIGHT_RAIL", - "REGIONAL_RAIL", - "BUS" - ] + "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "BUS"] } ], "legGeometry": { @@ -1273,13 +1133,7 @@ "track": "10", "vertexType": "TRANSIT", "cancelled": false, - "modes": [ - "HIGHSPEED_RAIL", - "LONG_DISTANCE", - "NIGHT_RAIL", - "REGIONAL_RAIL", - "SUBURBAN" - ] + "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN"] }, "to": { "name": "Zürich HB", @@ -1295,13 +1149,7 @@ "scheduledTrack": "8", "track": "8", "vertexType": "TRANSIT", - "modes": [ - "HIGHSPEED_RAIL", - "LONG_DISTANCE", - "NIGHT_RAIL", - "REGIONAL_RAIL", - "SUBURBAN" - ] + "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN"] }, "duration": 300, "startTime": "2026-10-15T09:00:00Z", @@ -1336,13 +1184,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "HIGHSPEED_RAIL", - "LONG_DISTANCE", - "NIGHT_RAIL", - "REGIONAL_RAIL", - "SUBURBAN" - ] + "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN"] }, "to": { "name": "Lugano", @@ -1361,12 +1203,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "LONG_DISTANCE", - "NIGHT_RAIL", - "REGIONAL_RAIL", - "SUBURBAN" - ] + "modes": ["LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN"] }, "duration": 6780, "startTime": "2026-10-15T09:05:00Z", @@ -1394,13 +1231,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "HIGHSPEED_RAIL", - "LONG_DISTANCE", - "NIGHT_RAIL", - "REGIONAL_RAIL", - "SUBURBAN" - ] + "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN"] }, "tripTo": { "name": "Lugano", @@ -1419,12 +1250,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "LONG_DISTANCE", - "NIGHT_RAIL", - "REGIONAL_RAIL", - "SUBURBAN" - ] + "modes": ["LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN"] }, "routeId": "ch-opentransportdataswiss26_91-2-G-j26-1", "routeUrl": "", @@ -1461,11 +1287,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "LONG_DISTANCE", - "REGIONAL_RAIL", - "SUBURBAN" - ] + "modes": ["LONG_DISTANCE", "REGIONAL_RAIL", "SUBURBAN"] }, { "name": "Arth-Goldau", @@ -1486,14 +1308,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "LONG_DISTANCE", - "NIGHT_RAIL", - "REGIONAL_RAIL", - "SUBURBAN", - "BUS", - "FUNICULAR" - ] + "modes": ["LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN", "BUS", "FUNICULAR"] } ], "legGeometry": { @@ -1524,12 +1339,7 @@ "track": "2", "vertexType": "TRANSIT", "cancelled": false, - "modes": [ - "LONG_DISTANCE", - "NIGHT_RAIL", - "REGIONAL_RAIL", - "SUBURBAN" - ] + "modes": ["LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN"] }, "to": { "name": "Lugano", @@ -1545,12 +1355,7 @@ "scheduledTrack": "1", "track": "1", "vertexType": "TRANSIT", - "modes": [ - "LONG_DISTANCE", - "NIGHT_RAIL", - "REGIONAL_RAIL", - "SUBURBAN" - ] + "modes": ["LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN"] }, "duration": 240, "startTime": "2026-10-15T10:58:00Z", @@ -1585,12 +1390,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "LONG_DISTANCE", - "NIGHT_RAIL", - "REGIONAL_RAIL", - "SUBURBAN" - ] + "modes": ["LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN"] }, "to": { "name": "Milano Centrale", @@ -1607,15 +1407,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "HIGHSPEED_RAIL", - "LONG_DISTANCE", - "NIGHT_RAIL", - "REGIONAL_RAIL", - "SUBURBAN", - "TRAM", - "BUS" - ] + "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN", "TRAM", "BUS"] }, "duration": 4500, "startTime": "2026-10-15T11:02:00Z", @@ -1643,11 +1435,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "LONG_DISTANCE", - "REGIONAL_RAIL", - "SUBURBAN" - ] + "modes": ["LONG_DISTANCE", "REGIONAL_RAIL", "SUBURBAN"] }, "tripTo": { "name": "Milano Centrale", @@ -1664,15 +1452,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "HIGHSPEED_RAIL", - "LONG_DISTANCE", - "NIGHT_RAIL", - "REGIONAL_RAIL", - "SUBURBAN", - "TRAM", - "BUS" - ] + "modes": ["HIGHSPEED_RAIL", "LONG_DISTANCE", "NIGHT_RAIL", "REGIONAL_RAIL", "SUBURBAN", "TRAM", "BUS"] }, "routeId": "ch-opentransportdataswiss26_91-80-j26-1", "routeUrl": "", @@ -1709,10 +1489,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "REGIONAL_RAIL", - "SUBURBAN" - ] + "modes": ["REGIONAL_RAIL", "SUBURBAN"] }, { "name": "Mendrisio", @@ -1733,11 +1510,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "LONG_DISTANCE", - "REGIONAL_RAIL", - "SUBURBAN" - ] + "modes": ["LONG_DISTANCE", "REGIONAL_RAIL", "SUBURBAN"] } ], "legGeometry": { @@ -1754,4 +1527,4 @@ ], "previousPageCursor": "EARLIER|1792038420", "nextPageCursor": "LATER|1792045500" -} \ No newline at end of file +} diff --git a/website/test/fixtures/transitous/stoptimes.json b/website/test/fixtures/transitous/stoptimes.json index 474b7d95b..36cfe919b 100644 --- a/website/test/fixtures/transitous/stoptimes.json +++ b/website/test/fixtures/transitous/stoptimes.json @@ -50,10 +50,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "TRAM", - "BUS" - ] + "modes": ["TRAM", "BUS"] }, "tripTo": { "name": "Viernheim, Bahnhof", @@ -70,11 +67,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "TRAM", - "BUS", - "ODM" - ] + "modes": ["TRAM", "BUS", "ODM"] }, "agencyId": "7911", "agencyName": "RNV HD-MA-Weinheim (Strab)", @@ -145,9 +138,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "BUS" - ] + "modes": ["BUS"] }, "tripTo": { "name": "Heidelberg, Universitätsplatz", @@ -161,9 +152,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "BUS" - ] + "modes": ["BUS"] }, "agencyId": "7915", "agencyName": "RNV Heidelberg (Bus)", @@ -237,9 +226,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "BUS" - ] + "modes": ["BUS"] }, "tripTo": { "name": "Neuenheim, Schwimmbad", @@ -256,9 +243,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "BUS" - ] + "modes": ["BUS"] }, "agencyId": "7915", "agencyName": "RNV Heidelberg (Bus)", @@ -332,12 +317,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "RIDE_SHARING", - "TRAM", - "BUS", - "ODM" - ] + "modes": ["RIDE_SHARING", "TRAM", "BUS", "ODM"] }, "tripTo": { "name": "Weinheim, Alter OEG-Bahnhof", @@ -354,12 +334,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "RIDE_SHARING", - "TRAM", - "BUS", - "ODM" - ] + "modes": ["RIDE_SHARING", "TRAM", "BUS", "ODM"] }, "agencyId": "7911", "agencyName": "RNV HD-MA-Weinheim (Strab)", @@ -458,10 +433,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "BUS", - "ODM" - ] + "modes": ["BUS", "ODM"] }, "agencyId": "7927", "agencyName": "Busverkehr-Rhein-Neckar", @@ -537,14 +509,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "HIGHSPEED_RAIL", - "COACH", - "REGIONAL_RAIL", - "SUBURBAN", - "BUS", - "ODM" - ] + "modes": ["HIGHSPEED_RAIL", "COACH", "REGIONAL_RAIL", "SUBURBAN", "BUS", "ODM"] }, "tripTo": { "name": "Karlsruhe Hauptbahnhof", @@ -646,9 +611,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "TRAM" - ] + "modes": ["TRAM"] }, "tripTo": { "name": "Rohrbach, Süd", @@ -665,10 +628,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "TRAM", - "BUS" - ] + "modes": ["TRAM", "BUS"] }, "agencyId": "7910", "agencyName": "RNV Heidelberg (Strab)", @@ -772,14 +732,7 @@ "pickupType": "NORMAL", "dropoffType": "NORMAL", "cancelled": false, - "modes": [ - "HIGHSPEED_RAIL", - "COACH", - "REGIONAL_RAIL", - "SUBURBAN", - "BUS", - "ODM" - ] + "modes": ["HIGHSPEED_RAIL", "COACH", "REGIONAL_RAIL", "SUBURBAN", "BUS", "ODM"] }, "agencyId": "10449", "agencyName": "DB Regio AG Mitte Region Südwest", @@ -827,4 +780,4 @@ }, "previousPageCursor": "EARLIER|1792038360", "nextPageCursor": "LATER|1792038840" -} \ No newline at end of file +} diff --git a/website/tools/transitous.ts b/website/tools/transitous.ts index 696abb820..dd75cdd22 100644 --- a/website/tools/transitous.ts +++ b/website/tools/transitous.ts @@ -184,7 +184,10 @@ export { fetchFailed } from "./failure"; // --- Fetchers: plain fetch, no cache, throw on failure --------------------------------------- export class TransitousError extends Error { - constructor(message: string, readonly status: number | null = null) { + constructor( + message: string, + readonly status: number | null = null, + ) { super(message); this.name = "TransitousError"; } @@ -198,8 +201,7 @@ async function get(path: string, params: Record): return res.json() as Promise; } -export const fetchGeocode = (query: string): Promise => - get("/v1/geocode", { text: query }); +export const fetchGeocode = (query: string): Promise => get("/v1/geocode", { text: query }); export const fetchStoptimes = (stopId: string, n = MAX_BOARD_ROWS, time?: string): Promise => get("/v1/stoptimes", { stopId, n: String(n), time }); @@ -222,8 +224,7 @@ export const fetchPlan = (args: { // --- Selectors: pure, synchronous, operate on already-parsed JSON --------------------------- -const minutesBetween = (a?: string, b?: string) => - a && b ? Math.round((Date.parse(a) - Date.parse(b)) / 60000) : 0; +const minutesBetween = (a?: string, b?: string) => (a && b ? Math.round((Date.parse(a) - Date.parse(b)) / 60000) : 0); const clip = (s: unknown, n = MAX_NAME_CHARS): string | null => { if (typeof s !== "string" || !s) return null; From 218d82aaf09db15afe9bc082636e1a74b2c8dac4 Mon Sep 17 00:00:00 2001 From: fretchen Date: Fri, 16 Oct 2026 18:05:32 +0200 Subject: [PATCH 3/6] first round of changes --- website/components/AssistantChat.tsx | 22 +++- website/hooks/useX402Chat.ts | 55 ++++++++-- website/hooks/x402Currency.ts | 44 ++++++++ website/locales/de.ts | 4 + website/locales/en.ts | 4 + website/test/AssistantChat.test.tsx | 39 ++++++- website/test/failure.test.ts | 3 + website/test/useX402Chat.test.ts | 149 +++++++++++++++++++++++++++ website/test/x402Currency.test.ts | 56 ++++++++++ website/test/x402PaidFetch.test.ts | 49 +++++++++ website/utils/x402PaidFetch.ts | 61 ++++++++++- 11 files changed, 472 insertions(+), 14 deletions(-) diff --git a/website/components/AssistantChat.tsx b/website/components/AssistantChat.tsx index 44b2ac115..3e0b360e5 100644 --- a/website/components/AssistantChat.tsx +++ b/website/components/AssistantChat.tsx @@ -554,6 +554,10 @@ export function AssistantChat() { const networkFallbackLabel = useLocale({ label: "assistent.networkFallback" }); const eurcBaseOnlyLabel = useLocale({ label: "payment.eurcBaseOnly" }); const currencyFallbackLabel = useLocale({ label: "payment.currencyFallback" }); + // The wallet-side note: guarded-B fell back to a token the wallet can fund. Named apart from + // `payment.currencyFallback` (the agent-side note below) because the reasons differ — "the + // agent doesn't take it" and "your wallet holds none of it" must not share a sentence. + const walletFallbackLabel = useLocale({ label: "assistent.walletFallback" }); // Mobile detection React.useEffect(() => { @@ -704,6 +708,7 @@ export function AssistantChat() { paymentReceipt, paymentNetwork, paymentCurrency, + currencyFallback, status: chatStatus, } = useX402Chat(desiredNetwork, agentUrl, currency); const { network, switchIfNeeded, getSwitchError } = useAutoNetwork([paymentNetwork]); @@ -1413,8 +1418,10 @@ export function AssistantChat() {

)} {/* Separately from the network fallback above: the agent may accept the negotiated - network but only in the other currency (e.g. USDC-only on Base). */} - {paymentCurrency !== currency && ( + network but only in the other currency (e.g. USDC-only on Base). Suppressed when + the wallet note is active — then the deviation is the wallet's, not the agent's, + and the wrong attribution would be worse than silence. */} + {paymentCurrency !== currency && !currencyFallback && (

{currencyFallbackLabel} {paymentCurrency}.

@@ -1599,6 +1606,17 @@ export function AssistantChat() { )) )} + {currencyFallback && ( + // One honest line when the send switched token: the deviation is announced, the + // stored preference stays untouched (the hook never persists a fallback), and + // the line quietly teaches where the currency setting lives. +
+ {walletFallbackLabel + .replaceAll("{used}", currencyFallback.used) + .replaceAll("{preferred}", currencyFallback.preferred)} +
+ )} + {isLoading && (
{isDefaultAgent &&
} diff --git a/website/hooks/useX402Chat.ts b/website/hooks/useX402Chat.ts index 542a19b5f..a09f5a2e0 100644 --- a/website/hooks/useX402Chat.ts +++ b/website/hooks/useX402Chat.ts @@ -17,8 +17,8 @@ import { useWalletClient } from "wagmi"; import { getConfiguredPublicClient } from "./useConfiguredPublicClient"; import { useIsWalletConnected } from "./useIsWalletConnected"; import { probeAccepts, negotiateNetwork, LLM_V1_FLOOR } from "./x402Discovery"; -import { DEFAULT_CURRENCY, offeredCurrency, type PaymentCurrency } from "./x402Currency"; -import { createPaidFetch, type PaidFetch } from "../utils/x402PaidFetch"; +import { DEFAULT_CURRENCY, offeredCurrency, offeredCurrencies, selectFundedCurrency, type PaymentCurrency } from "./x402Currency"; +import { createPaidFetch, readFundableTokens, type PaidFetch } from "../utils/x402PaidFetch"; import type { X402ChatMessage, X402ChatResponse, @@ -68,6 +68,14 @@ export interface UseX402ChatResult { * `currency` until the agent has been probed. */ paymentCurrency: PaymentCurrency; + /** + * When the token this send would have paid in could not fund its deposit and another + * token the wallet holds and the agent offers was used instead: `{ preferred, used }`, + * per-payment and never persisted (the stored preference stays the user's alone). Null + * on every send that paid in the negotiated currency. The component announces it; the + * deposit signature was the consent gate. + */ + currencyFallback: { preferred: PaymentCurrency; used: PaymentCurrency } | null; } /** @@ -101,6 +109,11 @@ export function useX402Chat( network: string; paid: PaymentCurrency; } | null>(null); + // The guarded-B fallback of the most recent send, or null — set per send, never persisted. + const [currencyFallback, setCurrencyFallback] = useState<{ + preferred: PaymentCurrency; + used: PaymentCurrency; + } | null>(null); const isCurrent = negotiated?.agentUrl === agentUrl && negotiated?.preferred === network && negotiated?.currency === currency; const paymentNetwork = isCurrent ? negotiated.network : network; @@ -155,10 +168,6 @@ export function useX402Chat( // that — proceed on the preferred network and let the real 402 be the judge. const payNetwork = resolved ?? network; const paid = offeredCurrency(accepts, payNetwork, currency) ?? currency; - setNegotiated({ agentUrl, preferred: network, currency, network: payNetwork, paid }); - // Synchronously, unlike the state above: this turn's tool calls read it during the very - // loop this send belongs to, long before a re-render could deliver the state. - payRef.current = { network: payNetwork, currency }; // A readContract-capable client is required: batch-settlement's corrective-402 // recovery reads channel state on-chain, unlike the exact scheme. Resolved here, not @@ -168,6 +177,27 @@ export function useX402Chat( throw new Error(`No public client for network ${payNetwork}`); } + // Guarded-B currency fallback (selectFundedCurrency in x402Currency.ts): when the + // token this send would pay in cannot fund its deposit floor, pay in a token the + // wallet actually holds and the agent actually offers. `paid` is passed, not the raw + // preference, so the seller-side negotiation runs first — a fallback can only replace + // a token that could not pay anyway, and never chooses among funded options. The + // switch is never persisted, the deposit signature stays the consent gate, and the + // component announces the deviation via `currencyFallback`. + const candidates = offeredCurrencies(accepts, payNetwork); + const fundable = + candidates.length > 0 + ? await readFundableTokens(walletClient.account.address, publicClient, payNetwork) + : () => false; + const effective = selectFundedCurrency(paid, candidates, fundable); + setCurrencyFallback(effective.fellBack ? { preferred: paid, used: effective.currency } : null); + setNegotiated({ agentUrl, preferred: network, currency, network: payNetwork, paid: effective.currency }); + // Synchronously, unlike the state above: this turn's tool calls read it during the very + // loop this send belongs to, long before a re-render could deliver the state. The + // effective currency, not the preference — the tools must spend on the channel this + // turn actually opened. + payRef.current = { network: payNetwork, currency: effective.currency }; + setStatus("awaiting-signature"); setError(null); // Don't clear paymentReceipt here: it represents the currently-open channel's @@ -269,7 +299,18 @@ export function useX402Chat( setPaymentReceipt(null); }, []); - return { sendMessage, paidFetch, status, error, paymentReceipt, reset, isReady, paymentNetwork, paymentCurrency }; + return { + sendMessage, + paidFetch, + status, + error, + paymentReceipt, + reset, + isReady, + paymentNetwork, + paymentCurrency, + currencyFallback, + }; } export default useX402Chat; diff --git a/website/hooks/x402Currency.ts b/website/hooks/x402Currency.ts index 8b603f11d..f44738730 100644 --- a/website/hooks/x402Currency.ts +++ b/website/hooks/x402Currency.ts @@ -108,3 +108,47 @@ export function offeredCurrency( const first = onNetwork[0]; return first ? currencyOf(first) : null; } + +/** + * The settlement currencies the agent offers on `network`, in `PAYMENT_CURRENCIES` order — + * the candidate list for `selectFundedCurrency`. A fallback is only ever chosen from what + * the seller actually takes, so a funded token it does not offer is never picked. Empty for + * an unreadable offer (`accepts === null`): with no candidates the fallback cannot fire, + * and the send proceeds exactly as before. + */ +export function offeredCurrencies(accepts: AcceptsEntry[] | null, network: string): PaymentCurrency[] { + if (!accepts) return []; + const onNetwork = accepts.filter((entry) => entry.network === network); + return PAYMENT_CURRENCIES.filter((currency) => onNetwork.some((entry) => currencyOf(entry) === currency)); +} + +/** + * The guarded-B currency fallback: pay in a token the wallet can actually fund, when the + * token the send would pay in cannot cover its deposit floor. + * + * Pure on purpose — the caller gathers the facts, this only decides: + * - `paid` is what the send would pay in after seller-side negotiation (`offeredCurrency`), + * not the raw user preference. + * - `candidates` are the tokens the seller offers on the pay network, in + * `PAYMENT_CURRENCIES` order (euro-first), so among two funded alternatives EURC beats USDC. + * - `fundable` answers "can the wallet balance cover this token's deposit floor". + * + * The rules, each of which is a guard agreed in the plan: the paid currency always wins when + * it can fund the deposit; a fallback is only ever chosen from what the seller actually offers + * (a fundable preference the seller does not take is unusable by construction); and when + * nothing is fundable the paid currency stands unchanged — the send then fails with a message + * that is honest exactly because this fallback ran first ("recharge" is only correct advice + * when no held token could fund it). A fallback never persists: the stored preference is the + * user's alone, and the deposit signature remains the consent gate for the new token. + */ +export function selectFundedCurrency( + paid: PaymentCurrency, + candidates: readonly PaymentCurrency[], + fundable: (currency: PaymentCurrency) => boolean, +): { currency: PaymentCurrency; fellBack: boolean } { + if (candidates.includes(paid) && fundable(paid)) { + return { currency: paid, fellBack: false }; + } + const funded = candidates.find((candidate) => fundable(candidate)); + return funded ? { currency: funded, fellBack: true } : { currency: paid, fellBack: false }; +} diff --git a/website/locales/de.ts b/website/locales/de.ts index 04357b6a9..f5cca6918 100644 --- a/website/locales/de.ts +++ b/website/locales/de.ts @@ -178,6 +178,10 @@ export default { analyticsSource: "Quelle: Analytics", braveSource: "Quelle: Brave Search", transitousSource: "Quelle: Transitous", + // Guarded-B: wenn die bevorzugte Währung die Einzahlung nicht decken kann, zahlt der Chat + // automatisch mit einer, die die Wallet hält — und sagt es hier, statt zu behaupten, man + // müsse erst EURe kaufen. Die Wallet-Signatur bleibt der Moment der Zustimmung. + walletFallback: "Mit {used} gezahlt — deine Wallet hält kein {preferred}. Umstellen unter Erweitert.", errorPrefix: "Fehler:", unknownError: "Unbekannter Fehler", loading: "Lädt...", diff --git a/website/locales/en.ts b/website/locales/en.ts index a55a24d34..726ff43eb 100644 --- a/website/locales/en.ts +++ b/website/locales/en.ts @@ -169,6 +169,10 @@ export default { analyticsSource: "Source: Analytics", braveSource: "Source: Brave Search", transitousSource: "Source: Transitous", + // Guarded-B: when the preferred currency cannot fund the deposit, the chat pays with one + // the wallet holds — and says so here, instead of claiming you need to buy EURe first. + // The wallet signature remains the moment of consent. + walletFallback: "Paid with {used} — your wallet holds no {preferred}. Switch under Advanced.", errorPrefix: "Error:", unknownError: "Unknown error", loading: "Loading...", diff --git a/website/test/AssistantChat.test.tsx b/website/test/AssistantChat.test.tsx index 205ba1839..7bc5d8edc 100644 --- a/website/test/AssistantChat.test.tsx +++ b/website/test/AssistantChat.test.tsx @@ -58,6 +58,7 @@ vi.mock("../hooks/useX402Chat", () => ({ isReady: true, paymentNetwork: "eip155:10", paymentCurrency: "USDC", + currencyFallback: null, })), DEFAULT_LLM_AGENT_URL: "https://llm-agent.fretchen.eu", })); @@ -280,6 +281,7 @@ describe("AssistantChat", () => { isReady: true, paymentNetwork: "eip155:10", paymentCurrency: "USDC", + currencyFallback: null, }); vi.mocked(useWalletConnection).mockReturnValue({ address: "0x1234567890123456789012345678901234567890", @@ -410,6 +412,7 @@ describe("AssistantChat", () => { isReady: true, paymentNetwork: "eip155:10", paymentCurrency: "USDC", + currencyFallback: null, }); mockSendMessage.mockImplementation(() => new Promise(() => {})); // never resolves: stay loading @@ -494,6 +497,7 @@ describe("AssistantChat", () => { isReady: true, paymentNetwork: "eip155:8453", paymentCurrency: "EURC", + currencyFallback: null, }); renderWithQuery(); @@ -571,6 +575,7 @@ describe("AssistantChat", () => { isReady: true, paymentNetwork: "eip155:8453", paymentCurrency: "EURC", + currencyFallback: null, }); mockSendMessage.mockRejectedValueOnce( new PaymentError(402, JSON.stringify({ error: "insufficient_balance" }), "EURC"), @@ -918,6 +923,34 @@ describe("AssistantChat", () => { expect(names).not.toContain("get_departures"); }); + it("announces a wallet-driven currency switch, and does not blame the agent for it", () => { + const { unmount } = renderWithQuery(); + expect(screen.queryByText(/assistent\.walletFallback/)).not.toBeInTheDocument(); + unmount(); + + // EURe preferred, the wallet could only fund USDC — the hook fell back and reports it. + // paymentCurrency differs from the preference too, which alone would trigger the + // agent-side note; the wallet note must supersede it, or the UI would attribute the + // switch to the agent when it was the wallet. + vi.mocked(useX402Chat).mockReturnValue({ + sendMessage: mockSendMessage, + paidFetch: mockPaidFetch, + status: "idle", + error: null, + paymentReceipt: null, + reset: vi.fn(), + isReady: true, + paymentNetwork: "eip155:10", + paymentCurrency: "USDC", + currencyFallback: { preferred: "EURe", used: "USDC" }, + }); + + renderWithQuery(); + + expect(screen.getByText(/assistent\.walletFallback/)).toBeInTheDocument(); + expect(screen.queryByText(/payment\.currencyFallback/)).not.toBeInTheDocument(); + }); + it("keeps the image tool on offer when a Bundestakt lookup fails", async () => { // The regression this guards: a single shared `toolFailed` flag would have disabled // generate_image for the rest of the turn because an unrelated, free lookup failed. @@ -1532,7 +1565,8 @@ describe("AssistantChat", () => { isReady: true, paymentNetwork: "eip155:8453", paymentCurrency: "USDC", - }); + currencyFallback: null, + }); renderWithQuery(); @@ -1555,7 +1589,8 @@ describe("AssistantChat", () => { isReady: true, paymentNetwork: "eip155:8453", paymentCurrency: "USDC", - }); + currencyFallback: null, + }); renderWithQuery(); diff --git a/website/test/failure.test.ts b/website/test/failure.test.ts index 10483d9e4..40e5cf2c2 100644 --- a/website/test/failure.test.ts +++ b/website/test/failure.test.ts @@ -20,6 +20,9 @@ describe("paymentFailed", () => { expect(result?.status).toBe("payment_failed"); expect(result?.reason).toMatch(/USDC/i); + // The model's advice must point at the in-chat switch, not at buying the missing token — + // the guarded-B fallback makes this error a race-era residue, and the switch is the fix. + expect(result?.reason).toMatch(/switch the payment currency in the assistant's advanced settings/i); }); /** diff --git a/website/test/useX402Chat.test.ts b/website/test/useX402Chat.test.ts index 699205531..4b089b60c 100644 --- a/website/test/useX402Chat.test.ts +++ b/website/test/useX402Chat.test.ts @@ -58,6 +58,16 @@ vi.mock("@x402/evm/batch-settlement/client", () => ({ mockReadChannelBalanceAndTotalClaimed(signer, channelId), })); +// The funding-facts reader is unit-tested in x402PaidFetch.test.ts; here its answer is +// injected, so these tests cover exactly the wiring: candidates, selection, announcement +// state, and what reaches createPaidFetch. vi.hoisted because the factory below spreads +// this in immediately — a plain const is still uninitialised when the hoisted vi.mock runs. +const mockReadFundableTokens = vi.hoisted(() => vi.fn()); +vi.mock("../utils/x402PaidFetch", async (importOriginal) => { + const actual = await importOriginal(); + return { ...actual, readFundableTokens: mockReadFundableTokens }; +}); + const NETWORK = "eip155:84532"; const mockWalletClient = { account: { address: "0x1234567890123456789012345678901234567890" }, @@ -71,6 +81,9 @@ describe("useX402Chat", () => { // Every case here probes the same agent URL; a cached hit would serve the previous case's // accepts[] and silently defeat the per-case fetch mocks. resetAcceptsCache(); + // The default: everything fundable, so the paid currency always wins and the existing + // cases see today's behavior. Tests that need a fallback override this themselves. + mockReadFundableTokens.mockResolvedValue(() => true); mockGetPaymentSettleResponse.mockReturnValue({ success: true, transaction: "0xdeposit", @@ -952,6 +965,142 @@ describe("useX402Chat", () => { afterEach(() => { vi.unstubAllGlobals(); }); + + describe("guarded-B currency fallback", () => { + // LLM_V1_FLOOR is mainnet-only, and mainnet Base is the one network carrying all three + // settlement tokens — so this describe negotiates on eip155:8453, not the Sepolia NETWORK + // the rest of the file uses. + const PAY_BASE = "eip155:8453"; + // Base Sepolia's registered settlement tokens (chain-utils' own addresses) — the asset + // field is what maps an accepts entry to a currency the site can pay with. + const BASE_EURE = "0xbf6e2966A9C3D99C9E4D069E04f7Bdb9C8aa762C"; + const BASE_EURC = "0x60a3E35Cc302bFA44Cb288Bc5a4F316Fdb1adb42"; + const BASE_USDC = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"; + + const isProbe = (init?: RequestInit) => { + try { + return (JSON.parse(init?.body as string) as { model?: string }).model === "probe"; + } catch { + return false; + } + }; + + /** An agent that 402s the probe with all three tokens offered on NETWORK, then succeeds. */ + function stubAgentOfferingAllTokens() { + const accepts = [ + { scheme: "batch-settlement", network: PAY_BASE, payTo: "0xabc", asset: BASE_EURE }, + { scheme: "batch-settlement", network: PAY_BASE, payTo: "0xabc", asset: BASE_EURC }, + { scheme: "batch-settlement", network: PAY_BASE, payTo: "0xabc", asset: BASE_USDC }, + ]; + const header = btoa(JSON.stringify({ accepts })); + vi.stubGlobal( + "fetch", + vi.fn((_input: string, init?: RequestInit) => + Promise.resolve( + isProbe(init) + ? new Response("{}", { status: 402, headers: { "Payment-Required": header } }) + : new Response(JSON.stringify({ content: "hi" }), { status: 200 }), + ), + ), + ); + } + + beforeEach(() => { + vi.mocked(useWalletClient).mockReturnValue(buildWalletClientData({ data: mockWalletClient })); + vi.mocked(useAccount).mockReturnValue(buildAccountData({ isConnected: true })); + }); + + it("keeps the paid currency and reports no fallback when it can fund the deposit", async () => { + stubAgentOfferingAllTokens(); + + const { result } = renderHook(() => useX402Chat(PAY_BASE)); + await act(async () => { + await result.current.sendMessage([{ role: "user", content: "Hi" }]); + }); + + expect(result.current.paymentCurrency).toBe("EURe"); + expect(result.current.currencyFallback).toBeNull(); + }); + + it("falls back to the first funded candidate and reports the deviation", async () => { + stubAgentOfferingAllTokens(); + // EURe (the default and the paid currency) is unfunded; both EURC and USDC are funded, + // so the registry order picks EURC — the euro-first candidate. + mockReadFundableTokens.mockResolvedValue((c: string) => c === "EURC" || c === "USDC"); + + const { result } = renderHook(() => useX402Chat(PAY_BASE)); + await act(async () => { + await result.current.sendMessage([{ role: "user", content: "Hi" }]); + }); + + expect(result.current.paymentCurrency).toBe("EURC"); + expect(result.current.currencyFallback).toEqual({ preferred: "EURe", used: "EURC" }); + }); + + it("keeps today's behavior when nothing is fundable — the failure wording is then honest advice", async () => { + stubAgentOfferingAllTokens(); + mockReadFundableTokens.mockResolvedValue(() => false); + + const { result } = renderHook(() => useX402Chat(PAY_BASE)); + await act(async () => { + await result.current.sendMessage([{ role: "user", content: "Hi" }]); + }); + + expect(result.current.paymentCurrency).toBe("EURe"); + expect(result.current.currencyFallback).toBeNull(); + }); + + it("never reads balances when the agent offer is unreadable — unknown must not switch tokens", async () => { + // No 402 on the probe: accepts is null, candidates are empty, and the read is skipped. + vi.stubGlobal( + "fetch", + vi.fn((_input: string, init?: RequestInit) => + Promise.resolve( + isProbe(init) + ? new Response("{}", { status: 200 }) + : new Response(JSON.stringify({ content: "hi" }), { status: 200 }), + ), + ), + ); + + const { result } = renderHook(() => useX402Chat(PAY_BASE)); + await act(async () => { + await result.current.sendMessage([{ role: "user", content: "Hi" }]); + }); + + expect(mockReadFundableTokens).not.toHaveBeenCalled(); + expect(result.current.paymentCurrency).toBe("EURe"); + expect(result.current.currencyFallback).toBeNull(); + }); + + it("does not fall back to a token the agent does not offer, even when it is the only funded one", async () => { + // The agent offers EURe and USDC only; EURC is funded but unofferable. + const accepts = [ + { scheme: "batch-settlement", network: PAY_BASE, payTo: "0xabc", asset: BASE_EURE }, + { scheme: "batch-settlement", network: PAY_BASE, payTo: "0xabc", asset: BASE_USDC }, + ]; + const header = btoa(JSON.stringify({ accepts })); + vi.stubGlobal( + "fetch", + vi.fn((_input: string, init?: RequestInit) => + Promise.resolve( + isProbe(init) + ? new Response("{}", { status: 402, headers: { "Payment-Required": header } }) + : new Response(JSON.stringify({ content: "hi" }), { status: 200 }), + ), + ), + ); + mockReadFundableTokens.mockResolvedValue((c: string) => c === "EURC"); + + const { result } = renderHook(() => useX402Chat(PAY_BASE)); + await act(async () => { + await result.current.sendMessage([{ role: "user", content: "Hi" }]); + }); + + expect(result.current.paymentCurrency).toBe("EURe"); + expect(result.current.currencyFallback).toBeNull(); + }); + }); }); describe("WebStorageClientChannelStorage", () => { diff --git a/website/test/x402Currency.test.ts b/website/test/x402Currency.test.ts index c86aaae6b..ca0ff8a56 100644 --- a/website/test/x402Currency.test.ts +++ b/website/test/x402Currency.test.ts @@ -9,9 +9,12 @@ import { DEFAULT_CURRENCY, PAYMENT_CURRENCIES, networksForCurrency, + offeredCurrencies, preferCurrency, readCurrency, + selectFundedCurrency, storeCurrency, + type PaymentCurrency, } from "../hooks/x402Currency"; const BASE_EURE = "0xbf6e2966A9C3D99C9E4D069E04f7Bdb9C8aa762C" as const; @@ -97,3 +100,56 @@ describe("preferCurrency selector", () => { expect(paid).toBe("EURe"); }); }); + +describe("selectFundedCurrency", () => { + /** `fundable` answers "can this token's wallet balance cover the deposit floor". */ + const funded = (...held: PaymentCurrency[]) => (c: PaymentCurrency) => held.includes(c); + const all = ["EURe", "EURC", "USDC"] as const; + + it("keeps the paid currency when it can fund the deposit", () => { + expect(selectFundedCurrency("EURe", all, () => true)).toEqual({ currency: "EURe", fellBack: false }); + }); + + it("falls back to the first funded candidate in preference order — EURC before USDC", () => { + expect(selectFundedCurrency("EURe", all, funded("EURC", "USDC"))).toEqual({ currency: "EURC", fellBack: true }); + }); + + it("skips an unfunded candidate to the next funded one", () => { + expect(selectFundedCurrency("EURe", all, funded("USDC"))).toEqual({ currency: "USDC", fellBack: true }); + }); + + it("keeps today's behavior when nothing is fundable — the failure wording is then honest advice", () => { + expect(selectFundedCurrency("EURe", all, () => false)).toEqual({ currency: "EURe", fellBack: false }); + }); + + it("keeps the paid currency when no candidates are offered", () => { + expect(selectFundedCurrency("USDC", [], () => true)).toEqual({ currency: "USDC", fellBack: false }); + }); + + it("never picks a currency the seller does not offer, even when its balance would fund it", () => { + expect(selectFundedCurrency("EURe", ["USDC"], funded("EURe", "USDC"))).toEqual({ currency: "USDC", fellBack: true }); + }); +}); + +describe("offeredCurrencies", () => { + it("lists the seller's offered tokens on the network, in preference order", () => { + const accepts = [ + accept("eip155:8453", BASE_USDC), + accept("eip155:8453", BASE_EURE), + accept("eip155:8453", BASE_EURC), + ]; + expect(offeredCurrencies(accepts, "eip155:8453")).toEqual(["EURe", "EURC", "USDC"]); + }); + + it("ignores offers on other networks and tokens this site does not pay with", () => { + const accepts = [ + accept("eip155:10", BASE_USDC), + accept("eip155:8453", "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85"), // not a settlement token + ]; + expect(offeredCurrencies(accepts, "eip155:8453")).toEqual([]); + }); + + it("is empty for an unreadable offer — no candidates, no fallback", () => { + expect(offeredCurrencies(null, "eip155:8453")).toEqual([]); + }); +}); diff --git a/website/test/x402PaidFetch.test.ts b/website/test/x402PaidFetch.test.ts index 40031c472..bad777f38 100644 --- a/website/test/x402PaidFetch.test.ts +++ b/website/test/x402PaidFetch.test.ts @@ -45,6 +45,7 @@ import { PaymentError, WebStorageClientChannelStorage, readChargedTotal, + readFundableTokens, } from "../utils/x402PaidFetch"; import { formatSpend } from "../utils/x402Prices"; @@ -355,3 +356,51 @@ describe("formatSpend", () => { expect(formatSpend(1_000n, "EURC")).toBe("€0.001 EURC"); }); }); + +describe("readFundableTokens", () => { + // Base carries all three settlement tokens; the addresses are chain-utils' own. + const BASE_EURE = "0xbf6e2966A9C3D99C9E4D069E04f7Bdb9C8aa762C"; + const BASE_EURC = "0x60a3E35Cc302bFA44Cb288Bc5a4F316Fdb1adb42"; + const BASE_USDC = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"; + const wallet = "0x1234567890123456789012345678901234567890" as `0x${string}`; + + /** A public client that answers `balanceOf` from a per-address table. */ + function clientWith(balances: Record) { + return { + readContract: vi.fn(async ({ address }: { address: string }) => { + const balance = balances[address]; + if (balance === "boom") throw new Error("RPC down"); + return balance; + }), + }; + } + + it("funds only the tokens whose wallet balance covers the deposit floor", async () => { + // 0 EURe, 1.00 EURC (>= 0.50), 0.10 USDC (< 0.50). + const client = clientWith({ + [BASE_EURE]: 0n, + [BASE_EURC]: 1_000_000n, + [BASE_USDC]: 100_000n, + }); + + const fundable = await readFundableTokens(wallet, client, "eip155:8453"); + + expect(fundable("EURe")).toBe(false); + expect(fundable("EURC")).toBe(true); + expect(fundable("USDC")).toBe(false); + }); + + it("treats a failing read as unfunded — unknown must not trigger a fallback", async () => { + const client = clientWith({ + [BASE_EURE]: "boom", + [BASE_EURC]: "boom", + [BASE_USDC]: "boom", + }); + + const fundable = await readFundableTokens(wallet, client, "eip155:8453"); + + expect(fundable("EURe")).toBe(false); + expect(fundable("EURC")).toBe(false); + expect(fundable("USDC")).toBe(false); + }); +}); diff --git a/website/utils/x402PaidFetch.ts b/website/utils/x402PaidFetch.ts index 739791c3d..0fe69c531 100644 --- a/website/utils/x402PaidFetch.ts +++ b/website/utils/x402PaidFetch.ts @@ -1,4 +1,5 @@ import { privateKeyToAccount, generatePrivateKey } from "viem/accounts"; +import { getSettlementTokens } from "@fretchen/chain-utils"; import { buildStablecoinAllowedAssets } from "../hooks/x402SpendControls"; import { CURRENCY_DECIMALS, preferCurrency, type PaymentCurrency } from "../hooks/x402Currency"; // Type-only import — erased at compile time, so no @x402 runtime is pulled into SSR. @@ -215,6 +216,53 @@ export function minimumDepositAtomic(currency: PaymentCurrency): bigint { return 5n * 10n ** BigInt(CURRENCY_DECIMALS[currency] - 1); } +/** + * Which settlement tokens this wallet could fund a *new* channel deposit in — the funding + * facts behind `selectFundedCurrency` (hooks/x402Currency.ts). Reads `balanceOf` for every + * token registered on `network` (three parallel reads), and a token counts as fundable when + * the balance covers its `minimumDepositAtomic` floor — the same 0.50 the deposit itself + * would move, so the answer cannot drift from what the SDK will actually ask for. + * + * A failing read (RPC down, unknown token) counts as *unfunded*, never as "try another": + * "unknown" must not trigger a currency fallback, or a flaky RPC would silently switch the + * token the user chose. Per-call state by design — balances are read fresh at send time, + * never cached, matching the "in context of the action" rule of the chain switch. + * + * `publicClient` is `unknown` and cast inside, the file's own convention: viem's generic + * `readContract` cannot be matched structurally, and `createPaidFetch` casts the same value + * for the same reason (see the call at `toClientEvmSigner`). + */ +export async function readFundableTokens( + walletAddress: `0x${string}`, + // Unknown, cast below to the minimal shape actually called: viem's generic readContract + // cannot be matched structurally, and `createPaidFetch` accepts the same value as unknown + // for the same reason. The cast keeps this function any-free. + publicClient: unknown, + network: string, +): Promise<(currency: PaymentCurrency) => boolean> { + const client = publicClient as { readContract: (call: unknown) => Promise }; + const tokens = getSettlementTokens(network); + const held = new Map(); + await Promise.all( + tokens.map(async (token) => { + try { + const balance = await client.readContract({ + address: token.address, + functionName: "balanceOf", + args: [walletAddress], + }); + held.set(token.symbol, typeof balance === "bigint" ? balance : null); + } catch { + held.set(token.symbol, null); + } + }), + ); + return (currency) => { + const balance = held.get(currency); + return balance !== undefined && balance !== null && balance >= minimumDepositAtomic(currency); + }; +} + /** * Custom deposit sizing: always deposit/top-up to at least `minimumDepositAtomic(currency)`, * regardless of the SDK's default multiplier-of-ceiling formula — see that function's @@ -274,10 +322,17 @@ function describePaymentError(status: number, body: string, currency: PaymentCur return DRAINED_CHANNEL_MESSAGE.chat; } if (errorCode?.includes("insufficient_balance")) { - // The USDC.e note is USDC's alone: bridged EURC is not a thing people end up holding by accident. + // The switch hint is the actionable advice: the guarded-B fallback (useX402Chat) has + // already moved the send to a funded token when one exists, so reaching this message + // means either a race between the balance read and the deposit, or nothing funded — and + // the hint points at the one in-chat fix either way, instead of "go buy ". + // Both variants are written to fit `describeFailure`'s 200-char cap: the hint is the part + // the model must not lose, and the USDC.e note is shortened, not the hint. + // (USDC's note is USDC's alone: bridged EURC is not a thing people end up holding by accident.) + const switchHint = "Alternatively, switch the payment currency in the assistant's advanced settings."; return currency === "USDC" - ? "Not enough USDC in your wallet to fund the payment channel. Note that only native USDC works — a bridged variant such as USDC.e cannot be used." - : `Not enough ${currency} in your wallet to fund the payment channel.`; + ? `Not enough USDC in your wallet to fund the payment channel. Note that only native USDC works, not USDC.e. ${switchHint}` + : `Not enough ${currency} in your wallet to fund the payment channel. ${switchHint}`; } return `Request failed: ${status} - ${body}`; } From ddb083d03e027b1b1e6be265e895649321e0a9a1 Mon Sep 17 00:00:00 2001 From: fretchen Date: Fri, 16 Oct 2026 18:14:40 +0200 Subject: [PATCH 4/6] fix names --- website/components/AssistantChat.tsx | 3 ++- website/pages/assistent/+description.ts | 2 +- website/pages/assistent/+title.ts | 2 +- website/pages/lab/+Page.tsx | 2 +- 4 files changed, 5 insertions(+), 4 deletions(-) diff --git a/website/components/AssistantChat.tsx b/website/components/AssistantChat.tsx index 3e0b360e5..bb094f0b8 100644 --- a/website/components/AssistantChat.tsx +++ b/website/components/AssistantChat.tsx @@ -1,6 +1,7 @@ /** * AssistantChat — the interactive core of the x402 batch-settlement chat assistant - * (`/assistent`). Pays per message via `useX402Chat` (USDC payment channels): the + * (`/assistent`). Pays per message via `useX402Chat` (stablecoin payment channels — + * EURe by default, EURC and USDC one toggle away): the * first message opens a channel (one wallet-signed deposit), later messages are * off-chain voucher signatures reusing the open channel. */ diff --git a/website/pages/assistent/+description.ts b/website/pages/assistent/+description.ts index 5100894f7..e69288f1b 100644 --- a/website/pages/assistent/+description.ts +++ b/website/pages/assistent/+description.ts @@ -1,3 +1,3 @@ export function description() { - return "An AI assistant that pays per message with x402 batch-settlement USDC payment channels — no prepaid balance, no subscription. The channel opens on your first message; each message after is a cheap off-chain voucher."; + return "An AI assistant that pays per message with x402 batch-settlement stablecoin payment channels — no prepaid balance, no subscription. The channel opens on your first message; each message after is a cheap off-chain voucher."; } diff --git a/website/pages/assistent/+title.ts b/website/pages/assistent/+title.ts index 25d4e49a7..e2eb64ccb 100644 --- a/website/pages/assistent/+title.ts +++ b/website/pages/assistent/+title.ts @@ -1,3 +1,3 @@ export function title() { - return "AI Assistant with USDC Payment Channels | fretchen.eu"; + return "AI Assistant with Stablecoin Payment Channels | fretchen.eu"; } diff --git a/website/pages/lab/+Page.tsx b/website/pages/lab/+Page.tsx index 08d6ca68b..f805d2673 100644 --- a/website/pages/lab/+Page.tsx +++ b/website/pages/lab/+Page.tsx @@ -21,7 +21,7 @@ const LabPage: React.FC = () => { From a6379b6b686efb2cd7ab429c41b799020ec3b189 Mon Sep 17 00:00:00 2001 From: fretchen Date: Fri, 16 Oct 2026 21:21:46 +0200 Subject: [PATCH 5/6] make it prettier --- website/hooks/useX402Chat.ts | 8 +++++++- website/test/AssistantChat.test.tsx | 4 ++-- website/test/x402Currency.test.ts | 10 ++++++++-- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/website/hooks/useX402Chat.ts b/website/hooks/useX402Chat.ts index a09f5a2e0..8857126fc 100644 --- a/website/hooks/useX402Chat.ts +++ b/website/hooks/useX402Chat.ts @@ -17,7 +17,13 @@ import { useWalletClient } from "wagmi"; import { getConfiguredPublicClient } from "./useConfiguredPublicClient"; import { useIsWalletConnected } from "./useIsWalletConnected"; import { probeAccepts, negotiateNetwork, LLM_V1_FLOOR } from "./x402Discovery"; -import { DEFAULT_CURRENCY, offeredCurrency, offeredCurrencies, selectFundedCurrency, type PaymentCurrency } from "./x402Currency"; +import { + DEFAULT_CURRENCY, + offeredCurrency, + offeredCurrencies, + selectFundedCurrency, + type PaymentCurrency, +} from "./x402Currency"; import { createPaidFetch, readFundableTokens, type PaidFetch } from "../utils/x402PaidFetch"; import type { X402ChatMessage, diff --git a/website/test/AssistantChat.test.tsx b/website/test/AssistantChat.test.tsx index 7bc5d8edc..86d983fe7 100644 --- a/website/test/AssistantChat.test.tsx +++ b/website/test/AssistantChat.test.tsx @@ -1566,7 +1566,7 @@ describe("AssistantChat", () => { paymentNetwork: "eip155:8453", paymentCurrency: "USDC", currencyFallback: null, - }); + }); renderWithQuery(); @@ -1590,7 +1590,7 @@ describe("AssistantChat", () => { paymentNetwork: "eip155:8453", paymentCurrency: "USDC", currencyFallback: null, - }); + }); renderWithQuery(); diff --git a/website/test/x402Currency.test.ts b/website/test/x402Currency.test.ts index ca0ff8a56..087b216b5 100644 --- a/website/test/x402Currency.test.ts +++ b/website/test/x402Currency.test.ts @@ -103,7 +103,10 @@ describe("preferCurrency selector", () => { describe("selectFundedCurrency", () => { /** `fundable` answers "can this token's wallet balance cover the deposit floor". */ - const funded = (...held: PaymentCurrency[]) => (c: PaymentCurrency) => held.includes(c); + const funded = + (...held: PaymentCurrency[]) => + (c: PaymentCurrency) => + held.includes(c); const all = ["EURe", "EURC", "USDC"] as const; it("keeps the paid currency when it can fund the deposit", () => { @@ -127,7 +130,10 @@ describe("selectFundedCurrency", () => { }); it("never picks a currency the seller does not offer, even when its balance would fund it", () => { - expect(selectFundedCurrency("EURe", ["USDC"], funded("EURe", "USDC"))).toEqual({ currency: "USDC", fellBack: true }); + expect(selectFundedCurrency("EURe", ["USDC"], funded("EURe", "USDC"))).toEqual({ + currency: "USDC", + fellBack: true, + }); }); }); From 966394423398274e8e604c2dae6c08dfbc407f8b Mon Sep 17 00:00:00 2001 From: fretchen Date: Fri, 16 Oct 2026 22:12:12 +0200 Subject: [PATCH 6/6] clean up tsup --- .github/CVE_TRIAGE.md | 2 +- analytics/README.md | 2 +- analytics/package-lock.json | 1332 ++++---- analytics/package.json | 4 +- analytics/tsdown.config.ts | 39 + analytics/tsup.config.js | 37 - comment_service/README.md | 2 +- comment_service/package-lock.json | 2806 ++++++----------- comment_service/package.json | 4 +- comment_service/tsdown.config.ts | 24 + comment_service/tsup.config.js | 19 - scw_js/dev_server_genimg.ts | 2 +- scw_js/dev_server_llm.ts | 2 +- scw_js/dev_server_mcp.ts | 2 +- scw_js/package-lock.json | 2201 +++++-------- scw_js/package.json | 4 +- scw_js/scripts/openapi-codegen.ts | 2 +- scw_js/test/handler_purity.test.ts | 2 +- scw_js/tsdown.config.ts | 33 + scw_js/tsup.config.js | 31 - x402_facilitator/package-lock.json | 1294 +++----- x402_facilitator/package.json | 4 +- x402_facilitator/serverless.yml | 2 +- x402_facilitator/test/no_stray_js.test.ts | 1 - x402_facilitator/tsdown.config.ts | 28 + x402_facilitator/tsup.config.js | 26 - x402_facilitator/x402_splitter_facilitator.js | 2 +- x402_facilitator/x402_splitter_settle.js | 2 +- x402_facilitator/x402_splitter_supported.js | 2 +- x402_facilitator/x402_splitter_verify.js | 2 +- 30 files changed, 2942 insertions(+), 4971 deletions(-) create mode 100644 analytics/tsdown.config.ts delete mode 100644 analytics/tsup.config.js create mode 100644 comment_service/tsdown.config.ts delete mode 100644 comment_service/tsup.config.js create mode 100644 scw_js/tsdown.config.ts delete mode 100644 scw_js/tsup.config.js create mode 100644 x402_facilitator/tsdown.config.ts delete mode 100644 x402_facilitator/tsup.config.js diff --git a/.github/CVE_TRIAGE.md b/.github/CVE_TRIAGE.md index 6c2911829..1b9fb23f7 100644 --- a/.github/CVE_TRIAGE.md +++ b/.github/CVE_TRIAGE.md @@ -32,7 +32,7 @@ Look up the manifest path and package name in the tier table below. Most triage | `pino` | scw_js / x402_facilitator prod dep | **T3** | | `dotenv` | serverless prod dep | **T3** | | `undici` | transitive dep in `eth/` (Hardhat) | **T4** | -| `vite`, `vitest`, `tsup`, `eslint`, `typescript` | devDependencies everywhere | **T4** | +| `vite`, `vitest`, `tsdown`, `eslint`, `typescript` | devDependencies everywhere | **T4** | | `hardhat` and all `@nomicfoundation/*` | `eth/` devDependencies | **T4** | | `jupyterlab`, `jupyter-server` | `notebooks/` local only | **T4** | | `growth-agent` pip deps | cron container, no public surface | **T4** | diff --git a/analytics/README.md b/analytics/README.md index a17657eca..8b085eaed 100644 --- a/analytics/README.md +++ b/analytics/README.md @@ -159,7 +159,7 @@ npm install npm test # run tests (vitest) npm run test:coverage # with coverage report npm run lint # eslint -npm run build # tsup → dist/ +npm run build # tsdown → dist/ ``` ### Local servers diff --git a/analytics/package-lock.json b/analytics/package-lock.json index 69b21cf57..fbdd92206 100644 --- a/analytics/package-lock.json +++ b/analytics/package-lock.json @@ -23,7 +23,7 @@ "eslint": "^10.0.0", "prettier": "^3.0.0", "serverless-scaleway-functions": ">=0.4.16", - "tsup": "^9.0.0", + "tsdown": "^0.23.1", "tsx": "^4.23.5", "typescript": "^5.9.3", "typescript-eslint": "^8.60.0", @@ -974,17 +974,6 @@ } } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -1095,26 +1084,6 @@ "semver": "bin/semver.js" } }, - "node_modules/@napi-rs/lzma-linux-x64-gnu": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", - "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^22.20 || ^24.12 || >=25" - } - }, "node_modules/@noble/ciphers": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", @@ -1247,6 +1216,19 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/@quansync/fs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@quansync/fs/-/fs-1.1.0.tgz", + "integrity": "sha512-qAPG/t3HqML1TlN7sY/pTbEjzFVAKsMjNNMGheyDosro+kT4iw2KCUoHcVdmliwWjorm4elZbgNQyU2eD97eDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "quansync": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, "node_modules/@rolldown/binding-android-arm-eabi": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.13.tgz", @@ -1498,414 +1480,15 @@ "optional": true, "os": [ "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.13.tgz", - "integrity": "sha512-UKhFaZTeTcbKrb3iU82m17jVcPEAoqDkCN5MBqgPyZSwp/cQmib21crTS0DdH7T1B7wZRWEI89YQAOJMet5yhg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.64.7.tgz", - "integrity": "sha512-GFF2tHk0NqYVObrK0+/ps/LEXsV/v2q6Lyiy7mZr+Ej24fpQScvqK2ziz9NHeEQYnKWKym38Ml7dZbPtC9tuAw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.64.7.tgz", - "integrity": "sha512-BOymcXJFYYXqluDidj6sLelNjXruC3u1BqVxLn2OPCXH9xaPSOTH+MS4uychsGI1NU7tJoiv9KvqijDHFe+hhQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.64.7.tgz", - "integrity": "sha512-jgVpGweIbls2H5jfBB70tnX52abMd5pJr3xmtoDILx6JdmGl+Un+tMb9R+MbHPVB46tTBpY8emtn7M71SnQhEQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.64.7.tgz", - "integrity": "sha512-AVMpt94mrXH7WjyWKmd9nT4RC5yM0AN3Lt6A89xVIsuLDi3dDX6dxMytLbW36FlppY9JsoqUoS3LUUpUrYxiMQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.64.7.tgz", - "integrity": "sha512-Nje29c/MyajxRNFGU05oyeTDS6SWdMg/wWMSlZSBTBju5BKz2NVc0kFiFSQGzRELNiB+CBk/ZvAVsWsENgjGag==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.64.7.tgz", - "integrity": "sha512-xxgN5/kMzCNz/NYJ4t49B0/WS6InNlWv6xvgwUQqNnWM9WJMMwMUGWrAxdNEgYWdHL0sMnuh8I87StGrIMTA+w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.64.7.tgz", - "integrity": "sha512-5U/9gVn/X657I8+NHoHO9Wnfyd0lEXwqbslobRoB9TC8SwYzOitcIr6TLE7531Q/NWs3L4mb+YOGzlf3vHIeYw==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.64.7.tgz", - "integrity": "sha512-hcDS0a/Y8ggM3dcOfzH7UpSaogCViWTtNDSl0EXpWIj8g8/r86ITqptjil2hayTXS0Umzb+Yt3mjgpQVFVf2+A==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.64.7.tgz", - "integrity": "sha512-awbAr4N7Qd/yjZAQBEEPzgcPveYG2Gi5L6gq1/Bp+3SMRjn5F68Wv1zKsntzvvoioBR6yKvhLtWqu11am1TsxA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.64.7.tgz", - "integrity": "sha512-Ut7xQJfeLhzu2yN3rHzVvL9ccyPJvN4aCdP1V7hJ5lGxX/eCzgB9SiMk/Md3J+rWWZgvoYsDW4BUFggJr32pBA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.64.7.tgz", - "integrity": "sha512-trqoni/vHkuM5oo5iQhoKPh6fjjD7E80pMgCXWgGxU8vSRPUlwvG8GeYvEEcB6eJAxNa99WH9iVHPHelgtKiHA==", - "cpu": [ - "loong64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.64.7.tgz", - "integrity": "sha512-gvlUy0XFIwtUWiQmhc+4GT2Knm3KosinpUVhr7CtTFA78gFDnE5NWwMPzHrJsYpKkh2LlY7yvBIboN1FAV6Xeg==", - "cpu": [ - "loong64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.64.7.tgz", - "integrity": "sha512-8yS/kSXTJ/47Z62JW+C2AJ3vd/8zZw016vFjtNpZwmZlwJumLua4s1i78dkYuSSqQ+0aIMxJcBp/4uIwp2ehjA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.64.7.tgz", - "integrity": "sha512-mxVSKvvty0hOP1AFo/l4Kpv3i3HK0zx4rYUrirZDToYlWhS3xzmIkq3vUJ7rtrM2cPyXveDyDT6M1FfXZ9hTRA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.64.7.tgz", - "integrity": "sha512-lEse1zra1CagM+uHH2bl28GInDsZZ45NJzHei2OMaXQFzZWKBO1hFo07rS0xB6ayV4WU360UrSmPDSyCMpYsUQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.64.7.tgz", - "integrity": "sha512-d/cqCoiG9WMZ5VuJZ5Qdlv9g97QyoGwnmvHccvGhKSacTy7xFrAS+jMcJSBdMNOw1oacSkl6p7K6O/DRYTKL3g==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.64.7.tgz", - "integrity": "sha512-kVEA//CeDOZZP1XCH2JBgqXb9+ALlwuA/4civaazMVdgzaSQC9WM38w65zG/LLk0lA7F9Od19CSBZW7J9mCbNg==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.64.7.tgz", - "integrity": "sha512-14oLfDsOSr0TSntT/34jRg/V8B2XW/Jomh9zX9CjIM9gwwNlI1OCymS/GVn0DV32h67eRf7U0GGem0rvfXgNwQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.64.7.tgz", - "integrity": "sha512-dFVtPfjZqAnUPpPY4Bfg+87yo1IBW9HiY8iCFtg49Pn46MfZTebSHZh8PL6SOsgyt9LQP8Nj/sE6jm3aWpySmQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.64.7.tgz", - "integrity": "sha512-Dm9CZ2SM3u2NgvBj4awW/gGqkOwzH8f6MSYIJE6+bKcKLI+T0+LhpD6vtetTfrIIx+rLXDf5RJqBP6v7V5O+wg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.64.7.tgz", - "integrity": "sha512-oaxsvS2mL6+78741CT2HCORBvy1USg3Wqpt5qvZwy3aMXRMl4zxyDo8maeFRWJkF3dp0Wbi71fKH5Gr9YI3vYA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.64.7.tgz", - "integrity": "sha512-UKZz1Y4mxUqkWh60uH7B1aZn6UcAimPk4ipRktpb3wfZq7JrzZYyAXTwiafkb3T+kd5P3Sf+vzcRdsDks4WtjQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.64.7.tgz", - "integrity": "sha512-WWkSuC1J+mZJnsDh0mRaCAFSWfQdl6y3fDjZeWElI6zHo8CcOSG5lY3yurKJjEq+FrX0WD60sFrVVpbHqzMmrw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.64.7.tgz", - "integrity": "sha512-u9bp2yXCI3/BUjUxY6uWknAY32pfvvDCPysyUTySotx0dj3ydlFHrRQYfn/b/kZgnfjyEwySMtI7Ga054uiysQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.64.7.tgz", - "integrity": "sha512-EhX6N3XPMEnVU5cRfNgzPOKcSucsbu3nNNWuoAaEuKIqmddBKHN5b9d4rPe65T1I+FaOT176JKiZNsUBp3rqbA==", + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.13.tgz", + "integrity": "sha512-UKhFaZTeTcbKrb3iU82m17jVcPEAoqDkCN5MBqgPyZSwp/cQmib21crTS0DdH7T1B7wZRWEI89YQAOJMet5yhg==", "cpu": [ "x64" ], @@ -1914,7 +1497,17 @@ "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" }, "node_modules/@scaleway/serverless-functions": { "version": "1.1.2", @@ -2545,6 +2138,199 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/@yuku-core/binding-android-arm64": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-android-arm64/-/binding-android-arm64-0.19.0.tgz", + "integrity": "sha512-wdL2XmTiZixAOaHk9Z0JJZ8u9Qm8d333Zjpc6gaxXFX+UR5BlsfxZ7a2+2Rm71pamppsPYGUGFq2oVLbh6DISw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@yuku-core/binding-darwin-arm64": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-darwin-arm64/-/binding-darwin-arm64-0.19.0.tgz", + "integrity": "sha512-7sNJa6XJhyetnTy64jw3NEi4YgUcezHk1G5GH9FSvXAuC8wIlbaOwT9lgq5qo5sspjrZJQlBR1TWflP49uRpMw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@yuku-core/binding-darwin-x64": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-darwin-x64/-/binding-darwin-x64-0.19.0.tgz", + "integrity": "sha512-pTC7dYEc59isdyizc3nsuyFNBu2LU5wMYZ1be6UMr59PY/AJNtO1aBLWV0MgL/z7C1nv/2sX4TNjGgKLoeevJw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@yuku-core/binding-freebsd-x64": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-freebsd-x64/-/binding-freebsd-x64-0.19.0.tgz", + "integrity": "sha512-xrZjF6XOEwyLOiDIfrwDdRCS6ghxcJeirNC1KivQhVcUwlRonaU79S3/Uiyx3lBylPnT8qKJ3/aMT+H52nGTJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@yuku-core/binding-linux-arm-gnu": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-arm-gnu/-/binding-linux-arm-gnu-0.19.0.tgz", + "integrity": "sha512-0OyIH53C0I1CbADHn9FSdCfX5qbpeLwJhmOVhonFJNYheybOnkSJ50qGMfTJIb8y5zrwqvLs7FVBvz6Fk8maZg==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-core/binding-linux-arm-musl": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-arm-musl/-/binding-linux-arm-musl-0.19.0.tgz", + "integrity": "sha512-z/iPfkCOCSXE34VXNt0uP1ORSW+4mEa9b5CiJcWZeqZH08g49bFU/jRM2T04f+Wpw5mJ6HIzNBiojxeAbrHjeg==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-core/binding-linux-arm64-gnu": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.19.0.tgz", + "integrity": "sha512-jLNTi+gzaRwBJ+gwhCJ+rDb5dmx/8hEBx93UWd7hjMSqPTL1D1wvVSvXVAldV5kALvju7b0/m51EHEhs4+I1fA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-core/binding-linux-arm64-musl": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.19.0.tgz", + "integrity": "sha512-YwyPIdW/rN2Fmv0MTFWi47FaB3F9g+2b+sJISyAw83Yd60RWH4T3Nx6XkAHHVN+uKJNBAd6So7/BVihSiFYvuQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-core/binding-linux-x64-gnu": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.19.0.tgz", + "integrity": "sha512-/vskaAXVX3ESR43FiTdfiYS7z1b9uoQJwVQ/0RgUHgN2sWoAyCZs+aX4CgU7eKGIHTVfp9VFwv+c+2XchYiEtQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-core/binding-linux-x64-musl": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-x64-musl/-/binding-linux-x64-musl-0.19.0.tgz", + "integrity": "sha512-FuXL5igeSKib9Rye02TdH+D6SQezTyGxIATMu1Qsn/QywrzwpGl35OLpS2C1x5vpGLeVE2XgiLd5mVPFHmIglQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-core/binding-win32-arm64": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-win32-arm64/-/binding-win32-arm64-0.19.0.tgz", + "integrity": "sha512-YuJAe7zEKT1Xa7LuHlhGJpPnYQeVtvo0rZvNjJRqkH0hQGOw4C8QeP30Tg5VKGzZfo2x8CjhjEhKt4TmLwfmdg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@yuku-core/binding-win32-x64": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-win32-x64/-/binding-win32-x64-0.19.0.tgz", + "integrity": "sha512-o8iY/mXwlRkedp0LNTr4+TEfXTPQwoNZmv6k+1WIAd1ZXEn8xJJTBCtB0osaVvdZo/x/cNmV16UrWrrGpM5Mvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@yuku-toolchain/types": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-toolchain/types/-/types-0.19.0.tgz", + "integrity": "sha512-tFkNbsP4WXX9UMUC5syJGdK9dPMLK0PPaIuXCcCYH75sZ8MrebfBZ2XvCILRTw8AgLivSSCfDa4R67iYBDa4Kg==", + "dev": true, + "license": "MIT" + }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -2747,13 +2533,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true, - "license": "MIT" - }, "node_modules/aproba": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", @@ -3067,22 +2846,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bundle-require": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", - "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "load-tsconfig": "^0.2.3" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "esbuild": ">=0.18" - } - }, "node_modules/cac": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/cac/-/cac-7.1.0.tgz", @@ -3246,22 +3009,6 @@ "dev": true, "license": "MIT" }, - "node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^5.0.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", @@ -3512,23 +3259,6 @@ "dev": true, "license": "MIT" }, - "node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", @@ -3896,6 +3626,13 @@ "node": ">=8" } }, + "node_modules/defu": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", + "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", + "dev": true, + "license": "MIT" + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -3986,6 +3723,27 @@ "url": "https://dotenvx.com" } }, + "node_modules/dts-resolver": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/dts-resolver/-/dts-resolver-3.0.0.tgz", + "integrity": "sha512-1T1f+z+4tl9XD+m+0HBgWoL/nm0bOIffyWaUuUSBlFg/86IWvfx+wjNaO/ybU0AJzG9/Mi5hBUgGV6zCmWEN7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "oxc-resolver": ">=11.0.0" + }, + "peerDependenciesMeta": { + "oxc-resolver": { + "optional": true + } + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -4019,6 +3777,16 @@ "dev": true, "license": "MIT" }, + "node_modules/empathic": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.1.0.tgz", + "integrity": "sha512-AnfC1ATldl49/cvZdLPDjBfrRNwbDO05aibiOtzQu3qtlbJtomNLhF30HEtn/7iBz50dlMECqATo3fG0LrdEgw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, "node_modules/end-of-stream": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", @@ -4838,18 +4606,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fix-dts-default-cjs-exports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz", - "integrity": "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "magic-string": "^0.30.17", - "mlly": "^1.7.4", - "rollup": "^4.34.8" - } - }, "node_modules/flat-cache": { "version": "6.1.23", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.23.tgz", @@ -5102,6 +4858,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-tsconfig": { + "version": "5.0.0-beta.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-5.0.0-beta.6.tgz", + "integrity": "sha512-X6fBC0pmImC70gvX2zm56go9hx0MyoGVdG0tUCkg/D+Xnh5TJsOZ7iDbOdI3PvmtrDxnu1YdDufpK2QJX1Meqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "engines": { + "node": ">=20.20.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -5299,6 +5071,13 @@ "node": ">= 0.4" } }, + "node_modules/hookable": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-6.1.2.tgz", + "integrity": "sha512-+abwxtiEA52GCVIsQqut3S/uKTbUwYIp4Pe/vv+6py5XiXBCqMZHg6pA6Y5qhgLSEys0/cYuPbO0z1QFj5ZCmg==", + "dev": true, + "license": "MIT" + }, "node_modules/hookified": { "version": "1.15.1", "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.15.1.tgz", @@ -5396,6 +5175,19 @@ "node": ">= 4" } }, + "node_modules/import-without-cache": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/import-without-cache/-/import-without-cache-0.4.1.tgz", + "integrity": "sha512-vXoV9PjKHEednCUu01e98TkImxy67e3BJXbTIOmIq4Hyzw3IAwYRcuPkfeTzJzwyyts4kjuA73x+pWJLc4f86A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -5680,21 +5472,11 @@ "dev": true, "license": "BSD-3-Clause", "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/joycon": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", - "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", - "dev": true, - "license": "MIT", + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, "engines": { - "node": ">=10" + "node": ">=8" } }, "node_modules/js-tokens": { @@ -6074,36 +5856,6 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" - }, - "node_modules/load-tsconfig": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", - "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -6430,19 +6182,6 @@ "dev": true, "license": "MIT" }, - "node_modules/mlly": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", - "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.16.0", - "pathe": "^2.0.3", - "pkg-types": "^1.3.1", - "ufo": "^1.6.3" - } - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -6457,18 +6196,6 @@ "dev": true, "license": "ISC" }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, "node_modules/nan": { "version": "2.29.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.29.0.tgz", @@ -6997,28 +6724,6 @@ ], "license": "MIT" }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" - } - }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -7058,49 +6763,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-load-config": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", - "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "lilconfig": "^3.1.1" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "jiti": ">=1.21.0", - "postcss": ">=8.0.9", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -7260,6 +6922,23 @@ "dev": true, "license": "MIT" }, + "node_modules/quansync": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-1.0.0.tgz", + "integrity": "sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, "node_modules/quick-format-unescaped": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", @@ -7354,20 +7033,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/readdirp": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", - "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/real-require": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", @@ -7405,14 +7070,14 @@ "dev": true, "license": "MIT" }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, "node_modules/responselike": { @@ -7521,50 +7186,64 @@ "@rolldown/binding-win32-x64-msvc": "1.2.13" } }, - "node_modules/rollup": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.64.7.tgz", - "integrity": "sha512-aCiJONoZp0lNGJ6sYqspLkh6UXaWEey/7Ko2TZyXQ4kgzAhDUxAgbt/oulXKmD+zFHXw1k+RF6ZZWOrjp7DZnQ==", + "node_modules/rolldown-plugin-dts": { + "version": "0.28.8", + "resolved": "https://registry.npmjs.org/rolldown-plugin-dts/-/rolldown-plugin-dts-0.28.8.tgz", + "integrity": "sha512-FVhfqxorCWcc20BVT5eVRfRjzLLl6mgzjcMR4gSBf0K4oQMXT0qoHhhzfXy0L7y83fQy7Ug5ZDNk90xM3/LiCQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.9" - }, - "bin": { - "rollup": "dist/bin/rollup" + "dts-resolver": "^3.0.0", + "get-tsconfig": "5.0.0-beta.6", + "obug": "^3.0.0", + "yuku-ast": "^0.19.0", + "yuku-codegen": "^0.19.0", + "yuku-parser": "^0.19.0" }, "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, - "optionalDependencies": { - "@napi-rs/lzma-linux-x64-gnu": "1.5.1", - "@rollup/rollup-android-arm-eabi": "4.64.7", - "@rollup/rollup-android-arm64": "4.64.7", - "@rollup/rollup-darwin-arm64": "4.64.7", - "@rollup/rollup-darwin-x64": "4.64.7", - "@rollup/rollup-freebsd-arm64": "4.64.7", - "@rollup/rollup-freebsd-x64": "4.64.7", - "@rollup/rollup-linux-arm-gnueabihf": "4.64.7", - "@rollup/rollup-linux-arm-musleabihf": "4.64.7", - "@rollup/rollup-linux-arm64-gnu": "4.64.7", - "@rollup/rollup-linux-arm64-musl": "4.64.7", - "@rollup/rollup-linux-loong64-gnu": "4.64.7", - "@rollup/rollup-linux-loong64-musl": "4.64.7", - "@rollup/rollup-linux-ppc64-gnu": "4.64.7", - "@rollup/rollup-linux-ppc64-musl": "4.64.7", - "@rollup/rollup-linux-riscv64-gnu": "4.64.7", - "@rollup/rollup-linux-riscv64-musl": "4.64.7", - "@rollup/rollup-linux-s390x-gnu": "4.64.7", - "@rollup/rollup-linux-x64-gnu": "4.64.7", - "@rollup/rollup-linux-x64-musl": "4.64.7", - "@rollup/rollup-openbsd-x64": "4.64.7", - "@rollup/rollup-openharmony-arm64": "4.64.7", - "@rollup/rollup-win32-arm64-msvc": "4.64.7", - "@rollup/rollup-win32-ia32-msvc": "4.64.7", - "@rollup/rollup-win32-x64-gnu": "4.64.7", - "@rollup/rollup-win32-x64-msvc": "4.64.7", - "fsevents": "~2.3.2" + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@typescript/native-preview": "*", + "@volar/typescript": "~2.4.0", + "@vue/language-core": "~3.2.0 || ~3.3.0", + "rolldown": "^1.2.0", + "typescript": "^5.0.0 || ^6.0.0 || ~7.0.0", + "vue-tsc": "~3.2.0 || ~3.3.0" + }, + "peerDependenciesMeta": { + "@typescript/native-preview": { + "optional": true + }, + "@volar/typescript": { + "optional": true + }, + "@vue/language-core": { + "optional": true + }, + "typescript": { + "optional": true + }, + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/rolldown-plugin-dts/node_modules/obug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/obug/-/obug-3.0.0.tgz", + "integrity": "sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" } }, "node_modules/run-async": { @@ -7950,39 +7629,6 @@ "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/sucrase": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", - "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "tinyglobby": "^0.2.11", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -8122,29 +7768,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/thread-stream": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.2.0.tgz", @@ -8316,74 +7939,79 @@ "typescript": ">=4.8.4" } }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/tsup": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/tsup/-/tsup-9.0.0.tgz", - "integrity": "sha512-DHgb0bfo2gFKybOa8dRFMiHSqzWWhMkfNK0f902VVquWQtDBWExNgidHszjjDKaFd12pWPgzumpWf9nGr3gzFg==", + "node_modules/tsdown": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/tsdown/-/tsdown-0.23.1.tgz", + "integrity": "sha512-MSC2WSOts3in95J334/VIS7KPfor3eCSvndJ6KdoVj9Aak9Kh1aNfz9ws5owhdukuTNSXRdfkPEzA/ihpDD6SA==", "dev": true, "license": "MIT", "dependencies": { - "bundle-require": "^5.1.0", - "cac": "^7.1.0", - "chokidar": "^5.0.0", - "consola": "^3.4.2", - "esbuild": "^0.28.2", - "fix-dts-default-cjs-exports": "^1.0.1", - "joycon": "^3.1.1", + "cac": "^7.0.1", + "defu": "^6.1.7", + "empathic": "^2.1.0", + "hookable": "^6.1.2", + "import-without-cache": "^0.4.1", "obug": "^3.0.0", - "picocolors": "^1.1.1", - "postcss-load-config": "^6.0.1", - "resolve-from": "^5.0.0", - "rollup": "^4.64.6", - "source-map-js": "^1.2.2", - "sucrase": "^3.35.1", + "picomatch": "^4.0.7", + "rolldown": "~1.2.13", + "rolldown-plugin-dts": "^0.28.7", "tinyexec": "^1.3.1", "tinyglobby": "^0.2.17", - "tree-kill": "^1.2.2" + "tree-kill": "^1.2.2", + "unconfig-core": "^7.5.0", + "verkit": "^0.5.0" }, "bin": { - "tsup": "dist/cli-default.js", - "tsup-node": "dist/cli-node.js" + "tsdown": "dist/run.mjs" }, "engines": { "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, "peerDependencies": { - "@microsoft/api-extractor": "^7.36.0", - "@swc/core": "^1", - "postcss": "^8.4.12", - "typescript": ">=4.5.0" + "@arethetypeswrong/core": "^0.18.1", + "@tsdown/css": "0.23.1", + "@tsdown/exe": "0.23.1", + "@vitejs/devtools": "*", + "publint": "^0.3.8", + "tsx": "*", + "typescript": "^5.0.0 || ^6.0.0 || ^7.0.0", + "unplugin-unused": ">=0.5.0", + "unrun": "*" }, "peerDependenciesMeta": { - "@microsoft/api-extractor": { + "@arethetypeswrong/core": { + "optional": true + }, + "@tsdown/css": { "optional": true }, - "@swc/core": { + "@tsdown/exe": { "optional": true }, - "postcss": { + "@vitejs/devtools": { + "optional": true + }, + "publint": { + "optional": true + }, + "tsx": { "optional": true }, "typescript": { "optional": true + }, + "unplugin-unused": { + "optional": true + }, + "unrun": { + "optional": true } } }, - "node_modules/tsup/node_modules/obug": { + "node_modules/tsdown/node_modules/obug": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/obug/-/obug-3.0.0.tgz", "integrity": "sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==", @@ -8397,6 +8025,13 @@ "node": ">=12.20.0" } }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, "node_modules/tsx": { "version": "4.23.15", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.15.tgz", @@ -8509,13 +8144,6 @@ "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/ufo": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", - "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", - "dev": true, - "license": "MIT" - }, "node_modules/unbzip2-stream": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", @@ -8527,6 +8155,20 @@ "through": "^2.3.8" } }, + "node_modules/unconfig-core": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/unconfig-core/-/unconfig-core-7.5.0.tgz", + "integrity": "sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@quansync/fs": "^1.0.0", + "quansync": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/undici-types": { "version": "7.24.6", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", @@ -8572,6 +8214,19 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/verkit": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/verkit/-/verkit-0.5.0.tgz", + "integrity": "sha512-u4J1hr6Y+C/hit34GwL3eIcUf3wngT8TlYUjK7tk0jxydKLAq3sYvifjdTDA6U3KCKRcQCQDGf/srjxfZF3l7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, "node_modules/viem": { "version": "2.57.4", "resolved": "https://registry.npmjs.org/viem/-/viem-2.57.4.tgz", @@ -9009,6 +8664,73 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/yuku-ast": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/yuku-ast/-/yuku-ast-0.19.0.tgz", + "integrity": "sha512-PyCsiScaelhxBGzL8dyeJkLqvRZycoh78R31Vrt/WqYrm0hMFoKwIw/X7Dx5mBKLWAMlV9I9HEyBOHnj2gZVyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@yuku-toolchain/types": "^0.19.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/yuku-codegen": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/yuku-codegen/-/yuku-codegen-0.19.0.tgz", + "integrity": "sha512-uymAKHjDuaP4BEpkXC/BSLz4DUEF5oArZ5AuD3888nb2miChjWSgpPdojEJxm3pjpXkgUaCRJQyNAbnMN33wHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@yuku-toolchain/types": "^0.19.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/yuku-core": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/yuku-core/-/yuku-core-0.19.0.tgz", + "integrity": "sha512-kYK9e1XdfirNhkipzW0wmMcSWcVF/CWnuugodfVYRCUwvoBefweL9HzB96OiKEhsx78V5WbUxbJqlizMX869Qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@yuku-toolchain/types": "^0.19.0" + }, + "engines": { + "node": ">=14.18.0" + }, + "optionalDependencies": { + "@yuku-core/binding-android-arm64": "0.19.0", + "@yuku-core/binding-darwin-arm64": "0.19.0", + "@yuku-core/binding-darwin-x64": "0.19.0", + "@yuku-core/binding-freebsd-x64": "0.19.0", + "@yuku-core/binding-linux-arm-gnu": "0.19.0", + "@yuku-core/binding-linux-arm-musl": "0.19.0", + "@yuku-core/binding-linux-arm64-gnu": "0.19.0", + "@yuku-core/binding-linux-arm64-musl": "0.19.0", + "@yuku-core/binding-linux-x64-gnu": "0.19.0", + "@yuku-core/binding-linux-x64-musl": "0.19.0", + "@yuku-core/binding-win32-arm64": "0.19.0", + "@yuku-core/binding-win32-x64": "0.19.0" + } + }, + "node_modules/yuku-parser": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/yuku-parser/-/yuku-parser-0.19.0.tgz", + "integrity": "sha512-XrBh9ZiQK5mJVRxZBAvD6LwRyAYrK3MFtH3+onyuxFL5hFD44EC3QOmIC1FjTj6H2MMwq46/NAI+NZxLZPZgxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@yuku-toolchain/types": "^0.19.0", + "yuku-core": "0.19.0" + }, + "engines": { + "node": ">=14.18.0" + } } } } diff --git a/analytics/package.json b/analytics/package.json index 2193e12e2..d320c0298 100644 --- a/analytics/package.json +++ b/analytics/package.json @@ -5,7 +5,7 @@ "type": "module", "main": "dist/analytics.js", "scripts": { - "build": "tsup", + "build": "tsdown", "test": "vitest run", "test:watch": "vitest", "test:coverage": "vitest run --coverage", @@ -47,7 +47,7 @@ "eslint": "^10.0.0", "prettier": "^3.0.0", "serverless-scaleway-functions": ">=0.4.16", - "tsup": "^9.0.0", + "tsdown": "^0.23.1", "tsx": "^4.23.5", "typescript": "^5.9.3", "typescript-eslint": "^8.60.0", diff --git a/analytics/tsdown.config.ts b/analytics/tsdown.config.ts new file mode 100644 index 000000000..7fefe2c6c --- /dev/null +++ b/analytics/tsdown.config.ts @@ -0,0 +1,39 @@ +import { defineConfig } from "tsdown"; + +export default defineConfig({ + entry: ["analytics.ts", "rollup.ts"], + format: "esm", + platform: "node", + target: "node22", + outDir: "dist", + // Emit .js, not .mjs — serverless.yml handlers reference dist/*.js. + fixedExtension: false, + // Nothing consumes a deployed handler's types; tsconfig's declaration: true + // would auto-enable dts, so keep the dist shape tsup produced. + dts: false, + sourcemap: true, + minify: false, + deps: { + // Dev-only local server (npm run dev / dev:live), dynamically imported and + // gated behind NODE_ENV==="test" in hit.ts — never reached in production. + // tsdown only auto-externalizes package.json `dependencies`, not + // `devDependencies`, so these two need listing explicitly or rolldown + // bundles them (and serveHandler's own fastify dependency) anyway. + neverBundle: ["dotenv", "@scaleway/serverless-functions"], + // Scaleway's deploy zip ships dist/** only (see serverless.yml) — no + // package.json, no node_modules, so nothing left as external can be + // resolved at runtime. Not a blanket [/.*/] like the other packages in this + // repo use, because the two dev-only packages above must stay external; every + // real dependency has to be listed here instead. `viem` is transitive (only + // @fretchen/chain-utils imports it directly) but tsdown's alwaysBundle + // doesn't bundle a package's own dependencies unless they're named too — + // omitting it here shipped a broken `import "viem"` straight to production. + alwaysBundle: ["@fretchen/s3-utils", "@fretchen/chain-utils", "viem", "isbot"], + }, + // createRequire banner for packages that use dynamic require() (like pino). + // The import is aliased: rolldown's own runtime chunks import `createRequire` + // unaliased, and a bare re-import in the same file is a SyntaxError. + banner: { + js: `import { createRequire as __fretchenCr } from 'module'; const require = __fretchenCr(import.meta.url);`, + }, +}); diff --git a/analytics/tsup.config.js b/analytics/tsup.config.js deleted file mode 100644 index c9d35183f..000000000 --- a/analytics/tsup.config.js +++ /dev/null @@ -1,37 +0,0 @@ -import { defineConfig } from "tsup"; -import { builtinModules } from "module"; - -export default defineConfig({ - entry: ["analytics.ts", "rollup.ts"], - format: ["esm"], - platform: "node", - target: "node22", - outDir: "dist", - splitting: false, - clean: true, - minify: false, - sourcemap: true, - external: [ - ...builtinModules, - ...builtinModules.map((m) => `node:${m}`), - // Dev-only local server (npm run dev / dev:live), dynamically imported and - // gated behind NODE_ENV==="test" in hit.ts — never reached in production. - // tsup only auto-externalizes package.json `dependencies`, not - // `devDependencies`, so these two need listing explicitly or esbuild - // bundles them (and serveHandler's own fastify dependency) anyway. - "dotenv", - "@scaleway/serverless-functions", - ], - // Scaleway's deploy zip ships dist/** only (see serverless.yml) — no - // package.json, no node_modules, so nothing left as `external` can be - // resolved at runtime. Not a blanket [/.*/] like the other packages in this - // repo use, because two dev-only packages below must stay external; every - // real dependency has to be listed here instead. `viem` is transitive (only - // @fretchen/chain-utils imports it directly) but tsup's noExternal doesn't - // bundle a package's own dependencies unless they're named too — omitting - // it here shipped a broken `import "viem"` straight to production. - noExternal: ["@fretchen/s3-utils", "@fretchen/chain-utils", "viem", "isbot"], - banner: { - js: `import { createRequire } from 'module'; const require = createRequire(import.meta.url);`, - }, -}); diff --git a/comment_service/README.md b/comment_service/README.md index 24d46f2d5..3084a9404 100644 --- a/comment_service/README.md +++ b/comment_service/README.md @@ -40,7 +40,7 @@ npm install npm test # run tests (vitest) npm run test:coverage # with coverage report npm run lint # eslint -npm run build # tsup → dist/ +npm run build # tsdown → dist/ ``` ## Deployment diff --git a/comment_service/package-lock.json b/comment_service/package-lock.json index f288ce3ce..cae5bc79c 100644 --- a/comment_service/package-lock.json +++ b/comment_service/package-lock.json @@ -19,7 +19,7 @@ "eslint": "^10.0.0", "prettier": "^3.0.0", "serverless-scaleway-functions": ">=0.4.16", - "tsup": "^9.0.0", + "tsdown": "^0.23.1", "typescript": "^5.9.3", "typescript-eslint": "^8.60.0", "vitest": "^4.1.11" @@ -133,1329 +133,589 @@ "keyv": "^5.6.0" } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", - "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", - "cpu": [ - "ppc64" - ], + "node_modules/@eslint-community/eslint-utils": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", + "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "aix" - ], + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, "engines": { - "node": ">=18" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.2.tgz", - "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", - "cpu": [ - "arm" - ], + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/@esbuild/android-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", - "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint-community/regexpp": { + "version": "4.12.2", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", + "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "android" - ], "engines": { - "node": ">=18" + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, - "node_modules/@esbuild/android-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.2.tgz", - "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/config-array": { + "version": "0.23.5", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", + "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^3.0.5", + "debug": "^4.3.1", + "minimatch": "^10.2.4" + }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", - "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/config-helpers": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz", + "integrity": "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1" + }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", - "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/core": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", + "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", - "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", - "cpu": [ - "arm64" - ], + "node_modules/@eslint/js": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", + "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "eslint": "^10.0.0" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } } }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", - "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", - "cpu": [ - "x64" - ], + "node_modules/@eslint/object-schema": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", + "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@esbuild/linux-arm": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", - "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", - "cpu": [ - "arm" - ], + "node_modules/@eslint/plugin-kit": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.3.tgz", + "integrity": "sha512-IkO+/KEUvwbVpiURZg+P7zF74z5Jxe0UgJxVni+RtoHQ6IZieXaO02kmadomap/q+l6bc/jdPGGqTjhuZnuz1Q==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^1.2.1", + "levn": "^0.4.1" + }, "engines": { - "node": ">=18" + "node": "^20.19.0 || ^22.13.0 || >=24" } }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", - "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", - "cpu": [ - "arm64" - ], + "node_modules/@fastify/ajv-compiler": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-3.6.0.tgz", + "integrity": "sha512-LwdXQJjmMD+GwLOkP7TVC68qa+pSSogeWWmznRJ/coyTcfe9qA05AHFSe1eZFwK6q+xVRpChnvFUkf1iYaSZsQ==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "dependencies": { + "ajv": "^8.11.0", + "ajv-formats": "^2.1.1", + "fast-uri": "^2.0.0" } }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", - "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", - "cpu": [ - "ia32" - ], + "node_modules/@fastify/ajv-compiler/node_modules/ajv": { + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", + "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", - "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", - "cpu": [ - "loong64" - ], + "node_modules/@fastify/ajv-compiler/node_modules/ajv/node_modules/fast-uri": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.8.tgz", + "integrity": "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } ], - "engines": { - "node": ">=18" - } + "license": "BSD-3-Clause" }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", - "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", - "cpu": [ - "mips64el" - ], + "node_modules/@fastify/ajv-compiler/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } + "license": "MIT" }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", - "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", - "cpu": [ - "ppc64" - ], + "node_modules/@fastify/error": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.4.1.tgz", + "integrity": "sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@fastify/fast-json-stringify-compiler": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.3.0.tgz", + "integrity": "sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", - "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "dependencies": { + "fast-json-stringify": "^5.7.0" } }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", - "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", - "cpu": [ - "s390x" - ], + "node_modules/@fastify/merge-json-schemas": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.1.1.tgz", + "integrity": "sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "dependencies": { + "fast-deep-equal": "^3.1.3" } }, - "node_modules/@esbuild/linux-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", - "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", - "cpu": [ - "x64" - ], + "node_modules/@fastify/url-data": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@fastify/url-data/-/url-data-5.4.0.tgz", + "integrity": "sha512-Ht8lAZnIGsBKdFu6yYwN98OH89fFziCMeCq3yyZbIUKl+lbK5njhmPrcxAwfwLW1QoVk6OO0BkUPu1E/3Js94A==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" + "dependencies": { + "fast-uri": "^2.2.0", + "fastify-plugin": "^4.0.0" } }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", - "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } + "node_modules/@fretchen/s3-utils": { + "resolved": "../shared/s3-utils", + "link": true }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", - "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", - "cpu": [ - "x64" - ], + "node_modules/@grpc/grpc-js": { + "version": "1.14.6", + "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.6.tgz", + "integrity": "sha512-SgC/B3/VZ8lTyOZ4Cwk6f1skWhmkNAaVfiX90qd5u1rRXGKk1//8FTUEN9GvOUq7rfWIqAYkA3CoyumYVpOS6g==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], + "license": "Apache-2.0", + "dependencies": { + "@grpc/proto-loader": "^0.8.0", + "@js-sdsl/ordered-map": "^4.4.2" + }, "engines": { - "node": ">=18" + "node": ">=12.10.0" } }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", - "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", - "cpu": [ - "arm64" - ], + "node_modules/@grpc/grpc-js/node_modules/@grpc/proto-loader": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.1.tgz", + "integrity": "sha512-wtF6h+DY6M3YaDBPAmvuuA6jV8Sif9MjtOI5euKFWRgCDl5PeDpPsHR9u2l6St5ceY8AZgoNDww5+HvEsXFsGg==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], + "license": "Apache-2.0", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.5.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, "engines": { - "node": ">=18" + "node": ">=6" } }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", - "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", - "cpu": [ - "x64" - ], + "node_modules/@grpc/proto-loader": { + "version": "0.7.15", + "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz", + "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], + "license": "Apache-2.0", + "dependencies": { + "lodash.camelcase": "^4.3.0", + "long": "^5.0.0", + "protobufjs": "^7.2.5", + "yargs": "^17.7.2" + }, + "bin": { + "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" + }, "engines": { - "node": ">=18" + "node": ">=6" } }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", - "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", - "cpu": [ - "arm64" - ], + "node_modules/@humanfs/core": { + "version": "0.19.2", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", + "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], + "license": "Apache-2.0", + "dependencies": { + "@humanfs/types": "^0.15.0" + }, "engines": { - "node": ">=18" + "node": ">=18.18.0" } }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", - "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", - "cpu": [ - "x64" - ], + "node_modules/@humanfs/node": { + "version": "0.16.8", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", + "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.2", + "@humanfs/types": "^0.15.0", + "@humanwhocodes/retry": "^0.4.0" + }, "engines": { - "node": ">=18" + "node": ">=18.18.0" } }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", - "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", - "cpu": [ - "arm64" - ], + "node_modules/@humanfs/types": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", + "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": ">=18.18.0" } }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", - "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", - "cpu": [ - "ia32" - ], + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@esbuild/win32-x64": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", - "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", - "cpu": [ - "x64" - ], + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], + "license": "Apache-2.0", "engines": { - "node": ">=18" + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" } }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.10.1", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", - "integrity": "sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg==", + "node_modules/@inquirer/external-editor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", + "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", "dev": true, "license": "MIT", "dependencies": { - "eslint-visitor-keys": "^3.4.3" + "chardet": "^2.1.1", + "iconv-lite": "^0.7.0" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=18" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } } }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=6.0.0" } }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", - "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", "dev": true, "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@eslint/config-array": { - "version": "0.23.5", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.23.5.tgz", - "integrity": "sha512-Y3kKLvC1dvTOT+oGlqNQ1XLqK6D1HU2YXPc52NmAlJZbMMWDzGYXMiPRJ8TYD39muD/OTjlZmNJ4ib7dvSrMBA==", + "node_modules/@js-sdsl/ordered-map": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", + "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/object-schema": "^3.0.5", - "debug": "^4.3.1", - "minimatch": "^10.2.4" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" } }, - "node_modules/@eslint/config-helpers": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.7.0.tgz", - "integrity": "sha512-DObd/KKUsU+FaFv4PLxSRenpXfQWmPXXP3pPZ6/K1PCrMu2vQpMDMuQe/BqYeoLcz8ro0bVDF1RxOJgfVEdhUw==", + "node_modules/@keyv/bigmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.3.1.tgz", + "integrity": "sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==", "dev": true, - "license": "Apache-2.0", + "license": "MIT", "dependencies": { - "@eslint/core": "^1.2.1" + "hashery": "^1.4.0", + "hookified": "^1.15.0" }, "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "node": ">= 18" + }, + "peerDependencies": { + "keyv": "^5.6.0" } }, - "node_modules/@eslint/core": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-1.2.1.tgz", - "integrity": "sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ==", + "node_modules/@keyv/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", "dev": true, - "license": "Apache-2.0", + "license": "MIT" + }, + "node_modules/@mapbox/node-pre-gyp": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", + "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", + "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "@types/json-schema": "^7.0.15" + "detect-libc": "^2.0.0", + "https-proxy-agent": "^5.0.0", + "make-dir": "^3.1.0", + "node-fetch": "^2.6.7", + "nopt": "^5.0.0", + "npmlog": "^5.0.1", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.11" }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "bin": { + "node-pre-gyp": "bin/node-pre-gyp" } }, - "node_modules/@eslint/js": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-10.0.1.tgz", - "integrity": "sha512-zeR9k5pd4gxjZ0abRoIaxdc7I3nDktoXZk2qOv9gCNWx3mVwEn32VRhyLaRsDiJjTs0xq/T8mfPtyuXu7GWBcA==", + "node_modules/@mapbox/node-pre-gyp/node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, "license": "MIT", + "dependencies": { + "semver": "^6.0.0" + }, "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "node": ">=8" }, "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "eslint": "^10.0.0" - }, - "peerDependenciesMeta": { - "eslint": { - "optional": true - } + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@eslint/object-schema": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-3.0.5.tgz", - "integrity": "sha512-vqTaUEgxzm+YDSdElad6PiRoX4t8VGDjCtt05zn4nU810UIx/uNEV7/lZJ6KwFThKZOzOxzXy48da+No7HZaMw==", + "node_modules/@mapbox/node-pre-gyp/node_modules/make-dir/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "license": "ISC", + "bin": { + "semver": "bin/semver.js" } }, - "node_modules/@eslint/plugin-kit": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.7.3.tgz", - "integrity": "sha512-IkO+/KEUvwbVpiURZg+P7zF74z5Jxe0UgJxVni+RtoHQ6IZieXaO02kmadomap/q+l6bc/jdPGGqTjhuZnuz1Q==", + "node_modules/@oxc-project/types": { + "version": "0.153.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.153.0.tgz", + "integrity": "sha512-jSNrRIyvPVLL5E1z/tS5zLAprosGz/FuI1PWwEOz59j3E4TTTzSpqKb/RDGqJhhW0QHYISGXxq582wGx6T11Tw==", "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@eslint/core": "^1.2.1", - "levn": "^0.4.1" - }, - "engines": { - "node": "^20.19.0 || ^22.13.0 || >=24" + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/oxc-project" } }, - "node_modules/@fastify/ajv-compiler": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-3.6.0.tgz", - "integrity": "sha512-LwdXQJjmMD+GwLOkP7TVC68qa+pSSogeWWmznRJ/coyTcfe9qA05AHFSe1eZFwK6q+xVRpChnvFUkf1iYaSZsQ==", + "node_modules/@phc/format": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@phc/format/-/format-1.0.0.tgz", + "integrity": "sha512-m7X9U6BG2+J+R1lSOdCiITLLrxm+cWlNI3HUFA92oLO77ObGNzaKdh8pMLqdZcshtkKuV84olNNXDfMc4FezBQ==", "dev": true, "license": "MIT", - "dependencies": { - "ajv": "^8.11.0", - "ajv-formats": "^2.1.1", - "fast-uri": "^2.0.0" + "engines": { + "node": ">=10" } }, - "node_modules/@fastify/ajv-compiler/node_modules/ajv": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", - "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", + "node_modules/@pinojs/redact": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", + "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } + "license": "MIT" }, - "node_modules/@fastify/ajv-compiler/node_modules/ajv/node_modules/fast-uri": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.8.tgz", - "integrity": "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==", + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], "license": "BSD-3-Clause" }, - "node_modules/@fastify/ajv-compiler/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", "dev": true, - "license": "MIT" + "license": "BSD-3-Clause" }, - "node_modules/@fastify/error": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.4.1.tgz", - "integrity": "sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==", + "node_modules/@protobufjs/codegen": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", + "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", "dev": true, - "license": "MIT" + "license": "BSD-3-Clause" }, - "node_modules/@fastify/fast-json-stringify-compiler": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@fastify/fast-json-stringify-compiler/-/fast-json-stringify-compiler-4.3.0.tgz", - "integrity": "sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==", + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz", + "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==", "dev": true, - "license": "MIT", - "dependencies": { - "fast-json-stringify": "^5.7.0" - } + "license": "BSD-3-Clause" }, - "node_modules/@fastify/merge-json-schemas": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@fastify/merge-json-schemas/-/merge-json-schemas-0.1.1.tgz", - "integrity": "sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==", + "node_modules/@protobufjs/fetch": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz", + "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==", "dev": true, - "license": "MIT", + "license": "BSD-3-Clause", "dependencies": { - "fast-deep-equal": "^3.1.3" + "@protobufjs/aspromise": "^1.1.1" } }, - "node_modules/@fastify/url-data": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/@fastify/url-data/-/url-data-5.4.0.tgz", - "integrity": "sha512-Ht8lAZnIGsBKdFu6yYwN98OH89fFziCMeCq3yyZbIUKl+lbK5njhmPrcxAwfwLW1QoVk6OO0BkUPu1E/3Js94A==", + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", "dev": true, - "license": "MIT", - "dependencies": { - "fast-uri": "^2.2.0", - "fastify-plugin": "^4.0.0" - } + "license": "BSD-3-Clause" }, - "node_modules/@fretchen/s3-utils": { - "resolved": "../shared/s3-utils", - "link": true - }, - "node_modules/@grpc/grpc-js": { - "version": "1.14.6", - "resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.14.6.tgz", - "integrity": "sha512-SgC/B3/VZ8lTyOZ4Cwk6f1skWhmkNAaVfiX90qd5u1rRXGKk1//8FTUEN9GvOUq7rfWIqAYkA3CoyumYVpOS6g==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@grpc/proto-loader": "^0.8.0", - "@js-sdsl/ordered-map": "^4.4.2" - }, - "engines": { - "node": ">=12.10.0" - } - }, - "node_modules/@grpc/grpc-js/node_modules/@grpc/proto-loader": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.8.1.tgz", - "integrity": "sha512-wtF6h+DY6M3YaDBPAmvuuA6jV8Sif9MjtOI5euKFWRgCDl5PeDpPsHR9u2l6St5ceY8AZgoNDww5+HvEsXFsGg==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.5.5", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@grpc/proto-loader": { - "version": "0.7.15", - "resolved": "https://registry.npmjs.org/@grpc/proto-loader/-/proto-loader-0.7.15.tgz", - "integrity": "sha512-tMXdRCfYVixjuFK+Hk0Q1s38gV9zDiDJfWL3h1rv4Qc39oILCu1TRTDt7+fGUI8K4G1Fj125Hx/ru3azECWTyQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "lodash.camelcase": "^4.3.0", - "long": "^5.0.0", - "protobufjs": "^7.2.5", - "yargs": "^17.7.2" - }, - "bin": { - "proto-loader-gen-types": "build/bin/proto-loader-gen-types.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.2", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.2.tgz", - "integrity": "sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/types": "^0.15.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.8.tgz", - "integrity": "sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.2", - "@humanfs/types": "^0.15.0", - "@humanwhocodes/retry": "^0.4.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/types": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/@humanfs/types/-/types-0.15.0.tgz", - "integrity": "sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@inquirer/external-editor": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@inquirer/external-editor/-/external-editor-1.0.3.tgz", - "integrity": "sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==", - "dev": true, - "license": "MIT", - "dependencies": { - "chardet": "^2.1.1", - "iconv-lite": "^0.7.0" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@types/node": ">=18" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - } - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", - "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.31", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@js-sdsl/ordered-map": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/@js-sdsl/ordered-map/-/ordered-map-4.4.2.tgz", - "integrity": "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==", - "dev": true, - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, - "node_modules/@keyv/bigmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@keyv/bigmap/-/bigmap-1.3.1.tgz", - "integrity": "sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "hashery": "^1.4.0", - "hookified": "^1.15.0" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "keyv": "^5.6.0" - } - }, - "node_modules/@keyv/serialize": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@keyv/serialize/-/serialize-1.1.1.tgz", - "integrity": "sha512-dXn3FZhPv0US+7dtJsIi2R+c7qWYiReoEh5zUntWCf4oSpMNib8FDhSoed6m3QyZdx5hK7iLFkYk3rNxwt8vTA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@mapbox/node-pre-gyp": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.11.tgz", - "integrity": "sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "detect-libc": "^2.0.0", - "https-proxy-agent": "^5.0.0", - "make-dir": "^3.1.0", - "node-fetch": "^2.6.7", - "nopt": "^5.0.0", - "npmlog": "^5.0.1", - "rimraf": "^3.0.2", - "semver": "^7.3.5", - "tar": "^6.1.11" - }, - "bin": { - "node-pre-gyp": "bin/node-pre-gyp" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^6.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@mapbox/node-pre-gyp/node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@napi-rs/lzma-linux-x64-gnu": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", - "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^22.20 || ^24.12 || >=25" - } - }, - "node_modules/@oxc-project/types": { - "version": "0.153.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.153.0.tgz", - "integrity": "sha512-jSNrRIyvPVLL5E1z/tS5zLAprosGz/FuI1PWwEOz59j3E4TTTzSpqKb/RDGqJhhW0QHYISGXxq582wGx6T11Tw==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/oxc-project" - } - }, - "node_modules/@phc/format": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@phc/format/-/format-1.0.0.tgz", - "integrity": "sha512-m7X9U6BG2+J+R1lSOdCiITLLrxm+cWlNI3HUFA92oLO77ObGNzaKdh8pMLqdZcshtkKuV84olNNXDfMc4FezBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/@pinojs/redact": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/@pinojs/redact/-/redact-0.4.0.tgz", - "integrity": "sha512-k2ENnmBugE/rzQfEcdWHcCY+/FM3VLzH9cYEsbdsoqrvzAKRhUZeRNhAZvB8OitQJ1TBed3yqWtdjzS6wJKBwg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@protobufjs/aspromise": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", - "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/base64": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", - "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/codegen": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.5.tgz", - "integrity": "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/eventemitter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.1.tgz", - "integrity": "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/fetch": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.1.tgz", - "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.2.tgz", - "integrity": "sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@rolldown/binding-android-arm-eabi": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.13.tgz", - "integrity": "sha512-Vu/NICrgdRvUOeaJZIyB2FP63s6fO/4ud5l8dXmxDx9yDyn+mN0y+gsvsVviSli+T361Aqo0h46EuMoobrwawA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.13.tgz", - "integrity": "sha512-6LEoIrGy5vvCd2boNnv2soPSUZj/PRvhp8R/t9KlX+mIZxThIE/ZqxrGXxmuNX0FuvQFvLdZr7S4HrYpYBVhEQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.13.tgz", - "integrity": "sha512-CaJSRzlQ6Q+zkDMVA9OkVxBjVoPRCDEE3v0FSJ9kIQBgRjFApA3Si4ijhbNVUji7ZJt+PfO0e46qy4nPInHUPA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.13.tgz", - "integrity": "sha512-e4r340I5hxSzJkD3YJBxgzq/rJ3wwxwdLLb2FPt1Zpyem20nrQPT11DDEEkazwxaHumH8wpglsp/Ozgj/wT6mw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.13.tgz", - "integrity": "sha512-hoBWDZ4/K/mJKVMbsgUd1jfpA2DiOrJ54mpegObU9TBHBBrtX4FLIXJJQRDPZ/2Dn91GvPob+Z2hwKJzf4E5SQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.13.tgz", - "integrity": "sha512-oF9fZu3vTWnTiVAkDFxU9PJLt1nh20K9RRpuHsR7ZnE2L7XookBbDBVLojCVSLGbvtSlxeUNnjAj6DbNsKyzbg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.13.tgz", - "integrity": "sha512-DTpb/+jMiqWMPgphn4ksW1zW+XLJ6dJJ9FMvnIk9I291LhCctMPhMYJrP5t9p6C9qa3KXadDdUEZHBaPh3kNxQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.13.tgz", - "integrity": "sha512-xU+Kvv9N2A3SY35zFh1FWWNjxbadE/BKeqnkXe7vScU4GZsw757BlVmDLITZEq8DPpk6m7uoDYkK7P+x/uU5Ow==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.13.tgz", - "integrity": "sha512-XMk/hnhh25oQ756Lclb1Q11h4ll0xC0Esa5w4Vzp+mAE2S3AGJgeM0SonrIgY8fHhjarb6hcoTuwoFG0VVP2ig==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.13.tgz", - "integrity": "sha512-U1BoTHYmlywE2n3HUWjzZ+8EQsKr+OwpxYuDWaubx42tUL8QSL7nOqRz/NVHanibbFP3M1Rxuprz/wNcbMKjqw==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.13.tgz", - "integrity": "sha512-J4cm80Pc6wEwV5AZ42o62sIQgDk+Y7R2s646jIwuvO+4V46QB58N4vVuMPWCBaNgursXLpmUWJV//WQAkPvHBQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.13.tgz", - "integrity": "sha512-W0euZS40U4V6JkmEnVCIX9mcsL6cbXQ4X8c2w+MMOIjFg68TXUW+u3RT+2e1t1pv9mg/EP3pDtK3POXdQ7Rxyw==", - "cpu": [ - "x64" - ], + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } + "license": "BSD-3-Clause" }, - "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.13.tgz", - "integrity": "sha512-do/AF/4n9MRshia3a5aXoy8xM2c6mgfT6D7H/dY6my5z+hfCIR4ab7mk4IRj++nsEQpKy39kd0DQnDq+r692tw==", - "cpu": [ - "arm64" - ], + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } + "license": "BSD-3-Clause" }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.13.tgz", - "integrity": "sha512-6FtUf2cJZobutJdxnGYX8z0vtbgqU0b2v8vfBhkXb9wp2MppMFtkunE+IaOntyi01rkIQoPW2GHABtfzsC0BRQ==", - "cpu": [ - "arm64" - ], + "node_modules/@protobufjs/utf8": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.2.tgz", + "integrity": "sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } + "license": "BSD-3-Clause" }, - "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.13.tgz", - "integrity": "sha512-UKhFaZTeTcbKrb3iU82m17jVcPEAoqDkCN5MBqgPyZSwp/cQmib21crTS0DdH7T1B7wZRWEI89YQAOJMet5yhg==", - "cpu": [ - "x64" - ], + "node_modules/@quansync/fs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@quansync/fs/-/fs-1.1.0.tgz", + "integrity": "sha512-qAPG/t3HqML1TlN7sY/pTbEjzFVAKsMjNNMGheyDosro+kT4iw2KCUoHcVdmliwWjorm4elZbgNQyU2eD97eDg==", "dev": true, "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" + "dependencies": { + "quansync": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" } }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.64.7.tgz", - "integrity": "sha512-GFF2tHk0NqYVObrK0+/ps/LEXsV/v2q6Lyiy7mZr+Ej24fpQScvqK2ziz9NHeEQYnKWKym38Ml7dZbPtC9tuAw==", + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.13.tgz", + "integrity": "sha512-Vu/NICrgdRvUOeaJZIyB2FP63s6fO/4ud5l8dXmxDx9yDyn+mN0y+gsvsVviSli+T361Aqo0h46EuMoobrwawA==", "cpu": [ "arm" ], @@ -1464,12 +724,15 @@ "optional": true, "os": [ "android" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.64.7.tgz", - "integrity": "sha512-BOymcXJFYYXqluDidj6sLelNjXruC3u1BqVxLn2OPCXH9xaPSOTH+MS4uychsGI1NU7tJoiv9KvqijDHFe+hhQ==", + "node_modules/@rolldown/binding-android-arm64": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.13.tgz", + "integrity": "sha512-6LEoIrGy5vvCd2boNnv2soPSUZj/PRvhp8R/t9KlX+mIZxThIE/ZqxrGXxmuNX0FuvQFvLdZr7S4HrYpYBVhEQ==", "cpu": [ "arm64" ], @@ -1478,12 +741,15 @@ "optional": true, "os": [ "android" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.64.7.tgz", - "integrity": "sha512-jgVpGweIbls2H5jfBB70tnX52abMd5pJr3xmtoDILx6JdmGl+Un+tMb9R+MbHPVB46tTBpY8emtn7M71SnQhEQ==", + "node_modules/@rolldown/binding-darwin-arm64": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.13.tgz", + "integrity": "sha512-CaJSRzlQ6Q+zkDMVA9OkVxBjVoPRCDEE3v0FSJ9kIQBgRjFApA3Si4ijhbNVUji7ZJt+PfO0e46qy4nPInHUPA==", "cpu": [ "arm64" ], @@ -1492,12 +758,15 @@ "optional": true, "os": [ "darwin" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.64.7.tgz", - "integrity": "sha512-AVMpt94mrXH7WjyWKmd9nT4RC5yM0AN3Lt6A89xVIsuLDi3dDX6dxMytLbW36FlppY9JsoqUoS3LUUpUrYxiMQ==", + "node_modules/@rolldown/binding-darwin-x64": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.13.tgz", + "integrity": "sha512-e4r340I5hxSzJkD3YJBxgzq/rJ3wwxwdLLb2FPt1Zpyem20nrQPT11DDEEkazwxaHumH8wpglsp/Ozgj/wT6mw==", "cpu": [ "x64" ], @@ -1506,26 +775,15 @@ "optional": true, "os": [ "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.64.7.tgz", - "integrity": "sha512-Nje29c/MyajxRNFGU05oyeTDS6SWdMg/wWMSlZSBTBju5BKz2NVc0kFiFSQGzRELNiB+CBk/ZvAVsWsENgjGag==", - "cpu": [ - "arm64" ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.64.7.tgz", - "integrity": "sha512-xxgN5/kMzCNz/NYJ4t49B0/WS6InNlWv6xvgwUQqNnWM9WJMMwMUGWrAxdNEgYWdHL0sMnuh8I87StGrIMTA+w==", + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.13.tgz", + "integrity": "sha512-hoBWDZ4/K/mJKVMbsgUd1jfpA2DiOrJ54mpegObU9TBHBBrtX4FLIXJJQRDPZ/2Dn91GvPob+Z2hwKJzf4E5SQ==", "cpu": [ "x64" ], @@ -1534,84 +792,36 @@ "optional": true, "os": [ "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.64.7.tgz", - "integrity": "sha512-5U/9gVn/X657I8+NHoHO9Wnfyd0lEXwqbslobRoB9TC8SwYzOitcIr6TLE7531Q/NWs3L4mb+YOGzlf3vHIeYw==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "glibc" ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.64.7.tgz", - "integrity": "sha512-hcDS0a/Y8ggM3dcOfzH7UpSaogCViWTtNDSl0EXpWIj8g8/r86ITqptjil2hayTXS0Umzb+Yt3mjgpQVFVf2+A==", + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.13.tgz", + "integrity": "sha512-oF9fZu3vTWnTiVAkDFxU9PJLt1nh20K9RRpuHsR7ZnE2L7XookBbDBVLojCVSLGbvtSlxeUNnjAj6DbNsKyzbg==", "cpu": [ "arm" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.64.7.tgz", - "integrity": "sha512-awbAr4N7Qd/yjZAQBEEPzgcPveYG2Gi5L6gq1/Bp+3SMRjn5F68Wv1zKsntzvvoioBR6yKvhLtWqu11am1TsxA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.64.7.tgz", - "integrity": "sha512-Ut7xQJfeLhzu2yN3rHzVvL9ccyPJvN4aCdP1V7hJ5lGxX/eCzgB9SiMk/Md3J+rWWZgvoYsDW4BUFggJr32pBA==", + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.13.tgz", + "integrity": "sha512-DTpb/+jMiqWMPgphn4ksW1zW+XLJ6dJJ9FMvnIk9I291LhCctMPhMYJrP5t9p6C9qa3KXadDdUEZHBaPh3kNxQ==", "cpu": [ "arm64" ], "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.64.7.tgz", - "integrity": "sha512-trqoni/vHkuM5oo5iQhoKPh6fjjD7E80pMgCXWgGxU8vSRPUlwvG8GeYvEEcB6eJAxNa99WH9iVHPHelgtKiHA==", - "cpu": [ - "loong64" - ], - "dev": true, "libc": [ "glibc" ], @@ -1619,14 +829,17 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.64.7.tgz", - "integrity": "sha512-gvlUy0XFIwtUWiQmhc+4GT2Knm3KosinpUVhr7CtTFA78gFDnE5NWwMPzHrJsYpKkh2LlY7yvBIboN1FAV6Xeg==", + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.13.tgz", + "integrity": "sha512-xU+Kvv9N2A3SY35zFh1FWWNjxbadE/BKeqnkXe7vScU4GZsw757BlVmDLITZEq8DPpk6m7uoDYkK7P+x/uU5Ow==", "cpu": [ - "loong64" + "arm64" ], "dev": true, "libc": [ @@ -1636,50 +849,19 @@ "optional": true, "os": [ "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.64.7.tgz", - "integrity": "sha512-8yS/kSXTJ/47Z62JW+C2AJ3vd/8zZw016vFjtNpZwmZlwJumLua4s1i78dkYuSSqQ+0aIMxJcBp/4uIwp2ehjA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.64.7.tgz", - "integrity": "sha512-mxVSKvvty0hOP1AFo/l4Kpv3i3HK0zx4rYUrirZDToYlWhS3xzmIkq3vUJ7rtrM2cPyXveDyDT6M1FfXZ9hTRA==", + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.13.tgz", + "integrity": "sha512-XMk/hnhh25oQ756Lclb1Q11h4ll0xC0Esa5w4Vzp+mAE2S3AGJgeM0SonrIgY8fHhjarb6hcoTuwoFG0VVP2ig==", "cpu": [ "ppc64" ], "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.64.7.tgz", - "integrity": "sha512-lEse1zra1CagM+uHH2bl28GInDsZZ45NJzHei2OMaXQFzZWKBO1hFo07rS0xB6ayV4WU360UrSmPDSyCMpYsUQ==", - "cpu": [ - "riscv64" - ], - "dev": true, "libc": [ "glibc" ], @@ -1687,29 +869,15 @@ "optional": true, "os": [ "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.64.7.tgz", - "integrity": "sha512-d/cqCoiG9WMZ5VuJZ5Qdlv9g97QyoGwnmvHccvGhKSacTy7xFrAS+jMcJSBdMNOw1oacSkl6p7K6O/DRYTKL3g==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "musl" ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.64.7.tgz", - "integrity": "sha512-kVEA//CeDOZZP1XCH2JBgqXb9+ALlwuA/4civaazMVdgzaSQC9WM38w65zG/LLk0lA7F9Od19CSBZW7J9mCbNg==", + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.13.tgz", + "integrity": "sha512-U1BoTHYmlywE2n3HUWjzZ+8EQsKr+OwpxYuDWaubx42tUL8QSL7nOqRz/NVHanibbFP3M1Rxuprz/wNcbMKjqw==", "cpu": [ "s390x" ], @@ -1721,12 +889,15 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.64.7.tgz", - "integrity": "sha512-14oLfDsOSr0TSntT/34jRg/V8B2XW/Jomh9zX9CjIM9gwwNlI1OCymS/GVn0DV32h67eRf7U0GGem0rvfXgNwQ==", + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.13.tgz", + "integrity": "sha512-J4cm80Pc6wEwV5AZ42o62sIQgDk+Y7R2s646jIwuvO+4V46QB58N4vVuMPWCBaNgursXLpmUWJV//WQAkPvHBQ==", "cpu": [ "x64" ], @@ -1738,12 +909,15 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.64.7.tgz", - "integrity": "sha512-dFVtPfjZqAnUPpPY4Bfg+87yo1IBW9HiY8iCFtg49Pn46MfZTebSHZh8PL6SOsgyt9LQP8Nj/sE6jm3aWpySmQ==", + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.13.tgz", + "integrity": "sha512-W0euZS40U4V6JkmEnVCIX9mcsL6cbXQ4X8c2w+MMOIjFg68TXUW+u3RT+2e1t1pv9mg/EP3pDtK3POXdQ7Rxyw==", "cpu": [ "x64" ], @@ -1755,26 +929,15 @@ "optional": true, "os": [ "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.64.7.tgz", - "integrity": "sha512-Dm9CZ2SM3u2NgvBj4awW/gGqkOwzH8f6MSYIJE6+bKcKLI+T0+LhpD6vtetTfrIIx+rLXDf5RJqBP6v7V5O+wg==", - "cpu": [ - "x64" ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.64.7.tgz", - "integrity": "sha512-oaxsvS2mL6+78741CT2HCORBvy1USg3Wqpt5qvZwy3aMXRMl4zxyDo8maeFRWJkF3dp0Wbi71fKH5Gr9YI3vYA==", + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.13.tgz", + "integrity": "sha512-do/AF/4n9MRshia3a5aXoy8xM2c6mgfT6D7H/dY6my5z+hfCIR4ab7mk4IRj++nsEQpKy39kd0DQnDq+r692tw==", "cpu": [ "arm64" ], @@ -1783,12 +946,15 @@ "optional": true, "os": [ "openharmony" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.64.7.tgz", - "integrity": "sha512-UKZz1Y4mxUqkWh60uH7B1aZn6UcAimPk4ipRktpb3wfZq7JrzZYyAXTwiafkb3T+kd5P3Sf+vzcRdsDks4WtjQ==", + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.13.tgz", + "integrity": "sha512-6FtUf2cJZobutJdxnGYX8z0vtbgqU0b2v8vfBhkXb9wp2MppMFtkunE+IaOntyi01rkIQoPW2GHABtfzsC0BRQ==", "cpu": [ "arm64" ], @@ -1797,26 +963,15 @@ "optional": true, "os": [ "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.64.7.tgz", - "integrity": "sha512-WWkSuC1J+mZJnsDh0mRaCAFSWfQdl6y3fDjZeWElI6zHo8CcOSG5lY3yurKJjEq+FrX0WD60sFrVVpbHqzMmrw==", - "cpu": [ - "ia32" ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.64.7.tgz", - "integrity": "sha512-u9bp2yXCI3/BUjUxY6uWknAY32pfvvDCPysyUTySotx0dj3ydlFHrRQYfn/b/kZgnfjyEwySMtI7Ga054uiysQ==", + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.13.tgz", + "integrity": "sha512-UKhFaZTeTcbKrb3iU82m17jVcPEAoqDkCN5MBqgPyZSwp/cQmib21crTS0DdH7T1B7wZRWEI89YQAOJMet5yhg==", "cpu": [ "x64" ], @@ -1825,21 +980,17 @@ "optional": true, "os": [ "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.64.7.tgz", - "integrity": "sha512-EhX6N3XPMEnVU5cRfNgzPOKcSucsbu3nNNWuoAaEuKIqmddBKHN5b9d4rPe65T1I+FaOT176JKiZNsUBp3rqbA==", - "cpu": [ - "x64" ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "license": "MIT" }, "node_modules/@scaleway/serverless-functions": { "version": "1.1.2", @@ -2434,6 +1585,199 @@ "url": "https://opencollective.com/vitest" } }, + "node_modules/@yuku-core/binding-android-arm64": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-android-arm64/-/binding-android-arm64-0.19.0.tgz", + "integrity": "sha512-wdL2XmTiZixAOaHk9Z0JJZ8u9Qm8d333Zjpc6gaxXFX+UR5BlsfxZ7a2+2Rm71pamppsPYGUGFq2oVLbh6DISw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@yuku-core/binding-darwin-arm64": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-darwin-arm64/-/binding-darwin-arm64-0.19.0.tgz", + "integrity": "sha512-7sNJa6XJhyetnTy64jw3NEi4YgUcezHk1G5GH9FSvXAuC8wIlbaOwT9lgq5qo5sspjrZJQlBR1TWflP49uRpMw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@yuku-core/binding-darwin-x64": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-darwin-x64/-/binding-darwin-x64-0.19.0.tgz", + "integrity": "sha512-pTC7dYEc59isdyizc3nsuyFNBu2LU5wMYZ1be6UMr59PY/AJNtO1aBLWV0MgL/z7C1nv/2sX4TNjGgKLoeevJw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@yuku-core/binding-freebsd-x64": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-freebsd-x64/-/binding-freebsd-x64-0.19.0.tgz", + "integrity": "sha512-xrZjF6XOEwyLOiDIfrwDdRCS6ghxcJeirNC1KivQhVcUwlRonaU79S3/Uiyx3lBylPnT8qKJ3/aMT+H52nGTJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@yuku-core/binding-linux-arm-gnu": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-arm-gnu/-/binding-linux-arm-gnu-0.19.0.tgz", + "integrity": "sha512-0OyIH53C0I1CbADHn9FSdCfX5qbpeLwJhmOVhonFJNYheybOnkSJ50qGMfTJIb8y5zrwqvLs7FVBvz6Fk8maZg==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-core/binding-linux-arm-musl": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-arm-musl/-/binding-linux-arm-musl-0.19.0.tgz", + "integrity": "sha512-z/iPfkCOCSXE34VXNt0uP1ORSW+4mEa9b5CiJcWZeqZH08g49bFU/jRM2T04f+Wpw5mJ6HIzNBiojxeAbrHjeg==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-core/binding-linux-arm64-gnu": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.19.0.tgz", + "integrity": "sha512-jLNTi+gzaRwBJ+gwhCJ+rDb5dmx/8hEBx93UWd7hjMSqPTL1D1wvVSvXVAldV5kALvju7b0/m51EHEhs4+I1fA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-core/binding-linux-arm64-musl": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.19.0.tgz", + "integrity": "sha512-YwyPIdW/rN2Fmv0MTFWi47FaB3F9g+2b+sJISyAw83Yd60RWH4T3Nx6XkAHHVN+uKJNBAd6So7/BVihSiFYvuQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-core/binding-linux-x64-gnu": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.19.0.tgz", + "integrity": "sha512-/vskaAXVX3ESR43FiTdfiYS7z1b9uoQJwVQ/0RgUHgN2sWoAyCZs+aX4CgU7eKGIHTVfp9VFwv+c+2XchYiEtQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-core/binding-linux-x64-musl": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-x64-musl/-/binding-linux-x64-musl-0.19.0.tgz", + "integrity": "sha512-FuXL5igeSKib9Rye02TdH+D6SQezTyGxIATMu1Qsn/QywrzwpGl35OLpS2C1x5vpGLeVE2XgiLd5mVPFHmIglQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-core/binding-win32-arm64": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-win32-arm64/-/binding-win32-arm64-0.19.0.tgz", + "integrity": "sha512-YuJAe7zEKT1Xa7LuHlhGJpPnYQeVtvo0rZvNjJRqkH0hQGOw4C8QeP30Tg5VKGzZfo2x8CjhjEhKt4TmLwfmdg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@yuku-core/binding-win32-x64": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-win32-x64/-/binding-win32-x64-0.19.0.tgz", + "integrity": "sha512-o8iY/mXwlRkedp0LNTr4+TEfXTPQwoNZmv6k+1WIAd1ZXEn8xJJTBCtB0osaVvdZo/x/cNmV16UrWrrGpM5Mvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@yuku-toolchain/types": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-toolchain/types/-/types-0.19.0.tgz", + "integrity": "sha512-tFkNbsP4WXX9UMUC5syJGdK9dPMLK0PPaIuXCcCYH75sZ8MrebfBZ2XvCILRTw8AgLivSSCfDa4R67iYBDa4Kg==", + "dev": true, + "license": "MIT" + }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -2615,13 +1959,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true, - "license": "MIT" - }, "node_modules/aproba": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", @@ -2935,22 +2272,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bundle-require": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", - "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "load-tsconfig": "^0.2.3" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "esbuild": ">=0.18" - } - }, "node_modules/cac": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/cac/-/cac-7.1.0.tgz", @@ -3114,22 +2435,6 @@ "dev": true, "license": "MIT" }, - "node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^5.0.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", @@ -3380,23 +2685,6 @@ "dev": true, "license": "MIT" }, - "node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", @@ -3764,6 +3052,13 @@ "node": ">=8" } }, + "node_modules/defu": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", + "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", + "dev": true, + "license": "MIT" + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -3841,6 +3136,27 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/dts-resolver": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/dts-resolver/-/dts-resolver-3.0.0.tgz", + "integrity": "sha512-1T1f+z+4tl9XD+m+0HBgWoL/nm0bOIffyWaUuUSBlFg/86IWvfx+wjNaO/ybU0AJzG9/Mi5hBUgGV6zCmWEN7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "oxc-resolver": ">=11.0.0" + }, + "peerDependenciesMeta": { + "oxc-resolver": { + "optional": true + } + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -3874,6 +3190,16 @@ "dev": true, "license": "MIT" }, + "node_modules/empathic": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.1.0.tgz", + "integrity": "sha512-AnfC1ATldl49/cvZdLPDjBfrRNwbDO05aibiOtzQu3qtlbJtomNLhF30HEtn/7iBz50dlMECqATo3fG0LrdEgw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, "node_modules/end-of-stream": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", @@ -4014,48 +3340,6 @@ "es6-symbol": "^3.1.1" } }, - "node_modules/esbuild": { - "version": "0.28.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.2.tgz", - "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.28.2", - "@esbuild/android-arm": "0.28.2", - "@esbuild/android-arm64": "0.28.2", - "@esbuild/android-x64": "0.28.2", - "@esbuild/darwin-arm64": "0.28.2", - "@esbuild/darwin-x64": "0.28.2", - "@esbuild/freebsd-arm64": "0.28.2", - "@esbuild/freebsd-x64": "0.28.2", - "@esbuild/linux-arm": "0.28.2", - "@esbuild/linux-arm64": "0.28.2", - "@esbuild/linux-ia32": "0.28.2", - "@esbuild/linux-loong64": "0.28.2", - "@esbuild/linux-mips64el": "0.28.2", - "@esbuild/linux-ppc64": "0.28.2", - "@esbuild/linux-riscv64": "0.28.2", - "@esbuild/linux-s390x": "0.28.2", - "@esbuild/linux-x64": "0.28.2", - "@esbuild/netbsd-arm64": "0.28.2", - "@esbuild/netbsd-x64": "0.28.2", - "@esbuild/openbsd-arm64": "0.28.2", - "@esbuild/openbsd-x64": "0.28.2", - "@esbuild/openharmony-arm64": "0.28.2", - "@esbuild/sunos-x64": "0.28.2", - "@esbuild/win32-arm64": "0.28.2", - "@esbuild/win32-ia32": "0.28.2", - "@esbuild/win32-x64": "0.28.2" - } - }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -4687,18 +3971,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fix-dts-default-cjs-exports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz", - "integrity": "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "magic-string": "^0.30.17", - "mlly": "^1.7.4", - "rollup": "^4.34.8" - } - }, "node_modules/flat-cache": { "version": "6.1.23", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.23.tgz", @@ -4951,6 +4223,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-tsconfig": { + "version": "5.0.0-beta.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-5.0.0-beta.6.tgz", + "integrity": "sha512-X6fBC0pmImC70gvX2zm56go9hx0MyoGVdG0tUCkg/D+Xnh5TJsOZ7iDbOdI3PvmtrDxnu1YdDufpK2QJX1Meqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "engines": { + "node": ">=20.20.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -5148,6 +4436,13 @@ "node": ">= 0.4" } }, + "node_modules/hookable": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-6.1.2.tgz", + "integrity": "sha512-+abwxtiEA52GCVIsQqut3S/uKTbUwYIp4Pe/vv+6py5XiXBCqMZHg6pA6Y5qhgLSEys0/cYuPbO0z1QFj5ZCmg==", + "dev": true, + "license": "MIT" + }, "node_modules/hookified": { "version": "1.15.1", "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.15.1.tgz", @@ -5245,6 +4540,19 @@ "node": ">= 4" } }, + "node_modules/import-without-cache": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/import-without-cache/-/import-without-cache-0.4.1.tgz", + "integrity": "sha512-vXoV9PjKHEednCUu01e98TkImxy67e3BJXbTIOmIq4Hyzw3IAwYRcuPkfeTzJzwyyts4kjuA73x+pWJLc4f86A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -5504,22 +4812,12 @@ "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", "dev": true, "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/joycon": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", - "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", - "dev": true, - "license": "MIT", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, "engines": { - "node": ">=10" + "node": ">=8" } }, "node_modules/js-tokens": { @@ -5899,36 +5197,6 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" - }, - "node_modules/load-tsconfig": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", - "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -6255,19 +5523,6 @@ "dev": true, "license": "MIT" }, - "node_modules/mlly": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", - "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.16.0", - "pathe": "^2.0.3", - "pkg-types": "^1.3.1", - "ufo": "^1.6.3" - } - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -6282,18 +5537,6 @@ "dev": true, "license": "ISC" }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, "node_modules/nan": { "version": "2.29.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.29.0.tgz", @@ -6792,28 +6035,6 @@ ], "license": "MIT" }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" - } - }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -6853,49 +6074,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-load-config": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", - "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "lilconfig": "^3.1.1" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "jiti": ">=1.21.0", - "postcss": ">=8.0.9", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -7055,6 +6233,23 @@ "dev": true, "license": "MIT" }, + "node_modules/quansync": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-1.0.0.tgz", + "integrity": "sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, "node_modules/quick-format-unescaped": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", @@ -7149,20 +6344,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/readdirp": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", - "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/real-require": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", @@ -7200,14 +6381,14 @@ "dev": true, "license": "MIT" }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, "node_modules/responselike": { @@ -7316,50 +6497,64 @@ "@rolldown/binding-win32-x64-msvc": "1.2.13" } }, - "node_modules/rollup": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.64.7.tgz", - "integrity": "sha512-aCiJONoZp0lNGJ6sYqspLkh6UXaWEey/7Ko2TZyXQ4kgzAhDUxAgbt/oulXKmD+zFHXw1k+RF6ZZWOrjp7DZnQ==", + "node_modules/rolldown-plugin-dts": { + "version": "0.28.8", + "resolved": "https://registry.npmjs.org/rolldown-plugin-dts/-/rolldown-plugin-dts-0.28.8.tgz", + "integrity": "sha512-FVhfqxorCWcc20BVT5eVRfRjzLLl6mgzjcMR4gSBf0K4oQMXT0qoHhhzfXy0L7y83fQy7Ug5ZDNk90xM3/LiCQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.9" - }, - "bin": { - "rollup": "dist/bin/rollup" + "dts-resolver": "^3.0.0", + "get-tsconfig": "5.0.0-beta.6", + "obug": "^3.0.0", + "yuku-ast": "^0.19.0", + "yuku-codegen": "^0.19.0", + "yuku-parser": "^0.19.0" }, "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, - "optionalDependencies": { - "@napi-rs/lzma-linux-x64-gnu": "1.5.1", - "@rollup/rollup-android-arm-eabi": "4.64.7", - "@rollup/rollup-android-arm64": "4.64.7", - "@rollup/rollup-darwin-arm64": "4.64.7", - "@rollup/rollup-darwin-x64": "4.64.7", - "@rollup/rollup-freebsd-arm64": "4.64.7", - "@rollup/rollup-freebsd-x64": "4.64.7", - "@rollup/rollup-linux-arm-gnueabihf": "4.64.7", - "@rollup/rollup-linux-arm-musleabihf": "4.64.7", - "@rollup/rollup-linux-arm64-gnu": "4.64.7", - "@rollup/rollup-linux-arm64-musl": "4.64.7", - "@rollup/rollup-linux-loong64-gnu": "4.64.7", - "@rollup/rollup-linux-loong64-musl": "4.64.7", - "@rollup/rollup-linux-ppc64-gnu": "4.64.7", - "@rollup/rollup-linux-ppc64-musl": "4.64.7", - "@rollup/rollup-linux-riscv64-gnu": "4.64.7", - "@rollup/rollup-linux-riscv64-musl": "4.64.7", - "@rollup/rollup-linux-s390x-gnu": "4.64.7", - "@rollup/rollup-linux-x64-gnu": "4.64.7", - "@rollup/rollup-linux-x64-musl": "4.64.7", - "@rollup/rollup-openbsd-x64": "4.64.7", - "@rollup/rollup-openharmony-arm64": "4.64.7", - "@rollup/rollup-win32-arm64-msvc": "4.64.7", - "@rollup/rollup-win32-ia32-msvc": "4.64.7", - "@rollup/rollup-win32-x64-gnu": "4.64.7", - "@rollup/rollup-win32-x64-msvc": "4.64.7", - "fsevents": "~2.3.2" + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@typescript/native-preview": "*", + "@volar/typescript": "~2.4.0", + "@vue/language-core": "~3.2.0 || ~3.3.0", + "rolldown": "^1.2.0", + "typescript": "^5.0.0 || ^6.0.0 || ~7.0.0", + "vue-tsc": "~3.2.0 || ~3.3.0" + }, + "peerDependenciesMeta": { + "@typescript/native-preview": { + "optional": true + }, + "@volar/typescript": { + "optional": true + }, + "@vue/language-core": { + "optional": true + }, + "typescript": { + "optional": true + }, + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/rolldown-plugin-dts/node_modules/obug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/obug/-/obug-3.0.0.tgz", + "integrity": "sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" } }, "node_modules/run-async": { @@ -7745,39 +6940,6 @@ "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/sucrase": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", - "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "tinyglobby": "^0.2.11", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -7917,29 +7079,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/thread-stream": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.2.0.tgz", @@ -8111,74 +7250,79 @@ "typescript": ">=4.8.4" } }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/tsup": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/tsup/-/tsup-9.0.0.tgz", - "integrity": "sha512-DHgb0bfo2gFKybOa8dRFMiHSqzWWhMkfNK0f902VVquWQtDBWExNgidHszjjDKaFd12pWPgzumpWf9nGr3gzFg==", + "node_modules/tsdown": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/tsdown/-/tsdown-0.23.1.tgz", + "integrity": "sha512-MSC2WSOts3in95J334/VIS7KPfor3eCSvndJ6KdoVj9Aak9Kh1aNfz9ws5owhdukuTNSXRdfkPEzA/ihpDD6SA==", "dev": true, "license": "MIT", "dependencies": { - "bundle-require": "^5.1.0", - "cac": "^7.1.0", - "chokidar": "^5.0.0", - "consola": "^3.4.2", - "esbuild": "^0.28.2", - "fix-dts-default-cjs-exports": "^1.0.1", - "joycon": "^3.1.1", + "cac": "^7.0.1", + "defu": "^6.1.7", + "empathic": "^2.1.0", + "hookable": "^6.1.2", + "import-without-cache": "^0.4.1", "obug": "^3.0.0", - "picocolors": "^1.1.1", - "postcss-load-config": "^6.0.1", - "resolve-from": "^5.0.0", - "rollup": "^4.64.6", - "source-map-js": "^1.2.2", - "sucrase": "^3.35.1", + "picomatch": "^4.0.7", + "rolldown": "~1.2.13", + "rolldown-plugin-dts": "^0.28.7", "tinyexec": "^1.3.1", "tinyglobby": "^0.2.17", - "tree-kill": "^1.2.2" + "tree-kill": "^1.2.2", + "unconfig-core": "^7.5.0", + "verkit": "^0.5.0" }, "bin": { - "tsup": "dist/cli-default.js", - "tsup-node": "dist/cli-node.js" + "tsdown": "dist/run.mjs" }, "engines": { "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, "peerDependencies": { - "@microsoft/api-extractor": "^7.36.0", - "@swc/core": "^1", - "postcss": "^8.4.12", - "typescript": ">=4.5.0" + "@arethetypeswrong/core": "^0.18.1", + "@tsdown/css": "0.23.1", + "@tsdown/exe": "0.23.1", + "@vitejs/devtools": "*", + "publint": "^0.3.8", + "tsx": "*", + "typescript": "^5.0.0 || ^6.0.0 || ^7.0.0", + "unplugin-unused": ">=0.5.0", + "unrun": "*" }, "peerDependenciesMeta": { - "@microsoft/api-extractor": { + "@arethetypeswrong/core": { + "optional": true + }, + "@tsdown/css": { "optional": true }, - "@swc/core": { + "@tsdown/exe": { "optional": true }, - "postcss": { + "@vitejs/devtools": { + "optional": true + }, + "publint": { + "optional": true + }, + "tsx": { "optional": true }, "typescript": { "optional": true + }, + "unplugin-unused": { + "optional": true + }, + "unrun": { + "optional": true } } }, - "node_modules/tsup/node_modules/obug": { + "node_modules/tsdown/node_modules/obug": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/obug/-/obug-3.0.0.tgz", "integrity": "sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==", @@ -8192,6 +7336,13 @@ "node": ">=12.20.0" } }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", @@ -8285,13 +7436,6 @@ "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/ufo": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", - "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", - "dev": true, - "license": "MIT" - }, "node_modules/unbzip2-stream": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", @@ -8303,6 +7447,20 @@ "through": "^2.3.8" } }, + "node_modules/unconfig-core": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/unconfig-core/-/unconfig-core-7.5.0.tgz", + "integrity": "sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@quansync/fs": "^1.0.0", + "quansync": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/undici-types": { "version": "7.24.6", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", @@ -8348,6 +7506,19 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/verkit": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/verkit/-/verkit-0.5.0.tgz", + "integrity": "sha512-u4J1hr6Y+C/hit34GwL3eIcUf3wngT8TlYUjK7tk0jxydKLAq3sYvifjdTDA6U3KCKRcQCQDGf/srjxfZF3l7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, "node_modules/vite": { "version": "8.3.4", "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.4.tgz", @@ -8734,6 +7905,73 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/yuku-ast": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/yuku-ast/-/yuku-ast-0.19.0.tgz", + "integrity": "sha512-PyCsiScaelhxBGzL8dyeJkLqvRZycoh78R31Vrt/WqYrm0hMFoKwIw/X7Dx5mBKLWAMlV9I9HEyBOHnj2gZVyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@yuku-toolchain/types": "^0.19.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/yuku-codegen": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/yuku-codegen/-/yuku-codegen-0.19.0.tgz", + "integrity": "sha512-uymAKHjDuaP4BEpkXC/BSLz4DUEF5oArZ5AuD3888nb2miChjWSgpPdojEJxm3pjpXkgUaCRJQyNAbnMN33wHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@yuku-toolchain/types": "^0.19.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/yuku-core": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/yuku-core/-/yuku-core-0.19.0.tgz", + "integrity": "sha512-kYK9e1XdfirNhkipzW0wmMcSWcVF/CWnuugodfVYRCUwvoBefweL9HzB96OiKEhsx78V5WbUxbJqlizMX869Qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@yuku-toolchain/types": "^0.19.0" + }, + "engines": { + "node": ">=14.18.0" + }, + "optionalDependencies": { + "@yuku-core/binding-android-arm64": "0.19.0", + "@yuku-core/binding-darwin-arm64": "0.19.0", + "@yuku-core/binding-darwin-x64": "0.19.0", + "@yuku-core/binding-freebsd-x64": "0.19.0", + "@yuku-core/binding-linux-arm-gnu": "0.19.0", + "@yuku-core/binding-linux-arm-musl": "0.19.0", + "@yuku-core/binding-linux-arm64-gnu": "0.19.0", + "@yuku-core/binding-linux-arm64-musl": "0.19.0", + "@yuku-core/binding-linux-x64-gnu": "0.19.0", + "@yuku-core/binding-linux-x64-musl": "0.19.0", + "@yuku-core/binding-win32-arm64": "0.19.0", + "@yuku-core/binding-win32-x64": "0.19.0" + } + }, + "node_modules/yuku-parser": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/yuku-parser/-/yuku-parser-0.19.0.tgz", + "integrity": "sha512-XrBh9ZiQK5mJVRxZBAvD6LwRyAYrK3MFtH3+onyuxFL5hFD44EC3QOmIC1FjTj6H2MMwq46/NAI+NZxLZPZgxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@yuku-toolchain/types": "^0.19.0", + "yuku-core": "0.19.0" + }, + "engines": { + "node": ">=14.18.0" + } } } } diff --git a/comment_service/package.json b/comment_service/package.json index 9fbcac546..45de29bb6 100644 --- a/comment_service/package.json +++ b/comment_service/package.json @@ -5,7 +5,7 @@ "type": "module", "main": "dist/comments.js", "scripts": { - "build": "tsup", + "build": "tsdown", "test": "vitest run", "test:watch": "vitest", "test:coverage": "vitest run --coverage", @@ -39,7 +39,7 @@ "eslint": "^10.0.0", "prettier": "^3.0.0", "serverless-scaleway-functions": ">=0.4.16", - "tsup": "^9.0.0", + "tsdown": "^0.23.1", "typescript": "^5.9.3", "typescript-eslint": "^8.60.0", "vitest": "^4.1.11" diff --git a/comment_service/tsdown.config.ts b/comment_service/tsdown.config.ts new file mode 100644 index 000000000..9c12d767b --- /dev/null +++ b/comment_service/tsdown.config.ts @@ -0,0 +1,24 @@ +import { defineConfig } from "tsdown"; + +export default defineConfig({ + entry: ["comments.ts"], + format: "esm", + platform: "node", + target: "node22", + outDir: "dist", + // Emit .js, not .mjs — serverless.yml and package.json reference dist/comments.js. + fixedExtension: false, + // tsconfig has declaration: true, which auto-enables dts; nothing consumes + // the types of a deployed handler, so keep the dist shape tsup produced. + dts: false, + sourcemap: true, + minify: false, + // Bundle all npm dependencies (Node built-ins are always external). + deps: { alwaysBundle: [/.*/] }, + // createRequire banner for packages that use dynamic require() (like pino). + // The import is aliased: rolldown's own runtime chunks import `createRequire` + // unaliased, and a bare re-import in the same file is a SyntaxError. + banner: { + js: `import { createRequire as __fretchenCr } from 'module'; const require = __fretchenCr(import.meta.url);`, + }, +}); diff --git a/comment_service/tsup.config.js b/comment_service/tsup.config.js deleted file mode 100644 index 71e8ffa6c..000000000 --- a/comment_service/tsup.config.js +++ /dev/null @@ -1,19 +0,0 @@ -import { defineConfig } from "tsup"; -import { builtinModules } from "module"; - -export default defineConfig({ - entry: ["comments.ts"], - format: ["esm"], - platform: "node", - target: "node22", - outDir: "dist", - splitting: false, - clean: true, - minify: false, - sourcemap: true, - external: [...builtinModules, ...builtinModules.map((m) => `node:${m}`)], - noExternal: [/.*/], - banner: { - js: `import { createRequire } from 'module'; const require = createRequire(import.meta.url);`, - }, -}); diff --git a/scw_js/dev_server_genimg.ts b/scw_js/dev_server_genimg.ts index 8869cd0ed..9e638eae0 100644 --- a/scw_js/dev_server_genimg.ts +++ b/scw_js/dev_server_genimg.ts @@ -1,5 +1,5 @@ // Local dev server for the genimg x402 seller. Runs only via `npm run dev:x402` -// (NODE_ENV=test npx tsx dev_server_genimg.ts) and is not in tsup's entry list, so it is +// (NODE_ENV=test npx tsx dev_server_genimg.ts) and is not in tsdown's entry list, so it is // never bundled or deployed. It serves handle() over fastify on port 8082, with the // payment headers exposed for browser clients. Deployed handlers must stay free of // fastify — enforced by test/handler_purity.test.ts. diff --git a/scw_js/dev_server_llm.ts b/scw_js/dev_server_llm.ts index 03a6641de..fc0d61ccc 100644 --- a/scw_js/dev_server_llm.ts +++ b/scw_js/dev_server_llm.ts @@ -1,5 +1,5 @@ // Local dev server for the LLM chat x402 seller. Runs only via `npm run dev:llmx402` -// (NODE_ENV=test npx tsx dev_server_llm.ts) and is not in tsup's entry list, so it is +// (NODE_ENV=test npx tsx dev_server_llm.ts) and is not in tsdown's entry list, so it is // never bundled or deployed. It serves handle() over fastify on port 8085, with the // payment headers exposed for browser clients. Deployed handlers must stay free of // fastify — enforced by test/handler_purity.test.ts. diff --git a/scw_js/dev_server_mcp.ts b/scw_js/dev_server_mcp.ts index 3f036c49e..46645c0d7 100644 --- a/scw_js/dev_server_mcp.ts +++ b/scw_js/dev_server_mcp.ts @@ -1,5 +1,5 @@ // Local dev server for the MCP endpoint. Runs only via `npm run dev:mcp` -// (NODE_ENV=test npx tsx dev_server_mcp.ts) and is not in tsup's entry list, so it is +// (NODE_ENV=test npx tsx dev_server_mcp.ts) and is not in tsdown's entry list, so it is // never bundled or deployed. It serves handle() over fastify on port 8086 — point the // MCP inspector (npx @modelcontextprotocol/inspector) at http://127.0.0.1:8086/mcp to // exercise initialize/tools/list/tools/call before any deploy. Deployed handlers must diff --git a/scw_js/package-lock.json b/scw_js/package-lock.json index 10a601fdc..eef5badf2 100644 --- a/scw_js/package-lock.json +++ b/scw_js/package-lock.json @@ -34,7 +34,7 @@ "fastify": "^5.12.1", "prettier": "^3.6.2", "serverless-scaleway-functions": ">=0.5.1", - "tsup": "^8.5.1", + "tsdown": "^0.23.1", "typescript": "^5.9.3", "typescript-eslint": "^8.58.2", "vitest": "^4.1.11" @@ -172,448 +172,6 @@ "keyv": "^5.6.0" } }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.7.tgz", - "integrity": "sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.7.tgz", - "integrity": "sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.7.tgz", - "integrity": "sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.7.tgz", - "integrity": "sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.7.tgz", - "integrity": "sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.7.tgz", - "integrity": "sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.7.tgz", - "integrity": "sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.7.tgz", - "integrity": "sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.7.tgz", - "integrity": "sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.7.tgz", - "integrity": "sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.7.tgz", - "integrity": "sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.7.tgz", - "integrity": "sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==", - "cpu": [ - "loong64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.7.tgz", - "integrity": "sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==", - "cpu": [ - "mips64el" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.7.tgz", - "integrity": "sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.7.tgz", - "integrity": "sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.7.tgz", - "integrity": "sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.7.tgz", - "integrity": "sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.7.tgz", - "integrity": "sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.7.tgz", - "integrity": "sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.7.tgz", - "integrity": "sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.7.tgz", - "integrity": "sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.7.tgz", - "integrity": "sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.7.tgz", - "integrity": "sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.7.tgz", - "integrity": "sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.7.tgz", - "integrity": "sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.7.tgz", - "integrity": "sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, "node_modules/@eslint-community/eslint-utils": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz", @@ -1106,17 +664,6 @@ } } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -1314,26 +861,6 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "license": "MIT" }, - "node_modules/@napi-rs/lzma-linux-x64-gnu": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", - "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^22.20 || ^24.12 || >=25" - } - }, "node_modules/@noble/ciphers": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", @@ -1433,264 +960,72 @@ "integrity": "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw==", "dev": true, "license": "BSD-3-Clause", - "dependencies": { - "@protobufjs/aspromise": "^1.1.1" - } - }, - "node_modules/@protobufjs/float": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", - "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/path": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", - "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/pool": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", - "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@protobufjs/utf8": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.2.tgz", - "integrity": "sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@rolldown/binding-android-arm-eabi": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.13.tgz", - "integrity": "sha512-Vu/NICrgdRvUOeaJZIyB2FP63s6fO/4ud5l8dXmxDx9yDyn+mN0y+gsvsVviSli+T361Aqo0h46EuMoobrwawA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-android-arm64": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.13.tgz", - "integrity": "sha512-6LEoIrGy5vvCd2boNnv2soPSUZj/PRvhp8R/t9KlX+mIZxThIE/ZqxrGXxmuNX0FuvQFvLdZr7S4HrYpYBVhEQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.13.tgz", - "integrity": "sha512-CaJSRzlQ6Q+zkDMVA9OkVxBjVoPRCDEE3v0FSJ9kIQBgRjFApA3Si4ijhbNVUji7ZJt+PfO0e46qy4nPInHUPA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.13.tgz", - "integrity": "sha512-e4r340I5hxSzJkD3YJBxgzq/rJ3wwxwdLLb2FPt1Zpyem20nrQPT11DDEEkazwxaHumH8wpglsp/Ozgj/wT6mw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.13.tgz", - "integrity": "sha512-hoBWDZ4/K/mJKVMbsgUd1jfpA2DiOrJ54mpegObU9TBHBBrtX4FLIXJJQRDPZ/2Dn91GvPob+Z2hwKJzf4E5SQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.13.tgz", - "integrity": "sha512-oF9fZu3vTWnTiVAkDFxU9PJLt1nh20K9RRpuHsR7ZnE2L7XookBbDBVLojCVSLGbvtSlxeUNnjAj6DbNsKyzbg==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.13.tgz", - "integrity": "sha512-DTpb/+jMiqWMPgphn4ksW1zW+XLJ6dJJ9FMvnIk9I291LhCctMPhMYJrP5t9p6C9qa3KXadDdUEZHBaPh3kNxQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, - "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.13.tgz", - "integrity": "sha512-xU+Kvv9N2A3SY35zFh1FWWNjxbadE/BKeqnkXe7vScU4GZsw757BlVmDLITZEq8DPpk6m7uoDYkK7P+x/uU5Ow==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" + "dependencies": { + "@protobufjs/aspromise": "^1.1.1" } }, - "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.13.tgz", - "integrity": "sha512-XMk/hnhh25oQ756Lclb1Q11h4ll0xC0Esa5w4Vzp+mAE2S3AGJgeM0SonrIgY8fHhjarb6hcoTuwoFG0VVP2ig==", - "cpu": [ - "ppc64" - ], + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==", "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } + "license": "BSD-3-Clause" }, - "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.13.tgz", - "integrity": "sha512-U1BoTHYmlywE2n3HUWjzZ+8EQsKr+OwpxYuDWaubx42tUL8QSL7nOqRz/NVHanibbFP3M1Rxuprz/wNcbMKjqw==", - "cpu": [ - "s390x" - ], + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==", "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" - } + "license": "BSD-3-Clause" }, - "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.13.tgz", - "integrity": "sha512-J4cm80Pc6wEwV5AZ42o62sIQgDk+Y7R2s646jIwuvO+4V46QB58N4vVuMPWCBaNgursXLpmUWJV//WQAkPvHBQ==", - "cpu": [ - "x64" - ], + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.2.tgz", + "integrity": "sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug==", + "dev": true, + "license": "BSD-3-Clause" + }, + "node_modules/@quansync/fs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@quansync/fs/-/fs-1.1.0.tgz", + "integrity": "sha512-qAPG/t3HqML1TlN7sY/pTbEjzFVAKsMjNNMGheyDosro+kT4iw2KCUoHcVdmliwWjorm4elZbgNQyU2eD97eDg==", "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^20.19.0 || >=22.12.0" + "dependencies": { + "quansync": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" } }, - "node_modules/@rolldown/binding-linux-x64-musl": { + "node_modules/@rolldown/binding-android-arm-eabi": { "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.13.tgz", - "integrity": "sha512-W0euZS40U4V6JkmEnVCIX9mcsL6cbXQ4X8c2w+MMOIjFg68TXUW+u3RT+2e1t1pv9mg/EP3pDtK3POXdQ7Rxyw==", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.13.tgz", + "integrity": "sha512-Vu/NICrgdRvUOeaJZIyB2FP63s6fO/4ud5l8dXmxDx9yDyn+mN0y+gsvsVviSli+T361Aqo0h46EuMoobrwawA==", "cpu": [ - "x64" + "arm" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ - "linux" + "android" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-openharmony-arm64": { + "node_modules/@rolldown/binding-android-arm64": { "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.13.tgz", - "integrity": "sha512-do/AF/4n9MRshia3a5aXoy8xM2c6mgfT6D7H/dY6my5z+hfCIR4ab7mk4IRj++nsEQpKy39kd0DQnDq+r692tw==", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.13.tgz", + "integrity": "sha512-6LEoIrGy5vvCd2boNnv2soPSUZj/PRvhp8R/t9KlX+mIZxThIE/ZqxrGXxmuNX0FuvQFvLdZr7S4HrYpYBVhEQ==", "cpu": [ "arm64" ], @@ -1698,16 +1033,16 @@ "license": "MIT", "optional": true, "os": [ - "openharmony" + "android" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-win32-arm64-msvc": { + "node_modules/@rolldown/binding-darwin-arm64": { "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.13.tgz", - "integrity": "sha512-6FtUf2cJZobutJdxnGYX8z0vtbgqU0b2v8vfBhkXb9wp2MppMFtkunE+IaOntyi01rkIQoPW2GHABtfzsC0BRQ==", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.13.tgz", + "integrity": "sha512-CaJSRzlQ6Q+zkDMVA9OkVxBjVoPRCDEE3v0FSJ9kIQBgRjFApA3Si4ijhbNVUji7ZJt+PfO0e46qy4nPInHUPA==", "cpu": [ "arm64" ], @@ -1715,16 +1050,16 @@ "license": "MIT", "optional": true, "os": [ - "win32" + "darwin" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-win32-x64-msvc": { + "node_modules/@rolldown/binding-darwin-x64": { "version": "1.2.13", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.13.tgz", - "integrity": "sha512-UKhFaZTeTcbKrb3iU82m17jVcPEAoqDkCN5MBqgPyZSwp/cQmib21crTS0DdH7T1B7wZRWEI89YQAOJMet5yhg==", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.13.tgz", + "integrity": "sha512-e4r340I5hxSzJkD3YJBxgzq/rJ3wwxwdLLb2FPt1Zpyem20nrQPT11DDEEkazwxaHumH8wpglsp/Ozgj/wT6mw==", "cpu": [ "x64" ], @@ -1732,93 +1067,16 @@ "license": "MIT", "optional": true, "os": [ - "win32" + "darwin" ], "engines": { "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/pluginutils": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.64.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.64.5.tgz", - "integrity": "sha512-MrfgRQSpD5hkkRg6XI16B6EDLb+6+xp8xje6bpdSwkYw+qxrBKbUVrRAQu9h82UT+QumSIVQ8HXsXjPd2dlhqw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.64.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.64.5.tgz", - "integrity": "sha512-+uu2p/R9Tzn8GpoQyX1pAo5dmKT1DhXevfaCzqzmPFhnLjHLWw7uWkaVGlxmhwYoRiYYhsGfRcD5cTBpL7rgSw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.64.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.64.5.tgz", - "integrity": "sha512-17dys+YEmzwzzFVHQAVDONg5FALXY9kd99HFEpfk4gJVHYxoh5bGea3D4t1fXXnwkTcOe25wPyd6nWS0I8IdLQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.64.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.64.5.tgz", - "integrity": "sha512-wg0zQEKkEvFZf1UaaX1UELOoPs//OSKUG7D+yITuqOsAvza7LvHTv5Wu4nmMfzNG7EYI2jp2PJC7Id6OETmsYQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.64.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.64.5.tgz", - "integrity": "sha512-CoJmWcpEMuwin+TZ/ev/H9uDyF/uxUKQSWXdmIPn/UBx/uGV9+4ebMp0FwnlhWR9PE1AdzYsKf3bZevhif38+A==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.64.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.64.5.tgz", - "integrity": "sha512-PxZnLAaTUAL5xG0W2BXLeYPKrK2b3LIASV2/e/Kf7PZvSLI1iAQIm9B9aJD+YyFIT7hc6qaMV3+OOO35R28LfA==", + "node_modules/@rolldown/binding-freebsd-x64": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.13.tgz", + "integrity": "sha512-hoBWDZ4/K/mJKVMbsgUd1jfpA2DiOrJ54mpegObU9TBHBBrtX4FLIXJJQRDPZ/2Dn91GvPob+Z2hwKJzf4E5SQ==", "cpu": [ "x64" ], @@ -1827,116 +1085,34 @@ "optional": true, "os": [ "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.64.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.64.5.tgz", - "integrity": "sha512-uPo3IvnONjhbFXwWgroBeFwOicuhT7ZwQrnzkzmOtBJzeQbkUJUE1SJDfDI31ijQ5+ZUIA6sPrdUMxTSnxUWAg==", - "cpu": [ - "arm" ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.64.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.64.5.tgz", - "integrity": "sha512-ywI8Jyuc4LyHYTjC0mw4yA1ulvZBkHusdpWnoiEBsmBuHvSnt90btTBGCZ+s/2y+YNNfVAEKy33nPo5UI9zTmg==", + "node_modules/@rolldown/binding-linux-arm-gnueabihf": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.13.tgz", + "integrity": "sha512-oF9fZu3vTWnTiVAkDFxU9PJLt1nh20K9RRpuHsR7ZnE2L7XookBbDBVLojCVSLGbvtSlxeUNnjAj6DbNsKyzbg==", "cpu": [ "arm" ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.64.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.64.5.tgz", - "integrity": "sha512-tmuXJoQ/3ovSr637aykZMdQteU/CB2APAz2CrvsbibuoHZi1BS1Db13cVViBdEARGwXCLn1DSJ8wsjoThLJPGA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.64.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.64.5.tgz", - "integrity": "sha512-5FMjSYNcUOHx7oW8Qu9KB6jGPpvF/8sG7+BDHwU/Ihh1/6FMJ9ySmsFG4tJ1qbNRuP8OLzCBDso4sF0mQaLuFQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.64.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.64.5.tgz", - "integrity": "sha512-K8ZJ+neLDbUkIrL8dqF/5LtuVCrKwo27kREgOlxjBEjlOXwHvDnHLU8Z/UKv/B49qi7e8hsSDOyoJwhwqhvX4w==", - "cpu": [ - "loong64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.64.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.64.5.tgz", - "integrity": "sha512-NlVxsq7PFPv0DBKGuNWRDKixQYQCjM53zl04mxEcKMBmJbCBIUm1JdPfIWDRHyOOFzzYPmLQzfeEwh4716ayQg==", - "cpu": [ - "loong64" - ], - "dev": true, - "libc": [ - "musl" - ], + "dev": true, "license": "MIT", "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.64.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.64.5.tgz", - "integrity": "sha512-ARhRHJYs5eCFet5azfrHD97vOkD8OzNW2RSMlvo5CcBqXaTOLfp0OHDtUQh7/K5AL5fUYoFp2fgC9KDg4vVYMQ==", + "node_modules/@rolldown/binding-linux-arm64-gnu": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.13.tgz", + "integrity": "sha512-DTpb/+jMiqWMPgphn4ksW1zW+XLJ6dJJ9FMvnIk9I291LhCctMPhMYJrP5t9p6C9qa3KXadDdUEZHBaPh3kNxQ==", "cpu": [ - "ppc64" + "arm64" ], "dev": true, "libc": [ @@ -1946,14 +1122,17 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.64.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.64.5.tgz", - "integrity": "sha512-atSgreM5C7jpxd9aEXN+6vJ5wTd05iYw+S3FiQpw7VsoEl8B90llbq35ARON+GOHj5QlVQEq2vOKWCHTob/BSQ==", + "node_modules/@rolldown/binding-linux-arm64-musl": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.13.tgz", + "integrity": "sha512-xU+Kvv9N2A3SY35zFh1FWWNjxbadE/BKeqnkXe7vScU4GZsw757BlVmDLITZEq8DPpk6m7uoDYkK7P+x/uU5Ow==", "cpu": [ - "ppc64" + "arm64" ], "dev": true, "libc": [ @@ -1963,14 +1142,17 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.64.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.64.5.tgz", - "integrity": "sha512-vmlmwBFGnjVWxSRoVabNkyYuscSmg52Pd0fM8jEbNT3Jmka4A6HcB84x4uAmuumznWfBVaxKOqU6jbEgomWKCA==", + "node_modules/@rolldown/binding-linux-ppc64-gnu": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.13.tgz", + "integrity": "sha512-XMk/hnhh25oQ756Lclb1Q11h4ll0xC0Esa5w4Vzp+mAE2S3AGJgeM0SonrIgY8fHhjarb6hcoTuwoFG0VVP2ig==", "cpu": [ - "riscv64" + "ppc64" ], "dev": true, "libc": [ @@ -1980,29 +1162,15 @@ "optional": true, "os": [ "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.64.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.64.5.tgz", - "integrity": "sha512-hhJrP6S9WkbsbcHgUkvCBS5Cn8IdsG8XjlLZyxjnv9+NdoYfbbZE4TWJYr8apdaj1M5t5Y1id2StnEslxpNFyA==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "musl" ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.64.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.64.5.tgz", - "integrity": "sha512-NNVCyN9pGrwFmQa4bf+Cnf5aVH3g6ZpnlOg1Cs/H9swIHT9bRixijfzUqyEIWm1WtiAuR1LJ+rJH6zpBm8kgQA==", + "node_modules/@rolldown/binding-linux-s390x-gnu": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.13.tgz", + "integrity": "sha512-U1BoTHYmlywE2n3HUWjzZ+8EQsKr+OwpxYuDWaubx42tUL8QSL7nOqRz/NVHanibbFP3M1Rxuprz/wNcbMKjqw==", "cpu": [ "s390x" ], @@ -2014,12 +1182,15 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.64.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.64.5.tgz", - "integrity": "sha512-dR9nd6OKnvSS60Ifz/L7Mj5zzYyoqyRn2NwTuaOONKaa3xsVGXyp8YusMbvFyEOR94DxnwgcbgsFqkHd29ZSzQ==", + "node_modules/@rolldown/binding-linux-x64-gnu": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.13.tgz", + "integrity": "sha512-J4cm80Pc6wEwV5AZ42o62sIQgDk+Y7R2s646jIwuvO+4V46QB58N4vVuMPWCBaNgursXLpmUWJV//WQAkPvHBQ==", "cpu": [ "x64" ], @@ -2031,12 +1202,15 @@ "optional": true, "os": [ "linux" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.64.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.64.5.tgz", - "integrity": "sha512-1tzsMjaqhsh3bAO6SJiJqh8hIr9sSPRd+i2vPPxJHod8/XYnf9TEnK0z/u3r1z1AkI347X0KbRSg9dWcxeGahw==", + "node_modules/@rolldown/binding-linux-x64-musl": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.13.tgz", + "integrity": "sha512-W0euZS40U4V6JkmEnVCIX9mcsL6cbXQ4X8c2w+MMOIjFg68TXUW+u3RT+2e1t1pv9mg/EP3pDtK3POXdQ7Rxyw==", "cpu": [ "x64" ], @@ -2048,26 +1222,15 @@ "optional": true, "os": [ "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.64.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.64.5.tgz", - "integrity": "sha512-01mWMQblKoXXsmk28KXtpbA96w7g/aOWUoV3AC16fdHdqkykGalqyyM+5u8M7uP5/MEMiiPv69Hv7iv/hEH/dA==", - "cpu": [ - "x64" ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.64.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.64.5.tgz", - "integrity": "sha512-trdnMPb/DNm4V/CgsaoGgr90HfQQ071wfK0KoIs4YpLvjBgVQGXhGabg2Z6nK4EcYNilrb9ZZPcsP6+zpJIdxQ==", + "node_modules/@rolldown/binding-openharmony-arm64": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.13.tgz", + "integrity": "sha512-do/AF/4n9MRshia3a5aXoy8xM2c6mgfT6D7H/dY6my5z+hfCIR4ab7mk4IRj++nsEQpKy39kd0DQnDq+r692tw==", "cpu": [ "arm64" ], @@ -2076,12 +1239,15 @@ "optional": true, "os": [ "openharmony" - ] + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.64.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.64.5.tgz", - "integrity": "sha512-x2LxZlfdfsw99T6/qb9EqE/Qi84JWzibjyOJyhJsgFJy6CafaTiqIXCCnslCGrV5XWNh7fwrS3FbRENcuKnooA==", + "node_modules/@rolldown/binding-win32-arm64-msvc": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.13.tgz", + "integrity": "sha512-6FtUf2cJZobutJdxnGYX8z0vtbgqU0b2v8vfBhkXb9wp2MppMFtkunE+IaOntyi01rkIQoPW2GHABtfzsC0BRQ==", "cpu": [ "arm64" ], @@ -2090,26 +1256,15 @@ "optional": true, "os": [ "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.64.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.64.5.tgz", - "integrity": "sha512-/Qd/9aDQIo0+jmItgBmPIs8195YVbDxRRApn47GyufgbutCDOh7eP5vSKKlI4QNFeaI+wKQAkSMsPnF3EuMpaA==", - "cpu": [ - "ia32" ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "engines": { + "node": "^20.19.0 || >=22.12.0" + } }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.64.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.64.5.tgz", - "integrity": "sha512-ngUJ/XvOWrqbd2IMsfXfh2xXFLTP3sY7sCKvxbGvYdBZ1KmXFd3ewDZ9n3/GNzAUgzRuhLT/UvJRivbNoAQRBw==", + "node_modules/@rolldown/binding-win32-x64-msvc": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.13.tgz", + "integrity": "sha512-UKhFaZTeTcbKrb3iU82m17jVcPEAoqDkCN5MBqgPyZSwp/cQmib21crTS0DdH7T1B7wZRWEI89YQAOJMet5yhg==", "cpu": [ "x64" ], @@ -2118,21 +1273,17 @@ "optional": true, "os": [ "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.64.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.64.5.tgz", - "integrity": "sha512-IhV6ew/DuzUWwHaYmlh7MrPCV3lKFUq/amTEwysi4r/mwNPAEfAMh5dYWeTSPTeMy2pFHGMEWYtPkHzfX3tG5A==", - "cpu": [ - "x64" ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "license": "MIT" }, "node_modules/@scaleway/serverless-functions": { "version": "1.1.2", @@ -3242,62 +2393,255 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@x402/extensions/node_modules/fast-uri": { - "version": "3.1.8", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.8.tgz", - "integrity": "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } + "node_modules/@x402/extensions/node_modules/fast-uri": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.8.tgz", + "integrity": "sha512-GZMtZUTNRpOVIECoXwLNZS5xUGE+mVNbTB8h/7Rwh2TFWcBQiPzTgyZi05BF9UMZKkLJv8XBRJTlU7zg8+ZfMg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/@x402/extensions/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/@x402/extensions/node_modules/tweetnacl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", + "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", + "license": "Unlicense" + }, + "node_modules/@x402/extensions/node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@x402/mcp": { + "version": "2.28.0", + "resolved": "https://registry.npmjs.org/@x402/mcp/-/mcp-2.28.0.tgz", + "integrity": "sha512-I84qbst4aazR8lqfcw/XRURjECxzKuFsNMWgELgD63OBK39Jqjz0dar9o0X7Vdm4FcsWA/QET+F1MFFEU4QmKQ==", + "license": "Apache-2.0", + "dependencies": { + "@modelcontextprotocol/sdk": "^1.12.1", + "@x402/core": "~2.28.0", + "zod": "^3.24.2" + } + }, + "node_modules/@x402/mcp/node_modules/zod": { + "version": "3.25.76", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", + "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + }, + "node_modules/@yuku-core/binding-android-arm64": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-android-arm64/-/binding-android-arm64-0.19.0.tgz", + "integrity": "sha512-wdL2XmTiZixAOaHk9Z0JJZ8u9Qm8d333Zjpc6gaxXFX+UR5BlsfxZ7a2+2Rm71pamppsPYGUGFq2oVLbh6DISw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@yuku-core/binding-darwin-arm64": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-darwin-arm64/-/binding-darwin-arm64-0.19.0.tgz", + "integrity": "sha512-7sNJa6XJhyetnTy64jw3NEi4YgUcezHk1G5GH9FSvXAuC8wIlbaOwT9lgq5qo5sspjrZJQlBR1TWflP49uRpMw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@yuku-core/binding-darwin-x64": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-darwin-x64/-/binding-darwin-x64-0.19.0.tgz", + "integrity": "sha512-pTC7dYEc59isdyizc3nsuyFNBu2LU5wMYZ1be6UMr59PY/AJNtO1aBLWV0MgL/z7C1nv/2sX4TNjGgKLoeevJw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@yuku-core/binding-freebsd-x64": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-freebsd-x64/-/binding-freebsd-x64-0.19.0.tgz", + "integrity": "sha512-xrZjF6XOEwyLOiDIfrwDdRCS6ghxcJeirNC1KivQhVcUwlRonaU79S3/Uiyx3lBylPnT8qKJ3/aMT+H52nGTJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@yuku-core/binding-linux-arm-gnu": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-arm-gnu/-/binding-linux-arm-gnu-0.19.0.tgz", + "integrity": "sha512-0OyIH53C0I1CbADHn9FSdCfX5qbpeLwJhmOVhonFJNYheybOnkSJ50qGMfTJIb8y5zrwqvLs7FVBvz6Fk8maZg==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-core/binding-linux-arm-musl": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-arm-musl/-/binding-linux-arm-musl-0.19.0.tgz", + "integrity": "sha512-z/iPfkCOCSXE34VXNt0uP1ORSW+4mEa9b5CiJcWZeqZH08g49bFU/jRM2T04f+Wpw5mJ6HIzNBiojxeAbrHjeg==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-core/binding-linux-arm64-gnu": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.19.0.tgz", + "integrity": "sha512-jLNTi+gzaRwBJ+gwhCJ+rDb5dmx/8hEBx93UWd7hjMSqPTL1D1wvVSvXVAldV5kALvju7b0/m51EHEhs4+I1fA==", + "cpu": [ + "arm64" ], - "license": "BSD-3-Clause" + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@x402/extensions/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" + "node_modules/@yuku-core/binding-linux-arm64-musl": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.19.0.tgz", + "integrity": "sha512-YwyPIdW/rN2Fmv0MTFWi47FaB3F9g+2b+sJISyAw83Yd60RWH4T3Nx6XkAHHVN+uKJNBAd6So7/BVihSiFYvuQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@x402/extensions/node_modules/tweetnacl": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-1.0.3.tgz", - "integrity": "sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==", - "license": "Unlicense" + "node_modules/@yuku-core/binding-linux-x64-gnu": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.19.0.tgz", + "integrity": "sha512-/vskaAXVX3ESR43FiTdfiYS7z1b9uoQJwVQ/0RgUHgN2sWoAyCZs+aX4CgU7eKGIHTVfp9VFwv+c+2XchYiEtQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@x402/extensions/node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "node_modules/@yuku-core/binding-linux-x64-musl": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-x64-musl/-/binding-linux-x64-musl-0.19.0.tgz", + "integrity": "sha512-FuXL5igeSKib9Rye02TdH+D6SQezTyGxIATMu1Qsn/QywrzwpGl35OLpS2C1x5vpGLeVE2XgiLd5mVPFHmIglQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } + "optional": true, + "os": [ + "linux" + ] }, - "node_modules/@x402/mcp": { - "version": "2.28.0", - "resolved": "https://registry.npmjs.org/@x402/mcp/-/mcp-2.28.0.tgz", - "integrity": "sha512-I84qbst4aazR8lqfcw/XRURjECxzKuFsNMWgELgD63OBK39Jqjz0dar9o0X7Vdm4FcsWA/QET+F1MFFEU4QmKQ==", - "license": "Apache-2.0", - "dependencies": { - "@modelcontextprotocol/sdk": "^1.12.1", - "@x402/core": "~2.28.0", - "zod": "^3.24.2" - } + "node_modules/@yuku-core/binding-win32-arm64": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-win32-arm64/-/binding-win32-arm64-0.19.0.tgz", + "integrity": "sha512-YuJAe7zEKT1Xa7LuHlhGJpPnYQeVtvo0rZvNjJRqkH0hQGOw4C8QeP30Tg5VKGzZfo2x8CjhjEhKt4TmLwfmdg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] }, - "node_modules/@x402/mcp/node_modules/zod": { - "version": "3.25.76", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", - "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", + "node_modules/@yuku-core/binding-win32-x64": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-win32-x64/-/binding-win32-x64-0.19.0.tgz", + "integrity": "sha512-o8iY/mXwlRkedp0LNTr4+TEfXTPQwoNZmv6k+1WIAd1ZXEn8xJJTBCtB0osaVvdZo/x/cNmV16UrWrrGpM5Mvw==", + "cpu": [ + "x64" + ], + "dev": true, "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@yuku-toolchain/types": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-toolchain/types/-/types-0.19.0.tgz", + "integrity": "sha512-tFkNbsP4WXX9UMUC5syJGdK9dPMLK0PPaIuXCcCYH75sZ8MrebfBZ2XvCILRTw8AgLivSSCfDa4R67iYBDa4Kg==", + "dev": true, + "license": "MIT" }, "node_modules/abbrev": { "version": "1.1.1", @@ -3526,13 +2870,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true, - "license": "MIT" - }, "node_modules/apg-js": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/apg-js/-/apg-js-4.4.0.tgz", @@ -3898,22 +3235,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bundle-require": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", - "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "load-tsconfig": "^0.2.3" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "esbuild": ">=0.18" - } - }, "node_modules/bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", @@ -3923,16 +3244,6 @@ "node": ">= 0.8" } }, - "node_modules/cac": { - "version": "6.7.14", - "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, "node_modules/cacheable": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/cacheable/-/cacheable-2.5.0.tgz", @@ -4084,22 +3395,6 @@ "dev": true, "license": "MIT" }, - "node_modules/chokidar": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^4.0.1" - }, - "engines": { - "node": ">= 14.16.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", @@ -4350,23 +3645,6 @@ "dev": true, "license": "MIT" }, - "node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", @@ -4771,6 +4049,13 @@ "node": ">=8" } }, + "node_modules/defu": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", + "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", + "dev": true, + "license": "MIT" + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -4882,6 +4167,27 @@ "url": "https://dotenvx.com" } }, + "node_modules/dts-resolver": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/dts-resolver/-/dts-resolver-3.0.0.tgz", + "integrity": "sha512-1T1f+z+4tl9XD+m+0HBgWoL/nm0bOIffyWaUuUSBlFg/86IWvfx+wjNaO/ybU0AJzG9/Mi5hBUgGV6zCmWEN7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "oxc-resolver": ">=11.0.0" + }, + "peerDependenciesMeta": { + "oxc-resolver": { + "optional": true + } + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -4920,6 +4226,16 @@ "dev": true, "license": "MIT" }, + "node_modules/empathic": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.1.0.tgz", + "integrity": "sha512-AnfC1ATldl49/cvZdLPDjBfrRNwbDO05aibiOtzQu3qtlbJtomNLhF30HEtn/7iBz50dlMECqATo3fG0LrdEgw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, "node_modules/encodeurl": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", @@ -5066,48 +4382,6 @@ "es6-symbol": "^3.1.1" } }, - "node_modules/esbuild": { - "version": "0.27.7", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.7.tgz", - "integrity": "sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.7", - "@esbuild/android-arm": "0.27.7", - "@esbuild/android-arm64": "0.27.7", - "@esbuild/android-x64": "0.27.7", - "@esbuild/darwin-arm64": "0.27.7", - "@esbuild/darwin-x64": "0.27.7", - "@esbuild/freebsd-arm64": "0.27.7", - "@esbuild/freebsd-x64": "0.27.7", - "@esbuild/linux-arm": "0.27.7", - "@esbuild/linux-arm64": "0.27.7", - "@esbuild/linux-ia32": "0.27.7", - "@esbuild/linux-loong64": "0.27.7", - "@esbuild/linux-mips64el": "0.27.7", - "@esbuild/linux-ppc64": "0.27.7", - "@esbuild/linux-riscv64": "0.27.7", - "@esbuild/linux-s390x": "0.27.7", - "@esbuild/linux-x64": "0.27.7", - "@esbuild/netbsd-arm64": "0.27.7", - "@esbuild/netbsd-x64": "0.27.7", - "@esbuild/openbsd-arm64": "0.27.7", - "@esbuild/openbsd-x64": "0.27.7", - "@esbuild/openharmony-arm64": "0.27.7", - "@esbuild/sunos-x64": "0.27.7", - "@esbuild/win32-arm64": "0.27.7", - "@esbuild/win32-ia32": "0.27.7", - "@esbuild/win32-x64": "0.27.7" - } - }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -6058,18 +5332,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fix-dts-default-cjs-exports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz", - "integrity": "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "magic-string": "^0.30.17", - "mlly": "^1.7.4", - "rollup": "^4.34.8" - } - }, "node_modules/flat-cache": { "version": "6.1.23", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.23.tgz", @@ -6326,6 +5588,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-tsconfig": { + "version": "5.0.0-beta.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-5.0.0-beta.6.tgz", + "integrity": "sha512-X6fBC0pmImC70gvX2zm56go9hx0MyoGVdG0tUCkg/D+Xnh5TJsOZ7iDbOdI3PvmtrDxnu1YdDufpK2QJX1Meqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "engines": { + "node": ">=20.20.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -6529,6 +5807,13 @@ "node": ">=16.9.0" } }, + "node_modules/hookable": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-6.1.2.tgz", + "integrity": "sha512-+abwxtiEA52GCVIsQqut3S/uKTbUwYIp4Pe/vv+6py5XiXBCqMZHg6pA6Y5qhgLSEys0/cYuPbO0z1QFj5ZCmg==", + "dev": true, + "license": "MIT" + }, "node_modules/hookified": { "version": "1.15.1", "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.15.1.tgz", @@ -6645,6 +5930,19 @@ "node": ">= 4" } }, + "node_modules/import-without-cache": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/import-without-cache/-/import-without-cache-0.4.1.tgz", + "integrity": "sha512-vXoV9PjKHEednCUu01e98TkImxy67e3BJXbTIOmIq4Hyzw3IAwYRcuPkfeTzJzwyyts4kjuA73x+pWJLc4f86A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -6959,16 +6257,6 @@ "url": "https://github.com/sponsors/panva" } }, - "node_modules/joycon": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", - "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, "node_modules/js-tokens": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-10.0.0.tgz", @@ -7373,36 +6661,6 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" - }, - "node_modules/load-tsconfig": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", - "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -7752,19 +7010,6 @@ "dev": true, "license": "MIT" }, - "node_modules/mlly": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", - "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.16.0", - "pathe": "^2.0.3", - "pkg-types": "^1.3.1", - "ufo": "^1.6.3" - } - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -7775,20 +7020,8 @@ "version": "0.0.8", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true, - "license": "ISC" - }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } + "dev": true, + "license": "ISC" }, "node_modules/nan": { "version": "2.29.0", @@ -8373,16 +7606,6 @@ "integrity": "sha512-BndPH67/JxGExRgiX1dX0w1FvZck5Wa4aal9198SrRhZjH3GxKQUKIBnYJTdj2HDN3UQAS06HlfcSbQj2OHmaw==", "license": "MIT" }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/pkce-challenge": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", @@ -8392,18 +7615,6 @@ "node": ">=16.20.0" } }, - "node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" - } - }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -8443,49 +7654,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-load-config": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", - "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "lilconfig": "^3.1.1" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "jiti": ">=1.21.0", - "postcss": ">=8.0.9", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -8678,6 +7846,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/quansync": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-1.0.0.tgz", + "integrity": "sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, "node_modules/quick-format-unescaped": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", @@ -8799,20 +7984,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/readdirp": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 14.18.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/real-require": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/real-require/-/real-require-1.0.0.tgz", @@ -8880,14 +8051,14 @@ "dev": true, "license": "MIT" }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, "node_modules/responselike": { @@ -8996,50 +8167,64 @@ "@rolldown/binding-win32-x64-msvc": "1.2.13" } }, - "node_modules/rollup": { - "version": "4.64.5", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.64.5.tgz", - "integrity": "sha512-EAP5ZHcz2ijbgCWwPkpI7zh6bfsri2Ez5FtCy2dCp1k62duXzfG7DLGGh7RU2QQXWwavT+u4qpvDF/TWOiiGTw==", + "node_modules/rolldown-plugin-dts": { + "version": "0.28.8", + "resolved": "https://registry.npmjs.org/rolldown-plugin-dts/-/rolldown-plugin-dts-0.28.8.tgz", + "integrity": "sha512-FVhfqxorCWcc20BVT5eVRfRjzLLl6mgzjcMR4gSBf0K4oQMXT0qoHhhzfXy0L7y83fQy7Ug5ZDNk90xM3/LiCQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.9" - }, - "bin": { - "rollup": "dist/bin/rollup" + "dts-resolver": "^3.0.0", + "get-tsconfig": "5.0.0-beta.6", + "obug": "^3.0.0", + "yuku-ast": "^0.19.0", + "yuku-codegen": "^0.19.0", + "yuku-parser": "^0.19.0" }, "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, - "optionalDependencies": { - "@napi-rs/lzma-linux-x64-gnu": "1.5.1", - "@rollup/rollup-android-arm-eabi": "4.64.5", - "@rollup/rollup-android-arm64": "4.64.5", - "@rollup/rollup-darwin-arm64": "4.64.5", - "@rollup/rollup-darwin-x64": "4.64.5", - "@rollup/rollup-freebsd-arm64": "4.64.5", - "@rollup/rollup-freebsd-x64": "4.64.5", - "@rollup/rollup-linux-arm-gnueabihf": "4.64.5", - "@rollup/rollup-linux-arm-musleabihf": "4.64.5", - "@rollup/rollup-linux-arm64-gnu": "4.64.5", - "@rollup/rollup-linux-arm64-musl": "4.64.5", - "@rollup/rollup-linux-loong64-gnu": "4.64.5", - "@rollup/rollup-linux-loong64-musl": "4.64.5", - "@rollup/rollup-linux-ppc64-gnu": "4.64.5", - "@rollup/rollup-linux-ppc64-musl": "4.64.5", - "@rollup/rollup-linux-riscv64-gnu": "4.64.5", - "@rollup/rollup-linux-riscv64-musl": "4.64.5", - "@rollup/rollup-linux-s390x-gnu": "4.64.5", - "@rollup/rollup-linux-x64-gnu": "4.64.5", - "@rollup/rollup-linux-x64-musl": "4.64.5", - "@rollup/rollup-openbsd-x64": "4.64.5", - "@rollup/rollup-openharmony-arm64": "4.64.5", - "@rollup/rollup-win32-arm64-msvc": "4.64.5", - "@rollup/rollup-win32-ia32-msvc": "4.64.5", - "@rollup/rollup-win32-x64-gnu": "4.64.5", - "@rollup/rollup-win32-x64-msvc": "4.64.5", - "fsevents": "~2.3.2" + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@typescript/native-preview": "*", + "@volar/typescript": "~2.4.0", + "@vue/language-core": "~3.2.0 || ~3.3.0", + "rolldown": "^1.2.0", + "typescript": "^5.0.0 || ^6.0.0 || ~7.0.0", + "vue-tsc": "~3.2.0 || ~3.3.0" + }, + "peerDependenciesMeta": { + "@typescript/native-preview": { + "optional": true + }, + "@volar/typescript": { + "optional": true + }, + "@vue/language-core": { + "optional": true + }, + "typescript": { + "optional": true + }, + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/rolldown-plugin-dts/node_modules/obug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/obug/-/obug-3.0.0.tgz", + "integrity": "sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" } }, "node_modules/router": { @@ -9443,16 +8628,6 @@ "node": ">=0.10.0" } }, - "node_modules/source-map": { - "version": "0.7.6", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">= 12" - } - }, "node_modules/source-map-js": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz", @@ -9622,39 +8797,6 @@ "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/sucrase": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", - "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "tinyglobby": "^0.2.11", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -9807,29 +8949,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/thread-stream": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-4.2.0.tgz", @@ -9870,13 +8989,6 @@ "dev": true, "license": "MIT" }, - "node_modules/tinyexec": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", - "dev": true, - "license": "MIT" - }, "node_modules/tinyglobby": { "version": "0.2.17", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", @@ -10009,73 +9121,119 @@ "typescript": ">=4.8.4" } }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/tsup": { - "version": "8.5.1", - "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.5.1.tgz", - "integrity": "sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==", + "node_modules/tsdown": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/tsdown/-/tsdown-0.23.1.tgz", + "integrity": "sha512-MSC2WSOts3in95J334/VIS7KPfor3eCSvndJ6KdoVj9Aak9Kh1aNfz9ws5owhdukuTNSXRdfkPEzA/ihpDD6SA==", "dev": true, "license": "MIT", "dependencies": { - "bundle-require": "^5.1.0", - "cac": "^6.7.14", - "chokidar": "^4.0.3", - "consola": "^3.4.0", - "debug": "^4.4.0", - "esbuild": "^0.27.0", - "fix-dts-default-cjs-exports": "^1.0.0", - "joycon": "^3.1.1", - "picocolors": "^1.1.1", - "postcss-load-config": "^6.0.1", - "resolve-from": "^5.0.0", - "rollup": "^4.34.8", - "source-map": "^0.7.6", - "sucrase": "^3.35.0", - "tinyexec": "^0.3.2", - "tinyglobby": "^0.2.11", - "tree-kill": "^1.2.2" + "cac": "^7.0.1", + "defu": "^6.1.7", + "empathic": "^2.1.0", + "hookable": "^6.1.2", + "import-without-cache": "^0.4.1", + "obug": "^3.0.0", + "picomatch": "^4.0.7", + "rolldown": "~1.2.13", + "rolldown-plugin-dts": "^0.28.7", + "tinyexec": "^1.3.1", + "tinyglobby": "^0.2.17", + "tree-kill": "^1.2.2", + "unconfig-core": "^7.5.0", + "verkit": "^0.5.0" }, "bin": { - "tsup": "dist/cli-default.js", - "tsup-node": "dist/cli-node.js" + "tsdown": "dist/run.mjs" }, "engines": { - "node": ">=18" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" }, "peerDependencies": { - "@microsoft/api-extractor": "^7.36.0", - "@swc/core": "^1", - "postcss": "^8.4.12", - "typescript": ">=4.5.0" + "@arethetypeswrong/core": "^0.18.1", + "@tsdown/css": "0.23.1", + "@tsdown/exe": "0.23.1", + "@vitejs/devtools": "*", + "publint": "^0.3.8", + "tsx": "*", + "typescript": "^5.0.0 || ^6.0.0 || ^7.0.0", + "unplugin-unused": ">=0.5.0", + "unrun": "*" }, "peerDependenciesMeta": { - "@microsoft/api-extractor": { + "@arethetypeswrong/core": { + "optional": true + }, + "@tsdown/css": { + "optional": true + }, + "@tsdown/exe": { + "optional": true + }, + "@vitejs/devtools": { "optional": true }, - "@swc/core": { + "publint": { "optional": true }, - "postcss": { + "tsx": { "optional": true }, "typescript": { "optional": true + }, + "unplugin-unused": { + "optional": true + }, + "unrun": { + "optional": true } } }, + "node_modules/tsdown/node_modules/cac": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cac/-/cac-7.1.0.tgz", + "integrity": "sha512-LMDU/U2yA4IPIY8KT0NsNPWEYZvAMkbgyspxJ6btJaYV+WMDOHAZCmB0lsTObiHaRS1V/ztKAl7+TSkTqXyeoA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=20.19.0" + } + }, + "node_modules/tsdown/node_modules/obug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/obug/-/obug-3.0.0.tgz", + "integrity": "sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, + "node_modules/tsdown/node_modules/tinyexec": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.1.tgz", + "integrity": "sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, "node_modules/tsx": { "version": "4.23.15", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.15.tgz", @@ -10691,13 +9849,6 @@ "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/ufo": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", - "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", - "dev": true, - "license": "MIT" - }, "node_modules/unbzip2-stream": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", @@ -10709,6 +9860,20 @@ "through": "^2.3.8" } }, + "node_modules/unconfig-core": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/unconfig-core/-/unconfig-core-7.5.0.tgz", + "integrity": "sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@quansync/fs": "^1.0.0", + "quansync": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/undici-types": { "version": "8.9.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.9.0.tgz", @@ -10772,6 +9937,19 @@ "node": ">= 0.8" } }, + "node_modules/verkit": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/verkit/-/verkit-0.5.0.tgz", + "integrity": "sha512-u4J1hr6Y+C/hit34GwL3eIcUf3wngT8TlYUjK7tk0jxydKLAq3sYvifjdTDA6U3KCKRcQCQDGf/srjxfZF3l7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, "node_modules/viem": { "version": "2.57.4", "resolved": "https://registry.npmjs.org/viem/-/viem-2.57.4.tgz", @@ -11218,6 +10396,73 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/yuku-ast": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/yuku-ast/-/yuku-ast-0.19.0.tgz", + "integrity": "sha512-PyCsiScaelhxBGzL8dyeJkLqvRZycoh78R31Vrt/WqYrm0hMFoKwIw/X7Dx5mBKLWAMlV9I9HEyBOHnj2gZVyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@yuku-toolchain/types": "^0.19.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/yuku-codegen": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/yuku-codegen/-/yuku-codegen-0.19.0.tgz", + "integrity": "sha512-uymAKHjDuaP4BEpkXC/BSLz4DUEF5oArZ5AuD3888nb2miChjWSgpPdojEJxm3pjpXkgUaCRJQyNAbnMN33wHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@yuku-toolchain/types": "^0.19.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/yuku-core": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/yuku-core/-/yuku-core-0.19.0.tgz", + "integrity": "sha512-kYK9e1XdfirNhkipzW0wmMcSWcVF/CWnuugodfVYRCUwvoBefweL9HzB96OiKEhsx78V5WbUxbJqlizMX869Qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@yuku-toolchain/types": "^0.19.0" + }, + "engines": { + "node": ">=14.18.0" + }, + "optionalDependencies": { + "@yuku-core/binding-android-arm64": "0.19.0", + "@yuku-core/binding-darwin-arm64": "0.19.0", + "@yuku-core/binding-darwin-x64": "0.19.0", + "@yuku-core/binding-freebsd-x64": "0.19.0", + "@yuku-core/binding-linux-arm-gnu": "0.19.0", + "@yuku-core/binding-linux-arm-musl": "0.19.0", + "@yuku-core/binding-linux-arm64-gnu": "0.19.0", + "@yuku-core/binding-linux-arm64-musl": "0.19.0", + "@yuku-core/binding-linux-x64-gnu": "0.19.0", + "@yuku-core/binding-linux-x64-musl": "0.19.0", + "@yuku-core/binding-win32-arm64": "0.19.0", + "@yuku-core/binding-win32-x64": "0.19.0" + } + }, + "node_modules/yuku-parser": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/yuku-parser/-/yuku-parser-0.19.0.tgz", + "integrity": "sha512-XrBh9ZiQK5mJVRxZBAvD6LwRyAYrK3MFtH3+onyuxFL5hFD44EC3QOmIC1FjTj6H2MMwq46/NAI+NZxLZPZgxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@yuku-toolchain/types": "^0.19.0", + "yuku-core": "0.19.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, "node_modules/zod": { "version": "4.6.6", "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.6.tgz", diff --git a/scw_js/package.json b/scw_js/package.json index 992bc9f31..6e2dc6092 100644 --- a/scw_js/package.json +++ b/scw_js/package.json @@ -8,7 +8,7 @@ "generate:openapi:llm": "tsx scripts/generate-openapi-llm.ts && prettier --write --log-level warn openapi.llm.json", "generate:openapi:search": "tsx scripts/generate-openapi-search.ts && prettier --write --log-level warn openapi.search.json", "generate:openapi": "npm run generate:openapi:genimg && npm run generate:openapi:llm && npm run generate:openapi:search", - "build": "npm run generate:openapi && tsup", + "build": "npm run generate:openapi && tsdown", "predeploy": "npm run fee-allowances", "deploy": "npm run build && npx osls deploy", "fee-allowances": "tsx scripts/fee_allowances.ts", @@ -44,7 +44,7 @@ "fastify": "^5.12.1", "prettier": "^3.6.2", "serverless-scaleway-functions": ">=0.5.1", - "tsup": "^8.5.1", + "tsdown": "^0.23.1", "typescript": "^5.9.3", "typescript-eslint": "^8.58.2", "vitest": "^4.1.11" diff --git a/scw_js/scripts/openapi-codegen.ts b/scw_js/scripts/openapi-codegen.ts index 58555c49f..0075f2430 100644 --- a/scw_js/scripts/openapi-codegen.ts +++ b/scw_js/scripts/openapi-codegen.ts @@ -4,7 +4,7 @@ * Extracted once `openapi.llm.json` became the second spec generated this way (genimg was the * first). Deliberately a **local module, not a `shared/` package**: the genuinely common surface is * ~20 lines, and a `shared/` package would add a `file:` build-ordering dependency to this - * package's deploy path — `build` runs the generators before `tsup`, so an unbuilt shared package + * package's deploy path — `build` runs the generators before `tsdown`, so an unbuilt shared package * would break `npm run build` and `npm run deploy`. Promote it only when a third *package* needs it. * See `genimg-openai-compat-migration.md` §3. * diff --git a/scw_js/test/handler_purity.test.ts b/scw_js/test/handler_purity.test.ts index e3bed523a..b70752049 100644 --- a/scw_js/test/handler_purity.test.ts +++ b/scw_js/test/handler_purity.test.ts @@ -9,7 +9,7 @@ import { fileURLToPath } from "node:url"; * exists only for the local dev servers; when a handler imported it anyway (even inside * a NODE_ENV=test block), Dependabot reported payment-endpoint CVEs that looked * production-critical and every triage had to re-verify they were not. The local - * servers live in dev_server_*.ts, which tsup never bundles. + * servers live in dev_server_*.ts, which tsdown never bundles. */ const TEST_DIR = path.dirname(fileURLToPath(import.meta.url)); diff --git a/scw_js/tsdown.config.ts b/scw_js/tsdown.config.ts new file mode 100644 index 000000000..e12ac591d --- /dev/null +++ b/scw_js/tsdown.config.ts @@ -0,0 +1,33 @@ +import { defineConfig } from "tsdown"; + +export default defineConfig({ + entry: [ + "genimg_x402_token.ts", + "sc_llm_x402.ts", + "llm_x402_cron.ts", + "growth_api.ts", + "search_api.ts", + "mcp_server.ts", + ], + format: "esm", + platform: "node", + target: "node22", + outDir: "dist", + // Emit .js, not .mjs — serverless.yml handlers reference dist/*.js. + fixedExtension: false, + // Nothing consumes a deployed handler's types; tsconfig's declaration: true + // would auto-enable dts, so keep the dist shape tsup produced. + dts: false, + sourcemap: true, + // Minified for cold-start parse time; correlate production stack traces + // locally against the sourcemap of the same build (sourcemap: true above). + minify: true, + // Bundle all npm dependencies (Node built-ins are always external). + deps: { alwaysBundle: [/.*/] }, + // createRequire banner for packages that use dynamic require() (like pino). + // The import is aliased: rolldown's own runtime chunks import `createRequire` + // unaliased, and a bare re-import in the same file is a SyntaxError. + banner: { + js: `import { createRequire as __fretchenCr } from 'module'; const require = __fretchenCr(import.meta.url);`, + }, +}); diff --git a/scw_js/tsup.config.js b/scw_js/tsup.config.js deleted file mode 100644 index 1a6f842d5..000000000 --- a/scw_js/tsup.config.js +++ /dev/null @@ -1,31 +0,0 @@ -import { defineConfig } from "tsup"; -import { builtinModules } from "module"; - -export default defineConfig({ - entry: [ - "genimg_x402_token.ts", - "sc_llm_x402.ts", - "llm_x402_cron.ts", - "growth_api.ts", - "search_api.ts", - "mcp_server.ts", - ], - format: ["esm"], - platform: "node", - target: "node22", - outDir: "dist", - splitting: false, - clean: true, - // Minified for cold-start parse time; correlate production stack traces - // locally against the sourcemap of the same build (sourcemap: true below). - minify: true, - sourcemap: true, - // Node.js built-ins must be external (async_hooks, fs, path, etc.) - external: [...builtinModules, ...builtinModules.map((m) => `node:${m}`)], - // Bundle all npm dependencies - noExternal: [/.*/], - // Add createRequire banner for packages that use dynamic require() (like pino) - banner: { - js: `import { createRequire } from 'module'; const require = createRequire(import.meta.url);`, - }, -}); diff --git a/x402_facilitator/package-lock.json b/x402_facilitator/package-lock.json index 40cbb98cb..29c4498e2 100644 --- a/x402_facilitator/package-lock.json +++ b/x402_facilitator/package-lock.json @@ -25,7 +25,7 @@ "eslint": "^10.0.0", "prettier": "^3.0.0", "serverless-scaleway-functions": ">=0.4.16", - "tsup": "^9.0.0", + "tsdown": "^0.23.1", "tsx": "^4.23.13", "typescript": "^5.9.3", "typescript-eslint": "^8.60.0", @@ -962,17 +962,6 @@ } } }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", @@ -1083,26 +1072,6 @@ "semver": "bin/semver.js" } }, - "node_modules/@napi-rs/lzma-linux-x64-gnu": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", - "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", - "cpu": [ - "x64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": "^22.20 || ^24.12 || >=25" - } - }, "node_modules/@noble/ciphers": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@noble/ciphers/-/ciphers-1.3.0.tgz", @@ -1234,6 +1203,19 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/@quansync/fs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@quansync/fs/-/fs-1.1.0.tgz", + "integrity": "sha512-qAPG/t3HqML1TlN7sY/pTbEjzFVAKsMjNNMGheyDosro+kT4iw2KCUoHcVdmliwWjorm4elZbgNQyU2eD97eDg==", + "dev": true, + "license": "MIT", + "dependencies": { + "quansync": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, "node_modules/@rolldown/binding-android-arm-eabi": { "version": "1.2.13", "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.13.tgz", @@ -1509,396 +1491,41 @@ }, "node_modules/@rolldown/pluginutils": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", - "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.64.7.tgz", - "integrity": "sha512-GFF2tHk0NqYVObrK0+/ps/LEXsV/v2q6Lyiy7mZr+Ej24fpQScvqK2ziz9NHeEQYnKWKym38Ml7dZbPtC9tuAw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.64.7.tgz", - "integrity": "sha512-BOymcXJFYYXqluDidj6sLelNjXruC3u1BqVxLn2OPCXH9xaPSOTH+MS4uychsGI1NU7tJoiv9KvqijDHFe+hhQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.64.7.tgz", - "integrity": "sha512-jgVpGweIbls2H5jfBB70tnX52abMd5pJr3xmtoDILx6JdmGl+Un+tMb9R+MbHPVB46tTBpY8emtn7M71SnQhEQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.64.7.tgz", - "integrity": "sha512-AVMpt94mrXH7WjyWKmd9nT4RC5yM0AN3Lt6A89xVIsuLDi3dDX6dxMytLbW36FlppY9JsoqUoS3LUUpUrYxiMQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.64.7.tgz", - "integrity": "sha512-Nje29c/MyajxRNFGU05oyeTDS6SWdMg/wWMSlZSBTBju5BKz2NVc0kFiFSQGzRELNiB+CBk/ZvAVsWsENgjGag==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.64.7.tgz", - "integrity": "sha512-xxgN5/kMzCNz/NYJ4t49B0/WS6InNlWv6xvgwUQqNnWM9WJMMwMUGWrAxdNEgYWdHL0sMnuh8I87StGrIMTA+w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.64.7.tgz", - "integrity": "sha512-5U/9gVn/X657I8+NHoHO9Wnfyd0lEXwqbslobRoB9TC8SwYzOitcIr6TLE7531Q/NWs3L4mb+YOGzlf3vHIeYw==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.64.7.tgz", - "integrity": "sha512-hcDS0a/Y8ggM3dcOfzH7UpSaogCViWTtNDSl0EXpWIj8g8/r86ITqptjil2hayTXS0Umzb+Yt3mjgpQVFVf2+A==", - "cpu": [ - "arm" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.64.7.tgz", - "integrity": "sha512-awbAr4N7Qd/yjZAQBEEPzgcPveYG2Gi5L6gq1/Bp+3SMRjn5F68Wv1zKsntzvvoioBR6yKvhLtWqu11am1TsxA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.64.7.tgz", - "integrity": "sha512-Ut7xQJfeLhzu2yN3rHzVvL9ccyPJvN4aCdP1V7hJ5lGxX/eCzgB9SiMk/Md3J+rWWZgvoYsDW4BUFggJr32pBA==", - "cpu": [ - "arm64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.64.7.tgz", - "integrity": "sha512-trqoni/vHkuM5oo5iQhoKPh6fjjD7E80pMgCXWgGxU8vSRPUlwvG8GeYvEEcB6eJAxNa99WH9iVHPHelgtKiHA==", - "cpu": [ - "loong64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loong64-musl": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.64.7.tgz", - "integrity": "sha512-gvlUy0XFIwtUWiQmhc+4GT2Knm3KosinpUVhr7CtTFA78gFDnE5NWwMPzHrJsYpKkh2LlY7yvBIboN1FAV6Xeg==", - "cpu": [ - "loong64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.64.7.tgz", - "integrity": "sha512-8yS/kSXTJ/47Z62JW+C2AJ3vd/8zZw016vFjtNpZwmZlwJumLua4s1i78dkYuSSqQ+0aIMxJcBp/4uIwp2ehjA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-ppc64-musl": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.64.7.tgz", - "integrity": "sha512-mxVSKvvty0hOP1AFo/l4Kpv3i3HK0zx4rYUrirZDToYlWhS3xzmIkq3vUJ7rtrM2cPyXveDyDT6M1FfXZ9hTRA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.64.7.tgz", - "integrity": "sha512-lEse1zra1CagM+uHH2bl28GInDsZZ45NJzHei2OMaXQFzZWKBO1hFo07rS0xB6ayV4WU360UrSmPDSyCMpYsUQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.64.7.tgz", - "integrity": "sha512-d/cqCoiG9WMZ5VuJZ5Qdlv9g97QyoGwnmvHccvGhKSacTy7xFrAS+jMcJSBdMNOw1oacSkl6p7K6O/DRYTKL3g==", - "cpu": [ - "riscv64" - ], - "dev": true, - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.64.7.tgz", - "integrity": "sha512-kVEA//CeDOZZP1XCH2JBgqXb9+ALlwuA/4civaazMVdgzaSQC9WM38w65zG/LLk0lA7F9Od19CSBZW7J9mCbNg==", - "cpu": [ - "s390x" - ], - "dev": true, - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.64.7.tgz", - "integrity": "sha512-14oLfDsOSr0TSntT/34jRg/V8B2XW/Jomh9zX9CjIM9gwwNlI1OCymS/GVn0DV32h67eRf7U0GGem0rvfXgNwQ==", - "cpu": [ - "x64" - ], - "libc": [ - "glibc" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.64.7.tgz", - "integrity": "sha512-dFVtPfjZqAnUPpPY4Bfg+87yo1IBW9HiY8iCFtg49Pn46MfZTebSHZh8PL6SOsgyt9LQP8Nj/sE6jm3aWpySmQ==", - "cpu": [ - "x64" - ], - "libc": [ - "musl" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openbsd-x64": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.64.7.tgz", - "integrity": "sha512-Dm9CZ2SM3u2NgvBj4awW/gGqkOwzH8f6MSYIJE6+bKcKLI+T0+LhpD6vtetTfrIIx+rLXDf5RJqBP6v7V5O+wg==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.64.7.tgz", - "integrity": "sha512-oaxsvS2mL6+78741CT2HCORBvy1USg3Wqpt5qvZwy3aMXRMl4zxyDo8maeFRWJkF3dp0Wbi71fKH5Gr9YI3vYA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.64.7.tgz", - "integrity": "sha512-UKZz1Y4mxUqkWh60uH7B1aZn6UcAimPk4ipRktpb3wfZq7JrzZYyAXTwiafkb3T+kd5P3Sf+vzcRdsDks4WtjQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.64.7.tgz", - "integrity": "sha512-WWkSuC1J+mZJnsDh0mRaCAFSWfQdl6y3fDjZeWElI6zHo8CcOSG5lY3yurKJjEq+FrX0WD60sFrVVpbHqzMmrw==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" }, - "node_modules/@rollup/rollup-win32-x64-gnu": { + "node_modules/@rollup/rollup-linux-x64-gnu": { "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.64.7.tgz", - "integrity": "sha512-u9bp2yXCI3/BUjUxY6uWknAY32pfvvDCPysyUTySotx0dj3ydlFHrRQYfn/b/kZgnfjyEwySMtI7Ga054uiysQ==", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.64.7.tgz", + "integrity": "sha512-14oLfDsOSr0TSntT/34jRg/V8B2XW/Jomh9zX9CjIM9gwwNlI1OCymS/GVn0DV32h67eRf7U0GGem0rvfXgNwQ==", "cpu": [ "x64" ], - "dev": true, + "libc": [ + "glibc" + ], "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ] }, - "node_modules/@rollup/rollup-win32-x64-msvc": { + "node_modules/@rollup/rollup-linux-x64-musl": { "version": "4.64.7", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.64.7.tgz", - "integrity": "sha512-EhX6N3XPMEnVU5cRfNgzPOKcSucsbu3nNNWuoAaEuKIqmddBKHN5b9d4rPe65T1I+FaOT176JKiZNsUBp3rqbA==", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.64.7.tgz", + "integrity": "sha512-dFVtPfjZqAnUPpPY4Bfg+87yo1IBW9HiY8iCFtg49Pn46MfZTebSHZh8PL6SOsgyt9LQP8Nj/sE6jm3aWpySmQ==", "cpu": [ "x64" ], - "dev": true, + "libc": [ + "musl" + ], "license": "MIT", "optional": true, "os": [ - "win32" + "linux" ] }, "node_modules/@scaleway/serverless-functions": { @@ -2568,6 +2195,199 @@ "url": "https://github.com/sponsors/colinhacks" } }, + "node_modules/@yuku-core/binding-android-arm64": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-android-arm64/-/binding-android-arm64-0.19.0.tgz", + "integrity": "sha512-wdL2XmTiZixAOaHk9Z0JJZ8u9Qm8d333Zjpc6gaxXFX+UR5BlsfxZ7a2+2Rm71pamppsPYGUGFq2oVLbh6DISw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@yuku-core/binding-darwin-arm64": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-darwin-arm64/-/binding-darwin-arm64-0.19.0.tgz", + "integrity": "sha512-7sNJa6XJhyetnTy64jw3NEi4YgUcezHk1G5GH9FSvXAuC8wIlbaOwT9lgq5qo5sspjrZJQlBR1TWflP49uRpMw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@yuku-core/binding-darwin-x64": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-darwin-x64/-/binding-darwin-x64-0.19.0.tgz", + "integrity": "sha512-pTC7dYEc59isdyizc3nsuyFNBu2LU5wMYZ1be6UMr59PY/AJNtO1aBLWV0MgL/z7C1nv/2sX4TNjGgKLoeevJw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@yuku-core/binding-freebsd-x64": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-freebsd-x64/-/binding-freebsd-x64-0.19.0.tgz", + "integrity": "sha512-xrZjF6XOEwyLOiDIfrwDdRCS6ghxcJeirNC1KivQhVcUwlRonaU79S3/Uiyx3lBylPnT8qKJ3/aMT+H52nGTJQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@yuku-core/binding-linux-arm-gnu": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-arm-gnu/-/binding-linux-arm-gnu-0.19.0.tgz", + "integrity": "sha512-0OyIH53C0I1CbADHn9FSdCfX5qbpeLwJhmOVhonFJNYheybOnkSJ50qGMfTJIb8y5zrwqvLs7FVBvz6Fk8maZg==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-core/binding-linux-arm-musl": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-arm-musl/-/binding-linux-arm-musl-0.19.0.tgz", + "integrity": "sha512-z/iPfkCOCSXE34VXNt0uP1ORSW+4mEa9b5CiJcWZeqZH08g49bFU/jRM2T04f+Wpw5mJ6HIzNBiojxeAbrHjeg==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-core/binding-linux-arm64-gnu": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.19.0.tgz", + "integrity": "sha512-jLNTi+gzaRwBJ+gwhCJ+rDb5dmx/8hEBx93UWd7hjMSqPTL1D1wvVSvXVAldV5kALvju7b0/m51EHEhs4+I1fA==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-core/binding-linux-arm64-musl": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.19.0.tgz", + "integrity": "sha512-YwyPIdW/rN2Fmv0MTFWi47FaB3F9g+2b+sJISyAw83Yd60RWH4T3Nx6XkAHHVN+uKJNBAd6So7/BVihSiFYvuQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-core/binding-linux-x64-gnu": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.19.0.tgz", + "integrity": "sha512-/vskaAXVX3ESR43FiTdfiYS7z1b9uoQJwVQ/0RgUHgN2sWoAyCZs+aX4CgU7eKGIHTVfp9VFwv+c+2XchYiEtQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-core/binding-linux-x64-musl": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-linux-x64-musl/-/binding-linux-x64-musl-0.19.0.tgz", + "integrity": "sha512-FuXL5igeSKib9Rye02TdH+D6SQezTyGxIATMu1Qsn/QywrzwpGl35OLpS2C1x5vpGLeVE2XgiLd5mVPFHmIglQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@yuku-core/binding-win32-arm64": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-win32-arm64/-/binding-win32-arm64-0.19.0.tgz", + "integrity": "sha512-YuJAe7zEKT1Xa7LuHlhGJpPnYQeVtvo0rZvNjJRqkH0hQGOw4C8QeP30Tg5VKGzZfo2x8CjhjEhKt4TmLwfmdg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@yuku-core/binding-win32-x64": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-core/binding-win32-x64/-/binding-win32-x64-0.19.0.tgz", + "integrity": "sha512-o8iY/mXwlRkedp0LNTr4+TEfXTPQwoNZmv6k+1WIAd1ZXEn8xJJTBCtB0osaVvdZo/x/cNmV16UrWrrGpM5Mvw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@yuku-toolchain/types": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/@yuku-toolchain/types/-/types-0.19.0.tgz", + "integrity": "sha512-tFkNbsP4WXX9UMUC5syJGdK9dPMLK0PPaIuXCcCYH75sZ8MrebfBZ2XvCILRTw8AgLivSSCfDa4R67iYBDa4Kg==", + "dev": true, + "license": "MIT" + }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -2770,13 +2590,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - "dev": true, - "license": "MIT" - }, "node_modules/aproba": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.1.0.tgz", @@ -3089,22 +2902,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bundle-require": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", - "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==", - "dev": true, - "license": "MIT", - "dependencies": { - "load-tsconfig": "^0.2.3" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "esbuild": ">=0.18" - } - }, "node_modules/cac": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/cac/-/cac-7.1.0.tgz", @@ -3268,22 +3065,6 @@ "dev": true, "license": "MIT" }, - "node_modules/chokidar": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-5.0.0.tgz", - "integrity": "sha512-TQMmc3w+5AxjpL8iIiwebF73dRDF4fBIieAqGn9RGCWaEVwQ6Fb2cGe31Yns0RRIzii5goJ1Y7xbMwo1TxMplw==", - "dev": true, - "license": "MIT", - "dependencies": { - "readdirp": "^5.0.0" - }, - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", @@ -3534,23 +3315,6 @@ "dev": true, "license": "MIT" }, - "node_modules/confbox": { - "version": "0.1.8", - "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - "dev": true, - "license": "MIT" - }, - "node_modules/consola": { - "version": "3.4.2", - "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.18.0 || >=16.10.0" - } - }, "node_modules/console-control-strings": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", @@ -3918,6 +3682,13 @@ "node": ">=8" } }, + "node_modules/defu": { + "version": "6.1.7", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.7.tgz", + "integrity": "sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==", + "dev": true, + "license": "MIT" + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -4007,6 +3778,27 @@ "url": "https://dotenvx.com" } }, + "node_modules/dts-resolver": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/dts-resolver/-/dts-resolver-3.0.0.tgz", + "integrity": "sha512-1T1f+z+4tl9XD+m+0HBgWoL/nm0bOIffyWaUuUSBlFg/86IWvfx+wjNaO/ybU0AJzG9/Mi5hBUgGV6zCmWEN7Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "oxc-resolver": ">=11.0.0" + }, + "peerDependenciesMeta": { + "oxc-resolver": { + "optional": true + } + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -4040,6 +3832,16 @@ "dev": true, "license": "MIT" }, + "node_modules/empathic": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/empathic/-/empathic-2.1.0.tgz", + "integrity": "sha512-AnfC1ATldl49/cvZdLPDjBfrRNwbDO05aibiOtzQu3qtlbJtomNLhF30HEtn/7iBz50dlMECqATo3fG0LrdEgw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=14" + } + }, "node_modules/end-of-stream": { "version": "1.4.5", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz", @@ -4859,18 +4661,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/fix-dts-default-cjs-exports": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz", - "integrity": "sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "magic-string": "^0.30.17", - "mlly": "^1.7.4", - "rollup": "^4.34.8" - } - }, "node_modules/flat-cache": { "version": "6.1.23", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-6.1.23.tgz", @@ -5123,6 +4913,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/get-tsconfig": { + "version": "5.0.0-beta.6", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-5.0.0-beta.6.tgz", + "integrity": "sha512-X6fBC0pmImC70gvX2zm56go9hx0MyoGVdG0tUCkg/D+Xnh5TJsOZ7iDbOdI3PvmtrDxnu1YdDufpK2QJX1Meqw==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "engines": { + "node": ">=20.20.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -5320,6 +5126,13 @@ "node": ">= 0.4" } }, + "node_modules/hookable": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-6.1.2.tgz", + "integrity": "sha512-+abwxtiEA52GCVIsQqut3S/uKTbUwYIp4Pe/vv+6py5XiXBCqMZHg6pA6Y5qhgLSEys0/cYuPbO0z1QFj5ZCmg==", + "dev": true, + "license": "MIT" + }, "node_modules/hookified": { "version": "1.15.1", "resolved": "https://registry.npmjs.org/hookified/-/hookified-1.15.1.tgz", @@ -5417,6 +5230,19 @@ "node": ">= 4" } }, + "node_modules/import-without-cache": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/import-without-cache/-/import-without-cache-0.4.1.tgz", + "integrity": "sha512-vXoV9PjKHEednCUu01e98TkImxy67e3BJXbTIOmIq4Hyzw3IAwYRcuPkfeTzJzwyyts4kjuA73x+pWJLc4f86A==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^22.18.0 || >=24.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -5693,20 +5519,10 @@ "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/joycon": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", - "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", - "dev": true, - "license": "MIT", + "istanbul-lib-report": "^3.0.0" + }, "engines": { - "node": ">=10" + "node": ">=8" } }, "node_modules/js-tokens": { @@ -6086,36 +5902,6 @@ "url": "https://opencollective.com/parcel" } }, - "node_modules/lilconfig": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" - }, - "node_modules/load-tsconfig": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", - "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - } - }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -6442,19 +6228,6 @@ "dev": true, "license": "MIT" }, - "node_modules/mlly": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", - "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", - "dev": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.16.0", - "pathe": "^2.0.3", - "pkg-types": "^1.3.1", - "ufo": "^1.6.3" - } - }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -6469,18 +6242,6 @@ "dev": true, "license": "ISC" }, - "node_modules/mz": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, "node_modules/nan": { "version": "2.29.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.29.0.tgz", @@ -7004,28 +6765,6 @@ ], "license": "MIT" }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-types": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "confbox": "^0.1.8", - "mlly": "^1.7.4", - "pathe": "^2.0.1" - } - }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -7065,49 +6804,6 @@ "node": "^10 || ^12 || >=14" } }, - "node_modules/postcss-load-config": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", - "integrity": "sha512-oPtTM4oerL+UXmx+93ytZVN82RrlY/wPUV8IeDxFrzIjXOLF1pN+EmKPLbubvKHT2HC20xXsCAH2Z+CKV6Oz/g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "lilconfig": "^3.1.1" - }, - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "jiti": ">=1.21.0", - "postcss": ">=8.0.9", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - }, - "postcss": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", @@ -7267,6 +6963,23 @@ "dev": true, "license": "MIT" }, + "node_modules/quansync": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-1.0.0.tgz", + "integrity": "sha512-5xZacEEufv3HSTPQuchrvV6soaiACMFnq1H8wkVioctoH3TRha9Sz66lOxRwPK/qZj7HPiSveih9yAyh98gvqA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, "node_modules/quick-format-unescaped": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", @@ -7360,20 +7073,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/readdirp": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-5.1.1.tgz", - "integrity": "sha512-Kko+Y5XQ6fM+Ce3dq3m9YGxnacYZYl9cA1wZjaF3Vbry2L3i1qVg8+CAgNPsXRArPMUMCaOR7oa9Nqntc43JKA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 20.19.0" - }, - "funding": { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - }, "node_modules/real-require": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.2.0.tgz", @@ -7410,14 +7109,14 @@ "dev": true, "license": "MIT" }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, "license": "MIT", - "engines": { - "node": ">=8" + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, "node_modules/responselike": { @@ -7526,50 +7225,64 @@ "@rolldown/binding-win32-x64-msvc": "1.2.13" } }, - "node_modules/rollup": { - "version": "4.64.7", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.64.7.tgz", - "integrity": "sha512-aCiJONoZp0lNGJ6sYqspLkh6UXaWEey/7Ko2TZyXQ4kgzAhDUxAgbt/oulXKmD+zFHXw1k+RF6ZZWOrjp7DZnQ==", + "node_modules/rolldown-plugin-dts": { + "version": "0.28.8", + "resolved": "https://registry.npmjs.org/rolldown-plugin-dts/-/rolldown-plugin-dts-0.28.8.tgz", + "integrity": "sha512-FVhfqxorCWcc20BVT5eVRfRjzLLl6mgzjcMR4gSBf0K4oQMXT0qoHhhzfXy0L7y83fQy7Ug5ZDNk90xM3/LiCQ==", "dev": true, "license": "MIT", "dependencies": { - "@types/estree": "1.0.9" - }, - "bin": { - "rollup": "dist/bin/rollup" + "dts-resolver": "^3.0.0", + "get-tsconfig": "5.0.0-beta.6", + "obug": "^3.0.0", + "yuku-ast": "^0.19.0", + "yuku-codegen": "^0.19.0", + "yuku-parser": "^0.19.0" }, "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" + "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, - "optionalDependencies": { - "@napi-rs/lzma-linux-x64-gnu": "1.5.1", - "@rollup/rollup-android-arm-eabi": "4.64.7", - "@rollup/rollup-android-arm64": "4.64.7", - "@rollup/rollup-darwin-arm64": "4.64.7", - "@rollup/rollup-darwin-x64": "4.64.7", - "@rollup/rollup-freebsd-arm64": "4.64.7", - "@rollup/rollup-freebsd-x64": "4.64.7", - "@rollup/rollup-linux-arm-gnueabihf": "4.64.7", - "@rollup/rollup-linux-arm-musleabihf": "4.64.7", - "@rollup/rollup-linux-arm64-gnu": "4.64.7", - "@rollup/rollup-linux-arm64-musl": "4.64.7", - "@rollup/rollup-linux-loong64-gnu": "4.64.7", - "@rollup/rollup-linux-loong64-musl": "4.64.7", - "@rollup/rollup-linux-ppc64-gnu": "4.64.7", - "@rollup/rollup-linux-ppc64-musl": "4.64.7", - "@rollup/rollup-linux-riscv64-gnu": "4.64.7", - "@rollup/rollup-linux-riscv64-musl": "4.64.7", - "@rollup/rollup-linux-s390x-gnu": "4.64.7", - "@rollup/rollup-linux-x64-gnu": "4.64.7", - "@rollup/rollup-linux-x64-musl": "4.64.7", - "@rollup/rollup-openbsd-x64": "4.64.7", - "@rollup/rollup-openharmony-arm64": "4.64.7", - "@rollup/rollup-win32-arm64-msvc": "4.64.7", - "@rollup/rollup-win32-ia32-msvc": "4.64.7", - "@rollup/rollup-win32-x64-gnu": "4.64.7", - "@rollup/rollup-win32-x64-msvc": "4.64.7", - "fsevents": "~2.3.2" + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, + "peerDependencies": { + "@typescript/native-preview": "*", + "@volar/typescript": "~2.4.0", + "@vue/language-core": "~3.2.0 || ~3.3.0", + "rolldown": "^1.2.0", + "typescript": "^5.0.0 || ^6.0.0 || ~7.0.0", + "vue-tsc": "~3.2.0 || ~3.3.0" + }, + "peerDependenciesMeta": { + "@typescript/native-preview": { + "optional": true + }, + "@volar/typescript": { + "optional": true + }, + "@vue/language-core": { + "optional": true + }, + "typescript": { + "optional": true + }, + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/rolldown-plugin-dts/node_modules/obug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/obug/-/obug-3.0.0.tgz", + "integrity": "sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" } }, "node_modules/run-async": { @@ -7952,39 +7665,6 @@ "url": "https://github.com/sponsors/Borewit" } }, - "node_modules/sucrase": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", - "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "tinyglobby": "^0.2.11", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/sucrase/node_modules/commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -8124,29 +7804,6 @@ "safe-buffer": "~5.1.0" } }, - "node_modules/thenify": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, "node_modules/thread-stream": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-3.2.0.tgz", @@ -8317,74 +7974,79 @@ "typescript": ">=4.8.4" } }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD" - }, - "node_modules/tsup": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/tsup/-/tsup-9.0.0.tgz", - "integrity": "sha512-DHgb0bfo2gFKybOa8dRFMiHSqzWWhMkfNK0f902VVquWQtDBWExNgidHszjjDKaFd12pWPgzumpWf9nGr3gzFg==", + "node_modules/tsdown": { + "version": "0.23.1", + "resolved": "https://registry.npmjs.org/tsdown/-/tsdown-0.23.1.tgz", + "integrity": "sha512-MSC2WSOts3in95J334/VIS7KPfor3eCSvndJ6KdoVj9Aak9Kh1aNfz9ws5owhdukuTNSXRdfkPEzA/ihpDD6SA==", "dev": true, "license": "MIT", "dependencies": { - "bundle-require": "^5.1.0", - "cac": "^7.1.0", - "chokidar": "^5.0.0", - "consola": "^3.4.2", - "esbuild": "^0.28.2", - "fix-dts-default-cjs-exports": "^1.0.1", - "joycon": "^3.1.1", + "cac": "^7.0.1", + "defu": "^6.1.7", + "empathic": "^2.1.0", + "hookable": "^6.1.2", + "import-without-cache": "^0.4.1", "obug": "^3.0.0", - "picocolors": "^1.1.1", - "postcss-load-config": "^6.0.1", - "resolve-from": "^5.0.0", - "rollup": "^4.64.6", - "source-map-js": "^1.2.2", - "sucrase": "^3.35.1", + "picomatch": "^4.0.7", + "rolldown": "~1.2.13", + "rolldown-plugin-dts": "^0.28.7", "tinyexec": "^1.3.1", "tinyglobby": "^0.2.17", - "tree-kill": "^1.2.2" + "tree-kill": "^1.2.2", + "unconfig-core": "^7.5.0", + "verkit": "^0.5.0" }, "bin": { - "tsup": "dist/cli-default.js", - "tsup-node": "dist/cli-node.js" + "tsdown": "dist/run.mjs" }, "engines": { "node": "^22.18.0 || ^24.11.0 || >=26.0.0" }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + }, "peerDependencies": { - "@microsoft/api-extractor": "^7.36.0", - "@swc/core": "^1", - "postcss": "^8.4.12", - "typescript": ">=4.5.0" + "@arethetypeswrong/core": "^0.18.1", + "@tsdown/css": "0.23.1", + "@tsdown/exe": "0.23.1", + "@vitejs/devtools": "*", + "publint": "^0.3.8", + "tsx": "*", + "typescript": "^5.0.0 || ^6.0.0 || ^7.0.0", + "unplugin-unused": ">=0.5.0", + "unrun": "*" }, "peerDependenciesMeta": { - "@microsoft/api-extractor": { + "@arethetypeswrong/core": { + "optional": true + }, + "@tsdown/css": { "optional": true }, - "@swc/core": { + "@tsdown/exe": { "optional": true }, - "postcss": { + "@vitejs/devtools": { + "optional": true + }, + "publint": { + "optional": true + }, + "tsx": { "optional": true }, "typescript": { "optional": true + }, + "unplugin-unused": { + "optional": true + }, + "unrun": { + "optional": true } } }, - "node_modules/tsup/node_modules/obug": { + "node_modules/tsdown/node_modules/obug": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/obug/-/obug-3.0.0.tgz", "integrity": "sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==", @@ -8398,6 +8060,13 @@ "node": ">=12.20.0" } }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true, + "license": "0BSD" + }, "node_modules/tsx": { "version": "4.23.15", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.23.15.tgz", @@ -8510,13 +8179,6 @@ "typescript": ">=4.8.4 <6.1.0" } }, - "node_modules/ufo": { - "version": "1.6.4", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.4.tgz", - "integrity": "sha512-JFNbkD1Svwe0KvGi8GOeLcP4kAWQ609twvCdcHxq1oSL8svv39ZuSvajcD8B+5D0eL4+s1Is2D/O6KN3qcTeRA==", - "dev": true, - "license": "MIT" - }, "node_modules/unbzip2-stream": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", @@ -8528,6 +8190,20 @@ "through": "^2.3.8" } }, + "node_modules/unconfig-core": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/unconfig-core/-/unconfig-core-7.5.0.tgz", + "integrity": "sha512-Su3FauozOGP44ZmKdHy2oE6LPjk51M/TRRjHv2HNCWiDvfvCoxC2lno6jevMA91MYAdCdwP05QnWdWpSbncX/w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@quansync/fs": "^1.0.0", + "quansync": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/undici-types": { "version": "7.24.6", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.24.6.tgz", @@ -8573,6 +8249,19 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/verkit": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/verkit/-/verkit-0.5.0.tgz", + "integrity": "sha512-u4J1hr6Y+C/hit34GwL3eIcUf3wngT8TlYUjK7tk0jxydKLAq3sYvifjdTDA6U3KCKRcQCQDGf/srjxfZF3l7g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "funding": { + "url": "https://github.com/sponsors/sxzz" + } + }, "node_modules/viem": { "version": "2.57.4", "resolved": "https://registry.npmjs.org/viem/-/viem-2.57.4.tgz", @@ -9011,6 +8700,73 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/yuku-ast": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/yuku-ast/-/yuku-ast-0.19.0.tgz", + "integrity": "sha512-PyCsiScaelhxBGzL8dyeJkLqvRZycoh78R31Vrt/WqYrm0hMFoKwIw/X7Dx5mBKLWAMlV9I9HEyBOHnj2gZVyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@yuku-toolchain/types": "^0.19.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/yuku-codegen": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/yuku-codegen/-/yuku-codegen-0.19.0.tgz", + "integrity": "sha512-uymAKHjDuaP4BEpkXC/BSLz4DUEF5oArZ5AuD3888nb2miChjWSgpPdojEJxm3pjpXkgUaCRJQyNAbnMN33wHg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@yuku-toolchain/types": "^0.19.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, + "node_modules/yuku-core": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/yuku-core/-/yuku-core-0.19.0.tgz", + "integrity": "sha512-kYK9e1XdfirNhkipzW0wmMcSWcVF/CWnuugodfVYRCUwvoBefweL9HzB96OiKEhsx78V5WbUxbJqlizMX869Qg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@yuku-toolchain/types": "^0.19.0" + }, + "engines": { + "node": ">=14.18.0" + }, + "optionalDependencies": { + "@yuku-core/binding-android-arm64": "0.19.0", + "@yuku-core/binding-darwin-arm64": "0.19.0", + "@yuku-core/binding-darwin-x64": "0.19.0", + "@yuku-core/binding-freebsd-x64": "0.19.0", + "@yuku-core/binding-linux-arm-gnu": "0.19.0", + "@yuku-core/binding-linux-arm-musl": "0.19.0", + "@yuku-core/binding-linux-arm64-gnu": "0.19.0", + "@yuku-core/binding-linux-arm64-musl": "0.19.0", + "@yuku-core/binding-linux-x64-gnu": "0.19.0", + "@yuku-core/binding-linux-x64-musl": "0.19.0", + "@yuku-core/binding-win32-arm64": "0.19.0", + "@yuku-core/binding-win32-x64": "0.19.0" + } + }, + "node_modules/yuku-parser": { + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/yuku-parser/-/yuku-parser-0.19.0.tgz", + "integrity": "sha512-XrBh9ZiQK5mJVRxZBAvD6LwRyAYrK3MFtH3+onyuxFL5hFD44EC3QOmIC1FjTj6H2MMwq46/NAI+NZxLZPZgxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@yuku-toolchain/types": "^0.19.0", + "yuku-core": "0.19.0" + }, + "engines": { + "node": ">=14.18.0" + } + }, "node_modules/zod": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/zod/-/zod-4.5.4.tgz", diff --git a/x402_facilitator/package.json b/x402_facilitator/package.json index 1cd28f3d8..eacbe0e40 100644 --- a/x402_facilitator/package.json +++ b/x402_facilitator/package.json @@ -6,7 +6,7 @@ "main": "dist/x402_facilitator.js", "scripts": { "generate:openapi": "tsx scripts/generate-openapi.ts && prettier --write --log-level warn openapi.json", - "build": "npm run generate:openapi && tsup", + "build": "npm run generate:openapi && tsdown", "predev": "npm run build", "dev": "NODE_ENV=test node dist/x402_facilitator.js", "test": "vitest run", @@ -51,7 +51,7 @@ "eslint": "^10.0.0", "prettier": "^3.0.0", "serverless-scaleway-functions": ">=0.4.16", - "tsup": "^9.0.0", + "tsdown": "^0.23.1", "tsx": "^4.23.13", "typescript": "^5.9.3", "typescript-eslint": "^8.60.0", diff --git a/x402_facilitator/serverless.yml b/x402_facilitator/serverless.yml index 77c3c070d..9ed35927f 100644 --- a/x402_facilitator/serverless.yml +++ b/x402_facilitator/serverless.yml @@ -47,7 +47,7 @@ plugins: package: patterns: # Exclude everything, then include ONLY the bundled runtime output. - # (tsup inlines all deps into dist/*.js, so nothing else is needed at runtime.) + # (tsdown inlines all deps into dist/*.js, so nothing else is needed at runtime.) # This is robust: it won't accidentally package new large dirs like # notebooks/node_modules (created by Deno), which previously bloated the # upload archive past Scaleway's limit. diff --git a/x402_facilitator/test/no_stray_js.test.ts b/x402_facilitator/test/no_stray_js.test.ts index b9f77ac12..768401c66 100644 --- a/x402_facilitator/test/no_stray_js.test.ts +++ b/x402_facilitator/test/no_stray_js.test.ts @@ -21,7 +21,6 @@ const SKIP = new Set(["node_modules", "dist", "coverage", ".serverless", "notebo // The only `.js` files this package intentionally keeps, as paths relative to ROOT. const ALLOWED_JS = new Set([ "eslint.config.js", - "tsup.config.js", "vitest.config.js", "vitest.integration.config.js", "x402_splitter_facilitator.js", diff --git a/x402_facilitator/tsdown.config.ts b/x402_facilitator/tsdown.config.ts new file mode 100644 index 000000000..51cf19438 --- /dev/null +++ b/x402_facilitator/tsdown.config.ts @@ -0,0 +1,28 @@ +import { defineConfig } from "tsdown"; + +export default defineConfig({ + // x402_splitter_facilitator.js is deliberately absent: the buyer-pays splitter is + // retired (see README → Fee model history). No function in serverless.yml routes to it, + // but `package: dist/**` means anything built here still ships in the deploy archive. + entry: ["x402_facilitator.ts", "wallet_report_cron.ts"], + format: "esm", + platform: "node", + target: "node22", + outDir: "dist", + // Emit .js, not .mjs — package.json main and the dev script reference dist/*.js. + fixedExtension: false, + // Nothing consumes a deployed handler's types; tsconfig's declaration: true + // would auto-enable dts, so keep the dist shape tsup produced. + dts: false, + sourcemap: true, + // Keep readable for debugging + minify: false, + // Bundle all npm dependencies (Node built-ins are always external). + deps: { alwaysBundle: [/.*/] }, + // createRequire banner for packages that use dynamic require() (like pino). + // The import is aliased: rolldown's own runtime chunks import `createRequire` + // unaliased, and a bare re-import in the same file is a SyntaxError. + banner: { + js: `import { createRequire as __fretchenCr } from 'module'; const require = __fretchenCr(import.meta.url);`, + }, +}); diff --git a/x402_facilitator/tsup.config.js b/x402_facilitator/tsup.config.js deleted file mode 100644 index dfab562eb..000000000 --- a/x402_facilitator/tsup.config.js +++ /dev/null @@ -1,26 +0,0 @@ -import { defineConfig } from "tsup"; -import { builtinModules } from "module"; - -export default defineConfig({ - // x402_splitter_facilitator.js is deliberately absent: the buyer-pays splitter is - // retired (see README → Fee model history). No function in serverless.yml routes to it, - // but `package: dist/**` means anything built here still ships in the deploy archive. - entry: ["x402_facilitator.ts", "wallet_report_cron.ts"], - format: ["esm"], - platform: "node", - target: "node22", - outDir: "dist", - splitting: false, - clean: true, - // Keep readable for debugging - minify: false, - sourcemap: true, - // Node.js built-ins must be external (async_hooks, fs, path, etc.) - external: [...builtinModules, ...builtinModules.map((m) => `node:${m}`)], - // Bundle all npm dependencies - noExternal: [/.*/], - // Add createRequire banner for packages that use dynamic require() (like pino) - banner: { - js: `import { createRequire } from 'module'; const require = createRequire(import.meta.url);`, - }, -}); diff --git a/x402_facilitator/x402_splitter_facilitator.js b/x402_facilitator/x402_splitter_facilitator.js index 53a0ed0e9..34cf4666c 100644 --- a/x402_facilitator/x402_splitter_facilitator.js +++ b/x402_facilitator/x402_splitter_facilitator.js @@ -9,7 +9,7 @@ * See README → "Fee model history" for why the merchant-pays model won. * * Not deployed and not built: no function in `serverless.yml` routes here, and it is - * excluded from the tsup `entry` list so it does not ship in the deploy archive. + * excluded from the tsdown `entry` list so it does not ship in the deploy archive. * * Retained, not dead: this is a working implementation of the alternative, and the * contract at 0x7e67bf96ADbf4a813DD7b0A3Ca3060a937018946 (Optimism Sepolia) is referenced diff --git a/x402_facilitator/x402_splitter_settle.js b/x402_facilitator/x402_splitter_settle.js index 86d6d9866..68c4461b1 100644 --- a/x402_facilitator/x402_splitter_settle.js +++ b/x402_facilitator/x402_splitter_settle.js @@ -9,7 +9,7 @@ * See README → "Fee model history" for why the merchant-pays model won. * * Not deployed and not built: no function in `serverless.yml` routes here, and it is - * excluded from the tsup `entry` list so it does not ship in the deploy archive. + * excluded from the tsdown `entry` list so it does not ship in the deploy archive. * * Retained, not dead: this is a working implementation of the alternative, and the * contract at 0x7e67bf96ADbf4a813DD7b0A3Ca3060a937018946 (Optimism Sepolia) is referenced diff --git a/x402_facilitator/x402_splitter_supported.js b/x402_facilitator/x402_splitter_supported.js index 52dcee871..1799b37d7 100644 --- a/x402_facilitator/x402_splitter_supported.js +++ b/x402_facilitator/x402_splitter_supported.js @@ -9,7 +9,7 @@ * See README → "Fee model history" for why the merchant-pays model won. * * Not deployed and not built: no function in `serverless.yml` routes here, and it is - * excluded from the tsup `entry` list so it does not ship in the deploy archive. + * excluded from the tsdown `entry` list so it does not ship in the deploy archive. * * Retained, not dead: this is a working implementation of the alternative, and the * contract at 0x7e67bf96ADbf4a813DD7b0A3Ca3060a937018946 (Optimism Sepolia) is referenced diff --git a/x402_facilitator/x402_splitter_verify.js b/x402_facilitator/x402_splitter_verify.js index f5eece758..20fa7dec3 100644 --- a/x402_facilitator/x402_splitter_verify.js +++ b/x402_facilitator/x402_splitter_verify.js @@ -9,7 +9,7 @@ * See README → "Fee model history" for why the merchant-pays model won. * * Not deployed and not built: no function in `serverless.yml` routes here, and it is - * excluded from the tsup `entry` list so it does not ship in the deploy archive. + * excluded from the tsdown `entry` list so it does not ship in the deploy archive. * * Retained, not dead: this is a working implementation of the alternative, and the * contract at 0x7e67bf96ADbf4a813DD7b0A3Ca3060a937018946 (Optimism Sepolia) is referenced