#501 by GitHub stars
LetsFG/LetsFG
Agent-native flight & hotel search and booking — MCP server, CLI, and Python/JS SDKs. Every airline in the world, major booking sites and OTAs, with per-flight reliability history.
History
Review weekly changes to SKILL.md before updating. Dates mark the weeks in which we observed each version; checks apply to the recorded commits.
View weekly changes
SKILL.md
Week of Oct 26, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
cfe6a3fe9431 → cfe6a3fe9431
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
agent-skills-contribution/packages/skills-catalog/skills/(tooling)/letsfg/SKILL.md
Week of Oct 26, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
cfe6a3fe9431 → cfe6a3fe9431
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
integrations/hermes/skills/letsfg/SKILL.md
Week of Oct 26, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
cfe6a3fe9431 → cfe6a3fe9431
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
skills/flight-search/SKILL.md
Week of Oct 26, 2026 · +0 / −0 lines
Before Network or broad shell → After Network or broad shell
cfe6a3fe9431 → cfe6a3fe9431
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
skills/hotel-search/SKILL.md
Week of Oct 26, 2026 · +0 / −0 lines
Before Instructions only → After Instructions only
cfe6a3fe9431 → cfe6a3fe9431
Diff text is unavailable under the recorded licenses. Line counts and the GitHub link remain available.
Verified commit cfe6a3fe9431d1a245a84b1be8556b510761cd4d
git clone --filter=blob:none --no-checkout https://github.com/LetsFG/LetsFG.git .hotskills/letsfg-letsfg && git -C .hotskills/letsfg-letsfg checkout --detach cfe6a3fe9431d1a245a84b1be8556b510761cd4d
# Copy each selected skill directory from .hotskills/letsfg-letsfg into .claude/skills/<skill-name>/git clone --filter=blob:none --no-checkout https://github.com/LetsFG/LetsFG.git .hotskills/letsfg-letsfg && git -C .hotskills/letsfg-letsfg checkout --detach cfe6a3fe9431d1a245a84b1be8556b510761cd4d
# Copy each selected skill directory from .hotskills/letsfg-letsfg into .agents/skills/<skill-name>/Heat
6.8- Star growth, last 7 daysAhead of 84% of tracked repositories
- Star growth, last 24 hoursAhead of 90% of tracked repositories
- Rank movement, last 7 daysAhead of 52% of tracked repositories
- Commits, last 30 daysAhead of 82% of tracked repositories
- Accounts asking about it through MCP, last 7 daysNot available
- Hot votes this weekAhead of 0% of tracked repositories
Heat never changes the order by stars, and sponsorship never touches it. How heat works
Stars over time
Individual skills in this repository
- letsfg
/ - letsfg
agent-skills-contribution/packages/skills-catalog/skills/(tooling)/letsfg - letsfg
integrations/hermes/skills/letsfg - flight-search
skills/flight-search - hotel-search
skills/hotel-search
How it works
letsfg
When your agent uses it
LetsFG — Agent-native flight and hotel search and booking API. Every airline in the world plus the major booking sites (Google Flights, Skyscanner, Kiwi, Kayak, Momondo), with per-flight reliability history and instant booking. Plus real bookable hotel rates, refundable and non-refundable: the price is held on the connected card and charged only once the hotel confirms. letsfg.co
What it loads into context
Frontmatter
88 tokensAlways available to the agent
SKILL.md
7,487 tokensWhen the skill is activated
Reference documents
118,704 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Identity
- Access Modes
- Skills
- Authentication
- Complete Workflow
- CLI Usage
- Python SDK Usage
- MCP Server Setup
- MCP Tools
- Search Flags Reference
- Error Handling
- Rate Limits
- Pricing Summary
- Key Facts
Scripts executed separately
DockerfileModel.jsassets/ranking.jsdocs/assets/domain-redirect.jsintegrations/openclaw/package.jsonlighthouserc.jsmodels/__init__.pymodels/flights.pypreview/build_stubs.pypreview/run.pysdk/js/package.jsonsdk/js/src/auth.test.tssdk/js/src/auth.tssdk/js/src/cli.tssdk/js/src/index.test.tssdk/js/src/index.tssdk/js/src/offer-details.tssdk/js/src/ranking.tssdk/js/src/trip-purpose.tssdk/mcp/package.jsonsdk/mcp/src/index.test.tssdk/mcp/src/index.tssdk/python/_jetstar_checkout_validate.pysdk/python/examples/quickstart.pysdk/python/google_checkout_live_sweep.pysdk/python/letsfg/__init__.pysdk/python/letsfg/__main__.pysdk/python/letsfg/cli.pysdk/python/letsfg/client.pysdk/python/letsfg/config.pysdk/python/letsfg/connectors/__init__.pysdk/python/letsfg/connectors/airport_tz.pysdk/python/letsfg/connectors/auth.pysdk/python/letsfg/local.pysdk/python/letsfg/models.pysdk/python/letsfg/models/__init__.pysdk/python/letsfg/models/flights.pysdk/python/letsfg/system_info.pysdk/python/tests/__init__.pysdk/python/tests/test_ancillary_connector_parsing.pysdk/python/tests/test_auth_user_agent.pysdk/python/tests/test_booking_holdings_booking_urls.pysdk/python/tests/test_checkout_engine_configs.pysdk/python/tests/test_cli_declined_card.pysdk/python/tests/test_cli_offer_shape.pysdk/python/tests/test_connect_auth.pysdk/python/tests/test_connect_auth_scope.pysdk/python/tests/test_connector_parsing.pysdk/python/tests/test_country_filter_completeness.pysdk/python/tests/test_currency_rates.pysdk/python/tests/test_duration_timezone.pysdk/python/tests/test_emirates_connector.pysdk/python/tests/test_flight_duration_backfill.pysdk/python/tests/test_hotel_booking_contract.pysdk/python/tests/test_india_direct_sources.pysdk/python/tests/test_india_ota_sources.pysdk/python/tests/test_india_user_surfaces.pysdk/python/tests/test_models_read_bearer_lane_offers.pysdk/python/tests/test_public_offer_masking.pysdk/python/tests/test_regional_cross_area_validation.pysdk/python/tests/test_regional_india_sources.pysdk/python/tests/test_search_api_key_lane_field_names.pysdk/python/tests/test_search_unauthorized.pysdk/python/tests/test_skyscanner_connector.pysdk/python/tests/test_source_country_filter.pysdk/python/tests/test_starlink_flights.pysdk/python/tests/test_telemetry_enrichment.pysdk/python/tests/test_tripcom_connector.pysdk/python/tests/test_user_agent_everywhere.pysdk/python/tests/test_vueling_connector.pysdk/python/tests/test_wizzair_connector.pytest/model-test.jstools/build-airports.pytools/build-icons.pytools/build-ranking.pytools/check-search-invariant.pytools/split-comparison.pytools/validate.sh
Files
.dockerignoreasset3,079 bytes.github/dependabot.ymlasset492 bytes.github/workflows/plugin-scanner.ymlasset921 bytes.github/workflows/sdk-tests.ymlasset1,270 bytes.github/workflows/test.ymlasset4,417 bytes.gitignoreasset2,176 bytes.mcp.jsonasset1,118 bytesAGENTS.mddoc51,475 bytesBarWidget.qmlasset4,101 bytesCLAUDE.mddoc14,324 bytesCODE_OF_CONDUCT.mddoc2,531 bytesCONTRIBUTING.mddoc3,794 bytesDockerfileruns881 bytesDockerfile.pythonasset1,786 bytesLICENSEasset2,173 bytesModel.jsruns120,021 bytesOMARCHY-PLUGIN.mddoc26,133 bytesPanel.qmlasset193,098 bytesREADME.mddoc48,499 bytesSECURITY.mddoc2,280 bytesSKILL.mdcore28,502 bytesSKILL.mdcore28,502 bytesSKILL.mdcore28,502 bytesSKILL.mdcore28,502 bytesSKILL.mdcore28,502 bytesSKILL.mdcore28,502 bytesSKILL.mdcore28,502 bytesassets/Kalam-Bold.ttfasset460,896 bytesassets/Lexend.ttfasset175,756 bytesassets/OFL-Kalam.txtdoc4,373 bytesassets/OFL.txtdoc4,436 bytesassets/airports.jsonasset477,620 bytesassets/badge-instagram.svgasset398 bytesassets/badge-tiktok.svgasset392 bytesassets/badge-x.svgasset382 bytesassets/banner.pngasset36,027 bytesassets/demo.gifasset4,037,616 bytesassets/demo.mp4asset2,541,044 bytesassets/destinations/BCN.jpgasset19,174 bytesassets/destinations/DPS.jpgasset20,004 bytesassets/destinations/DXB.jpgasset19,456 bytesassets/destinations/NYC.jpgasset9,627 bytesassets/destinations/PAR.jpgasset22,306 bytesassets/destinations/TYO.jpgasset26,518 bytesassets/icons/LICENSEasset922 bytesassets/icons/arrow-left-right-muted.pngasset742 bytesassets/icons/arrow-left-right-orange.pngasset610 bytesassets/icons/arrow-right-faint.pngasset458 bytesassets/icons/arrow-right-muted.pngasset525 bytesassets/icons/arrow-up-down-muted.pngasset761 bytesassets/icons/arrow-up-down-orange.pngasset678 bytesassets/icons/backpack-green.pngasset1,250 bytesassets/icons/backpack-muted.pngasset1,240 bytesassets/icons/calendar-ink.pngasset701 bytesassets/icons/calendar-muted.pngasset780 bytesassets/icons/chevron-down-faint.pngasset412 bytesassets/icons/chevron-down-muted.pngasset455 bytesassets/icons/chevron-down-orange.pngasset380 bytesassets/icons/circle-check-green.pngasset1,703 bytesassets/icons/globe-muted.pngasset2,175 bytesassets/icons/hotel-faint.pngasset905 bytesassets/icons/hotel-muted.pngasset913 bytesassets/icons/hotel-orange.pngasset832 bytesassets/icons/luggage-green.pngasset850 bytesassets/icons/luggage-muted.pngasset867 bytesassets/icons/map-pin-muted.pngasset2,019 bytesassets/icons/map-pin-orange.pngasset1,813 bytesassets/icons/minus-faint.pngasset230 bytesassets/icons/minus-muted.pngasset231 bytesassets/icons/plane-faint.pngasset1,906 bytesassets/icons/plane-muted.pngasset1,917 bytesassets/icons/plane-orange.pngasset1,787 bytesassets/icons/plane-white.pngasset1,097 bytesassets/icons/plus-faint.pngasset379 bytesassets/icons/plus-muted.pngasset385 bytesassets/icons/search-muted.pngasset1,404 bytesassets/icons/search-white.pngasset793 bytesassets/icons/triangle-alert-amber.pngasset1,118 bytesassets/icons/users-ink.pngasset1,150 bytesassets/icons/users-muted.pngasset1,323 bytesassets/icons/x-muted.pngasset597 bytesassets/letsfg-logo.pngasset7,948 bytesassets/logo.pngasset23,376 bytesassets/name-fallbacks.jsonasset767 bytesassets/ranking.jsruns106,976 bytesassets/sponsor-evomi.pngasset231,377 bytescontext7.jsonasset3,630 bytesdocker-compose.ymlasset1,532 bytesdocs/TESTING.mddoc12,672 bytesdocs/agent-guide.mddoc23,884 bytesdocs/api-booking.mddoc11,326 bytesdocs/api-errors.mddoc4,377 bytesdocs/api-guide.mddoc7,601 bytesdocs/api-onboarding.mddoc6,587 bytesdocs/api-polling.mddoc5,118 bytesdocs/api-sandbox.mddoc17,051 bytesdocs/api-search.mddoc17,692 bytesdocs/architecture-guide.mddoc15,296 bytesdocs/assets/domain-redirect.jsruns399 bytesdocs/assets/extra-20261004.cssasset16,373 bytesdocs/assets/extra.cssasset15,355 bytesdocs/assets/letsfg-favicon.pngasset3,088 bytesdocs/assets/letsfg-wordmark.pngasset7,563 bytesdocs/cli-reference.mddoc7,470 bytesdocs/getting-started.mddoc11,043 bytesdocs/hotels.mddoc10,325 bytesdocs/index.mddoc9,896 bytesdocs/mcp.mddoc6,466 bytesdocs/openapi.mddoc3,970 bytesdocs/overrides/.gitkeepasset75 bytesdocs/packages.mddoc11,087 bytesdocs/quickstart-claude.mddoc5,523 bytesdocs/quickstart-cursor.mddoc4,970 bytesdocs/quickstart-windsurf.mddoc4,902 bytesdocs/self-hosting.mddoc5,507 bytesdocs/tutorials.mddoc19,639 bytesglama.jsonasset103 bytesintegrations/hermes/.gitattributesasset32 bytesintegrations/hermes/LICENSEasset1,091 bytesintegrations/hermes/README.mddoc8,250 bytesintegrations/hermes/assets/banner.pngasset24,787 bytesintegrations/hermes/assets/logo.pngasset23,376 bytesintegrations/hermes/plugin.jsonasset625 bytesintegrations/openclaw/.claude-plugin/plugin.jsonasset493 bytesintegrations/openclaw/.gitattributesasset32 bytesintegrations/openclaw/.mcp.jsonasset330 bytesintegrations/openclaw/LICENSEasset1,091 bytesintegrations/openclaw/README.mddoc5,290 bytesintegrations/openclaw/assets/icon.pngasset23,376 bytesintegrations/openclaw/openclaw.plugin.jsonasset753 bytesintegrations/openclaw/package.jsonruns680 byteslighthouserc.jsruns1,167 bytesmanifest.jsonasset567 bytesmcp-config.jsonasset764 bytesmkdocs.ymlasset2,313 bytesmodels/__init__.pyruns49 bytesmodels/flights.pyruns6,232 bytesopenapi.yamlasset44,151 bytespreview.pngasset379,511 bytespreview/build_stubs.pyruns14,935 bytespreview/fixture-offers-250.jsonasset147,999 bytespreview/fixture-offers.jsonasset6,120 bytespreview/main.qmlasset11,812 bytespreview/run.pyruns13,354 bytespreview/stubs/Quickshell/Io/FileView.qmlasset1,789 bytespreview/stubs/Quickshell/Io/IpcHandler.qmlasset204 bytespreview/stubs/Quickshell/Io/qmldirasset77 bytespreview/stubs/Quickshell/Quickshell.qmlasset615 bytespreview/stubs/Quickshell/qmldirasset58 bytespreview/stubs/qs/Commons/Border.qmlasset206 bytespreview/stubs/qs/Commons/Color.qmlasset544 bytespreview/stubs/qs/Commons/Style.qmlasset921 bytespreview/stubs/qs/Commons/qmldirasset110 bytespreview/stubs/qs/Ui/BarWidget.qmlasset599 bytespreview/stubs/qs/Ui/Button.qmlasset1,693 bytespreview/stubs/qs/Ui/KeyboardPanel.qmlasset913 bytespreview/stubs/qs/Ui/OpticalGlyph.qmlasset295 bytespreview/stubs/qs/Ui/Panel.qmlasset1,347 bytespreview/stubs/qs/Ui/PanelKeyCatcher.qmlasset383 bytespreview/stubs/qs/Ui/PanelSeparator.qmlasset294 bytespreview/stubs/qs/Ui/TextField.qmlasset720 bytespreview/stubs/qs/Ui/WidgetButton.qmlasset1,540 bytespreview/stubs/qs/Ui/qmldirasset293 bytessdk/js/README.mddoc16,754 bytessdk/js/letsfg-2026.5.72.tgzasset74,720 bytessdk/js/package-lock.jsonasset63,994 bytessdk/js/package.jsonruns1,288 bytessdk/js/src/auth.test.tsruns5,132 bytessdk/js/src/auth.tsruns13,481 bytessdk/js/src/cli.tsruns16,742 bytessdk/js/src/index.test.tsruns20,572 bytessdk/js/src/index.tsruns46,255 bytessdk/js/src/offer-details.tsruns23,004 bytessdk/js/src/ranking.tsruns65,760 bytessdk/js/src/trip-purpose.tsruns1,185 bytessdk/js/tsconfig.jsonasset330 bytessdk/mcp/README.mddoc28,408 bytessdk/mcp/letsfg-mcp-2026.5.75.tgzasset21,210 bytessdk/mcp/package-lock.jsonasset64,008 bytessdk/mcp/package.jsonruns1,162 bytessdk/mcp/src/index.test.tsruns20,530 bytessdk/mcp/src/index.tsruns65,773 bytessdk/mcp/tsconfig.jsonasset284 bytessdk/python/LICENSEasset1,063 bytessdk/python/README.mddoc28,830 bytessdk/python/_jetstar_checkout_validate.pyruns1,589 bytessdk/python/examples/quickstart.pyruns1,836 bytessdk/python/google_checkout_live_sweep.pyruns6,699 bytessdk/python/google_checkout_live_sweep_japan_longhaul.jsonasset7,188 bytessdk/python/google_checkout_live_sweep_longhaul_london_us.jsonasset5,735 bytessdk/python/google_checkout_live_sweep_results.jsonasset15,397 bytessdk/python/google_checkout_live_sweep_results_v2.jsonasset21,197 bytessdk/python/letsfg/__init__.pyruns1,861 bytessdk/python/letsfg/__main__.pyruns81 bytessdk/python/letsfg/cli.pyruns47,460 bytessdk/python/letsfg/client.pyruns53,978 bytessdk/python/letsfg/config.pyruns493 bytessdk/python/letsfg/connectors/__init__.pyruns350 bytessdk/python/letsfg/connectors/airport_tz.pyruns2,897 bytessdk/python/letsfg/connectors/auth.pyruns19,672 bytessdk/python/letsfg/local.pyruns11,853 bytessdk/python/letsfg/models.pyruns11,028 bytessdk/python/letsfg/models/__init__.pyruns12,761 bytessdk/python/letsfg/models/flights.pyruns22,239 bytessdk/python/letsfg/system_info.pyruns127 bytessdk/python/pyproject.tomlasset2,277 bytessdk/python/result.txtdoc0 bytessdk/python/tests/__init__.pyruns63 bytessdk/python/tests/test_ancillary_connector_parsing.pyruns13,614 bytessdk/python/tests/test_auth_user_agent.pyruns2,745 bytessdk/python/tests/test_booking_holdings_booking_urls.pyruns10,360 bytessdk/python/tests/test_checkout_engine_configs.pyruns33,096 bytessdk/python/tests/test_cli_declined_card.pyruns1,663 bytessdk/python/tests/test_cli_offer_shape.pyruns11,649 bytessdk/python/tests/test_connect_auth.pyruns6,430 bytessdk/python/tests/test_connect_auth_scope.pyruns4,384 bytessdk/python/tests/test_connector_parsing.pyruns8,417 bytessdk/python/tests/test_country_filter_completeness.pyruns848 bytessdk/python/tests/test_currency_rates.pyruns1,766 bytessdk/python/tests/test_duration_timezone.pyruns6,400 bytessdk/python/tests/test_emirates_connector.pyruns3,918 bytessdk/python/tests/test_flight_duration_backfill.pyruns3,438 bytessdk/python/tests/test_hotel_booking_contract.pyruns5,474 bytessdk/python/tests/test_india_direct_sources.pyruns9,414 bytessdk/python/tests/test_india_ota_sources.pyruns5,535 bytessdk/python/tests/test_india_user_surfaces.pyruns4,238 bytessdk/python/tests/test_models_read_bearer_lane_offers.pyruns5,192 bytessdk/python/tests/test_public_offer_masking.pyruns8,755 bytessdk/python/tests/test_regional_cross_area_validation.pyruns5,506 bytessdk/python/tests/test_regional_india_sources.pyruns3,618 bytessdk/python/tests/test_search_api_key_lane_field_names.pyruns1,651 bytessdk/python/tests/test_search_unauthorized.pyruns4,024 bytessdk/python/tests/test_skyscanner_connector.pyruns11,484 bytessdk/python/tests/test_source_country_filter.pyruns3,771 bytessdk/python/tests/test_starlink_flights.pyruns4,129 bytessdk/python/tests/test_telemetry_enrichment.pyruns3,604 bytessdk/python/tests/test_tripcom_connector.pyruns3,073 bytessdk/python/tests/test_user_agent_everywhere.pyruns4,698 bytessdk/python/tests/test_vueling_connector.pyruns5,598 bytessdk/python/tests/test_wizzair_connector.pyruns1,581 bytesserver.jsonasset1,535 bytessmithery.yamlasset1,355 bytessplit-comparison.jsonasset9,180 bytestest/model-test.jsruns84,199 bytestools/build-airports.pyruns12,094 bytestools/build-icons.pyruns5,241 bytestools/build-ranking.pyruns6,586 bytestools/check-search-invariant.pyruns3,061 bytestools/split-comparison.pyruns10,811 bytestools/validate.shruns4,744 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubletsfg
When your agent uses it
Agent-native flight and hotel search and booking via the letsfg.co server-side engine. Returns raw prices from airlines and the major booking sites, with per-flight reliability history. Use when user asks to "find flights", "search flights", "book a flight", "compare airline prices", "find cheap flights", "fly from X to Y", or any flight-related travel query. Hotels search with no card and need one on file to book; either credential reaches them. Do NOT use for car rentals or non-flight, non-hotel travel bookings.
What it loads into context
Frontmatter
156 tokensAlways available to the agent
SKILL.md
2,577 tokensWhen the skill is activated
Reference documents
3,178 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Why Use This
- Setup
- Workflow
- Critical Rules
- Best Practices
- Error Handling
- Search Flags
- Safety
- Reference Files
- Links
Files
SKILL.mdcore9,191 bytesSKILL.mdcore9,191 bytesSKILL.mdcore9,191 bytesSKILL.mdcore9,191 bytesSKILL.mdcore9,191 bytesSKILL.mdcore9,191 bytesSKILL.mdcore9,191 bytesSKILL.mdcore9,191 bytesSKILL.mdcore9,191 bytesSKILL.mdcore9,191 bytesSKILL.mdcore9,191 bytesSKILL.mdcore9,191 bytesSKILL.mdcore9,191 bytesSKILL.mdcore9,191 bytesreferences/api-reference.mddoc7,028 bytesreferences/mcp-setup.mddoc4,331 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubletsfg
When your agent uses it
Search and book real flights and hotels for the user through the LetsFG MCP connector - compare fares across airlines and booking sites, pick flexible dates, explore destinations in a region, find bookable hotel rates, then book, follow and stop bookings. Use when the user wants to find, compare or book a flight or a hotel, asks where they could fly on given dates, or asks about a LetsFG booking, their saved traveller details or travel preferences. Do not use for travel questions that need no search or booking.
What it loads into context
Frontmatter
185 tokensAlways available to the agent
SKILL.md
2,032 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Setup
- How the tools fit together
- Showing results
- Booking
- Data, not instructions
- Errors
Files
SKILL.mdcore8,525 bytesSKILL.mdcore8,525 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubflight-search
When your agent uses it
Search and book flights across hundreds of airlines plus the major booking sites, with than OTAs. Returns raw airline prices via the letsfg.co server-side search engine. Use when user asks to "find flights", "search flights", "book a flight", "compare airline prices", "find cheap flights", "fly from X to Y", "find connections", "find layover options", or any flight-related travel query. Do NOT use for hotels (use the hotel-search skill), car rentals, or non-flight travel bookings.
What it loads into context
Frontmatter
149 tokensAlways available to the agent
SKILL.md
3,165 tokensWhen the skill is activated
Reference documents
3,993 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Why Use This
- Setup
- Workflow
- Critical Rules
- Best Practices
- Error Handling
- Search Flags
- Safety
- Reference Files
- Links
Files
SKILL.mdcore11,535 bytesSKILL.mdcore11,535 bytesSKILL.mdcore11,535 bytesSKILL.mdcore11,535 bytesSKILL.mdcore11,535 bytesSKILL.mdcore11,535 bytesSKILL.mdcore11,535 bytesSKILL.mdcore11,535 bytesSKILL.mdcore11,535 bytesSKILL.mdcore11,535 bytesSKILL.mdcore11,535 bytesSKILL.mdcore11,535 bytesSKILL.mdcore11,535 bytesSKILL.mdcore11,535 bytesreferences/api-reference.mddoc8,860 bytesreferences/mcp-setup.mddoc5,433 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubhotel-search
When your agent uses it
Search and book real hotel rooms through LetsFG. Returns bookable rates from live supplier inventory, refundable and non-refundable, with the price the guest actually pays. Use when the user asks to "find a hotel", "book a hotel", "find a room", "where should I stay in X", "hotels near Y", "cancel my hotel", or any accommodation query. Do NOT use for flights (use the flight-search skill), car rentals, or activities.
What it loads into context
Frontmatter
135 tokensAlways available to the agent
SKILL.md
2,046 tokensWhen the skill is activated
Reference documents
0 tokensLoaded on request
Token counts are estimates. Scripts run separately; they are not counted as reference context.
The playbook
- Read this before your first call
- How the money works
- Workflow
- Critical rules
- Error handling
- Links
Files
SKILL.mdcore8,019 bytesSKILL.mdcore8,019 bytes
No excerpt is shown for this license. Read the source on GitHub.
View the complete source on GitHubSkills included
- letsfg
- letsfg
- letsfg
- flight-search
- hotel-search
Repository facts
- License
- No license detected
- Created
- Mar 1, 2026
- Last pushed
- Nov 1, 2026
- Forks
- 153
- Open issues
- 3
- Project activity
- Active
Rank over the last 12 weeks
Now #501 · best #398 · down 60 in 30 days
- #495 from Oct 30 to Nov 1
- #498 on Nov 2
- #499 on Nov 3
- #501 on Nov 4
- #499 on Nov 5
- #501 since Nov 6
78 earlier periods
- #428 on Aug 1
- #413 on Aug 7
- #415 on Aug 8
- #404 on Aug 9
- #418 on Aug 10
- #416 on Aug 11
- #410 on Aug 12
- #418 on Aug 13
- #417 on Aug 14
- #412 on Aug 15
- #421 on Aug 17
- #425 on Aug 18
- #429 on Aug 19
- #423 on Aug 20
- #426 on Aug 21
- #411 on Aug 22
- #421 on Aug 23
- #415 on Aug 24
- #411 on Aug 25
- #406 on Aug 26
- #410 on Aug 27
- #411 on Aug 28
- #406 on Aug 29
- #398 on Aug 30
- #412 on Aug 31
- #416 on Sep 1
- #412 on Sep 2
- #415 on Sep 3
- #412 on Sep 5
- #407 on Sep 6
- #417 on Sep 7
- #420 on Sep 8
- #417 from Sep 9 to Sep 10
- #419 on Sep 11
- #415 from Sep 12 to Sep 13
- #425 on Sep 14
- #424 on Sep 15
- #429 on Sep 16
- #421 on Sep 17
- #428 on Sep 18
- #418 on Sep 19
- #424 on Sep 20
- #426 on Sep 21
- #433 on Sep 22
- #427 on Sep 23
- #420 on Sep 24
- #421 on Sep 25
- #418 on Sep 26
- #430 on Sep 27
- #435 on Sep 28
- #443 on Sep 29
- #439 on Sep 30
- #438 on Oct 1
- #434 on Oct 2
- #423 on Oct 3
- #418 on Oct 4
- #429 on Oct 5
- #436 on Oct 6
- #441 on Oct 7
- #446 on Oct 8
- #450 on Oct 9
- #441 on Oct 10
- #454 on Oct 12
- #449 on Oct 13
- #451 on Oct 14
- #453 on Oct 15
- #458 on Oct 16
- #447 on Oct 17
- #454 on Oct 18
- #463 on Oct 19
- #466 on Oct 20
- #473 on Oct 21
- #467 on Oct 22
- #465 on Oct 23
- #454 on Oct 24
- #488 on Oct 25
- #493 on Oct 28
- #492 on Oct 29
Before you install
Network or broad shellAutomated signals, not a guarantee
Checked Nov 3, 2026
Not fully analyzed: some files were too long, unreadable or missing. This never lowers the level.
Show 36 notes
SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedSKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedassets/airports.json:1Analysis incomplete: physical or joined line exceeds character limitpreview/fixture-offers-250.json:1Analysis incomplete: physical or joined line exceeds character limitagent-skills-contribution/packages/skills-catalog/skills/(tooling)/letsfg/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedagent-skills-contribution/packages/skills-catalog/skills/(tooling)/letsfg/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedagent-skills-contribution/packages/skills-catalog/skills/(tooling)/letsfg/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedagent-skills-contribution/packages/skills-catalog/skills/(tooling)/letsfg/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedagent-skills-contribution/packages/skills-catalog/skills/(tooling)/letsfg/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedagent-skills-contribution/packages/skills-catalog/skills/(tooling)/letsfg/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedagent-skills-contribution/packages/skills-catalog/skills/(tooling)/letsfg/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedagent-skills-contribution/packages/skills-catalog/skills/(tooling)/letsfg/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedagent-skills-contribution/packages/skills-catalog/skills/(tooling)/letsfg/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedagent-skills-contribution/packages/skills-catalog/skills/(tooling)/letsfg/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedagent-skills-contribution/packages/skills-catalog/skills/(tooling)/letsfg/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzedagent-skills-contribution/packages/skills-catalog/skills/(tooling)/letsfg/SKILL.md:1Analysis incomplete: Referenced executable target unavailable; not analyzed
- No broad tool permissions
- 4 dangerous shell commandsin 3 files: Dockerfile:7 Dockerfile.python:30 sdk/js/src/auth.ts:184
- 2,266 network referencesin 103 files: sdk/js/package-lock.json:24 sdk/mcp/package-lock.json:24 test/model-test.js:41 and 100 more
- 4 obfuscation signalsin 1 file: test/model-test.js:32
- No instruction overrides
- 78 executable scriptsin 78 files: Dockerfile:1 Model.js:1 assets/ranking.js:1 and 75 more
- 319 references to secretsin 65 files: sdk/python/letsfg/cli.py:59 sdk/python/letsfg/client.py:12 sdk/mcp/src/index.ts:8 and 62 more
- No requests to vote in Hot
Show all 2,671 signals by file
.dockerignore
- Access to secretsline 87
[Credential-related source omitted]
.gitignore
- Access to secretsline 7
[Credential-related source omitted]
.mcp.json
- Network accessline 9
[Credential-related source omitted] - Access to secretsline 9
[Credential-related source omitted] - Network accessline 10
}, "description": "Flight and hotel search & booking for AI agents. Server-side engine covers every airline in the world with per-flight reliability history, plus real bookable hotel rates, refundable and non-refundable. Flights book fo - Network accessline 11
"description": "Flight and hotel search & booking for AI agents. Server-side engine covers every airline in the world with per-flight reliability history, plus real bookable hotel rates, refundable and non-refundable. Flights book for real: - Network accessline 12
"homepage": "https://letsfg.co", - Network accessline 13
"repository": "https://github.com/LetsFG/LetsFG"
AGENTS.md
- Network accessline 16
If you are an agent searching or booking flights — even hundreds of them — you want **Programmatic Flight Search (PFS)**: connect LetsFG as an MCP server at `https://letsfg.co/mcp`, approve it (the consent at <https://letsfg.co/connect> is - Network accessline 17
want **Programmatic Flight Search (PFS)**: connect LetsFG as an MCP server at `https://letsfg.co/mcp`, approve it (the consent at <https://letsfg.co/connect> is one tap and needs no card), then search and book. No - Network accessline 18
`https://letsfg.co/mcp`, approve it (the consent at <https://letsfg.co/connect> is one tap and needs - Network accessline 19
no card), then search and book. No billing account, nothing charged beyond the ticket price itself. Full guide: <https://letsfg.co/for-agents>. - Network accessline 21
<https://letsfg.co/for-agents>. - Network accessline 40
**API Base URL:** `https://letsfg.co` (PFS) · `https://letsfg.co/developers/api/v1` (Developer API) - Network accessline 45
|------|----------|-------|------| | **CLI / SDK / MCP** (PFS payment token) | **Almost every agent.** Search + booking | 8–10 s to first results; longer to `completed`, longer again on a split | Free auth, free search, no booking fee and n - Network accessline 47
| **Developer API** ([letsfg.co/developers](https://letsfg.co/developers)) | Business / commercial / high-volume | 2–5 s (discover) · 8–10 s to first results (full search) | Look-to-book: 200 searches free after every booking, then $0.01. B - Network accessline 49
**Quick decision:** - You are an agent that wants to search and book → **use the MCP / SDK / CLI** with a PFS token (connect through the hosted MCP, described below). This is almost certainly you. - You need guaranteed speed for a product o - Network accessline 51
- You need guaranteed speed for a product or account-level billing controls → **use the Developer API** at [letsfg.co/developers](https://letsfg.co/developers). Hotels work on either credential. - Network accessline 77
Minimum top-up: $5. Register at [letsfg.co/developers](https://letsfg.co/developers). - Network accessline 92
| Step | Cost | What You Get | |------|------|--------------| | **Auth** | FREE | One tap at <https://letsfg.co/connect>, no card. The card is saved at the first booking, in a 0.00 Revolut setup. No charge, no authorization hold. | - Network accessline 93
|------|------|--------------| | **Auth** | FREE | One tap at <https://letsfg.co/connect>, no card. The card is saved at the first booking, in a 0.00 Revolut setup. No charge, no authorization hold. | | **Search** | FREE | Price, times, dur - Network accessline 94
| **Auth** | FREE | One tap at <https://letsfg.co/connect>, no card. The card is saved at the first booking, in a 0.00 Revolut setup. No charge, no authorization hold. | - Access to secretsline 120
[Credential-related source omitted] - Network accessline 133
**cURL (PFS):** - Network accessline 135
curl -X POST https://letsfg.co/api/search \ - Network accessline 139
[Credential-related source omitted] - Network accessline 141
[Credential-related source omitted] - Access to secretsline 177
[Credential-related source omitted] - Network accessline 194
while True: # 4–11 minutes, poll every 20–30 s time.sleep(25) st = requests.post("https://letsfg.co/api/agent-book/status", - Network accessline 195
[Credential-related source omitted] - Network accessline 196
st = requests.post("https://letsfg.co/api/agent-book/status", - Network accessline 222
Other answers, all with `"charged": 0`: `{"error": "missing_details", "missing_fields": [...]}` — ask the person and call again; `{"error": "payment_method_required", "add_card_url": "https://letsfg.co/connect"}`; - Network accessline 223
"missing_fields": [...]}` — ask the person and call again; `{"error": "payment_method_required", "add_card_url": "https://letsfg.co/connect"}`; `{"error": "payment_declined", "add_card_url": "https://letsfg.co/connect"}`. - Network accessline 224
`{"error": "payment_method_required", "add_card_url": "https://letsfg.co/connect"}`; - Network accessline 225
`{"error": "payment_declined", "add_card_url": "https://letsfg.co/connect"}`. - Access to secretsline 239
[Credential-related source omitted] - Access to secretsline 260
[Credential-related source omitted] - Access to secretsline 313
[Credential-related source omitted] - Network accessline 337
`https://letsfg.co/mcp`. The client runs OAuth; the consent step - Network accessline 338
opens <https://letsfg.co/connect>: one tap, no card. The token the client - Network accessline 342
# Claude Code claude mcp add --transport http letsfg https://letsfg.co/mcp - Network accessline 343
claude mcp add --transport http letsfg https://letsfg.co/mcp - Network accessline 348
{ "mcpServers": { "letsfg": { "url": "https://letsfg.co/mcp" } - Network accessline 349
"mcpServers": { "letsfg": { "url": "https://letsfg.co/mcp" } } - Network accessline 350
"letsfg": { "url": "https://letsfg.co/mcp" } - Network accessline 355
Claude: LetsFG is in Claude's official connector directory. Open <https://claude.ai/directory/letsfg>, add it and approve it. No URL to paste. Once added, it works in - Network accessline 356
<https://claude.ai/directory/letsfg>, add it and approve it. No URL to paste. Once added, it works in - Network accessline 359
ChatGPT: add it at chatgpt.com in a browser (the ChatGPT phone app has no way to add one): Plugins > Add > Add custom MCP server, URL `https://letsfg.co/mcp`, authentication OAuth, tick - Network accessline 360
Plugins > Add > Add custom MCP server, URL `https://letsfg.co/mcp`, authentication OAuth, tick - Access to secretsline 364
[Credential-related source omitted] - Access to secretsline 388
[Credential-related source omitted] - Network accessline 416
# cURL curl -X POST https://letsfg.co/developers/api/v1/agents/register \ - Network accessline 417
curl -X POST https://letsfg.co/developers/api/v1/agents/register \ - Access to secretsline 421
[Credential-related source omitted] - Access to secretsline 426
[Credential-related source omitted] - Access to secretsline 427
[Credential-related source omitted] - Network accessline 429
# cURL (raw HTTP) - Network accessline 430
curl -X POST https://letsfg.co/developers/api/v1/flights/search \ - Access to secretsline 439
[Credential-related source omitted] - Network accessline 560
| `INVALID_PARAMETER` | validation | 422 | Field value out of range or wrong type | | `AUTH_INVALID` | business | 401 | Bearer token / API key missing or invalid | | `PAYMENT_REQUIRED` | business | 402 | No card on file. PFS: response inclu - Network accessline 561
| `AUTH_INVALID` | business | 401 | Bearer token / API key missing or invalid | | `PAYMENT_REQUIRED` | business | 402 | No card on file. PFS: response includes `add_card_url` (https://letsfg.co/connect) — connect the card there. Developer A - Network accessline 562
| `PAYMENT_REQUIRED` | business | 402 | No card on file. PFS: response includes `add_card_url` (https://letsfg.co/connect) — connect the card there. Developer API: `letsfg connect-payment`, then open the printed link. | - Network accessline 584
print("Started, poll /api/agent-book/status with:", booked["booking_ref"]) except BearerTokenError as e: print("Re-connect at https://letsfg.co/connect:", e) - Network accessline 586
print("Re-connect at https://letsfg.co/connect:", e) - Access to secretsline 593
[Credential-related source omitted] - Network accessline 676
)) except BearerTokenError: print("Token expired or revoked — reconnect at https://letsfg.co/connect") - Network accessline 677
except BearerTokenError: print("Token expired or revoked — reconnect at https://letsfg.co/connect") return None - Network accessline 678
print("Token expired or revoked — reconnect at https://letsfg.co/connect") - Network accessline 817
)) except BearerTokenError: raise # can't retry this — reconnect at https://letsfg.co/connect - Network accessline 819
raise # can't retry this — reconnect at https://letsfg.co/connect - Network accessline 992
return booked # {"booking_ref": ..., "state": "booking_in_progress", "held": {...}} — poll /api/agent-book/status except BearerTokenError: raise # can't retry — reconnect at https://letsfg.co/connect - Network accessline 994
raise # can't retry — reconnect at https://letsfg.co/connect - Network accessline 1027
1. Add LetsFG as a remote MCP server: `https://letsfg.co/mcp` - Network accessline 1028
(Claude Code: `claude mcp add --transport http letsfg https://letsfg.co/mcp`; - Network accessline 1029
Claude: add it from Claude's connector directory, <https://claude.ai/directory/letsfg>; ChatGPT: at chatgpt.com in a - Network accessline 1030
browser, Plugins > Add > Add custom MCP server; Cursor / Windsurf: see the MCP section above). 2. Approve the connection. The OAuth consent step opens <https://letsfg.co/connect>: - Network accessline 1031
the MCP section above). 2. Approve the connection. The OAuth consent step opens <https://letsfg.co/connect>: one tap, no card. - Network accessline 1032
2. Approve the connection. The OAuth consent step opens <https://letsfg.co/connect>: - Network accessline 1044
curl -s -X POST https://letsfg.co/api/agent-access/request - Network accessline 1045
# → 402 {"error":"payment_method_required", # "add_card_url":"https://letsfg.co/connect", # "how":["Connect LetsFG as an MCP server (...) and approve the connection: the consent step opens https://letsfg.co/connect ...", - Network accessline 1046
# "add_card_url":"https://letsfg.co/connect", - Network accessline 1047
# "how":["Connect LetsFG as an MCP server (...) and approve the connection: the consent step opens https://letsfg.co/connect ...", - Network accessline 1049
# "charged":false, "docs":"https://letsfg.co/for-agents"} - Network accessline 1055
# Search curl -X POST https://letsfg.co/api/search \ - Network accessline 1056
curl -X POST https://letsfg.co/api/search \ - Network accessline 1062
[Credential-related source omitted] - Network accessline 1063
[Credential-related source omitted] - Network accessline 1065
# Book — holds the fare on the connected card, returns a booking_ref in seconds curl -X POST https://letsfg.co/api/agent-book \ - Network accessline 1066
curl -X POST https://letsfg.co/api/agent-book \ - Network accessline 1076
# Poll the booking every 20–30 s (it takes 4–11 minutes) curl -X POST https://letsfg.co/api/agent-book/status \ - Network accessline 1077
curl -X POST https://letsfg.co/api/agent-book/status \ - Network accessline 1093
token they issued has been revoked — such a token now answers `401 TOKEN_REVOKED`, and `POST /api/agent-access/verify` answers `410` for a Stripe credential. Connect again at <https://letsfg.co/connect>. `letsfg auth` (npm and PyPI) - Network accessline 1094
and `POST /api/agent-access/verify` answers `410` for a Stripe credential. Connect again at <https://letsfg.co/connect>. `letsfg auth` (npm and PyPI) now drives that connect flow from the terminal — it registers itself as an - Network accessline 1095
again at <https://letsfg.co/connect>. `letsfg auth` (npm and PyPI) - Network accessline 1115
| Endpoint | URL | |----------|-----| | OpenAPI/Swagger | https://letsfg.co/developers/api/docs | - Network accessline 1116
|----------|-----| | OpenAPI/Swagger | https://letsfg.co/developers/api/docs | | Agent discovery | https://letsfg.co/developers/api/.well-known/ai-plugin.json | - Network accessline 1117
| OpenAPI/Swagger | https://letsfg.co/developers/api/docs | - Network accessline 1118
| Agent discovery | https://letsfg.co/developers/api/.well-known/ai-plugin.json | - Network accessline 1119
| Agent manifest | https://letsfg.co/developers/api/.well-known/agent.json | - Network accessline 1120
| LLM instructions | https://letsfg.co/developers/api/llms.txt | - Network accessline 1124
- **PyPI:** https://pypi.org/project/letsfg/ - Network accessline 1125
- **npm (JS SDK):** https://www.npmjs.com/package/letsfg - Network accessline 1126
- **npm (MCP):** https://www.npmjs.com/package/letsfg-mcp
CLAUDE.md
- Network accessline 48
**PFS Base URL:** `https://letsfg.co` (Bearer token auth — see below) - Network accessline 49
**Developer API Base URL:** `https://letsfg.co/developers/api/v1` - Network accessline 53
| Mode | What it is | Speed | Cost | |------|-----------|-------|------| | **MCP / CLI / SDK** | Hosted MCP at `https://letsfg.co/mcp` (one-tap consent, no card; card at the first booking); `pip install letsfg` wraps PFS with ranking | 8–10 - Network accessline 54
|------|-----------|-------|------| | **MCP / CLI / SDK** | Hosted MCP at `https://letsfg.co/mcp` (one-tap consent, no card; card at the first booking); `pip install letsfg` wraps PFS with ranking | 8–10 s to first results; longer to `compl - Network accessline 55
| **MCP / CLI / SDK** | Hosted MCP at `https://letsfg.co/mcp` (one-tap consent, no card; card at the first booking); `pip install letsfg` wraps PFS with ranking | 8–10 s to first results; longer to `completed`, longer again on a split | Fre - Network accessline 134
Add https://letsfg.co/mcp as an MCP server → approve - Network accessline 135
→ consent opens https://letsfg.co/connect → one tap, no card - Network accessline 137
→ first booking asks for the card (0.00 setup, nothing charged) POST /api/agent-access/request → 402 { error: "payment_method_required", message, add_card_url: "https://letsfg.co/connect", how: [...], retired, mpp } - Network accessline 138
POST /api/agent-access/request → 402 { error: "payment_method_required", message, add_card_url: "https://letsfg.co/connect", how: [...], retired, mpp } (the instructions as JSON: Option A = add the connector, Option B = self-registe - Network accessline 139
add_card_url: "https://letsfg.co/connect", how: [...], retired, mpp } - Network accessline 229
| Method | Path | Description | |--------|------|-------------| | `POST` | `/api/agent-access/request` | Always 402 → `{ error: "payment_method_required", message, add_card_url: "https://letsfg.co/connect", how, retired, mpp }`: the connect - Network accessline 230
|--------|------|-------------| | `POST` | `/api/agent-access/request` | Always 402 → `{ error: "payment_method_required", message, add_card_url: "https://letsfg.co/connect", how, retired, mpp }`: the connect instructions as JSON. It mints - Network accessline 231
| `POST` | `/api/agent-access/request` | Always 402 → `{ error: "payment_method_required", message, add_card_url: "https://letsfg.co/connect", how, retired, mpp }`: the connect instructions as JSON. It mints nothing; the token comes from th - Network accessline 238
### Developer API (look-to-book search) Base: `https://letsfg.co/developers/api/v1` - Network accessline 239
Base: `https://letsfg.co/developers/api/v1` - Network accessline 268
- **API Docs:** https://letsfg.co/developers/api/docs - Network accessline 269
- **PyPI:** https://pypi.org/project/letsfg/ - Network accessline 270
- **npm SDK:** https://www.npmjs.com/package/letsfg - Network accessline 271
- **npm MCP:** https://www.npmjs.com/package/letsfg-mcp - Network accessline 272
- **GitHub:** https://github.com/LetsFG/LetsFG
CODE_OF_CONDUCT.md
CONTRIBUTING.md
- Network accessline 7
- **GitHub:** https://github.com/LetsFG/LetsFG - Network accessline 8
- **API Docs:** https://letsfg.co/developers/api/docs - Network accessline 9
- **npm (JS SDK):** https://www.npmjs.com/package/letsfg - Network accessline 10
- **npm (MCP):** https://www.npmjs.com/package/letsfg-mcp - Network accessline 11
- **PyPI:** https://pypi.org/project/letsfg/ - Network accessline 15
1. **Bugs & small fixes** → Open a PR directly 2. **New features / architecture changes** → Open a [GitHub Issue](https://github.com/LetsFG/LetsFG/issues) first to discuss - Network accessline 16
2. **New features / architecture changes** → Open a [GitHub Issue](https://github.com/LetsFG/LetsFG/issues) first to discuss - Network accessline 17
3. **Questions** → Open a [GitHub Discussion](https://github.com/LetsFG/LetsFG/discussions)
Dockerfile
- Executable scriptline 1
Executable file - Dangerous shell operationline 7
RUN apt-get update && apt-get install -y --no-install-recommends wget ca-certificates fonts-liberation libasound2t64 libatk-bridge2.0-0 libatk1.0-0 libcups2 libdbus-1-3 libdrm2 libgbm1 - Network accessline 7
RUN apt-get update && apt-get install -y --no-install-recommends \ wget \ - Network accessline 8
wget \ - Dangerous shell operationline 26
&& rm -rf /var/lib/apt/lists/* - Access to secretsline 37
[Credential-related source omitted]
Dockerfile.python
- Access to secretsline 16
[Credential-related source omitted] - Access to secretsline 17
[Credential-related source omitted] - Dangerous shell operationline 30
&& rm -rf /var/lib/apt/lists/* - Access to secretsline 46
[Credential-related source omitted] - Network accessline 49
LETSFG_MAX_BROWSERS="2" \ # Optional residential proxy for bot-protected airlines # Format: http://user:pass@host:port - Network accessline 50
# Optional residential proxy for bot-protected airlines # Format: http://user:pass@host:port LETSFG_PROXY="" - Network accessline 51
# Format: http://user:pass@host:port
LICENSE
Model.js
- Executable scriptline 1
Executable file - Network accessline 36
var API_ORIGIN = "https://letsfg.co" - Network accessline 182
// // letsfg.co renders carrier marks from a third-party CDN, keyed by IATA code: // https://pics.avs.io/100/100/{IATA}.png - Network accessline 183
// letsfg.co renders carrier marks from a third-party CDN, keyed by IATA code: // https://pics.avs.io/100/100/{IATA}.png // The plugin does the same, so a card looks like a card on the site. - Network accessline 184
// https://pics.avs.io/100/100/{IATA}.png - Network accessline 200
var LOGO_CDN_PRIMARY = "https://images.kiwi.com/airlines/64/" - Network accessline 201
var LOGO_CDN_FALLBACK = "https://pics.avs.io/100/100/" - Network accessline 368
// Strip any userinfo attempt: https://evil.com@letsfg.co reads as letsfg.co - Network accessline 398
// The site builds the link itself, and this is that same shape: // // https://letsfg.co/en?stage=results&sid=<search_id>&o=GDN&d=WAW - Network accessline 399
// // https://letsfg.co/en?stage=results&sid=<search_id>&o=GDN&d=WAW // &dep=2026-09-21&cur=USD&offer=<offer_id> - Network accessline 400
// https://letsfg.co/en?stage=results&sid=<search_id>&o=GDN&d=WAW - Network accessline 414
// user's BROWSER. // // The gap is narrow but real: "https://checkout.stripe.com.evil.com/x" passes - Network accessline 415
// // The gap is narrow but real: "https://checkout.stripe.com.evil.com/x" passes // a shape check and reads, to a person glancing at a URL bar, like Stripe. In - Network accessline 416
// The gap is narrow but real: "https://checkout.stripe.com.evil.com/x" passes - Network accessline 496
// 1. POST /developers/api/oauth/register (RFC 7591, no credential needed) // -> { client_id } // 2. open https://letsfg.co/connect?client_id=...&code_challenge=... - Network accessline 497
// -> { client_id } // 2. open https://letsfg.co/connect?client_id=...&code_challenge=... // a PERSON saves a card there (a 0.00 Revolut setup; nothing is charged) - Network accessline 498
// 2. open https://letsfg.co/connect?client_id=...&code_challenge=... - Access to secretsline 502
[Credential-related source omitted] - Network accessline 523
var CONNECT_REDIRECT_URI = "http://127.0.0.1:17531/letsfg-omarchy" - Access to secretsline 746
[Credential-related source omitted] - Access to secretsline 754
[Credential-related source omitted] - Network accessline 1679
var TILE_HOST = "https://basemaps.cartocdn.com/rastertiles/voyager/" - Network accessline 1834
// server did not. Copying that here double-charged: 167 -> 172. // // I got this wrong once by checking an anonymous curl payload and concluding - Network accessline 1835
// // I got this wrong once by checking an anonymous curl payload and concluding // the panel under-quoted. Check the lane the panel actually uses. - Network accessline 1836
// I got this wrong once by checking an anonymous curl payload and concluding - Network accessline 2015
var HOTEL_IMAGE_HOSTS = [ "https://i.travelapi.com/", - Network accessline 2016
"https://i.travelapi.com/", - Network accessline 2017
"https://q-xx.bstatic.com/", - Network accessline 2018
"https://letsfg.co/" - Network accessline 2178
var POPULAR_IMAGE_HOSTS = [ "https://images.pexels.com/", - Network accessline 2179
"https://images.pexels.com/", - Network accessline 2180
"https://upload.wikimedia.org/", - Network accessline 2181
"https://letsfg.co/"
OMARCHY-PLUGIN.md
- Network accessline 10
Search runs server-side at [letsfg.co](https://letsfg.co) — the same engine - Network accessline 37
omarchy plugin add https://github.com/LetsFG/LetsFG.git --enable - Network accessline 53
registers itself as an OAuth client, opens letsfg.co/connect in your browser, and you approve there. The browser is then sent to `http://127.0.0.1:17531/letsfg-omarchy?code=…` — a page that cannot load, - Network accessline 54
browser, and you approve there. The browser is then sent to `http://127.0.0.1:17531/letsfg-omarchy?code=…` — a page that cannot load, because nothing on your machine listens there — and you copy that address - Network accessline 55
`http://127.0.0.1:17531/letsfg-omarchy?code=…` — a page that cannot load, - Network accessline 252
- HTTPS requests to `https://letsfg.co`: `POST /api/search` and - Network accessline 264
**Not GitHub's API**: it is a third host, allows 60 unauthenticated calls an hour per IP, and returned 401 outright from a normal network in testing. - **Map tiles from `https://basemaps.cartocdn.com`**, for the results map, and - Network accessline 265
hour per IP, and returned 401 outright from a normal network in testing. - **Map tiles from `https://basemaps.cartocdn.com`**, for the results map, and **`POST /api/transfers/airport`** on letsfg.co for the ground-transport pill. - Network accessline 266
- **Map tiles from `https://basemaps.cartocdn.com`**, for the results map, and - Network accessline 272
one; using it would mean quietly breaking their terms. Attribution is drawn on the map, as the licence requires. `"map": false` turns the whole pane off. - **Stargazer avatar images from `https://avatars.githubusercontent.com`** — - Network accessline 273
on the map, as the licence requires. `"map": false` turns the whole pane off. - **Stargazer avatar images from `https://avatars.githubusercontent.com`** — the same host letsfg.co's own homepage loads them from. Image GETs only; the - Network accessline 274
- **Stargazer avatar images from `https://avatars.githubusercontent.com`** — - Network accessline 277
ever sees them. Set `"socialProof": false` in `shell.json` and the plugin never contacts it and the row does not appear. - **Airline logo images from `https://images.kiwi.com`, falling back to - Network accessline 278
never contacts it and the row does not appear. - **Airline logo images from `https://images.kiwi.com`, falling back to `https://pics.avs.io`** — the same two CDNs letsfg.co itself uses, in the same - Network accessline 279
- **Airline logo images from `https://images.kiwi.com`, falling back to - Network accessline 280
`https://pics.avs.io`** — the same two CDNs letsfg.co itself uses, in the same - Network accessline 289
plugin never contacts either, falling back to carrier initials. - **Popular-destination card images**, on the homepage only, from `https://images.pexels.com` and `https://upload.wikimedia.org` — the hosts - Network accessline 290
- **Popular-destination card images**, on the homepage only, from `https://images.pexels.com` and `https://upload.wikimedia.org` — the hosts letsfg.co's own image resolver picks for those cards, plus letsfg.co itself - Network accessline 291
`https://images.pexels.com` and `https://upload.wikimedia.org` — the hosts - Network accessline 361
browser opens; an offer whose URL fails is shown but not clickable. The shape check alone is not enough for that job and is not asked to do it: `https://checkout.stripe.com.evil.com/x` is a well-formed https URL that reads - Network accessline 362
check alone is not enough for that job and is not asked to do it: `https://checkout.stripe.com.evil.com/x` is a well-formed https URL that reads like Stripe at a glance, which is why the origin check exists on top of it. A non-JSON body (an - Network accessline 363
`https://checkout.stripe.com.evil.com/x` is a well-formed https URL that reads
Panel.qml
- Network accessline 2786
hoverEnabled: true cursorShape: Qt.PointingHandCursor onClicked: root.openOffer("https://letsfg.co/en/loved-by") - Network accessline 2787
cursorShape: Qt.PointingHandCursor onClicked: root.openOffer("https://letsfg.co/en/loved-by") } - Network accessline 2788
onClicked: root.openOffer("https://letsfg.co/en/loved-by") - Network accessline 2999
anchors.rightMargin: Style.space(14) text: root.authPaste placeholderText: "http://127.0.0.1:17531/letsfg-omarchy?code=…" - Network accessline 3000
text: root.authPaste placeholderText: "http://127.0.0.1:17531/letsfg-omarchy?code=…" placeholderTextColor: root.inkFaint - Network accessline 3001
placeholderText: "http://127.0.0.1:17531/letsfg-omarchy?code=…" - Network accessline 3385
hoverEnabled: true cursorShape: Qt.PointingHandCursor onClicked: root.openOffer("https://letsfg.co/en/hotels") - Network accessline 3386
cursorShape: Qt.PointingHandCursor onClicked: root.openOffer("https://letsfg.co/en/hotels") } - Network accessline 3387
onClicked: root.openOffer("https://letsfg.co/en/hotels")
README.md
- Network accessline 3
<a href="https://github.com/LetsFG/LetsFG"> - Network accessline 19
[<img src="https://img.shields.io/badge/Add_to_Claude-D97757?style=for-the-badge&logo=claude&logoColor=white" alt="Add to Claude">](https://claude.ai/directory/letsfg) - Network accessline 20
[<img src="https://img.shields.io/badge/⭐_Star_to_show_love-FFD700?style=for-the-badge&logoColor=black" alt="Star to show love">](https://github.com/LetsFG/LetsFG) - Network accessline 21
[<img src="https://img.shields.io/badge/⭐_Star_to_show_love-FFD700?style=for-the-badge&logoColor=black" alt="Star to show love">](https://github.com/LetsFG/LetsFG) - Network accessline 22
[<img src="https://img.shields.io/badge/🌐_Try_on_letsfg.co-4CAF50?style=for-the-badge&logoColor=white" alt="Try on letsfg.co">](https://letsfg.co/en) - Network accessline 23
[<img src="https://img.shields.io/badge/🌐_Try_on_letsfg.co-4CAF50?style=for-the-badge&logoColor=white" alt="Try on letsfg.co">](https://letsfg.co/en) - Network accessline 25
[<img src="https://img.shields.io/badge/📦_pip_install_letsfg-3776AB?style=for-the-badge&logo=python&logoColor=white" alt="pip install">](https://pypi.org/project/letsfg/) - Network accessline 29
[<img src="assets/badge-instagram.svg" alt="Follow on Instagram">](https://www.instagram.com/letsfg_) - Network accessline 30
[<img src="assets/badge-tiktok.svg" alt="Follow on TikTok">](https://www.tiktok.com/@letsfg_) - Network accessline 31
[<img src="assets/badge-tiktok.svg" alt="Follow on TikTok">](https://www.tiktok.com/@letsfg_) - Network accessline 33
[<img src="assets/badge-x.svg" alt="Follow on X">](https://x.com/LetsFG_) - Network accessline 39
<a href="https://twitter.com/intent/tweet?text=Found%20this.%20Real%20flight%20prices%2C%20one%20total%20price.%20Your%20AI%20agent%20can%20search%20%26%20book%20flights%20now.&url=https%3A%2F%2Fgithub.com%2FLetsFG%2FLetsFG"><img src="https - Network accessline 40
<a href="https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fgithub.com%2FLetsFG%2FLetsFG"><img src="https://img.shields.io/badge/Share_on_LinkedIn-0A66C2?style=flat-square&logo=linkedin&logoColor=white" alt="Share on L - Network accessline 41
<a href="https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fgithub.com%2FLetsFG%2FLetsFG"><img src="https://img.shields.io/badge/Share_on_LinkedIn-0A66C2?style=flat-square&logo=linkedin&logoColor=white" alt="Share on LinkedIn - Network accessline 42
<a href="https://reddit.com/submit?url=https%3A%2F%2Fgithub.com%2FLetsFG%2FLetsFG&title=LetsFG%20-%20AI%20flight%20search%20for%20agents.%20Real%20prices%2C%20one%20total%20price."><img src="https://img.shields.io/badge/Share_on_Redd - Network accessline 43
<a href="https://reddit.com/submit?url=https%3A%2F%2Fgithub.com%2FLetsFG%2FLetsFG&title=LetsFG%20-%20AI%20flight%20search%20for%20agents.%20Real%20prices%2C%20one%20total%20price."><img src="https://img.shields.io/badge/Share_on_Reddit-FF45 - Network accessline 44
<a href="https://wa.me/?text=Check%20this%20out!%20LetsFG%20searches%20every%20airline%20and%20gives%20you%20one%20total%20price.%20https%3A%2F%2Fgithub.com%2FLetsFG%2FLetsFG"><img src="https://img.shields.io/badge/Share_on_WhatsApp- - Network accessline 45
<a href="https://wa.me/?text=Check%20this%20out!%20LetsFG%20searches%20every%20airline%20and%20gives%20you%20one%20total%20price.%20https%3A%2F%2Fgithub.com%2FLetsFG%2FLetsFG"><img src="https://img.shields.io/badge/Share_on_WhatsApp-25D366? - Network accessline 46
<a href="https://t.me/share/url?url=https%3A%2F%2Fgithub.com%2FLetsFG%2FLetsFG&text=LetsFG%20-%20AI%20flight%20search%20for%20agents.%20Real%20prices%2C%20one%20total%20price."><img src="https://img.shields.io/badge/Share_on_Telegram - Network accessline 47
<a href="https://t.me/share/url?url=https%3A%2F%2Fgithub.com%2FLetsFG%2FLetsFG&text=LetsFG%20-%20AI%20flight%20search%20for%20agents.%20Real%20prices%2C%20one%20total%20price."><img src="https://img.shields.io/badge/Share_on_Telegram-26A5E4 - Network accessline 49
<a href="mailto:?subject=Check%20out%20LetsFG&body=Found%20this.%20Real%20flight%20prices%2C%20one%20total%20price.%20Your%20AI%20agent%20can%20search%20%26%20book%20flights%20now.%0A%0Ahttps%3A%2F%2Fgithub.com%2FLetsFG%2FLetsFG"><img src=" - Network accessline 61
[Credential-related source omitted] - Network accessline 65
[](https://github.com/LetsFG/LetsFG) - Network accessline 66
[](https://pypi.org/project/letsfg/) - Network accessline 67
[](https://www.npmjs.com/package/letsfg-mcp) - Network accessline 68
[](https://letsfg.co/developers/connectors/health) - Network accessline 69
[](https://mcpvault.io/servers/letsfg/health?utm_source=external_badge&utm_medium=referral&utm_campaign=mcp_health_report) - Network accessline 70
[](LICENSE) - Network accessline 76
<a href="https://evomi.com/?utm_source=letsfg&utm_medium=banner"> - Network accessline 120
**Human users:** Use [letsfg.co](https://letsfg.co) and search flights instantly in your browser: - Network accessline 124
### 🌐 [**Search on letsfg.co**](https://letsfg.co) - Network accessline 130
**Agents / scripts (free server-side):** Get a Bearer token by putting a payment method on file (nothing is charged) → use `POST /api/search` and `POST /api/agent-book`. This is **PFS — Programmatic Flight Search** powered by the letsfg.co - Network accessline 142
| **Search cost** | Free (connect once: one tap, no card) | Free (connect once: one tap, no card) | Look-to-book: 200 free after every booking, then $0.01 | | **Booking** | `book_flight` — fare held on your card, agent buys the ticket, real - Network accessline 143
| **Booking** | `book_flight` — fare held on your card, agent buys the ticket, real PNR | `POST /api/agent-book` — same flow | `POST /flights/book` — same flow, no booking fee | | **Setup** | Add `https://letsfg.co/mcp` as an MCP server and - Network accessline 144
[Credential-related source omitted] - Network accessline 147
- **MCP / CLI / SDK (Path 1):** add `https://letsfg.co/mcp` as an MCP server in Claude, ChatGPT, Cursor or Windsurf and approve the connection. The consent step opens **letsfg.co/connect**: one tap, no card. The card is asked for at the fir - Network accessline 149
- **PFS — Programmatic Flight Search (Path 2):** For scripts and agents that call the API directly. letsfg.co is human-only by default (Cloudflare Turnstile + bot protection), so the token from the connect flow is the only programmatic way - Network accessline 150
[Credential-related source omitted] - Network accessline 151
2. Poll: `GET https://letsfg.co/api/results/<search_id>` (never counts against the rate limit) - Network accessline 152
3. Book: `POST https://letsfg.co/api/agent-book` → `{ booking_ref }` within seconds - Network accessline 153
4. Wait: `POST https://letsfg.co/api/agent-book/status` with `{ booking_ref }` every 20–30 s until `completed` (PNR), `failed` (hold released, nothing charged) or `needs_attention` - Network accessline 155
[Credential-related source omitted] - Network accessline 157
- **Developer API (Path 3):** Server-side search and booking at [letsfg.co/developers](https://letsfg.co/developers). Look-to-book search (200 free after every booking, then $0.01), real booking through `POST /flights/book` on a connected R - Network accessline 177
**Developer API = business use, look-to-book.** [letsfg.co/developers](https://letsfg.co/developers) books flights itself — `POST /flights/book` holds the fare on your connected Revolut method and a LetsFG booking agent buys the ticket, exa - Network accessline 181
> 💡 **Know someone who travels?** The more people discover LetsFG, the more airlines we cover — and the better it gets for everyone. **[⭐ Star](https://github.com/LetsFG/LetsFG)** · **[Share with a friend](#-join-the-community-)** - Network accessline 209
# Claude Code claude mcp add --transport http letsfg https://letsfg.co/mcp - Network accessline 210
claude mcp add --transport http letsfg https://letsfg.co/mcp - Network accessline 214
// Cursor (~/.cursor/mcp.json) — Windsurf uses "serverUrl" instead of "url" { "mcpServers": { "letsfg": { "url": "https://letsfg.co/mcp" } } } - Network accessline 215
{ "mcpServers": { "letsfg": { "url": "https://letsfg.co/mcp" } } } - Network accessline 218
Claude: LetsFG is in Claude's official connector directory. Open **[claude.ai/directory/letsfg](https://claude.ai/directory/letsfg)**, add it and approve the connection. No URL to paste. Once added, it works in Claude Desktop and the Claude - Network accessline 220
ChatGPT: add it at chatgpt.com in a browser (the ChatGPT phone app has no way to add one): Plugins > Add > Add custom MCP server, URL `https://letsfg.co/mcp`, authentication OAuth, tick I understand, Create as a plugin. Once added, it works - Access to secretsline 228
[Credential-related source omitted] - Network accessline 233
The SDKs read the token from `LETSFG_BEARER_TOKEN` or `~/.letsfg/config.json`. `letsfg auth` performs that connect flow itself: it registers as an OAuth client, opens https://letsfg.co/connect for a person to approve, and writes the token t - Network accessline 240
# 1. Search with the token curl -X POST https://letsfg.co/api/search \ - Network accessline 241
curl -X POST https://letsfg.co/api/search \ - Network accessline 247
[Credential-related source omitted] - Network accessline 248
[Credential-related source omitted] - Network accessline 250
# 3. Book — the fare is HELD on the card, a LetsFG agent buys the ticket curl -X POST https://letsfg.co/api/agent-book \ - Network accessline 251
curl -X POST https://letsfg.co/api/agent-book \ - Network accessline 259
# 4. Wait for the PNR (every 20–30 s; a booking takes 4–11 minutes) curl -X POST https://letsfg.co/api/agent-book/status \ - Network accessline 260
curl -X POST https://letsfg.co/api/agent-book/status \ - Network accessline 266
`failed` means the hold was released and nothing was charged; `needs_attention` means a human at LetsFG is checking it, do not book again. A missing passenger detail returns `missing_fields` and charges nothing. Without a card the endpoint - Network accessline 270
A **separate product** for high-volume commercial integrations; most agents should not use it. Look-to-book search, results in seconds, and real booking through `POST /flights/book` — plus `/discover` (20 destinations in one call), async po - Network accessline 273
# Register, then search with your API key curl -X POST https://letsfg.co/developers/api/v1/agents/register \ - Network accessline 274
curl -X POST https://letsfg.co/developers/api/v1/agents/register \ - Network accessline 278
curl -X POST https://letsfg.co/developers/api/v1/flights/search \ - Network accessline 284
Pricing: 200 searches free after every booking, then blocks of 500 for $5.00 ($0.01 each). No booking fee, no transaction fee. Minimum top-up $5. Test for free in the sandbox first, booking included. Full docs: [letsfg.co/developers/api/doc - Network accessline 306
> 💡 **Like what you see?** Support us — **[⭐ Star](https://github.com/LetsFG/LetsFG)** · **[Share with a friend](#-join-the-community-)** - Network accessline 318
"mcpServers": { "letsfg": { "url": "https://letsfg.co/mcp" - Network accessline 319
"letsfg": { "url": "https://letsfg.co/mcp" } - Network accessline 320
"url": "https://letsfg.co/mcp" - Access to secretsline 340
[Credential-related source omitted] - Network accessline 347
This is a **separate paid product** for high-volume commercial use — most agents should stick with the free connect flow above and skip this. A human setting this up deliberately gets a key at [letsfg.co/developers](https://letsfg.co/develo - Access to secretsline 358
[Credential-related source omitted] - Network accessline 479
> the reservation-fee fields retired on 2026-09-11 (`expected_balance`, no `expected_cost`), and the API refuses > every hotel booking they make. Update with `pip install -U letsfg`, `npm install letsfg@latest` or > `npx -y letsfg-mcp@lates - Network accessline 481
> `npx -y letsfg-mcp@latest`. The hosted MCP at `https://letsfg.co/mcp` needs no update. - Access to secretsline 485
[Credential-related source omitted] - Access to secretsline 563
[Credential-related source omitted] - Network accessline 585
Search every airline in the world from the [Omarchy](https://omarchy.org) bar. Type - Network accessline 596
omarchy plugin add https://github.com/LetsFG/LetsFG.git --enable - Network accessline 628
| Package | Command | What you get | |---------|---------|--------------| | **Remote MCP** | `https://letsfg.co/mcp` | No install. Approve the connection at letsfg.co/connect (one tap, no card), search and book | - Network accessline 629
|---------|---------|--------------| | **Remote MCP** | `https://letsfg.co/mcp` | No install. Approve the connection at letsfg.co/connect (one tap, no card), search and book | | **Python SDK + CLI** | `pip install letsfg` | SDK + CLI (token - Network accessline 630
| **Remote MCP** | `https://letsfg.co/mcp` | No install. Approve the connection at letsfg.co/connect (one tap, no card), search and book | - Network accessline 632
| **MCP Server (stdio)** | `npx letsfg-mcp` | Local server for clients without remote MCP support; needs `LETSFG_BEARER_TOKEN` | | **JS/TS SDK** | `npm install -g letsfg` | SDK + CLI + open-source ranking engine | | **Agent Skill** | `npx s - Network accessline 633
| **JS/TS SDK** | `npm install -g letsfg` | SDK + CLI + open-source ranking engine | | **Agent Skill** | `npx skills add LetsFG/LetsFG` | Install flight search skill for any AI agent ([skills.sh](https://skills.sh)) | | **Smithery** | [smit - Network accessline 634
| **Agent Skill** | `npx skills add LetsFG/LetsFG` | Install flight search skill for any AI agent ([skills.sh](https://skills.sh)) | - Network accessline 635
| **Smithery** | [smithery.ai/servers/letsfg](https://smithery.ai/servers/letsfg) | One-click MCP install | - Network accessline 636
| **Omarchy plugin** | `omarchy plugin add https://github.com/LetsFG/LetsFG.git --enable` | Flight search in the Omarchy bar ([details](OMARCHY-PLUGIN.md)) | - Network accessline 666
1. **Auth** — add `https://letsfg.co/mcp` as an MCP server and approve it. The OAuth consent step opens letsfg.co/connect: one tap, no card. The card is asked for at the first booking, in a 0.00 Revolut setup. Nothing is charged to connect. - Network accessline 667
2. **Search** — `letsfg search LHR BCN 2026-06-15` calls `POST https://letsfg.co/api/search`, polls until done (8–10 s to first results), and applies the open-source ranking algorithm locally. - Network accessline 706
[Credential-related source omitted] - Network accessline 707
[Credential-related source omitted] - Network accessline 793
<a href="https://www.star-history.com/?repos=LetsFG%2FLetsFG&type=date&legend=top-left"> - Network accessline 794
<picture> <source media="(prefers-color-scheme: dark)" srcset="https://letsfg.co/api/stars/history?theme=dark" /> <source media="(prefers-color-scheme: light)" srcset="https://letsfg.co/api/stars/history?theme=light" /> - Network accessline 795
<source media="(prefers-color-scheme: dark)" srcset="https://letsfg.co/api/stars/history?theme=dark" /> - Network accessline 796
<source media="(prefers-color-scheme: light)" srcset="https://letsfg.co/api/stars/history?theme=light" /> - Network accessline 797
<img alt="Star History Chart" src="https://letsfg.co/api/stars/history?theme=light" /> - Network accessline 805
**[letsfg.co](https://letsfg.co)** · **[API Docs](https://letsfg.co/developers/api/docs)** · **[Connector Health](https://letsfg.co/developers/api/v1/analytics/connectors/health)** · **[PyPI](https://pypi.org/project/letsfg/)** · **[npm](ht - Network accessline 809
Want updates? Click **Watch** above, or follow [LetsFG on Instagram](https://www.instagram.com/letsfg_), [@letsfg_ on TikTok](https://www.tiktok.com/@letsfg_), or [@LetsFG_ on X](https://x.com/LetsFG_).
SECURITY.md
SKILL.md
- Network accessline 11
> and booking costs the price on the offer. Earlier revisions of this page > described an MPP charge at *unlock* time; that never shipped. See > <https://letsfg.co/for-agents>. - Network accessline 13
> <https://letsfg.co/for-agents>. - Network accessline 22
> > To search and book flights, connect LetsFG as an MCP server at > `https://letsfg.co/mcp` and approve it — the consent at - Network accessline 23
> To search and book flights, connect LetsFG as an MCP server at > `https://letsfg.co/mcp` and approve it — the consent at > <https://letsfg.co/connect> is one tap and needs no card. Then search and book. - Network accessline 24
> `https://letsfg.co/mcp` and approve it — the consent at - Network accessline 25
> <https://letsfg.co/connect> is one tap and needs no card. Then search and book. - Network accessline 26
> See <https://letsfg.co/for-agents>. - Network accessline 33
- **Purpose:** Agent-native flight and hotel search and booking - **Compatible agents:** OpenClaw, Perplexity Computer, Claude Desktop, Cursor, Windsurf, and any MCP-compatible client - **API Base URL:** `https://letsfg.co/developers/api/v1 - Network accessline 34
- **Compatible agents:** OpenClaw, Perplexity Computer, Claude Desktop, Cursor, Windsurf, and any MCP-compatible client - **API Base URL:** `https://letsfg.co/developers/api/v1` - **MCP Endpoint:** `https://letsfg.co/mcp` (Streamable HTTP) - Network accessline 35
- **API Base URL:** `https://letsfg.co/developers/api/v1` - Network accessline 36
- **MCP Endpoint:** `https://letsfg.co/mcp` (Streamable HTTP) - Network accessline 43
|------|----------|-------|------| | **MCP / SDK / CLI** (PFS token) | **Almost every agent.** Search + booking | 8–10 s to first results | Free auth, free search, booking at the price on the offer | | **Developer API** (`https://letsfg.co/ - Network accessline 45
| **Developer API** (`https://letsfg.co/developers`) | Business / commercial / high-volume (hotels work on either credential) | 2–5 s (discover) · 8–10 s to first results (full search) | Look-to-book: 200 searches free after every booking, - Network accessline 116
The booking itself takes 4–11 minutes — poll `get_flight_booking`. - **Nothing charged on:** `{"error": "missing_details", "missing_fields": [...]}` (ask, call again), `payment_method_required` and `payment_declined` (both carry `add_ - Network accessline 117
- **Nothing charged on:** `{"error": "missing_details", "missing_fields": [...]}` (ask, call again), `payment_method_required` and `payment_declined` (both carry `add_card_url`: https://letsfg.co/connect). - Never call it twice for th - Network accessline 118
`payment_method_required` and `payment_declined` (both carry `add_card_url`: https://letsfg.co/connect). - Access to secretsline 190
[Credential-related source omitted] - Network accessline 193
**Developer API only.** `POST /api/v1/agents/connect-payment` returns a one-time `connect_url`; a person opens it in a browser and saves a card or Revolut Pay. Agents on the PFS lane do not call this — connecting at <https://letsfg.co/conne - Network accessline 194
person opens it in a browser and saves a card or Revolut Pay. Agents on the PFS lane do not call this — connecting at <https://letsfg.co/connect> needs no card, and the card is asked for at their first booking. - Network accessline 195
this — connecting at <https://letsfg.co/connect> needs no card, and the card is asked - Network accessline 209
**PFS (recommended — almost every agent):** a Bearer token from the connect flow. Connecting needs no card and nothing is charged. The card is asked for at the first booking, in a 0.00 Revolut setup at <https://letsfg.co/connect> (any card, - Network accessline 210
Connecting needs no card and nothing is charged. The card is asked for at the first booking, in a 0.00 Revolut setup at <https://letsfg.co/connect> (any card, or Revolut Pay / Google Pay; no Revolut account needed; card details never touch - Network accessline 211
first booking, in a 0.00 Revolut setup at <https://letsfg.co/connect> (any card, or Revolut Pay / Google Pay; no Revolut - Network accessline 221
1. Add LetsFG as a remote MCP server: `https://letsfg.co/mcp`. - Network accessline 222
2. Approve the connection. The OAuth consent step opens <https://letsfg.co/connect>: one tap, no card. 3. Over the MCP the OAuth token is carried for you; over raw HTTP send it as - Network accessline 223
<https://letsfg.co/connect>: one tap, no card. - Network accessline 232
drives that connect flow from the terminal and stores the token; the CLI and SDKs otherwise read it from `LETSFG_BEARER_TOKEN`. One card = one account; quotas are per account, and per card once one is added. Full flow: <https://letsfg.co/fo - Network accessline 234
<https://letsfg.co/for-agents>. - Access to secretsline 288
[Credential-related source omitted] - Access to secretsline 347
[Credential-related source omitted] - Network accessline 356
{ "mcpServers": { "letsfg": { "url": "https://letsfg.co/mcp" } - Network accessline 357
"mcpServers": { "letsfg": { "url": "https://letsfg.co/mcp" } } - Network accessline 358
"letsfg": { "url": "https://letsfg.co/mcp" } - Network accessline 363
Claude Code: `claude mcp add --transport http letsfg https://letsfg.co/mcp`. - Network accessline 364
Claude: add it from Claude's official connector directory, <https://claude.ai/directory/letsfg> - no URL to paste (once added, it works in Claude Desktop and the Claude phone app too). - Network accessline 366
Add custom MCP server, that URL, authentication OAuth; once added it works in the phone app too. Windsurf uses `"serverUrl"` instead of `"url"`. The client runs OAuth; the consent step opens <https://letsfg.co/connect>: one tap, no card. Th - Network accessline 367
`"serverUrl"` instead of `"url"`. The client runs OAuth; the consent step opens <https://letsfg.co/connect>: one tap, no card. The token the client receives can search at once, and the card is asked for at the first booking. - Network accessline 368
<https://letsfg.co/connect>: one tap, no card. The token the client receives can - Access to secretsline 380
[Credential-related source omitted] - Network accessline 445
flights = bt.search("LHR", "JFK", "2026-04-15") except BearerTokenError: print("Token expired, revoked or missing — reconnect at https://letsfg.co/connect") - Network accessline 447
print("Token expired, revoked or missing — reconnect at https://letsfg.co/connect") - Access to secretsline 456
[Credential-related source omitted] - Access to secretsline 461
[Credential-related source omitted]
agent-skills-contribution/packages/skills-catalog/skills/(tooling)/letsfg/SKILL.md
- Network accessline 38
"mcpServers": { "letsfg": { "url": "https://letsfg.co/mcp", - Network accessline 39
"letsfg": { "url": "https://letsfg.co/mcp", "headers": { - Network accessline 40
"url": "https://letsfg.co/mcp", - Access to secretsline 42
[Credential-related source omitted] - Access to secretsline 58
[Credential-related source omitted] - Access to secretsline 76
[Credential-related source omitted] - Network accessline 289
- **API Docs:** https://letsfg.co/developers/api/docs - Network accessline 290
- **GitHub:** https://github.com/LetsFG/LetsFG - Network accessline 291
- **PyPI:** https://pypi.org/project/letsfg/ - Network accessline 292
- **npm SDK:** https://www.npmjs.com/package/letsfg - Network accessline 293
- **npm MCP:** https://www.npmjs.com/package/letsfg-mcp
agent-skills-contribution/packages/skills-catalog/skills/(tooling)/letsfg/references/api-reference.md
- Network accessline 5
**Base URL:** `https://letsfg.co/developers/api/v1` - Access to secretsline 12
[Credential-related source omitted] - Access to secretsline 37
[Credential-related source omitted] - Network accessline 48
{ "status": "connect_required", "connect_url": "https://letsfg.co/connect?dev=sess_abc123", - Network accessline 49
"status": "connect_required", "connect_url": "https://letsfg.co/connect?dev=sess_abc123", "expires_in_seconds": 3600 - Network accessline 50
"connect_url": "https://letsfg.co/connect?dev=sess_abc123",
agent-skills-contribution/packages/skills-catalog/skills/(tooling)/letsfg/references/mcp-setup.md
- Network accessline 19
curl -X POST https://letsfg.co/developers/api/v1/agents/register \ - Network accessline 30
"mcpServers": { "letsfg": { "url": "https://letsfg.co/mcp", - Network accessline 31
"letsfg": { "url": "https://letsfg.co/mcp", "headers": { - Network accessline 32
"url": "https://letsfg.co/mcp", - Access to secretsline 34
[Credential-related source omitted] - Access to secretsline 50
[Credential-related source omitted] - Network accessline 65
"mcpServers": { "letsfg": { "url": "https://letsfg.co/mcp", - Network accessline 66
"letsfg": { "url": "https://letsfg.co/mcp", "headers": { - Network accessline 67
"url": "https://letsfg.co/mcp", - Access to secretsline 69
[Credential-related source omitted] - Access to secretsline 87
[Credential-related source omitted] - Access to secretsline 105
[Credential-related source omitted] - Access to secretsline 123
[Credential-related source omitted] - Access to secretsline 139
[Credential-related source omitted]
assets/OFL-Kalam.txt
assets/OFL.txt
- Network accessline 1
Copyright 2018 The Lexend Project Authors (https://github.com/googlefonts/lexend), with Reserved Font Name “RevReading Lexend”. - Network accessline 3
This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is copied below, and is also available with a FAQ at: https://scripts.sil.org/OFL - Network accessline 5
https://scripts.sil.org/OFL
assets/badge-instagram.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="224" height="28" viewBox="0 0 224 28" role="img" aria-label="Follow on Instagram">
assets/badge-tiktok.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="190" height="28" viewBox="0 0 190 28" role="img" aria-label="Follow on TikTok">
assets/badge-x.svg
- Network accessline 1
<svg xmlns="http://www.w3.org/2000/svg" width="150" height="28" viewBox="0 0 150 28" role="img" aria-label="Follow on X">
assets/icons/LICENSE
- Network accessline 1
Icons from Lucide (https://lucide.dev) - ISC License.
assets/ranking.js
- Executable scriptline 1
Executable file
context7.json
- Network accessline 1
{ "$schema": "https://context7.com/schema/context7.json", - Network accessline 2
"$schema": "https://context7.com/schema/context7.json", - Network accessline 4
"description": "Search and book flights across every airline in the world plus the major booking sites, plus real bookable hotel rates, refundable and non-refundable. Python, JS and MCP.", "rules": [ "One credential covers flights AND - Network accessline 5
"rules": [ "One credential covers flights AND hotels: the PFS Bearer token from the connect flow (hosted MCP at https://letsfg.co/mcp, consent opens letsfg.co/connect, one tap and no card; the card is asked for at the first booking in a - Network accessline 6
"One credential covers flights AND hotels: the PFS Bearer token from the connect flow (hosted MCP at https://letsfg.co/mcp, consent opens letsfg.co/connect, one tap and no card; the card is asked for at the first booking in a 0.00 Revolut s - Network accessline 17
"Some flight offers are SPLIT TICKETS: two separately-issued tickets through a hub from two different sellers. They carry split_ticket=\"true\", combo_type=\"virtual_interlining\" and self_transfer=\"unprotected\". Always tell the user: the - Network accessline 18
], "url": "https://context7.com/letsfg/letsfg", "public_key": "pk_HrakXLAVA5rtCurZJE1U8" - Network accessline 19
"url": "https://context7.com/letsfg/letsfg",
docker-compose.yml
- Access to secretsline 9
[Credential-related source omitted] - Access to secretsline 10
[Credential-related source omitted] - Access to secretsline 24
[Credential-related source omitted] - Network accessline 26
LETSFG_MAX_BROWSERS: ${LETSFG_MAX_BROWSERS:-2} # Optional residential proxy for bot-protected airlines # Format: http://user:pass@host:port - Network accessline 27
# Optional residential proxy for bot-protected airlines # Format: http://user:pass@host:port LETSFG_PROXY: ${LETSFG_PROXY:-} - Network accessline 28
# Format: http://user:pass@host:port
docs/TESTING.md
- Access to secretsline 213
[Credential-related source omitted]
docs/agent-guide.md
- Network accessline 10
> > To search and book flights, connect LetsFG as an MCP server at > <https://letsfg.co/mcp>. Approving it opens - Network accessline 11
> To search and book flights, connect LetsFG as an MCP server at > <https://letsfg.co/mcp>. Approving it opens > <https://letsfg.co/connect>: one tap, no card. A card is asked for at the first booking. - Network accessline 12
> <https://letsfg.co/mcp>. Approving it opens - Network accessline 13
> <https://letsfg.co/connect>: one tap, no card. A card is asked for at the first booking. - Network accessline 14
> See <https://letsfg.co/for-agents>. - Network accessline 18
> 🎬 **[Watch the demo](https://github.com/LetsFG/LetsFG#demo-lfg-vs-default-agent-search)** — side-by-side comparison of default agent search vs LetsFG. - Network accessline 22
All search runs server-side at letsfg.co. Connect once through the hosted MCP (approving it at <https://letsfg.co/connect> takes one tap and needs no card) and every call carries your token — or use a prepaid Developer API key. - Access to secretsline 31
[Credential-related source omitted] - Network accessline 35
**When to use PFS (the token from the connect flow):** This is the agent path — search and booking. Connect LetsFG as an MCP server at `https://letsfg.co/mcp`; approving it opens <https://letsfg.co/connect>: one tap, no card. The card is as - Network accessline 37
**When to use Developer API:** Managed cloud search, billing controls, volume usage, and booking through `POST /flights/book`. Register at [letsfg.co/developers](https://letsfg.co/developers), then connect a Revolut method — nothing is char - Access to secretsline 42
[Credential-related source omitted] - Network accessline 147
> **MCP search rate limit:** Searches through the hosted MCP and the Bearer-token lane are limited per account (and per card once one is added) to **10 per 10 minutes, 30 per hour and 100 per day** (raised from 3 / 10 / 25 on 2026-09-02, se - Network accessline 157
1. Add LetsFG as an MCP server: `https://letsfg.co/mcp` (Claude, ChatGPT, Cursor, Windsurf, Claude Code — anything that speaks remote MCP with OAuth). In Claude: add it from Claude's connector directory, [claude.ai/directory/letsfg](https:/ - Network accessline 158
2. Approve the connection. The consent step opens <https://letsfg.co/connect>: one tap, no card. - Network accessline 161
`POST https://letsfg.co/api/agent-access/request` still answers `402` with these steps as JSON (`add_card_url`, `how`), so an agent that starts from the endpoint lands in the same place. - Network accessline 163
> **Retired 2026-09-02:** the Stripe enrolment lanes (`setup_url`, `setup_intent_id`, `payment_method_id`, `card_token`) and every token they issued. Such a token now answers `401 TOKEN_REVOKED`; `POST /api/agent-access/verify` answers `410 - Network accessline 170
# 1. Search with the token (NL query) curl -X POST https://letsfg.co/api/search \ - Network accessline 171
curl -X POST https://letsfg.co/api/search \ - Network accessline 177
# 2. Poll for results curl https://letsfg.co/api/results/ws_abc123 \ - Network accessline 178
curl https://letsfg.co/api/results/ws_abc123 \ - Network accessline 230
Full walkthrough: https://letsfg.co/for-agents - Network accessline 237
# Step 1 — start the booking (returns within seconds) curl -X POST https://letsfg.co/api/agent-book \ - Network accessline 238
curl -X POST https://letsfg.co/api/agent-book \ - Network accessline 250
# Step 2 — poll until it lands (every 20-30 s; a booking takes 4-11 minutes) curl -X POST https://letsfg.co/api/agent-book/status \ - Network accessline 251
curl -X POST https://letsfg.co/api/agent-book/status \ - Network accessline 262
- `{"error":"missing_details","missing_fields":["born_on","address_city"]}` — ask the person and call again. - `{"error":"payment_method_required","add_card_url":"https://letsfg.co/connect?card=…"}` — no card yet: send the person to `add_ca - Network accessline 263
- `{"error":"payment_method_required","add_card_url":"https://letsfg.co/connect?card=…"}` — no card yet: send the person to `add_card_url`, then call again. - Network accessline 264
- `{"error":"payment_declined","add_card_url":"https://letsfg.co/connect"}` — the card refused the hold.
docs/api-booking.md
- Network accessline 5
> This page describes the **Developer API key** path. If you are an AI agent > wanting to search and book, connect LetsFG as an MCP server at > <https://letsfg.co/mcp> instead — booking works the same way - Network accessline 6
> wanting to search and book, connect LetsFG as an MCP server at > <https://letsfg.co/mcp> instead — booking works the same way > there, through `book_flight`, with no billing account. - Network accessline 7
> <https://letsfg.co/mcp> instead — booking works the same way - Network accessline 35
[Credential-related source omitted] - Access to secretsline 35
[Credential-related source omitted] - Access to secretsline 36
[Credential-related source omitted] - Network accessline 56
[Credential-related source omitted] - Access to secretsline 56
[Credential-related source omitted] - Access to secretsline 57
[Credential-related source omitted] - Network accessline 91
"charged": 0, "offer": {"search_id": "srch_abc123", "offer_id": "off_def456", "fare": 200.0, "currency": "EUR"}, "poll_url": "https://letsfg.co/developers/api/v1/flights/bookings/dev_abc123" - Network accessline 92
"offer": {"search_id": "srch_abc123", "offer_id": "off_def456", "fare": 200.0, "currency": "EUR"}, "poll_url": "https://letsfg.co/developers/api/v1/flights/bookings/dev_abc123" } - Network accessline 93
"poll_url": "https://letsfg.co/developers/api/v1/flights/bookings/dev_abc123" - Network accessline 141
[Credential-related source omitted] - Access to secretsline 141
[Credential-related source omitted] - Access to secretsline 142
[Credential-related source omitted] - Network accessline 194
[Credential-related source omitted] - Access to secretsline 194
[Credential-related source omitted] - Access to secretsline 195
[Credential-related source omitted] - Network accessline 220
[Credential-related source omitted] - Access to secretsline 220
[Credential-related source omitted] - Access to secretsline 221
[Credential-related source omitted]
docs/api-errors.md
- Network accessline 10
> > To search and book flights, connect LetsFG as an MCP server at > <https://letsfg.co/mcp>. Approving it opens - Network accessline 11
> To search and book flights, connect LetsFG as an MCP server at > <https://letsfg.co/mcp>. Approving it opens > <https://letsfg.co/connect>: one tap, no card. A card is asked for at the first booking. - Network accessline 12
> <https://letsfg.co/mcp>. Approving it opens - Network accessline 13
> <https://letsfg.co/connect>: one tap, no card. A card is asked for at the first booking. - Network accessline 14
> See <https://letsfg.co/for-agents>. - Network accessline 51
[Credential-related source omitted] - Access to secretsline 51
[Credential-related source omitted] - Access to secretsline 52
[Credential-related source omitted]
docs/api-guide.md
- Network accessline 10
> > To search and book flights, connect LetsFG as an MCP server at > <https://letsfg.co/mcp>. Approving it opens - Network accessline 11
> To search and book flights, connect LetsFG as an MCP server at > <https://letsfg.co/mcp>. Approving it opens > <https://letsfg.co/connect>: one tap, no card. A card is asked for at the first booking. - Network accessline 12
> <https://letsfg.co/mcp>. Approving it opens - Network accessline 13
> <https://letsfg.co/connect>: one tap, no card. A card is asked for at the first booking. - Network accessline 14
> See <https://letsfg.co/for-agents>. - Network accessline 16
<div class="docs-callout"> <strong>Scope:</strong> this section is only about the website-owned public REST API at <code>https://letsfg.co/developers/api/v1</code>. Local SDK and CLI search still stay free and do not require the paid pu - Network accessline 17
<strong>Scope:</strong> this section is only about the website-owned public REST API at <code>https://letsfg.co/developers/api/v1</code>. Local SDK and CLI search still stay free and do not require the paid public onboarding flow. - Network accessline 29
| Surface | URL | |---------|-----| | Public API root | [https://letsfg.co/developers/api](https://letsfg.co/developers/api) | - Network accessline 30
|---------|-----| | Public API root | [https://letsfg.co/developers/api](https://letsfg.co/developers/api) | | Public REST base | `https://letsfg.co/developers/api/v1` | - Network accessline 31
| Public API root | [https://letsfg.co/developers/api](https://letsfg.co/developers/api) | - Network accessline 32
| Public REST base | `https://letsfg.co/developers/api/v1` | - Network accessline 33
| OpenAPI JSON | [https://letsfg.co/developers/api/openapi.json](https://letsfg.co/developers/api/openapi.json) | - Network accessline 34
| Swagger UI | [https://letsfg.co/developers/api/docs](https://letsfg.co/developers/api/docs) | - Network accessline 35
| Developers page | [https://letsfg.co/en/developers](https://letsfg.co/en/developers) | - Network accessline 144
curl -X POST https://letsfg.co/developers/api/v1/agents/register \ - Network accessline 148
[Credential-related source omitted] - Access to secretsline 148
[Credential-related source omitted] - Access to secretsline 149
[Credential-related source omitted]
docs/api-onboarding.md
- Network accessline 9
> > To search and book flights, connect LetsFG as an MCP server at > <https://letsfg.co/mcp>. Approving it opens - Network accessline 10
> To search and book flights, connect LetsFG as an MCP server at > <https://letsfg.co/mcp>. Approving it opens > <https://letsfg.co/connect>: one tap, no card. A card is asked for at the first booking. - Network accessline 11
> <https://letsfg.co/mcp>. Approving it opens - Network accessline 12
> <https://letsfg.co/connect>: one tap, no card. A card is asked for at the first booking. - Network accessline 13
> See <https://letsfg.co/for-agents>. - Network accessline 24
curl -X POST https://letsfg.co/developers/api/v1/agents/register \ - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 35
[Credential-related source omitted] - Access to secretsline 39
[Credential-related source omitted] - Network accessline 44
[Credential-related source omitted] - Access to secretsline 44
[Credential-related source omitted] - Network accessline 45
[Credential-related source omitted] - Access to secretsline 45
[Credential-related source omitted] - Network accessline 47
-d '{"return_url": "https://example.com/account"}' - Network accessline 51
{ "status": "connect_required", "connect_url": "https://letsfg.co/connect?dev=sess_abc123", - Network accessline 52
"status": "connect_required", "connect_url": "https://letsfg.co/connect?dev=sess_abc123", "expires_in_seconds": 3600, - Network accessline 53
"connect_url": "https://letsfg.co/connect?dev=sess_abc123", - Network accessline 74
[Credential-related source omitted] - Access to secretsline 74
[Credential-related source omitted] - Access to secretsline 75
[Credential-related source omitted] - Network accessline 83
[Credential-related source omitted] - Access to secretsline 83
[Credential-related source omitted] - Access to secretsline 84
[Credential-related source omitted] - Network accessline 148
[Credential-related source omitted] - Access to secretsline 148
[Credential-related source omitted] - Access to secretsline 149
[Credential-related source omitted] - Network accessline 162
[Credential-related source omitted] - Access to secretsline 162
[Credential-related source omitted] - Access to secretsline 163
[Credential-related source omitted]
docs/api-polling.md
- Network accessline 10
> > To search and book flights, connect LetsFG as an MCP server at > <https://letsfg.co/mcp>. Approving it opens - Network accessline 11
> To search and book flights, connect LetsFG as an MCP server at > <https://letsfg.co/mcp>. Approving it opens > <https://letsfg.co/connect>: one tap, no card. A card is asked for at the first booking. - Network accessline 12
> <https://letsfg.co/mcp>. Approving it opens - Network accessline 13
> <https://letsfg.co/connect>: one tap, no card. A card is asked for at the first booking. - Network accessline 14
> See <https://letsfg.co/for-agents>. - Network accessline 33
[Credential-related source omitted] - Access to secretsline 33
[Credential-related source omitted] - Access to secretsline 34
[Credential-related source omitted] - Network accessline 49
"search_id": "async_a1b2c3d4e5f6...", "status": "pending", "poll_url": "https://letsfg.co/developers/api/v1/flights/results/async_a1b2c3d4...", - Network accessline 50
"status": "pending", "poll_url": "https://letsfg.co/developers/api/v1/flights/results/async_a1b2c3d4...", "poll_interval_seconds": 2, - Network accessline 51
"poll_url": "https://letsfg.co/developers/api/v1/flights/results/async_a1b2c3d4...", - Network accessline 63
[Credential-related source omitted] - Access to secretsline 63
[Credential-related source omitted] - Access to secretsline 64
[Credential-related source omitted] - Network accessline 111
[Credential-related source omitted] - Network accessline 112
// Start search const startRes = await fetch( 'https://letsfg.co/developers/api/v1/flights/search/async', - Network accessline 113
const startRes = await fetch( - Network accessline 114
'https://letsfg.co/developers/api/v1/flights/search/async', - Network accessline 127
[Credential-related source omitted] - Network accessline 142
[Credential-related source omitted] - Access to secretsline 142
[Credential-related source omitted] - Access to secretsline 143
[Credential-related source omitted] - Network accessline 144
base = "https://letsfg.co/developers/api/v1" - Network accessline 146
# Start r = httpx.post(f"{base}/flights/search/async", json=params, headers=headers, timeout=10) - Network accessline 147
r = httpx.post(f"{base}/flights/search/async", json=params, headers=headers, timeout=10) - Network accessline 152
for _ in range(30): # max ~150 s time.sleep(5) r = httpx.get(f"{base}/flights/results/{search_id}", headers=headers, timeout=10) - Network accessline 153
time.sleep(5) r = httpx.get(f"{base}/flights/results/{search_id}", headers=headers, timeout=10) r.raise_for_status() - Network accessline 154
r = httpx.get(f"{base}/flights/results/{search_id}", headers=headers, timeout=10)
docs/api-sandbox.md
- Network accessline 10
> > To search and book flights, connect LetsFG as an MCP server at > <https://letsfg.co/mcp>. Approving it opens - Network accessline 11
> To search and book flights, connect LetsFG as an MCP server at > <https://letsfg.co/mcp>. Approving it opens > <https://letsfg.co/connect>: one tap, no card. A card is asked for at the first booking. - Network accessline 12
> <https://letsfg.co/mcp>. Approving it opens - Network accessline 13
> <https://letsfg.co/connect>: one tap, no card. A card is asked for at the first booking. - Network accessline 14
> See <https://letsfg.co/for-agents>. - Network accessline 23
https://letsfg.co/developers/api/v1/sandbox/ - Network accessline 35
> There is **no separate sandbox key and no separate production key**, and > nothing to activate to "switch on" production. It is one key, from > <https://letsfg.co/developers>, for both. If production returns - Network accessline 36
> nothing to activate to "switch on" production. It is one key, from > <https://letsfg.co/developers>, for both. If production returns > `401 This API key is not valid for any LetsFG account`, the key your code is - Network accessline 37
> <https://letsfg.co/developers>, for both. If production returns - Network accessline 63
[Credential-related source omitted] - Access to secretsline 63
[Credential-related source omitted] - Access to secretsline 64
[Credential-related source omitted] - Network accessline 117
[Credential-related source omitted] - Access to secretsline 117
[Credential-related source omitted] - Access to secretsline 118
[Credential-related source omitted] - Network accessline 162
curl -X POST https://letsfg.co/developers/api/v1/sandbox/flights/book \ - Network accessline 194
"charged": 0, "offer": {"search_id": "sb_WAW_BCN_3f9c1a7e21", "offer_id": "sb_WAW_BCN_0000_cf15b25f", "seats": 1, ...}, "poll_url": "https://letsfg.co/developers/api/v1/sandbox/flights/bookings/sb_dev_1790359173123a1e5", - Network accessline 195
"offer": {"search_id": "sb_WAW_BCN_3f9c1a7e21", "offer_id": "sb_WAW_BCN_0000_cf15b25f", "seats": 1, ...}, "poll_url": "https://letsfg.co/developers/api/v1/sandbox/flights/bookings/sb_dev_1790359173123a1e5", "message": "69 EUR is held (n - Network accessline 196
"poll_url": "https://letsfg.co/developers/api/v1/sandbox/flights/bookings/sb_dev_1790359173123a1e5", - Network accessline 369
# Step 4 — free, no allowance consumed, no card needed curl https://letsfg.co/developers/api/v1/agents/me \ - Network accessline 370
[Credential-related source omitted] - Access to secretsline 370
[Credential-related source omitted] - Access to secretsline 371
[Credential-related source omitted]
docs/api-search.md
- Network accessline 10
> > To search and book flights, connect LetsFG as an MCP server at > <https://letsfg.co/mcp>. Approving it opens - Network accessline 11
> To search and book flights, connect LetsFG as an MCP server at > <https://letsfg.co/mcp>. Approving it opens > <https://letsfg.co/connect>: one tap, no card. A card is asked for at the first booking. - Network accessline 12
> <https://letsfg.co/mcp>. Approving it opens - Network accessline 13
> <https://letsfg.co/connect>: one tap, no card. A card is asked for at the first booking. - Network accessline 14
> See <https://letsfg.co/for-agents>. - Network accessline 44
[Credential-related source omitted] - Access to secretsline 44
[Credential-related source omitted] - Access to secretsline 45
[Credential-related source omitted] - Network accessline 79
[Credential-related source omitted] - Access to secretsline 79
[Credential-related source omitted] - Access to secretsline 80
[Credential-related source omitted] - Network accessline 96
const response = await fetch("https://letsfg.co/developers/api/v1/flights/search", { - Access to secretsline 100
[Credential-related source omitted] - Network accessline 202
> **Lane note.** The split-ticket builder runs on the agent search lane > (`POST https://letsfg.co/api/search` — the CLI, the Python and JS SDKs and - Network accessline 203
> (`POST https://letsfg.co/api/search` — the CLI, the Python and JS SDKs and - Network accessline 220
The developer API uses the same airline connector fleet as the [letsfg.co](https://letsfg.co) consumer search. The fleet includes direct airline scrapers, OTA aggregators (Kiwi, Kayak, Momondo, Skyscanner), and virtual interlining — worldwi - Network accessline 236
[Credential-related source omitted] - Access to secretsline 236
[Credential-related source omitted] - Access to secretsline 237
[Credential-related source omitted] - Network accessline 251
If a route returns results on [letsfg.co](https://letsfg.co) but not via the API, check that your `date_from` is in the future and your client timeout is at least 90 seconds — the search itself returns in 8–10 s to first results, but a gene - Network accessline 297
[Credential-related source omitted] - Access to secretsline 297
[Credential-related source omitted] - Access to secretsline 298
[Credential-related source omitted] - Network accessline 317
[Credential-related source omitted] - Access to secretsline 317
[Credential-related source omitted] - Access to secretsline 318
[Credential-related source omitted]
docs/architecture-guide.md
- Network accessline 10
> > To search and book flights, connect LetsFG as an MCP server at > <https://letsfg.co/mcp>. Approving it opens - Network accessline 11
> To search and book flights, connect LetsFG as an MCP server at > <https://letsfg.co/mcp>. Approving it opens > <https://letsfg.co/connect>: one tap, no card. A card is asked for at the first booking. - Network accessline 12
> <https://letsfg.co/mcp>. Approving it opens - Network accessline 13
> <https://letsfg.co/connect>: one tap, no card. A card is asked for at the first booking. - Network accessline 14
> See <https://letsfg.co/for-agents>. - Access to secretsline 288
[Credential-related source omitted]
docs/assets/domain-redirect.js
- Executable scriptline 1
Executable file - Network accessline 10
var pathname = window.location.pathname === '/' ? '' : window.location.pathname; var target = 'https://letsfg.co/developers/docs' + pathname + window.location.search + window.location.hash; - Network accessline 11
var target = 'https://letsfg.co/developers/docs' + pathname + window.location.search + window.location.hash;
docs/cli-reference.md
- Network accessline 10
> > To search and book flights, connect LetsFG as an MCP server at > <https://letsfg.co/mcp>. Approving it opens - Network accessline 11
> To search and book flights, connect LetsFG as an MCP server at > <https://letsfg.co/mcp>. Approving it opens > <https://letsfg.co/connect>: one tap, no card. A card is asked for at the first booking. - Network accessline 12
> <https://letsfg.co/mcp>. Approving it opens - Network accessline 13
> <https://letsfg.co/connect>: one tap, no card. A card is asked for at the first booking. - Network accessline 14
> See <https://letsfg.co/for-agents>. - Access to secretsline 131
[Credential-related source omitted] - Network accessline 175
| `LETSFG_BEARER_TOKEN` | Token from the connect flow (PFS search + booking) | | `LETSFG_API_KEY` | Developer API key for look-to-book search and booking | | `LETSFG_BASE_URL` | API URL override (default: `https://letsfg.co/developers`) | - Access to secretsline 176
[Credential-related source omitted] - Network accessline 177
| `LETSFG_BASE_URL` | API URL override (default: `https://letsfg.co/developers`) |
docs/getting-started.md
- Network accessline 10
> > To search and book flights, connect LetsFG as an MCP server at > <https://letsfg.co/mcp>. Approving it opens - Network accessline 11
> To search and book flights, connect LetsFG as an MCP server at > <https://letsfg.co/mcp>. Approving it opens > <https://letsfg.co/connect>: one tap, no card. A card is asked for at the first booking. - Network accessline 12
> <https://letsfg.co/mcp>. Approving it opens - Network accessline 13
> <https://letsfg.co/connect>: one tap, no card. A card is asked for at the first booking. - Network accessline 14
> See <https://letsfg.co/for-agents>. - Network accessline 38
Connect LetsFG as an MCP server at `https://letsfg.co/mcp` and approve the connection. The consent step opens <https://letsfg.co/connect>: one tap, no card. The card is asked for at your first booking, in a 0.00 Revolut setup — any card, or - Network accessline 40
[Credential-related source omitted] - Access to secretsline 52
[Credential-related source omitted] - Network accessline 76
# Step 1 — start (one traveller per call; real details, the e-ticket goes to contact_email) curl -X POST https://letsfg.co/api/agent-book \ - Network accessline 77
curl -X POST https://letsfg.co/api/agent-book \ - Network accessline 88
# Step 2 — poll every 20-30 s curl -X POST https://letsfg.co/api/agent-book/status \ - Network accessline 89
curl -X POST https://letsfg.co/api/agent-book/status \ - Network accessline 98
Full contract: [Building AI Agents](agent-guide.md) and <https://letsfg.co/for-agents>. - Network accessline 109
curl -X POST https://letsfg.co/developers/api/v1/agents/register \ - Access to secretsline 114
[Credential-related source omitted] - Network accessline 119
[Credential-related source omitted] - Access to secretsline 119
[Credential-related source omitted] - Network accessline 120
[Credential-related source omitted] - Access to secretsline 120
[Credential-related source omitted] - Network accessline 122
-d '{"return_url": "https://example.com/account"}' - Network accessline 138
[Credential-related source omitted] - Access to secretsline 138
[Credential-related source omitted] - Access to secretsline 139
[Credential-related source omitted] - Network accessline 149
[Credential-related source omitted] - Access to secretsline 149
[Credential-related source omitted] - Access to secretsline 150
[Credential-related source omitted] - Network accessline 158
[Credential-related source omitted] - Access to secretsline 158
[Credential-related source omitted] - Access to secretsline 159
[Credential-related source omitted]
docs/hotels.md
- Network accessline 16
refuses every hotel booking they make. Update with `pip install -U letsfg`, `npm install letsfg@latest` or `npx -y letsfg-mcp@latest`. The hosted MCP at <https://letsfg.co/mcp> needs no update. - Network accessline 18
<https://letsfg.co/mcp> needs no update. - Network accessline 72
[Credential-related source omitted] - Network accessline 73
[Credential-related source omitted] - Access to secretsline 73
[Credential-related source omitted] - Network accessline 75
[Credential-related source omitted] - Network accessline 76
[Credential-related source omitted] - Access to secretsline 76
[Credential-related source omitted] - Access to secretsline 140
[Credential-related source omitted]
docs/index.md
- Network accessline 13
> > To search and book flights, connect LetsFG as an MCP server at > <https://letsfg.co/mcp>. Approving it opens - Network accessline 14
> To search and book flights, connect LetsFG as an MCP server at > <https://letsfg.co/mcp>. Approving it opens > <https://letsfg.co/connect>: one tap, no card. A card is asked for at the first booking. - Network accessline 15
> <https://letsfg.co/mcp>. Approving it opens - Network accessline 16
> <https://letsfg.co/connect>: one tap, no card. A card is asked for at the first booking. - Network accessline 17
> See <https://letsfg.co/for-agents>. - Network accessline 21
<p class="docs-kicker">Official LetsFG documentation</p> <h1>Search every airline in the world plus the major booking sites, server-side at letsfg.co — and book. Free to connect, no card needed. Move to the Developer API for direct book - Network accessline 22
<h1>Search every airline in the world plus the major booking sites, server-side at letsfg.co — and book. Free to connect, no card needed. Move to the Developer API for direct booking, hotels and volume access.</h1> <p class="docs-lead"> - Network accessline 23
<p class="docs-lead">LetsFG has two paths. Connect the MCP server at <code>letsfg.co/mcp</code> once — approving it at <code>letsfg.co/connect</code> takes one tap and needs no card — and search and book for free from Claude, ChatGPT, Curso - Network accessline 26
<a href="getting-started/" class="docs-button docs-button--primary">Get started</a> <a href="api-guide/" class="docs-button docs-button--ghost">Public API guide</a> <a href="https://letsfg.co/developers/api/docs" class="docs-but - Network accessline 27
<a href="api-guide/" class="docs-button docs-button--ghost">Public API guide</a> <a href="https://letsfg.co/developers/api/docs" class="docs-button docs-button--ghost" target="_blank">Swagger</a> <a href="https://letsfg.co/en/de - Network accessline 28
<a href="https://letsfg.co/developers/api/docs" class="docs-button docs-button--ghost" target="_blank">Swagger</a> - Network accessline 29
<a href="https://letsfg.co/en/developers" class="docs-button docs-button--ghost" target="_blank">Developers page</a> - Network accessline 44
| Path | How | Speed | Search cost | Booking | |------|-----|-------|-------------|---------| | **MCP / SDK** (connect at [letsfg.co/connect](https://letsfg.co/connect)) | Server-side search + booking; one-tap MCP consent, no card. The card - Network accessline 45
|------|-----|-------|-------------|---------| | **MCP / SDK** (connect at [letsfg.co/connect](https://letsfg.co/connect)) | Server-side search + booking; one-tap MCP consent, no card. The card is added at the first booking (0.00 setup) | 8 - Network accessline 46
| **MCP / SDK** (connect at [letsfg.co/connect](https://letsfg.co/connect)) | Server-side search + booking; one-tap MCP consent, no card. The card is added at the first booking (0.00 setup) | 8–10 s to first results; longer to `completed`, - Network accessline 47
| **Developer API** ([letsfg.co/developers](https://letsfg.co/developers)) | Runs on our servers; connect a Revolut method | 2–5 s (discover) · 8–10 s to first results (full search) | Look-to-book: 200 free per booking, then $0.01 | `POST / - Network accessline 49
**When to choose each:** - Use **MCP / SDK** if you want free search and booking — add `https://letsfg.co/mcp` to your assistant and approve it once ([letsfg.co/for-agents](https://letsfg.co/for-agents)), then search and book server-side fo - Network accessline 50
- Use **MCP / SDK** if you want free search and booking — add `https://letsfg.co/mcp` to your assistant and approve it once ([letsfg.co/for-agents](https://letsfg.co/for-agents)), then search and book server-side for free. `book_flight` / ` - Network accessline 103
- API root: [letsfg.co/developers/api](https://letsfg.co/developers/api) - Network accessline 104
- OpenAPI JSON: [letsfg.co/developers/api/openapi.json](https://letsfg.co/developers/api/openapi.json) - Network accessline 105
- Swagger UI: [letsfg.co/developers/api/docs](https://letsfg.co/developers/api/docs)
docs/mcp.md
- Network accessline 5
| | | |---|---| | **Endpoint** | `https://letsfg.co/mcp` | - Network accessline 6
|---|---| | **Endpoint** | `https://letsfg.co/mcp` | | **Transport** | Streamable HTTP (JSON-RPC 2.0 over `POST`) | - Network accessline 7
| **Endpoint** | `https://letsfg.co/mcp` | - Network accessline 18
| **Flow** | Authorization code with PKCE. `S256` is required. | | **Client registration** | Dynamic Client Registration (RFC 7591) is open, so no client ID has to be issued in advance. Public clients (`token_endpoint_auth_method: none`) an - Network accessline 19
| **Client registration** | Dynamic Client Registration (RFC 7591) is open, so no client ID has to be issued in advance. Public clients (`token_endpoint_auth_method: none`) and `client_secret_basic` are both accepted. | | **Protected resour - Network accessline 20
| **Protected resource metadata** (RFC 9728) | `https://letsfg.co/developers/api/.well-known/oauth-protected-resource` | - Network accessline 21
| **Authorization server metadata** (RFC 8414) | `https://letsfg.co/developers/api/.well-known/oauth-authorization-server` | - Network accessline 22
| **Authorize** | `https://letsfg.co/connect` | - Network accessline 23
| **Token** | `https://letsfg.co/developers/api/oauth/token` | - Network accessline 24
| **Register** | `https://letsfg.co/developers/api/oauth/register` | - Network accessline 88
- **claude.ai / Claude Desktop:** LetsFG is in Claude's official connector directory. Open [claude.ai/directory/letsfg](https://claude.ai/directory/letsfg) and add it. No URL to paste. - Network accessline 89
- **Claude Code:** `claude mcp add --transport http letsfg https://letsfg.co/mcp` - Network accessline 90
- **ChatGPT:** add it at chatgpt.com in a browser (the ChatGPT phone app has no way to add one): Plugins → Add → Add custom MCP server, URL `https://letsfg.co/mcp`, authentication OAuth, tick I understand, Create as a plugin. Once added, it
docs/openapi.md
- Network accessline 10
> > To search and book flights, connect LetsFG as an MCP server at > <https://letsfg.co/mcp>. Approving it opens - Network accessline 11
> To search and book flights, connect LetsFG as an MCP server at > <https://letsfg.co/mcp>. Approving it opens > <https://letsfg.co/connect>: one tap, no card. A card is asked for at the first booking. - Network accessline 12
> <https://letsfg.co/mcp>. Approving it opens - Network accessline 13
> <https://letsfg.co/connect>: one tap, no card. A card is asked for at the first booking. - Network accessline 14
> See <https://letsfg.co/for-agents>. - Network accessline 16
<div class="docs-callout"> <strong>Use the website-owned schema.</strong> The canonical public contract lives at <code>https://letsfg.co/developers/api/openapi.json</code>. Treat that as the live machine-readable surface, not the old raw - Network accessline 17
<strong>Use the website-owned schema.</strong> The canonical public contract lives at <code>https://letsfg.co/developers/api/openapi.json</code>. Treat that as the live machine-readable surface, not the old raw repository link. - Network accessline 20
<div class="docs-action-row"> <a href="https://letsfg.co/developers/api/openapi.json" class="docs-button docs-button--primary" target="_blank">OpenAPI JSON</a> - Network accessline 21
<a href="https://letsfg.co/developers/api/openapi.json" class="docs-button docs-button--primary" target="_blank">OpenAPI JSON</a> - Network accessline 22
<a href="https://letsfg.co/developers/api/docs" class="docs-button docs-button--ghost" target="_blank">Swagger UI</a> - Network accessline 23
<a href="https://letsfg.co/en/developers" class="docs-button docs-button--ghost" target="_blank">Developers page</a> - Network accessline 28
| Surface | Best for | |---------|----------| | `https://letsfg.co/developers/api/openapi.json` | Machine-readable schema for generators, SDK tooling, and agent discovery | - Network accessline 29
|---------|----------| | `https://letsfg.co/developers/api/openapi.json` | Machine-readable schema for generators, SDK tooling, and agent discovery | | `https://letsfg.co/developers/api/docs` | Interactive Swagger UI | - Network accessline 30
| `https://letsfg.co/developers/api/openapi.json` | Machine-readable schema for generators, SDK tooling, and agent discovery | | `https://letsfg.co/developers/api/docs` | Interactive Swagger UI | | `https://letsfg.co/developers/api/v1` | Th - Network accessline 31
| `https://letsfg.co/developers/api/docs` | Interactive Swagger UI | | `https://letsfg.co/developers/api/v1` | The actual REST base for requests | | `https://letsfg.co/en/developers` | Human onboarding and account context | - Network accessline 32
| `https://letsfg.co/developers/api/v1` | The actual REST base for requests | - Network accessline 33
| `https://letsfg.co/en/developers` | Human onboarding and account context | - Network accessline 56
curl https://letsfg.co/developers/api/openapi.json | jq '.info, .servers' - Network accessline 62
curl https://letsfg.co/developers/api/openapi.json | jq '.paths | keys'
docs/packages.md
- Network accessline 10
> > To search and book flights, connect LetsFG as an MCP server at > <https://letsfg.co/mcp>. Approving it opens - Network accessline 11
> To search and book flights, connect LetsFG as an MCP server at > <https://letsfg.co/mcp>. Approving it opens > <https://letsfg.co/connect>: one tap, no card. A card is asked for at the first booking. - Network accessline 12
> <https://letsfg.co/mcp>. Approving it opens - Network accessline 13
> <https://letsfg.co/connect>: one tap, no card. A card is asked for at the first booking. - Network accessline 14
> See <https://letsfg.co/for-agents>. - Network accessline 20
Every package below covers **flights and hotels**, on **one credential**: the token you get by connecting the MCP (one tap at <https://letsfg.co/connect>, no card), or a Developer API key. Flights ask for the card at the first booking. Hote - Network accessline 25
| **JS/TS SDK + CLI** | `npm install -g letsfg` | SDK + `letsfg` CLI command | Free Bearer token or Developer API key | | **MCP Server** | `npx letsfg-mcp` | Model Context Protocol for AI agents | Free Bearer token or Developer API key | | - Network accessline 26
| **MCP Server** | `npx letsfg-mcp` | Model Context Protocol for AI agents | Free Bearer token or Developer API key | | **Remote MCP** | `https://letsfg.co/mcp` | Streamable HTTP — no install needed; **the way to connect** (one-tap OAuth co - Network accessline 27
| **Remote MCP** | `https://letsfg.co/mcp` | Streamable HTTP — no install needed; **the way to connect** (one-tap OAuth consent, no card) | Nothing up front — connect and approve | - Network accessline 28
| **Smithery** | [smithery.ai/servers/letsfg](https://smithery.ai/servers/letsfg) | One-click MCP install | Free token or Developer API key | - Network accessline 34
refuses every hotel booking they make. Update with `pip install -U letsfg`, `npm install letsfg@latest` or `npx -y letsfg-mcp@latest`. The hosted MCP at <https://letsfg.co/mcp> needs no update. - Network accessline 36
<https://letsfg.co/mcp> needs no update. - Network accessline 40
[](https://pypi.org/project/letsfg/) - Access to secretsline 57
[Credential-related source omitted] - Network accessline 61
[Full Python SDK docs →](https://github.com/LetsFG/LetsFG/tree/main/sdk/python) - Network accessline 65
[](https://www.npmjs.com/package/letsfg) - Network accessline 84
[Full JS SDK docs →](https://github.com/LetsFG/LetsFG/tree/main/sdk/js) - Network accessline 88
[](https://www.npmjs.com/package/letsfg-mcp) - Access to secretsline 98
[Credential-related source omitted] - Access to secretsline 113
[Credential-related source omitted] - Network accessline 124
| `LETSFG_BEARER_TOKEN` | (none) | Token from the connect flow. Reaches **flights and hotels** | | `LETSFG_API_KEY` | (none) | Developer API key (look-to-book search). Also reaches both; required for the account and payment tools | | `LETSF - Access to secretsline 125
[Credential-related source omitted] - Network accessline 126
| `LETSFG_BASE_URL` | `https://letsfg.co/developers` | Override the website-owned public API base | - Network accessline 133
https://letsfg.co/mcp - Network accessline 136
This is the recommended way in. In Claude (claude.ai / Claude Desktop) there is nothing to paste: LetsFG is in [Claude's connector directory](https://claude.ai/directory/letsfg). Elsewhere, point your client at the URL and approve the conne - Network accessline 139
# Claude Code claude mcp add --transport http letsfg https://letsfg.co/mcp - Network accessline 140
claude mcp add --transport http letsfg https://letsfg.co/mcp - Network accessline 144
// Cursor (.cursor/mcp.json) — Windsurf uses "serverUrl" instead of "url" { "mcpServers": { "letsfg": { "url": "https://letsfg.co/mcp" } } } - Network accessline 145
{ "mcpServers": { "letsfg": { "url": "https://letsfg.co/mcp" } } } - Network accessline 179
[npm page →](https://www.npmjs.com/package/letsfg-mcp) - Network accessline 183
| Path | Search mode | Auth | Best for | |------|-------------|------|----------| | `https://letsfg.co/mcp` | Server-side at letsfg.co | Approve the connection (one tap, no card) | **Recommended.** No install — flights, hotels and booking o - Network accessline 184
|------|-------------|------|----------| | `https://letsfg.co/mcp` | Server-side at letsfg.co | Approve the connection (one tap, no card) | **Recommended.** No install — flights, hotels and booking over Streamable HTTP in Claude, ChatGPT, C - Network accessline 185
| `https://letsfg.co/mcp` | Server-side at letsfg.co | Approve the connection (one tap, no card) | **Recommended.** No install — flights, hotels and booking over Streamable HTTP in Claude, ChatGPT, Cursor, Windsurf | - Network accessline 207
**Base URL:** `https://letsfg.co/developers/api/v1` - Network accessline 209
**Interactive docs:** [letsfg.co/developers/api/docs](https://letsfg.co/developers/api/docs)
docs/quickstart-claude.md
- Network accessline 10
> > To search and book flights, connect LetsFG as an MCP server at > <https://letsfg.co/mcp>. Approving it opens - Network accessline 11
> To search and book flights, connect LetsFG as an MCP server at > <https://letsfg.co/mcp>. Approving it opens > <https://letsfg.co/connect>: one tap, no card. A card is asked for at the first booking. - Network accessline 12
> <https://letsfg.co/mcp>. Approving it opens - Network accessline 13
> <https://letsfg.co/connect>: one tap, no card. A card is asked for at the first booking. - Network accessline 14
> See <https://letsfg.co/for-agents>. - Network accessline 22
**claude.ai / Claude Desktop:** LetsFG is in Claude's official connector directory. Open **[claude.ai/directory/letsfg](https://claude.ai/directory/letsfg)** and add it. No URL to paste. Once added, it works in - Network accessline 23
**[claude.ai/directory/letsfg](https://claude.ai/directory/letsfg)** and add it. No URL to paste. Once added, it works in - Network accessline 29
claude mcp add --transport http letsfg https://letsfg.co/mcp - Network accessline 34
Click **Connect**. The consent step opens <https://letsfg.co/connect>: tap **Approve**. No sign-up form and no card. - Network accessline 83
The same remote URL also accepts a Developer API key (`X-API-Key` header) from the separate, prepaid product at [letsfg.co/developers](https://letsfg.co/developers). It creates a billing account and blocks search until you fund it. See [Onb
docs/quickstart-cursor.md
- Network accessline 10
> > To search and book flights, connect LetsFG as an MCP server at > <https://letsfg.co/mcp>. Approving it opens - Network accessline 11
> To search and book flights, connect LetsFG as an MCP server at > <https://letsfg.co/mcp>. Approving it opens > <https://letsfg.co/connect>: one tap, no card. A card is asked for at the first booking. - Network accessline 12
> <https://letsfg.co/mcp>. Approving it opens - Network accessline 13
> <https://letsfg.co/connect>: one tap, no card. A card is asked for at the first booking. - Network accessline 14
> See <https://letsfg.co/for-agents>. - Network accessline 26
"mcpServers": { "letsfg": { "url": "https://letsfg.co/mcp" - Network accessline 27
"letsfg": { "url": "https://letsfg.co/mcp" } - Network accessline 28
"url": "https://letsfg.co/mcp" - Network accessline 36
Cursor prompts you to authenticate the server. The consent step opens <https://letsfg.co/connect>: tap **Approve**. No sign-up form and no card. - Network accessline 78
The same remote URL also accepts a Developer API key in an `X-API-Key` header, from the separate, prepaid product at [letsfg.co/developers](https://letsfg.co/developers). It creates a billing account and blocks search until you fund it. See
docs/quickstart-windsurf.md
- Network accessline 10
> > To search and book flights, connect LetsFG as an MCP server at > <https://letsfg.co/mcp>. Approving it opens - Network accessline 11
> To search and book flights, connect LetsFG as an MCP server at > <https://letsfg.co/mcp>. Approving it opens > <https://letsfg.co/connect>: one tap, no card. A card is asked for at the first booking. - Network accessline 12
> <https://letsfg.co/mcp>. Approving it opens - Network accessline 13
> <https://letsfg.co/connect>: one tap, no card. A card is asked for at the first booking. - Network accessline 14
> See <https://letsfg.co/for-agents>. - Network accessline 24
"mcpServers": { "letsfg": { "serverUrl": "https://letsfg.co/mcp" - Network accessline 25
"letsfg": { "serverUrl": "https://letsfg.co/mcp" } - Network accessline 26
"serverUrl": "https://letsfg.co/mcp" - Network accessline 34
Windsurf prompts you to authenticate the server. The consent step opens <https://letsfg.co/connect>: tap **Approve**. No sign-up form and no card. - Network accessline 74
The same remote URL also accepts a Developer API key in an `X-API-Key` header, from the separate, prepaid product at [letsfg.co/developers](https://letsfg.co/developers). It creates a billing account and blocks search until you fund it. See
docs/self-hosting.md
- Network accessline 27
[Credential-related source omitted] - Access to secretsline 28
[Credential-related source omitted] - Network accessline 29
LETSFG_BASE = "https://letsfg.co/developers/api/v1" - Network accessline 43
@app.post("/search") async def search(req: SearchRequest): async with httpx.AsyncClient(timeout=120) as client: - Network accessline 44
async def search(req: SearchRequest): async with httpx.AsyncClient(timeout=120) as client: r = await client.post( - Network accessline 45
async with httpx.AsyncClient(timeout=120) as client: - Access to secretsline 49
[Credential-related source omitted] - Access to secretsline 64
[Credential-related source omitted] - Network accessline 71
curl -X POST http://localhost:8000/search \ - Network accessline 85
const response = await fetch("https://letsfg.co/developers/api/v1/flights/search", { - Access to secretsline 89
[Credential-related source omitted] - Network accessline 113
const LETSFG_BASE = "https://letsfg.co/developers/api/v1"; - Network accessline 118
const res = await fetch(`${LETSFG_BASE}/flights/search`, { - Access to secretsline 122
[Credential-related source omitted] - Network accessline 184
[Credential-related source omitted] - Network accessline 185
const base = "https://letsfg.co/developers/api/v1"; - Network accessline 187
// Start async search const startRes = await fetch(`${base}/flights/search/async`, { - Network accessline 188
const startRes = await fetch(`${base}/flights/search/async`, { - Network accessline 196
while (true) { await new Promise(r => setTimeout(r, 5_000)); const pollRes = await fetch(`${base}/flights/results/${search_id}`, { - Network accessline 197
[Credential-related source omitted] - Network accessline 198
const pollRes = await fetch(`${base}/flights/results/${search_id}`, { - Access to secretsline 219
[Credential-related source omitted] - Access to secretsline 224
[Credential-related source omitted] - Access to secretsline 236
[Credential-related source omitted] - Access to secretsline 237
[Credential-related source omitted]
docs/tutorials.md
- Network accessline 10
> > To search and book flights, connect LetsFG as an MCP server at > <https://letsfg.co/mcp>. Approving it opens - Network accessline 11
> To search and book flights, connect LetsFG as an MCP server at > <https://letsfg.co/mcp>. Approving it opens > <https://letsfg.co/connect>: one tap, no card. A card is asked for at the first booking. - Network accessline 12
> <https://letsfg.co/mcp>. Approving it opens - Network accessline 13
> <https://letsfg.co/connect>: one tap, no card. A card is asked for at the first booking. - Network accessline 14
> See <https://letsfg.co/for-agents>. - Access to secretsline 28
[Credential-related source omitted] - Access to secretsline 125
[Credential-related source omitted] - Network accessline 184
base = "https://letsfg.co/developers/api/v1" - Access to secretsline 185
[Credential-related source omitted] - Network accessline 187
async with httpx.AsyncClient(timeout=60) as http: - Access to secretsline 242
[Credential-related source omitted] - Network accessline 386
**Claude (claude.ai / Claude Desktop):** no config needed. LetsFG is in Claude's connector directory: add it at [claude.ai/directory/letsfg](https://claude.ai/directory/letsfg). The config below runs the local stdio server with a - Network accessline 387
add it at [claude.ai/directory/letsfg](https://claude.ai/directory/letsfg). The config below runs the local stdio server with a - Access to secretsline 397
[Credential-related source omitted] - Access to secretsline 457
[Credential-related source omitted]
glama.json
integrations/hermes/README.md
- Network accessline 5
Search and book real flights and hotels from inside [Hermes Agent](https://hermes-agent.nousresearch.com). Ask for the cheapest way to London next Friday, a round trip with open dates, where you could fly in Europe on a long weekend, or a h - Network accessline 7
[LetsFG](https://letsfg.co) searches every airline and the major travel sites in one go, checks every airport in a city, tests split tickets and prices the bags. A flight's details show its on-time record and how to get from the airport int - Network accessline 22
LetsFG signs in with OAuth 2.1 and Dynamic Client Registration. There is no API key, and nothing secret lives in this repository. The server itself (`https://letsfg.co/mcp`, Streamable HTTP) is added with one command, because a plugin canno - Network accessline 25
hermes mcp add letsfg --url https://letsfg.co/mcp --auth oauth --connect-timeout 300 - Network accessline 32
Start a new Hermes session afterwards, or run `/reload-mcp` in an open one. Tokens are cached under `~/.hermes/mcp-tokens/` and refresh on their own. On a headless host, see Hermes' [OAuth over SSH guide](https://hermes-agent.nousresearch.c - Network accessline 78
- Hosted-only connector: this folder is the whole plugin. It has no Python code, hooks or environment variables, and it does not update itself. Every tool call goes to `https://letsfg.co/mcp` over HTTPS. - Network accessline 79
- Access is scoped to the signed-in LetsFG account. Traveller details you give for a booking are stored on that account and used to book. - Card details are never taken in the chat. - Privacy policy: https://letsfg.co/en/privacy · Terms: ht - Network accessline 81
- Privacy policy: https://letsfg.co/en/privacy · Terms: https://letsfg.co/en/terms - Network accessline 99
The same server works in any MCP client: add `https://letsfg.co/mcp` as a remote (Streamable HTTP) server with OAuth. Setup for agents: https://letsfg.co/for-agents - Network accessline 103
- E-mail: contact@letsfg.co - Website: https://letsfg.co - Network accessline 104
- Website: https://letsfg.co - Network accessline 108
This folder (plugin manifests, skill and docs) is MIT licensed. The hosted LetsFG service and MCP server are separate and governed by the [LetsFG terms](https://letsfg.co/en/terms).
integrations/hermes/plugin.json
- Network accessline 1
{ "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json", - Network accessline 2
"$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json", - Network accessline 7
"name": "LetsFG", "email": "contact@letsfg.co", "url": "https://letsfg.co" - Network accessline 8
"email": "contact@letsfg.co", "url": "https://letsfg.co" }, - Network accessline 9
"url": "https://letsfg.co" - Network accessline 10
}, "homepage": "https://letsfg.co", "repository": "https://github.com/LetsFG/LetsFG", - Network accessline 11
"homepage": "https://letsfg.co", - Network accessline 12
"repository": "https://github.com/LetsFG/LetsFG",
integrations/hermes/skills/letsfg/SKILL.md
- Network accessline 5
author: LetsFG license: MIT compatibility: Requires the LetsFG MCP connector at https://letsfg.co/mcp (Streamable HTTP, OAuth 2.1 with Dynamic Client Registration) and network access. - Network accessline 6
license: MIT compatibility: Requires the LetsFG MCP connector at https://letsfg.co/mcp (Streamable HTTP, OAuth 2.1 with Dynamic Client Registration) and network access. metadata: - Network accessline 7
compatibility: Requires the LetsFG MCP connector at https://letsfg.co/mcp (Streamable HTTP, OAuth 2.1 with Dynamic Client Registration) and network access. - Network accessline 22
hermes mcp add letsfg --url https://letsfg.co/mcp --auth oauth --connect-timeout 300
integrations/openclaw/.claude-plugin/plugin.json
- Network accessline 6
"name": "LetsFG", "email": "contact@letsfg.co", "url": "https://letsfg.co" - Network accessline 7
"email": "contact@letsfg.co", "url": "https://letsfg.co" }, - Network accessline 8
"url": "https://letsfg.co" - Network accessline 9
}, "homepage": "https://letsfg.co", "repository": "https://github.com/LetsFG/LetsFG", - Network accessline 10
"homepage": "https://letsfg.co", - Network accessline 11
"repository": "https://github.com/LetsFG/LetsFG",
integrations/openclaw/.mcp.json
integrations/openclaw/README.md
- Network accessline 3
Search and book real flights and hotels from inside [OpenClaw](https://openclaw.ai). Ask for the cheapest way to London next Friday, a round trip with open dates, where you could fly in Europe on a long weekend, or a hotel with breakfast ne - Network accessline 5
[LetsFG](https://letsfg.co) searches every airline and the major travel sites in one go, checks every airport in a city, tests split tickets and prices the bags. A flight's details show its on-time record and how to get from the airport int - Network accessline 7
This plugin connects OpenClaw to the hosted LetsFG MCP server (`letsfg`) at `https://letsfg.co/mcp`, over Streamable HTTP. It has no code of its own: the server's tools and instructions are the whole integration. - Network accessline 23
openclaw mcp set letsfg '{"url":"https://letsfg.co/mcp","transport":"streamable-http","auth":"oauth","oauth":{"scope":"flights:search flights:book hotels:search hotels:book profile:read"}}' - Network accessline 56
- Hosted-only connector: this folder is the whole plugin. It has no code, hooks or environment variables. Every tool call goes to `https://letsfg.co/mcp` over HTTPS. - Network accessline 57
- Access is scoped to the signed-in LetsFG account. Traveller details you give for a booking are stored on that account and used to book. - Card details are never taken in the chat. - Privacy policy: https://letsfg.co/en/privacy · Terms: ht - Network accessline 59
- Privacy policy: https://letsfg.co/en/privacy · Terms: https://letsfg.co/en/terms - Network accessline 71
The same server works in any MCP client: add `https://letsfg.co/mcp` as a remote (Streamable HTTP) server with OAuth. Setup for agents: https://letsfg.co/for-agents - Network accessline 75
- E-mail: contact@letsfg.co - Issues: https://github.com/LetsFG/LetsFG/issues - Network accessline 76
- Issues: https://github.com/LetsFG/LetsFG/issues - Network accessline 77
- Website: https://letsfg.co - Network accessline 81
This folder (plugin manifests and docs) is MIT licensed. The hosted LetsFG service and MCP server are separate and governed by the [LetsFG terms](https://letsfg.co/en/terms).
integrations/openclaw/openclaw.plugin.json
integrations/openclaw/package.json
- Executable scriptline 1
Executable file - Network accessline 4
"description": "Search and book real flights and hotels: every airline and the major travel sites, split tickets and bag prices. A booking starts only when you press Approve in an e-mail from LetsFG.", "license": "MIT", "author": "LetsF - Network accessline 5
"license": "MIT", "author": "LetsFG <contact@letsfg.co> (https://letsfg.co)", "homepage": "https://letsfg.co", - Network accessline 6
"author": "LetsFG <contact@letsfg.co> (https://letsfg.co)", - Network accessline 7
"homepage": "https://letsfg.co", - Network accessline 8
"repository": { "type": "git", "url": "https://github.com/LetsFG/LetsFG.git", - Network accessline 9
"type": "git", "url": "https://github.com/LetsFG/LetsFG.git", "directory": "integrations/openclaw" - Network accessline 10
"url": "https://github.com/LetsFG/LetsFG.git", - Network accessline 11
"directory": "integrations/openclaw" }, "bugs": "https://github.com/LetsFG/LetsFG/issues", - Network accessline 12
}, "bugs": "https://github.com/LetsFG/LetsFG/issues", "keywords": [ - Network accessline 13
"bugs": "https://github.com/LetsFG/LetsFG/issues",
lighthouserc.js
- Executable scriptline 1
Executable file - Network accessline 4
collect: { url: [ 'http://localhost:3000/en/flights/gdn-bcn/', - Network accessline 5
url: [ 'http://localhost:3000/en/flights/gdn-bcn/', 'http://localhost:3000/en/flights/lhr-jfk/', - Network accessline 6
'http://localhost:3000/en/flights/gdn-bcn/', - Network accessline 7
'http://localhost:3000/en/flights/lhr-jfk/',
mcp-config.json
- Network accessline 1
{ "_comment": "One credential reaches BOTH flights and hotels: the token from the connect flow (LETSFG_BEARER_TOKEN) or a Developer API key (LETSFG_API_KEY). Connect through the hosted MCP at https://letsfg.co/mcp: the consent step opens - Network accessline 2
[Credential-related source omitted] - Access to secretsline 2
[Credential-related source omitted] - Access to secretsline 11
[Credential-related source omitted]
mkdocs.yml
models/__init__.py
- Executable scriptline 1
Executable file
models/flights.py
- Executable scriptline 1
Executable file
openapi.yaml
- Network accessline 38
**PFS Bearer token** (free search + booking): one tap at <https://letsfg.co/connect>, no card. - Network accessline 40
connecting the MCP server at `https://letsfg.co/mcp`, or via `letsfg auth`. - Network accessline 54
name: LetsFG Support email: contact@letsfg.co url: https://letsfg.co - Network accessline 55
email: contact@letsfg.co url: https://letsfg.co license: - Network accessline 56
url: https://letsfg.co - Network accessline 57
license: name: MIT url: https://opensource.org/licenses/MIT - Network accessline 59
url: https://opensource.org/licenses/MIT - Network accessline 61
servers: - url: https://letsfg.co/developers/api/v1 - Network accessline 62
- url: https://letsfg.co/developers/api/v1 - Network accessline 201
seller deep link: the seller link stays server-side and only LetsFG's booking agent follows it. example: "https://letsfg.co/en/offer/srch_123/off_abc123" - Network accessline 202
follows it. example: "https://letsfg.co/en/offer/srch_123/off_abc123" book_url: - Network accessline 203
example: "https://letsfg.co/en/offer/srch_123/off_abc123" - Network accessline 206
format: uri description: "The API route that books this offer on your connected method." example: "https://letsfg.co/developers/api/v1/flights/book" - Network accessline 207
description: "The API route that books this offer on your connected method." example: "https://letsfg.co/developers/api/v1/flights/book" outbound: - Network accessline 208
example: "https://letsfg.co/developers/api/v1/flights/book" - Access to secretsline 391
[Credential-related source omitted] - Network accessline 473
format: uri description: "Open in a browser to save a card or Revolut Pay. Nothing is charged." example: "https://letsfg.co/connect?dev=sess_abc123" - Network accessline 474
description: "Open in a browser to save a card or Revolut Pay. Nothing is charged." example: "https://letsfg.co/connect?dev=sess_abc123" expires_in_seconds: - Network accessline 475
example: "https://letsfg.co/connect?dev=sess_abc123"
preview/build_stubs.py
- Executable scriptline 1
Executable file
preview/run.py
sdk/js/README.md
- Network accessline 5
[](https://github.com/LetsFG/LetsFG) - Network accessline 6
[](https://www.npmjs.com/package/letsfg) - Network accessline 10
| | **CLI / SDK** (this package) | **Developer API** | |---|---|---| | **Search cost** | Free (token from [letsfg.co/connect](https://letsfg.co/connect), one tap, no card) | Prepaid credits | - Network accessline 11
|---|---|---| | **Search cost** | Free (token from [letsfg.co/connect](https://letsfg.co/connect), one tap, no card) | Prepaid credits | | **Booking** | `POST /api/agent-book` — fare held on your card, a LetsFG agent buys the ticket, captur - Network accessline 12
| **Search cost** | Free (token from [letsfg.co/connect](https://letsfg.co/connect), one tap, no card) | Prepaid credits | - Network accessline 13
| **Booking** | `POST /api/agent-book` — fare held on your card, a LetsFG agent buys the ticket, captured only on a real PNR. Every offer. | Direct airline URL (unlock required first) | | **Speed** | 8–10 s to first results; longer on a spl - Network accessline 15
| **Setup** | `npm install letsfg`, then connect at [letsfg.co/mcp](https://letsfg.co/mcp) | [letsfg.co/developers](https://letsfg.co/developers) | - Network accessline 17
> **Building a product, or need hotels?** Use the [Developer API](https://letsfg.co/developers) — look-to-book search (200 free after every booking, then $0.01), booking through `POST /flights/book`, no booking fee and no transaction fee. - Network accessline 27
Connect LetsFG as an MCP server at `https://letsfg.co/mcp` and - Network accessline 28
approve the connection — in Claude (from its connector directory, [claude.ai/directory/letsfg](https://claude.ai/directory/letsfg)), ChatGPT, Cursor, Windsurf, or Claude Code (`claude mcp add --transport http letsfg https://letsfg.co/mcp`). - Network accessline 29
[claude.ai/directory/letsfg](https://claude.ai/directory/letsfg)), ChatGPT, Cursor, Windsurf, or Claude Code - Network accessline 30
(`claude mcp add --transport http letsfg https://letsfg.co/mcp`). - Network accessline 31
The consent step opens [letsfg.co/connect](https://letsfg.co/connect): one tap, - Network accessline 78
do { await new Promise(r => setTimeout(r, 25_000)); status = await (await fetch('https://letsfg.co/api/agent-book/status', { - Network accessline 79
await new Promise(r => setTimeout(r, 25_000)); status = await (await fetch('https://letsfg.co/api/agent-book/status', { method: 'POST', - Network accessline 80
status = await (await fetch('https://letsfg.co/api/agent-book/status', { - Access to secretsline 123
[Credential-related source omitted] - Network accessline 164
Full semantics: [docs/api-search.md](https://github.com/LetsFG/LetsFG/blob/main/docs/api-search.md#starlink-wi-fi). - Network accessline 172
- **MCP Server**: `npx letsfg-mcp` — [npm](https://www.npmjs.com/package/letsfg-mcp) - Network accessline 173
- **Python SDK + CLI**: `pip install letsfg` — [PyPI](https://pypi.org/project/letsfg/) - Network accessline 174
- **Try without installing**: [letsfg.co](https://letsfg.co) — search instantly in your browser - Network accessline 175
- **GitHub**: [LetsFG/LetsFG](https://github.com/LetsFG/LetsFG) - Network accessline 177
> ⭐ **[Star the repo](https://github.com/LetsFG/LetsFG)** — we appreciate the support. - Network accessline 189
> the reservation-fee fields retired on 2026-09-11 (`expected_balance`, no `expected_cost`), and the API refuses > every hotel booking they make. Update with `pip install -U letsfg`, `npm install letsfg@latest` or > `npx -y letsfg-mcp@lates - Network accessline 191
> `npx -y letsfg-mcp@latest`. The hosted MCP at `https://letsfg.co/mcp` needs no update. - Access to secretsline 298
[Credential-related source omitted]
sdk/js/package-lock.json
- Network accessline 24
"node_modules/@esbuild/aix-ppc64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", - Network accessline 25
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", - Network accessline 26
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", - Network accessline 41
"node_modules/@esbuild/android-arm": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", - Network accessline 42
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", - Network accessline 43
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", - Network accessline 58
"node_modules/@esbuild/android-arm64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", - Network accessline 59
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", - Network accessline 60
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", - Network accessline 75
"node_modules/@esbuild/android-x64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", - Network accessline 76
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", - Network accessline 77
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", - Network accessline 92
"node_modules/@esbuild/darwin-arm64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", - Network accessline 93
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", - Network accessline 94
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", - Network accessline 109
"node_modules/@esbuild/darwin-x64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", - Network accessline 110
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", - Network accessline 111
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", - Network accessline 126
"node_modules/@esbuild/freebsd-arm64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", - Network accessline 127
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", - Network accessline 128
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", - Network accessline 143
"node_modules/@esbuild/freebsd-x64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", - Network accessline 144
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", - Network accessline 145
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", - Network accessline 160
"node_modules/@esbuild/linux-arm": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", - Network accessline 161
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", - Network accessline 162
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", - Network accessline 177
"node_modules/@esbuild/linux-arm64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", - Network accessline 178
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", - Network accessline 179
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", - Network accessline 194
"node_modules/@esbuild/linux-ia32": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", - Network accessline 195
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", - Network accessline 196
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", - Network accessline 211
"node_modules/@esbuild/linux-loong64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", - Network accessline 212
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", - Network accessline 213
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", - Network accessline 228
"node_modules/@esbuild/linux-mips64el": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", - Network accessline 229
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", - Network accessline 230
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", - Network accessline 245
"node_modules/@esbuild/linux-ppc64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", - Network accessline 246
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", - Network accessline 247
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", - Network accessline 262
"node_modules/@esbuild/linux-riscv64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", - Network accessline 263
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", - Network accessline 264
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", - Network accessline 279
"node_modules/@esbuild/linux-s390x": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", - Network accessline 280
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", - Network accessline 281
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", - Network accessline 296
"node_modules/@esbuild/linux-x64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", - Network accessline 297
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", - Network accessline 298
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", - Network accessline 313
"node_modules/@esbuild/netbsd-arm64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", - Network accessline 314
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", - Network accessline 315
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", - Network accessline 330
"node_modules/@esbuild/netbsd-x64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", - Network accessline 331
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", - Network accessline 332
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", - Network accessline 347
"node_modules/@esbuild/openbsd-arm64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", - Network accessline 348
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", - Network accessline 349
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", - Network accessline 364
"node_modules/@esbuild/openbsd-x64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", - Network accessline 365
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", - Network accessline 366
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", - Network accessline 381
"node_modules/@esbuild/openharmony-arm64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", - Network accessline 382
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g - Network accessline 383
"resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", - Network accessline 398
"node_modules/@esbuild/sunos-x64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", - Network accessline 399
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", - Network accessline 400
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", - Network accessline 415
"node_modules/@esbuild/win32-arm64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", - Network accessline 416
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", - Network accessline 417
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", - Network accessline 432
"node_modules/@esbuild/win32-ia32": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", - Network accessline 433
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", - Network accessline 434
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", - Network accessline 449
"node_modules/@esbuild/win32-x64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", - Network accessline 450
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", - Network accessline 451
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", - Network accessline 466
"node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - Network accessline 467
"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==", - Network accessline 468
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - Network accessline 477
"node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - Network accessline 478
"version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - Network accessline 479
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - Network accessline 487
"node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - Network accessline 488
"version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" - Network accessline 489
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - Network accessline 494
"node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - Network accessline 495
"version": "0.3.31", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - Network accessline 496
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - Network accessline 505
"node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", - Network accessline 506
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xw - Network accessline 507
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", - Network accessline 519
"node_modules/@rollup/rollup-android-arm64": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", - Network accessline 520
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBSho - Network accessline 521
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", - Network accessline 533
"node_modules/@rollup/rollup-darwin-arm64": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", - Network accessline 534
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m - Network accessline 535
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", - Network accessline 547
"node_modules/@rollup/rollup-darwin-x64": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", - Network accessline 548
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w= - Network accessline 549
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", - Network accessline 561
"node_modules/@rollup/rollup-freebsd-arm64": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", - Network accessline 562
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9 - Network accessline 563
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", - Network accessline 575
"node_modules/@rollup/rollup-freebsd-x64": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", - Network accessline 576
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3V - Network accessline 577
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", - Network accessline 589
"node_modules/@rollup/rollup-linux-arm-gnueabihf": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", - Network accessline 590
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKi - Network accessline 591
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", - Network accessline 603
"node_modules/@rollup/rollup-linux-arm-musleabihf": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", - Network accessline 604
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4e - Network accessline 605
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", - Network accessline 617
"node_modules/@rollup/rollup-linux-arm64-gnu": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", - Network accessline 618
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54 - Network accessline 619
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", - Network accessline 631
"node_modules/@rollup/rollup-linux-arm64-musl": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", - Network accessline 632
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsi - Network accessline 633
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", - Network accessline 645
"node_modules/@rollup/rollup-linux-loong64-gnu": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", - Network accessline 646
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9Cs - Network accessline 647
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", - Network accessline 659
"node_modules/@rollup/rollup-linux-loong64-musl": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", - Network accessline 660
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxp - Network accessline 661
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", - Network accessline 673
"node_modules/@rollup/rollup-linux-ppc64-gnu": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", - Network accessline 674
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6m - Network accessline 675
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", - Network accessline 687
"node_modules/@rollup/rollup-linux-ppc64-musl": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", - Network accessline 688
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/p - Network accessline 689
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", - Network accessline 701
"node_modules/@rollup/rollup-linux-riscv64-gnu": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", - Network accessline 702
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WO - Network accessline 703
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", - Network accessline 715
"node_modules/@rollup/rollup-linux-riscv64-musl": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", - Network accessline 716
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM - Network accessline 717
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", - Network accessline 729
"node_modules/@rollup/rollup-linux-s390x-gnu": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", - Network accessline 730
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+r - Network accessline 731
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", - Network accessline 743
"node_modules/@rollup/rollup-linux-x64-gnu": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", - Network accessline 744
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAk - Network accessline 745
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", - Network accessline 757
"node_modules/@rollup/rollup-linux-x64-musl": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", - Network accessline 758
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyo - Network accessline 759
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", - Network accessline 771
"node_modules/@rollup/rollup-openbsd-x64": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", - Network accessline 772
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/j - Network accessline 773
"resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", - Network accessline 785
"node_modules/@rollup/rollup-openharmony-arm64": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", - Network accessline 786
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+ - Network accessline 787
"resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", - Network accessline 799
"node_modules/@rollup/rollup-win32-arm64-msvc": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", - Network accessline 800
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9g - Network accessline 801
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", - Network accessline 813
"node_modules/@rollup/rollup-win32-ia32-msvc": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", - Network accessline 814
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4 - Network accessline 815
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", - Network accessline 827
"node_modules/@rollup/rollup-win32-x64-gnu": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", - Network accessline 828
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXi - Network accessline 829
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", - Network accessline 841
"node_modules/@rollup/rollup-win32-x64-msvc": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", - Network accessline 842
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj - Network accessline 843
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", - Network accessline 855
"node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - Network accessline 856
"version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - Network accessline 857
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - Network accessline 862
"node_modules/@types/node": { "version": "25.3.3", "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.3.tgz", - Network accessline 863
"version": "25.3.3", "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.3.tgz", "integrity": "sha512-DpzbrH7wIcBaJibpKo9nnSQL0MTRdnWttGyE5haGwK86xgMOkFLp7vEyfQPGLOJh5wNYiJ3V9PmUMDhV9u8kkQ==", - Network accessline 864
"resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.3.tgz", - Network accessline 872
"node_modules/acorn": { "version": "8.16.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - Network accessline 873
"version": "8.16.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", - Network accessline 874
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - Network accessline 885
"node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - Network accessline 886
"version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - Network accessline 887
"resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - Network accessline 892
"node_modules/bundle-require": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", - Network accessline 893
"version": "5.1.0", "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==", - Network accessline 894
"resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", - Network accessline 908
"node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - Network accessline 909
"version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - Network accessline 910
"resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - Network accessline 918
"node_modules/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - Network accessline 919
"version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - Network accessline 920
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - Network accessline 929
}, "funding": { "url": "https://paulmillr.com/funding/" - Network accessline 930
"funding": { "url": "https://paulmillr.com/funding/" } - Network accessline 931
"url": "https://paulmillr.com/funding/" - Network accessline 934
"node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - Network accessline 935
"version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - Network accessline 936
"resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - Network accessline 944
"node_modules/confbox": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - Network accessline 945
"version": "0.1.8", "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - Network accessline 946
"resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - Network accessline 951
"node_modules/consola": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - Network accessline 952
"version": "3.4.2", "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", - Network accessline 953
"resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - Network accessline 961
"node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - Network accessline 962
"version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - Network accessline 963
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - Network accessline 979
"node_modules/esbuild": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", - Network accessline 980
"version": "0.27.3", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", - Network accessline 981
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", - Network accessline 1021
"node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - Network accessline 1022
"version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - Network accessline 1023
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - Network accessline 1039
"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", - Network accessline 1040
"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/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVr - Network accessline 1041
"resolved": "https://registry.npmjs.org/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz", - Network accessline 1051
"node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - Network accessline 1052
"version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - Network accessline 1053
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - Network accessline 1066
"node_modules/joycon": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", - Network accessline 1067
"version": "3.1.1", "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", - Network accessline 1068
"resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", - Network accessline 1076
"node_modules/lilconfig": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - Network accessline 1077
"version": "3.1.3", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - Network accessline 1078
"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - Network accessline 1084
}, "funding": { "url": "https://github.com/sponsors/antonk52" - Network accessline 1085
"funding": { "url": "https://github.com/sponsors/antonk52" } - Network accessline 1086
"url": "https://github.com/sponsors/antonk52" - Network accessline 1089
"node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - Network accessline 1090
"version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - Network accessline 1091
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - Network accessline 1096
"node_modules/load-tsconfig": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", - Network accessline 1097
"version": "0.2.5", "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", - Network accessline 1098
"resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", - Network accessline 1106
"node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - Network accessline 1107
"version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - Network accessline 1108
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - Network accessline 1116
"node_modules/mlly": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", - Network accessline 1117
"version": "1.8.0", "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", - Network accessline 1118
"resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", - Network accessline 1129
"node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - Network accessline 1130
"version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - Network accessline 1131
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - Network accessline 1136
"node_modules/mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - Network accessline 1137
"version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - Network accessline 1138
"resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - Network accessline 1148
"node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - Network accessline 1149
"version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - Network accessline 1150
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - Network accessline 1158
"node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - Network accessline 1159
"version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - Network accessline 1160
"resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - Network accessline 1165
"node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - Network accessline 1166
"version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - Network accessline 1167
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - Network accessline 1172
"node_modules/picomatch": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - Network accessline 1173
"version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - Network accessline 1174
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - Network accessline 1180
}, "funding": { "url": "https://github.com/sponsors/jonschlinkert" - Network accessline 1181
"funding": { "url": "https://github.com/sponsors/jonschlinkert" } - Network accessline 1182
"url": "https://github.com/sponsors/jonschlinkert" - Network accessline 1185
"node_modules/pirates": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - Network accessline 1186
"version": "4.0.7", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - Network accessline 1187
"resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - Network accessline 1195
"node_modules/pkg-types": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - Network accessline 1196
"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==", - Network accessline 1197
"resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - Network accessline 1207
"node_modules/postcss-load-config": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", - Network accessline 1208
"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==", - Network accessline 1209
"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", - Network accessline 1213
{ "type": "opencollective", "url": "https://opencollective.com/postcss/" - Network accessline 1214
"type": "opencollective", "url": "https://opencollective.com/postcss/" }, - Network accessline 1215
"url": "https://opencollective.com/postcss/" - Network accessline 1217
{ "type": "github", "url": "https://github.com/sponsors/ai" - Network accessline 1218
"type": "github", "url": "https://github.com/sponsors/ai" } - Network accessline 1219
"url": "https://github.com/sponsors/ai" - Network accessline 1250
"node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - Network accessline 1251
"version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - Network accessline 1252
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - Network accessline 1259
"funding": { "type": "individual", "url": "https://paulmillr.com/funding/" - Network accessline 1260
"type": "individual", "url": "https://paulmillr.com/funding/" } - Network accessline 1261
"url": "https://paulmillr.com/funding/" - Network accessline 1264
"node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - Network accessline 1265
"version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - Network accessline 1266
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - Network accessline 1274
"node_modules/rollup": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", - Network accessline 1275
"version": "4.59.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", - Network accessline 1276
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", - Network accessline 1319
"node_modules/source-map": { "version": "0.7.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - Network accessline 1320
"version": "0.7.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", - Network accessline 1321
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - Network accessline 1329
"node_modules/sucrase": { "version": "3.35.1", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", - Network accessline 1330
"version": "3.35.1", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", - Network accessline 1331
"resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", - Network accessline 1352
"node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - Network accessline 1353
"version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - Network accessline 1354
"resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - Network accessline 1362
"node_modules/thenify-all": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - Network accessline 1363
"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==", - Network accessline 1364
"resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - Network accessline 1375
"node_modules/tinyexec": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - Network accessline 1376
"version": "0.3.2", "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", - Network accessline 1377
"resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - Network accessline 1382
"node_modules/tinyglobby": { "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - Network accessline 1383
"version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - Network accessline 1384
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - Network accessline 1394
}, "funding": { "url": "https://github.com/sponsors/SuperchupuDev" - Network accessline 1395
"funding": { "url": "https://github.com/sponsors/SuperchupuDev" } - Network accessline 1396
"url": "https://github.com/sponsors/SuperchupuDev" - Network accessline 1399
"node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - Network accessline 1400
"version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - Network accessline 1401
"resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - Network accessline 1409
"node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - Network accessline 1410
"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==" - Network accessline 1411
"resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - Network accessline 1416
"node_modules/tsup": { "version": "8.5.1", "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.5.1.tgz", - Network accessline 1417
"version": "8.5.1", "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.5.1.tgz", "integrity": "sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==", - Network accessline 1418
"resolved": "https://registry.npmjs.org/tsup/-/tsup-8.5.1.tgz", - Network accessline 1469
"node_modules/tsx": { "version": "4.22.4", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.22.4.tgz", - Network accessline 1470
"version": "4.22.4", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.22.4.tgz", "integrity": "sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg==", - Network accessline 1471
"resolved": "https://registry.npmjs.org/tsx/-/tsx-4.22.4.tgz", - Network accessline 1488
"node_modules/tsx/node_modules/@esbuild/aix-ppc64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz", - Network accessline 1489
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz", "integrity": "sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==", - Network accessline 1490
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz", - Network accessline 1505
"node_modules/tsx/node_modules/@esbuild/android-arm": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.0.tgz", - Network accessline 1506
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.0.tgz", "integrity": "sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==", - Network accessline 1507
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.0.tgz", - Network accessline 1522
"node_modules/tsx/node_modules/@esbuild/android-arm64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz", - Network accessline 1523
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz", "integrity": "sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==", - Network accessline 1524
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz", - Network accessline 1539
"node_modules/tsx/node_modules/@esbuild/android-x64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.0.tgz", - Network accessline 1540
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.0.tgz", "integrity": "sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==", - Network accessline 1541
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.0.tgz", - Network accessline 1556
"node_modules/tsx/node_modules/@esbuild/darwin-arm64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz", - Network accessline 1557
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz", "integrity": "sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==", - Network accessline 1558
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz", - Network accessline 1573
"node_modules/tsx/node_modules/@esbuild/darwin-x64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz", - Network accessline 1574
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz", "integrity": "sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==", - Network accessline 1575
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz", - Network accessline 1590
"node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz", - Network accessline 1591
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz", "integrity": "sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==", - Network accessline 1592
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz", - Network accessline 1607
"node_modules/tsx/node_modules/@esbuild/freebsd-x64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz", - Network accessline 1608
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz", "integrity": "sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==", - Network accessline 1609
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz", - Network accessline 1624
"node_modules/tsx/node_modules/@esbuild/linux-arm": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz", - Network accessline 1625
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz", "integrity": "sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==", - Network accessline 1626
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz", - Network accessline 1641
"node_modules/tsx/node_modules/@esbuild/linux-arm64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz", - Network accessline 1642
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz", "integrity": "sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==", - Network accessline 1643
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz", - Network accessline 1658
"node_modules/tsx/node_modules/@esbuild/linux-ia32": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz", - Network accessline 1659
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz", "integrity": "sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==", - Network accessline 1660
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz", - Network accessline 1675
"node_modules/tsx/node_modules/@esbuild/linux-loong64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz", - Network accessline 1676
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz", "integrity": "sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==", - Network accessline 1677
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz", - Network accessline 1692
"node_modules/tsx/node_modules/@esbuild/linux-mips64el": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz", - Network accessline 1693
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz", "integrity": "sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==", - Network accessline 1694
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz", - Network accessline 1709
"node_modules/tsx/node_modules/@esbuild/linux-ppc64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz", - Network accessline 1710
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz", "integrity": "sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==", - Network accessline 1711
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz", - Network accessline 1726
"node_modules/tsx/node_modules/@esbuild/linux-riscv64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz", - Network accessline 1727
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz", "integrity": "sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==", - Network accessline 1728
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz", - Network accessline 1743
"node_modules/tsx/node_modules/@esbuild/linux-s390x": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz", - Network accessline 1744
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz", "integrity": "sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==", - Network accessline 1745
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz", - Network accessline 1760
"node_modules/tsx/node_modules/@esbuild/linux-x64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz", - Network accessline 1761
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz", "integrity": "sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==", - Network accessline 1762
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz", - Network accessline 1777
"node_modules/tsx/node_modules/@esbuild/netbsd-arm64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz", - Network accessline 1778
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz", "integrity": "sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==", - Network accessline 1779
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz", - Network accessline 1794
"node_modules/tsx/node_modules/@esbuild/netbsd-x64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz", - Network accessline 1795
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz", "integrity": "sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==", - Network accessline 1796
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz", - Network accessline 1811
"node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz", - Network accessline 1812
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz", "integrity": "sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==", - Network accessline 1813
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz", - Network accessline 1828
"node_modules/tsx/node_modules/@esbuild/openbsd-x64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz", - Network accessline 1829
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz", "integrity": "sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==", - Network accessline 1830
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz", - Network accessline 1845
"node_modules/tsx/node_modules/@esbuild/openharmony-arm64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz", - Network accessline 1846
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz", "integrity": "sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w - Network accessline 1847
"resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz", - Network accessline 1862
"node_modules/tsx/node_modules/@esbuild/sunos-x64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz", - Network accessline 1863
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz", "integrity": "sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==", - Network accessline 1864
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz", - Network accessline 1879
"node_modules/tsx/node_modules/@esbuild/win32-arm64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz", - Network accessline 1880
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz", "integrity": "sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==", - Network accessline 1881
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz", - Network accessline 1896
"node_modules/tsx/node_modules/@esbuild/win32-ia32": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz", - Network accessline 1897
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz", "integrity": "sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==", - Network accessline 1898
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz", - Network accessline 1913
"node_modules/tsx/node_modules/@esbuild/win32-x64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz", - Network accessline 1914
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz", "integrity": "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==", - Network accessline 1915
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz", - Network accessline 1930
"node_modules/tsx/node_modules/esbuild": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", - Network accessline 1931
"version": "0.28.0", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", "integrity": "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==", - Network accessline 1932
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", - Network accessline 1972
"node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - Network accessline 1973
"version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - Network accessline 1974
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - Network accessline 1986
"node_modules/ufo": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", - Network accessline 1987
"version": "1.6.3", "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", - Network accessline 1988
"resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", - Network accessline 1993
"node_modules/undici-types": { "version": "7.18.2", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", - Network accessline 1994
"version": "7.18.2", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", - Network accessline 1995
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz",
sdk/js/package.json
- Executable scriptline 1
Executable file - Network accessline 42
"repository": { "type": "git", "url": "https://github.com/LetsFG/LetsFG.git" - Network accessline 43
"type": "git", "url": "https://github.com/LetsFG/LetsFG.git" }, - Network accessline 44
"url": "https://github.com/LetsFG/LetsFG.git" - Network accessline 45
}, "homepage": "https://letsfg.co", "devDependencies": { - Network accessline 46
"homepage": "https://letsfg.co",
sdk/js/src/auth.test.ts
- Executable scriptline 1
Executable file - Access to secretsline 18
[Credential-related source omitted] - Access to secretsline 22
[Credential-related source omitted] - Access to secretsline 40
[Credential-related source omitted] - Access to secretsline 89
[Credential-related source omitted] - Access to secretsline 107
[Credential-related source omitted]
sdk/js/src/auth.ts
- Executable scriptline 1
Executable file - Network accessline 10
* Claude, ChatGPT, Grok) uses. * A CLI is not a second-class client: the OAuth metadata advertises * authorization_endpoint = https://letsfg.co/connect and /oauth/register is open - Network accessline 11
* A CLI is not a second-class client: the OAuth metadata advertises * authorization_endpoint = https://letsfg.co/connect and /oauth/register is open * dynamic registration (RFC 7591), so this package registers itself and drives - Network accessline 12
* authorization_endpoint = https://letsfg.co/connect and /oauth/register is open - Network accessline 33
const BASE_URL = process.env.LETSFG_BASE_URL || 'https://letsfg.co'; - Access to secretsline 97
[Credential-related source omitted] - Access to secretsline 113
[Credential-related source omitted] - Access to secretsline 119
[Credential-related source omitted] - Network accessline 139
}; try { const resp = await fetch(`${DEV_ROOT}/.well-known/oauth-authorization-server`); - Network accessline 140
try { const resp = await fetch(`${DEV_ROOT}/.well-known/oauth-authorization-server`); if (!resp.ok) return fallback; - Network accessline 141
const resp = await fetch(`${DEV_ROOT}/.well-known/oauth-authorization-server`); - Network accessline 162
form: Record<string, string>, ): Promise<{ status: number; data: Record<string, unknown> }> { const resp = await fetch(url, { - Network accessline 163
): Promise<{ status: number; data: Record<string, unknown> }> { const resp = await fetch(url, { method: 'POST', - Network accessline 164
const resp = await fetch(url, { - Dangerous shell operationline 184
exec(cmd, () => { - Access to secretsline 205
[Credential-related source omitted] - Access to secretsline 209
[Credential-related source omitted] - Access to secretsline 213
[Credential-related source omitted] - Network accessline 231
const server = createServer((req, res) => { const url = new URL(req.url || '/', 'http://127.0.0.1'); - Network accessline 232
const url = new URL(req.url || '/', 'http://127.0.0.1'); - Network accessline 282
const { port, waitForCode, close } = await startCallbackServer(state); const redirectUri = `http://127.0.0.1:${port}/callback`; - Network accessline 283
const redirectUri = `http://127.0.0.1:${port}/callback`; - Network accessline 285
try { const reg = await fetch(meta.registration_endpoint, { - Network accessline 286
const reg = await fetch(meta.registration_endpoint, { - Access to secretsline 327
[Credential-related source omitted] - Access to secretsline 333
[Credential-related source omitted] - Access to secretsline 338
[Credential-related source omitted]
sdk/js/src/cli.ts
- Executable scriptline 1
#!/usr/bin/env node - Access to secretsline 27
[Credential-related source omitted] - Access to secretsline 34
[Credential-related source omitted] - Access to secretsline 311
[Credential-related source omitted] - Access to secretsline 313
[Credential-related source omitted] - Network accessline 399
--json, -j Output raw JSON --api-key, -k Developer API key (or set LETSFG_API_KEY) — switches book/search to the paid path --base-url API URL (default: https://letsfg.co) - Network accessline 400
[Credential-related source omitted] - Access to secretsline 400
[Credential-related source omitted] - Network accessline 401
--base-url API URL (default: https://letsfg.co)
sdk/js/src/index.test.ts
- Executable scriptline 1
Executable file - Network accessline 51
// ── register() sends an explicit User-Agent ───────────────────────────────── // Every other request in this file goes through requestWithHeaders(), which // sets User-Agent: LetsFG-js/0.1.0. register() builds its own bare fetch() - Network accessline 52
// Every other request in this file goes through requestWithHeaders(), which // sets User-Agent: LetsFG-js/0.1.0. register() builds its own bare fetch() // call and used to skip that header entirely -- Node's fetch silently fills - Network accessline 53
// sets User-Agent: LetsFG-js/0.1.0. register() builds its own bare fetch() - Network accessline 113
it('Bearer lane: the names /api/search reads, and limit enforced client-side', async () => { const { posts, result } = await capture(new LetsFG({ bearerToken: 'tok', baseUrl: 'http://lfg.test' })); - Network accessline 114
const { posts, result } = await capture(new LetsFG({ bearerToken: 'tok', baseUrl: 'http://lfg.test' })); - Access to secretsline 129
[Credential-related source omitted] - Network accessline 130
[Credential-related source omitted] - Access to secretsline 130
[Credential-related source omitted] - Network accessline 131
[Credential-related source omitted] - Network accessline 132
[Credential-related source omitted] - Access to secretsline 144
[Credential-related source omitted] - Network accessline 315
is_locked: false, fetched_at: '2026-06-01T12:00:00Z', booking_url: 'https://ryanair.com/book/GDN-BER', - Network accessline 316
fetched_at: '2026-06-01T12:00:00Z', booking_url: 'https://ryanair.com/book/GDN-BER', }; - Network accessline 317
booking_url: 'https://ryanair.com/book/GDN-BER', - Network accessline 464
const answer = { error: 'payment_declined', message: 'Not booked - your Visa was declined for 412.30 EUR: there was not enough money on the card. Nothing was booked and nothing was charged.\nPay for this booking another way (any - Network accessline 465
error: 'payment_declined', message: 'Not booked - your Visa was declined for 412.30 EUR: there was not enough money on the card. Nothing was booked and nothing was charged.\nPay for this booking another way (any card, Apple Pay, Googl - Network accessline 466
message: 'Not booked - your Visa was declined for 412.30 EUR: there was not enough money on the card. Nothing was booked and nothing was charged.\nPay for this booking another way (any card, Apple Pay, Google Pay or Revolut Pay): https://le - Network accessline 467
decline_reason: 'insufficient_funds', pay_url: 'https://letsfg.co/pay/b_1_3ds', charged: 0, - Network accessline 468
pay_url: 'https://letsfg.co/pay/b_1_3ds', - Network accessline 471
globalThis.fetch = (async () => ({ ok: false, status: 402, json: async () => answer }) as Response) as typeof fetch; try { const client = new LetsFG({ bearerToken: 'tok', baseUrl: 'http://lfg.test' }); - Network accessline 472
try { const client = new LetsFG({ bearerToken: 'tok', baseUrl: 'http://lfg.test' }); await assert.rejects( - Network accessline 473
const client = new LetsFG({ bearerToken: 'tok', baseUrl: 'http://lfg.test' });
sdk/js/src/index.ts
- Executable scriptline 1
Executable file - Network accessline 3
* * Server-side engine covers hundreds of airlines. Free search via PFS Bearer token * or prepaid Developer API. Zero external JS dependencies. Uses native fetch (Node 18+). - Network accessline 4
* Server-side engine covers hundreds of airlines. Free search via PFS Bearer token * or prepaid Developer API. Zero external JS dependencies. Uses native fetch (Node 18+). * - Network accessline 5
* or prepaid Developer API. Zero external JS dependencies. Uses native fetch (Node 18+). - Access to secretsline 12
[Credential-related source omitted] - Access to secretsline 16
[Credential-related source omitted] - Network accessline 313
const DEFAULT_BASE_URL = 'https://letsfg.co'; - Access to secretsline 354
[Credential-related source omitted] - Access to secretsline 355
[Credential-related source omitted] - Access to secretsline 364
[Credential-related source omitted] - Access to secretsline 372
[Credential-related source omitted] - Network accessline 513
'unlock() was retired on 2026-09-08 and the endpoint answers 410 Gone. There is no unlock ' + 'step: call book() directly. The fare is held on the connected payment method and ' + 'captured only against a real airline PNR. S - Network accessline 514
'step: call book() directly. The fare is held on the connected payment method and ' + 'captured only against a real airline PNR. See https://letsfg.co/developers/api/docs', 410, - Network accessline 515
'captured only against a real airline PNR. See https://letsfg.co/developers/api/docs', - Network accessline 820
? 'expectedBalance belonged to the reservation-fee process retired on 2026-09-11 and is not sent. ' : '') + 'See https://letsfg.co/developers/api/docs', - Network accessline 821
: '') + 'See https://letsfg.co/developers/api/docs', 400, - Network accessline 822
'See https://letsfg.co/developers/api/docs', - Network accessline 953
'setupPayment() was retired on 2026-09-08 with Stripe and the endpoint answers 410 Gone. ' + 'Call connectPayment() instead and open the connect_url it returns; nothing is charged ' + 'to connect. See https://letsfg.co/devel - Network accessline 954
'Call connectPayment() instead and open the connect_url it returns; nothing is charged ' + 'to connect. See https://letsfg.co/developers/api/docs', 410, - Network accessline 955
'to connect. See https://letsfg.co/developers/api/docs', - Network accessline 982
): Promise<Record<string, unknown>> { const url = (baseUrl || DEFAULT_BASE_URL).replace(/\/$/, ''); const resp = await fetch(`${url}/developers/api/v1/agents/register`, { - Network accessline 983
const url = (baseUrl || DEFAULT_BASE_URL).replace(/\/$/, ''); const resp = await fetch(`${url}/developers/api/v1/agents/register`, { method: 'POST', - Network accessline 984
const resp = await fetch(`${url}/developers/api/v1/agents/register`, { - Network accessline 1046
try { const resp = await fetch(`${this.baseUrl}${path}`, { - Network accessline 1047
const resp = await fetch(`${this.baseUrl}${path}`, {
sdk/js/src/offer-details.ts
- Executable scriptline 1
Executable file
sdk/js/src/ranking.ts
- Executable scriptline 1
Executable file
sdk/js/src/trip-purpose.ts
- Executable scriptline 1
Executable file
sdk/mcp/README.md
- Network accessline 7
[](https://www.npmjs.com/package/letsfg-mcp) - Network accessline 8
[](https://github.com/LetsFG/LetsFG) - Network accessline 9
[](../../LICENSE) - Network accessline 35
https://letsfg.co/mcp - Network accessline 38
In Claude, add it from Claude's connector directory, [claude.ai/directory/letsfg](https://claude.ai/directory/letsfg). Elsewhere, add it as a remote MCP server in - Network accessline 39
[claude.ai/directory/letsfg](https://claude.ai/directory/letsfg). Elsewhere, add it as a remote MCP server in - Network accessline 40
ChatGPT, Cursor or Windsurf (or `claude mcp add --transport http letsfg https://letsfg.co/mcp` in Claude Code) and approve the connection. The consent step opens - Network accessline 41
`claude mcp add --transport http letsfg https://letsfg.co/mcp` - Network accessline 42
in Claude Code) and approve the connection. The consent step opens [letsfg.co/connect](https://letsfg.co/connect): one tap, no card. The card is asked for at the first booking (any card, or Revolut Pay / Google Pay), in a - Network accessline 43
[letsfg.co/connect](https://letsfg.co/connect): one tap, no card. The card - Network accessline 74
LetsFG is in Claude's official connector directory. Open [claude.ai/directory/letsfg](https://claude.ai/directory/letsfg), add it and approve it. No URL to paste. - Network accessline 75
[claude.ai/directory/letsfg](https://claude.ai/directory/letsfg), add it and approve it. No URL to paste. - Network accessline 81
Add it at chatgpt.com in a browser; the ChatGPT phone app has no way to add one. Plugins > Add > Add custom MCP server, URL `https://letsfg.co/mcp`, - Network accessline 82
one. Plugins > Add > Add custom MCP server, URL `https://letsfg.co/mcp`, - Network accessline 89
claude mcp add --transport http letsfg https://letsfg.co/mcp - Network accessline 97
{ "mcpServers": { "letsfg": { "url": "https://letsfg.co/mcp" } - Network accessline 98
"mcpServers": { "letsfg": { "url": "https://letsfg.co/mcp" } } - Network accessline 99
"letsfg": { "url": "https://letsfg.co/mcp" } - Network accessline 109
{ "mcpServers": { "letsfg": { "serverUrl": "https://letsfg.co/mcp" } - Network accessline 110
"mcpServers": { "letsfg": { "serverUrl": "https://letsfg.co/mcp" } } - Network accessline 111
"letsfg": { "serverUrl": "https://letsfg.co/mcp" } - Access to secretsline 120
[Credential-related source omitted] - Network accessline 154
https://letsfg.co/mcp - Network accessline 253
The [Developer API](https://letsfg.co/developers) books flights itself: `POST /flights/book` holds - Network accessline 296
Full semantics: [docs/api-search.md](https://github.com/LetsFG/LetsFG/blob/main/docs/api-search.md#starlink-wi-fi). - Network accessline 301
already searches and books. An API key belongs to the separate, paid, prepaid-balance Developer API. If that is what you want, register at [letsfg.co/developers](https://letsfg.co/developers) or via CLI: - Network accessline 303
[letsfg.co/developers](https://letsfg.co/developers) or via CLI: - Network accessline 313
curl -X POST https://letsfg.co/developers/api/v1/agents/register \ - Access to secretsline 353
[Credential-related source omitted] - Network accessline 354
- **PII handling** — passenger names, emails, and DOBs are sent to the airline for booking (required by airlines). LetsFG does not store passenger PII after forwarding to the airline. - **No tracking** — no cookies, no session-based pricing - Network accessline 356
- **Open source** — the SDK and MCP server code is MIT-licensed and auditable at [github.com/LetsFG/LetsFG](https://github.com/LetsFG/LetsFG). - Network accessline 364
Developer API has a keyless sandbox where booking works end to end with no money (same responses, states, questions and timings as production) — see [Booking in the sandbox](https://letsfg.co/developers/docs/api-sandbox#booking-in-the-sandb - Network accessline 366
[Booking in the sandbox](https://letsfg.co/developers/docs/api-sandbox#booking-in-the-sandbox). - Network accessline 387
**Upgrade first: `2026.5.74` and later send a declared-bot User-Agent that is not singled out this way** (`Mozilla/5.0 (compatible; letsfg-mcp/1.3.1; +https://github.com/LetsFG/LetsFG)`). - Network accessline 388
out this way** (`Mozilla/5.0 (compatible; letsfg-mcp/1.3.1; +https://github.com/LetsFG/LetsFG)`). - Network accessline 411
Connect LetsFG as an MCP server at `https://letsfg.co/mcp` and approve it; the consent step opens letsfg.co/connect: one tap, no card. The card is asked for at the first booking, in a 0.00 Revolut setup; nothing is charged to connect. The t - Network accessline 444
- **JavaScript/TypeScript SDK + CLI**: `npm install letsfg` — [npm](https://www.npmjs.com/package/letsfg) - Network accessline 445
- **Python SDK + CLI**: `pip install letsfg` — [PyPI](https://pypi.org/project/letsfg/) - Network accessline 446
- **Try without installing**: [Message us on Messenger](https://m.me/61579557368989) - Network accessline 447
- **GitHub**: [LetsFG/LetsFG](https://github.com/LetsFG/LetsFG) - Network accessline 449
> ⭐ **[Star the repo](https://github.com/LetsFG/LetsFG)** — we appreciate the support. - Network accessline 461
> the reservation-fee fields retired on 2026-09-11 (`expected_balance`, no `expected_cost`), and the API refuses > every hotel booking they make. Update with `pip install -U letsfg`, `npm install letsfg@latest` or > `npx -y letsfg-mcp@lates - Network accessline 463
> `npx -y letsfg-mcp@latest`. The hosted MCP at `https://letsfg.co/mcp` needs no update. - Access to secretsline 570
[Credential-related source omitted]
sdk/mcp/package-lock.json
- Network accessline 24
"node_modules/@esbuild/aix-ppc64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", - Network accessline 25
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", - Network accessline 26
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", - Network accessline 41
"node_modules/@esbuild/android-arm": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", - Network accessline 42
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", - Network accessline 43
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", - Network accessline 58
"node_modules/@esbuild/android-arm64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", - Network accessline 59
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", - Network accessline 60
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", - Network accessline 75
"node_modules/@esbuild/android-x64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", - Network accessline 76
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", - Network accessline 77
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", - Network accessline 92
"node_modules/@esbuild/darwin-arm64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", - Network accessline 93
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", - Network accessline 94
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", - Network accessline 109
"node_modules/@esbuild/darwin-x64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", - Network accessline 110
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", - Network accessline 111
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", - Network accessline 126
"node_modules/@esbuild/freebsd-arm64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", - Network accessline 127
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", - Network accessline 128
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", - Network accessline 143
"node_modules/@esbuild/freebsd-x64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", - Network accessline 144
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", - Network accessline 145
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", - Network accessline 160
"node_modules/@esbuild/linux-arm": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", - Network accessline 161
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", - Network accessline 162
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", - Network accessline 177
"node_modules/@esbuild/linux-arm64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", - Network accessline 178
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", - Network accessline 179
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", - Network accessline 194
"node_modules/@esbuild/linux-ia32": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", - Network accessline 195
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", - Network accessline 196
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", - Network accessline 211
"node_modules/@esbuild/linux-loong64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", - Network accessline 212
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", - Network accessline 213
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", - Network accessline 228
"node_modules/@esbuild/linux-mips64el": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", - Network accessline 229
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", - Network accessline 230
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", - Network accessline 245
"node_modules/@esbuild/linux-ppc64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", - Network accessline 246
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", - Network accessline 247
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", - Network accessline 262
"node_modules/@esbuild/linux-riscv64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", - Network accessline 263
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", - Network accessline 264
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", - Network accessline 279
"node_modules/@esbuild/linux-s390x": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", - Network accessline 280
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", - Network accessline 281
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", - Network accessline 296
"node_modules/@esbuild/linux-x64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", - Network accessline 297
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", - Network accessline 298
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", - Network accessline 313
"node_modules/@esbuild/netbsd-arm64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", - Network accessline 314
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", - Network accessline 315
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", - Network accessline 330
"node_modules/@esbuild/netbsd-x64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", - Network accessline 331
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", - Network accessline 332
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", - Network accessline 347
"node_modules/@esbuild/openbsd-arm64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", - Network accessline 348
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", - Network accessline 349
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", - Network accessline 364
"node_modules/@esbuild/openbsd-x64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", - Network accessline 365
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", - Network accessline 366
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", - Network accessline 381
"node_modules/@esbuild/openharmony-arm64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", - Network accessline 382
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g - Network accessline 383
"resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", - Network accessline 398
"node_modules/@esbuild/sunos-x64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", - Network accessline 399
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", - Network accessline 400
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", - Network accessline 415
"node_modules/@esbuild/win32-arm64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", - Network accessline 416
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", - Network accessline 417
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", - Network accessline 432
"node_modules/@esbuild/win32-ia32": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", - Network accessline 433
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", - Network accessline 434
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", - Network accessline 449
"node_modules/@esbuild/win32-x64": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", - Network accessline 450
"version": "0.27.3", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", - Network accessline 451
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", - Network accessline 466
"node_modules/@jridgewell/gen-mapping": { "version": "0.3.13", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - Network accessline 467
"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==", - Network accessline 468
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - Network accessline 477
"node_modules/@jridgewell/resolve-uri": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - Network accessline 478
"version": "3.1.2", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - Network accessline 479
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - Network accessline 487
"node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - Network accessline 488
"version": "1.5.5", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==" - Network accessline 489
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - Network accessline 494
"node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - Network accessline 495
"version": "0.3.31", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - Network accessline 496
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", - Network accessline 505
"node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", - Network accessline 506
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xw - Network accessline 507
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", - Network accessline 519
"node_modules/@rollup/rollup-android-arm64": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", - Network accessline 520
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBSho - Network accessline 521
"resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", - Network accessline 533
"node_modules/@rollup/rollup-darwin-arm64": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", - Network accessline 534
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m - Network accessline 535
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", - Network accessline 547
"node_modules/@rollup/rollup-darwin-x64": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", - Network accessline 548
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w= - Network accessline 549
"resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", - Network accessline 561
"node_modules/@rollup/rollup-freebsd-arm64": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", - Network accessline 562
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9 - Network accessline 563
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", - Network accessline 575
"node_modules/@rollup/rollup-freebsd-x64": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", - Network accessline 576
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3V - Network accessline 577
"resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", - Network accessline 589
"node_modules/@rollup/rollup-linux-arm-gnueabihf": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", - Network accessline 590
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKi - Network accessline 591
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", - Network accessline 603
"node_modules/@rollup/rollup-linux-arm-musleabihf": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", - Network accessline 604
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4e - Network accessline 605
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", - Network accessline 617
"node_modules/@rollup/rollup-linux-arm64-gnu": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", - Network accessline 618
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54 - Network accessline 619
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", - Network accessline 631
"node_modules/@rollup/rollup-linux-arm64-musl": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", - Network accessline 632
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsi - Network accessline 633
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", - Network accessline 645
"node_modules/@rollup/rollup-linux-loong64-gnu": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", - Network accessline 646
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9Cs - Network accessline 647
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", - Network accessline 659
"node_modules/@rollup/rollup-linux-loong64-musl": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", - Network accessline 660
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxp - Network accessline 661
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", - Network accessline 673
"node_modules/@rollup/rollup-linux-ppc64-gnu": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", - Network accessline 674
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6m - Network accessline 675
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", - Network accessline 687
"node_modules/@rollup/rollup-linux-ppc64-musl": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", - Network accessline 688
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/p - Network accessline 689
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", - Network accessline 701
"node_modules/@rollup/rollup-linux-riscv64-gnu": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", - Network accessline 702
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WO - Network accessline 703
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", - Network accessline 715
"node_modules/@rollup/rollup-linux-riscv64-musl": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", - Network accessline 716
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM - Network accessline 717
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", - Network accessline 729
"node_modules/@rollup/rollup-linux-s390x-gnu": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", - Network accessline 730
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+r - Network accessline 731
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", - Network accessline 743
"node_modules/@rollup/rollup-linux-x64-gnu": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", - Network accessline 744
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAk - Network accessline 745
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", - Network accessline 757
"node_modules/@rollup/rollup-linux-x64-musl": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", - Network accessline 758
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyo - Network accessline 759
"resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", - Network accessline 771
"node_modules/@rollup/rollup-openbsd-x64": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", - Network accessline 772
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/j - Network accessline 773
"resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", - Network accessline 785
"node_modules/@rollup/rollup-openharmony-arm64": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", - Network accessline 786
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+ - Network accessline 787
"resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", - Network accessline 799
"node_modules/@rollup/rollup-win32-arm64-msvc": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", - Network accessline 800
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9g - Network accessline 801
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", - Network accessline 813
"node_modules/@rollup/rollup-win32-ia32-msvc": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", - Network accessline 814
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4 - Network accessline 815
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", - Network accessline 827
"node_modules/@rollup/rollup-win32-x64-gnu": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", - Network accessline 828
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXi - Network accessline 829
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", - Network accessline 841
"node_modules/@rollup/rollup-win32-x64-msvc": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", - Network accessline 842
"version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj - Network accessline 843
"resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", - Network accessline 855
"node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - Network accessline 856
"version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - Network accessline 857
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - Network accessline 862
"node_modules/@types/node": { "version": "25.5.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", - Network accessline 863
"version": "25.5.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", "integrity": "sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==", - Network accessline 864
"resolved": "https://registry.npmjs.org/@types/node/-/node-25.5.0.tgz", - Network accessline 872
"node_modules/acorn": { "version": "8.16.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - Network accessline 873
"version": "8.16.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", - Network accessline 874
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - Network accessline 885
"node_modules/any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - Network accessline 886
"version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", - Network accessline 887
"resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - Network accessline 892
"node_modules/bundle-require": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", - Network accessline 893
"version": "5.1.0", "resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", "integrity": "sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==", - Network accessline 894
"resolved": "https://registry.npmjs.org/bundle-require/-/bundle-require-5.1.0.tgz", - Network accessline 908
"node_modules/cac": { "version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - Network accessline 909
"version": "6.7.14", "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", - Network accessline 910
"resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", - Network accessline 918
"node_modules/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - Network accessline 919
"version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", - Network accessline 920
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", - Network accessline 929
}, "funding": { "url": "https://paulmillr.com/funding/" - Network accessline 930
"funding": { "url": "https://paulmillr.com/funding/" } - Network accessline 931
"url": "https://paulmillr.com/funding/" - Network accessline 934
"node_modules/commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - Network accessline 935
"version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - Network accessline 936
"resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - Network accessline 944
"node_modules/confbox": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - Network accessline 945
"version": "0.1.8", "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", - Network accessline 946
"resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", - Network accessline 951
"node_modules/consola": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - Network accessline 952
"version": "3.4.2", "resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", "integrity": "sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==", - Network accessline 953
"resolved": "https://registry.npmjs.org/consola/-/consola-3.4.2.tgz", - Network accessline 961
"node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - Network accessline 962
"version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - Network accessline 963
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - Network accessline 979
"node_modules/esbuild": { "version": "0.27.3", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", - Network accessline 980
"version": "0.27.3", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", - Network accessline 981
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", - Network accessline 1021
"node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - Network accessline 1022
"version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", - Network accessline 1023
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", - Network accessline 1039
"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", - Network accessline 1040
"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/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVr - Network accessline 1041
"resolved": "https://registry.npmjs.org/fix-dts-default-cjs-exports/-/fix-dts-default-cjs-exports-1.0.1.tgz", - Network accessline 1051
"node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - Network accessline 1052
"version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - Network accessline 1053
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - Network accessline 1066
"node_modules/joycon": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", - Network accessline 1067
"version": "3.1.1", "resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", "integrity": "sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==", - Network accessline 1068
"resolved": "https://registry.npmjs.org/joycon/-/joycon-3.1.1.tgz", - Network accessline 1076
"node_modules/lilconfig": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - Network accessline 1077
"version": "3.1.3", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", - Network accessline 1078
"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", - Network accessline 1084
}, "funding": { "url": "https://github.com/sponsors/antonk52" - Network accessline 1085
"funding": { "url": "https://github.com/sponsors/antonk52" } - Network accessline 1086
"url": "https://github.com/sponsors/antonk52" - Network accessline 1089
"node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - Network accessline 1090
"version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - Network accessline 1091
"resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - Network accessline 1096
"node_modules/load-tsconfig": { "version": "0.2.5", "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", - Network accessline 1097
"version": "0.2.5", "resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", "integrity": "sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==", - Network accessline 1098
"resolved": "https://registry.npmjs.org/load-tsconfig/-/load-tsconfig-0.2.5.tgz", - Network accessline 1106
"node_modules/magic-string": { "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - Network accessline 1107
"version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - Network accessline 1108
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", - Network accessline 1116
"node_modules/mlly": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", - Network accessline 1117
"version": "1.8.0", "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", "integrity": "sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==", - Network accessline 1118
"resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.0.tgz", - Network accessline 1129
"node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - Network accessline 1130
"version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - Network accessline 1131
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - Network accessline 1136
"node_modules/mz": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - Network accessline 1137
"version": "2.7.0", "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", - Network accessline 1138
"resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", - Network accessline 1148
"node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - Network accessline 1149
"version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - Network accessline 1150
"resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - Network accessline 1158
"node_modules/pathe": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - Network accessline 1159
"version": "2.0.3", "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", - Network accessline 1160
"resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", - Network accessline 1165
"node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - Network accessline 1166
"version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - Network accessline 1167
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - Network accessline 1172
"node_modules/picomatch": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - Network accessline 1173
"version": "4.0.3", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - Network accessline 1174
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - Network accessline 1180
}, "funding": { "url": "https://github.com/sponsors/jonschlinkert" - Network accessline 1181
"funding": { "url": "https://github.com/sponsors/jonschlinkert" } - Network accessline 1182
"url": "https://github.com/sponsors/jonschlinkert" - Network accessline 1185
"node_modules/pirates": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - Network accessline 1186
"version": "4.0.7", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - Network accessline 1187
"resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - Network accessline 1195
"node_modules/pkg-types": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - Network accessline 1196
"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==", - Network accessline 1197
"resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", - Network accessline 1207
"node_modules/postcss-load-config": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", - Network accessline 1208
"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==", - Network accessline 1209
"resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-6.0.1.tgz", - Network accessline 1213
{ "type": "opencollective", "url": "https://opencollective.com/postcss/" - Network accessline 1214
"type": "opencollective", "url": "https://opencollective.com/postcss/" }, - Network accessline 1215
"url": "https://opencollective.com/postcss/" - Network accessline 1217
{ "type": "github", "url": "https://github.com/sponsors/ai" - Network accessline 1218
"type": "github", "url": "https://github.com/sponsors/ai" } - Network accessline 1219
"url": "https://github.com/sponsors/ai" - Network accessline 1250
"node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - Network accessline 1251
"version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", - Network accessline 1252
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", - Network accessline 1259
"funding": { "type": "individual", "url": "https://paulmillr.com/funding/" - Network accessline 1260
"type": "individual", "url": "https://paulmillr.com/funding/" } - Network accessline 1261
"url": "https://paulmillr.com/funding/" - Network accessline 1264
"node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - Network accessline 1265
"version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - Network accessline 1266
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - Network accessline 1274
"node_modules/rollup": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", - Network accessline 1275
"version": "4.59.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", - Network accessline 1276
"resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", - Network accessline 1319
"node_modules/source-map": { "version": "0.7.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - Network accessline 1320
"version": "0.7.6", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", "integrity": "sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==", - Network accessline 1321
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.6.tgz", - Network accessline 1329
"node_modules/sucrase": { "version": "3.35.1", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", - Network accessline 1330
"version": "3.35.1", "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", "integrity": "sha512-DhuTmvZWux4H1UOnWMB3sk0sbaCVOoQZjv8u1rDoTV0HTdGem9hkAZtl4JZy8P2z4Bg0nT+YMeOFyVr4zcG5Tw==", - Network accessline 1331
"resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.1.tgz", - Network accessline 1352
"node_modules/thenify": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - Network accessline 1353
"version": "3.3.1", "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", - Network accessline 1354
"resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", - Network accessline 1362
"node_modules/thenify-all": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - Network accessline 1363
"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==", - Network accessline 1364
"resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", - Network accessline 1375
"node_modules/tinyexec": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - Network accessline 1376
"version": "0.3.2", "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", "integrity": "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==", - Network accessline 1377
"resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-0.3.2.tgz", - Network accessline 1382
"node_modules/tinyglobby": { "version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - Network accessline 1383
"version": "0.2.15", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", - Network accessline 1384
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - Network accessline 1394
}, "funding": { "url": "https://github.com/sponsors/SuperchupuDev" - Network accessline 1395
"funding": { "url": "https://github.com/sponsors/SuperchupuDev" } - Network accessline 1396
"url": "https://github.com/sponsors/SuperchupuDev" - Network accessline 1399
"node_modules/tree-kill": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - Network accessline 1400
"version": "1.2.2", "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - Network accessline 1401
"resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - Network accessline 1409
"node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - Network accessline 1410
"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==" - Network accessline 1411
"resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", - Network accessline 1416
"node_modules/tsup": { "version": "8.5.1", "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.5.1.tgz", - Network accessline 1417
"version": "8.5.1", "resolved": "https://registry.npmjs.org/tsup/-/tsup-8.5.1.tgz", "integrity": "sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==", - Network accessline 1418
"resolved": "https://registry.npmjs.org/tsup/-/tsup-8.5.1.tgz", - Network accessline 1469
"node_modules/tsx": { "version": "4.22.4", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.22.4.tgz", - Network accessline 1470
"version": "4.22.4", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.22.4.tgz", "integrity": "sha512-X8EX+XV4QR5xCsrgxaED954zTDfY8KqlDtskKEL0cHhyS/P8b4IFOvGDQpsC9Q1XnLq915wEfwwY/zzskCtmhg==", - Network accessline 1471
"resolved": "https://registry.npmjs.org/tsx/-/tsx-4.22.4.tgz", - Network accessline 1488
"node_modules/tsx/node_modules/@esbuild/aix-ppc64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz", - Network accessline 1489
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz", "integrity": "sha512-lhRUCeuOyJQURhTxl4WkpFTjIsbDayJHih5kZC1giwE+MhIzAb7mEsQMqMf18rHLsrb5qI1tafG20mLxEWcWlA==", - Network accessline 1490
"resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.0.tgz", - Network accessline 1505
"node_modules/tsx/node_modules/@esbuild/android-arm": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.0.tgz", - Network accessline 1506
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.0.tgz", "integrity": "sha512-wqh0ByljabXLKHeWXYLqoJ5jKC4XBaw6Hk08OfMrCRd2nP2ZQ5eleDZC41XHyCNgktBGYMbqnrJKq/K/lzPMSQ==", - Network accessline 1507
"resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.0.tgz", - Network accessline 1522
"node_modules/tsx/node_modules/@esbuild/android-arm64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz", - Network accessline 1523
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz", "integrity": "sha512-+WzIXQOSaGs33tLEgYPYe/yQHf0WTU0X42Jca3y8NWMbUVhp7rUnw+vAsRC/QiDrdD31IszMrZy+qwPOPjd+rw==", - Network accessline 1524
"resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.0.tgz", - Network accessline 1539
"node_modules/tsx/node_modules/@esbuild/android-x64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.0.tgz", - Network accessline 1540
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.0.tgz", "integrity": "sha512-+VJggoaKhk2VNNqVL7f6S189UzShHC/mR9EE8rDdSkdpN0KflSwWY/gWjDrNxxisg8Fp1ZCD9jLMo4m0OUfeUA==", - Network accessline 1541
"resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.0.tgz", - Network accessline 1556
"node_modules/tsx/node_modules/@esbuild/darwin-arm64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz", - Network accessline 1557
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz", "integrity": "sha512-0T+A9WZm+bZ84nZBtk1ckYsOvyA3x7e2Acj1KdVfV4/2tdG4fzUp91YHx+GArWLtwqp77pBXVCPn2We7Letr0Q==", - Network accessline 1558
"resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.0.tgz", - Network accessline 1573
"node_modules/tsx/node_modules/@esbuild/darwin-x64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz", - Network accessline 1574
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz", "integrity": "sha512-fyzLm/DLDl/84OCfp2f/XQ4flmORsjU7VKt8HLjvIXChJoFFOIL6pLJPH4Yhd1n1gGFF9mPwtlN5Wf82DZs+LQ==", - Network accessline 1575
"resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.0.tgz", - Network accessline 1590
"node_modules/tsx/node_modules/@esbuild/freebsd-arm64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz", - Network accessline 1591
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz", "integrity": "sha512-l9GeW5UZBT9k9brBYI+0WDffcRxgHQD8ShN2Ur4xWq/NFzUKm3k5lsH4PdaRgb2w7mI9u61nr2gI2mLI27Nh3Q==", - Network accessline 1592
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.0.tgz", - Network accessline 1607
"node_modules/tsx/node_modules/@esbuild/freebsd-x64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz", - Network accessline 1608
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz", "integrity": "sha512-BXoQai/A0wPO6Es3yFJ7APCiKGc1tdAEOgeTNy3SsB491S3aHn4S4r3e976eUnPdU+NbdtmBuLncYir2tMU9Nw==", - Network accessline 1609
"resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.0.tgz", - Network accessline 1624
"node_modules/tsx/node_modules/@esbuild/linux-arm": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz", - Network accessline 1625
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz", "integrity": "sha512-CjaaREJagqJp7iTaNQjjidaNbCKYcd4IDkzbwwxtSvjI7NZm79qiHc8HqciMddQ6CKvJT6aBd8lO9kN/ZudLlw==", - Network accessline 1626
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.0.tgz", - Network accessline 1641
"node_modules/tsx/node_modules/@esbuild/linux-arm64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz", - Network accessline 1642
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz", "integrity": "sha512-RVyzfb3FWsGA55n6WY0MEIEPURL1FcbhFE6BffZEMEekfCzCIMtB5yyDcFnVbTnwk+CLAgTujmV/Lgvih56W+A==", - Network accessline 1643
"resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.0.tgz", - Network accessline 1658
"node_modules/tsx/node_modules/@esbuild/linux-ia32": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz", - Network accessline 1659
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz", "integrity": "sha512-KBnSTt1kxl9x70q+ydterVdl+Cn0H18ngRMRCEQfrbqdUuntQQ0LoMZv47uB97NljZFzY6HcfqEZ2SAyIUTQBQ==", - Network accessline 1660
"resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.0.tgz", - Network accessline 1675
"node_modules/tsx/node_modules/@esbuild/linux-loong64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz", - Network accessline 1676
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz", "integrity": "sha512-zpSlUce1mnxzgBADvxKXX5sl8aYQHo2ezvMNI8I0lbblJtp8V4odlm3Yzlj7gPyt3T8ReksE6bK+pT3WD+aJRg==", - Network accessline 1677
"resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.0.tgz", - Network accessline 1692
"node_modules/tsx/node_modules/@esbuild/linux-mips64el": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz", - Network accessline 1693
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz", "integrity": "sha512-2jIfP6mmjkdmeTlsX/9vmdmhBmKADrWqN7zcdtHIeNSCH1SqIoNI63cYsjQR8J+wGa4Y5izRcSHSm8K3QWmk3w==", - Network accessline 1694
"resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.0.tgz", - Network accessline 1709
"node_modules/tsx/node_modules/@esbuild/linux-ppc64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz", - Network accessline 1710
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz", "integrity": "sha512-bc0FE9wWeC0WBm49IQMPSPILRocGTQt3j5KPCA8os6VprfuJ7KD+5PzESSrJ6GmPIPJK965ZJHTUlSA6GNYEhg==", - Network accessline 1711
"resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.0.tgz", - Network accessline 1726
"node_modules/tsx/node_modules/@esbuild/linux-riscv64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz", - Network accessline 1727
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz", "integrity": "sha512-SQPZOwoTTT/HXFXQJG/vBX8sOFagGqvZyXcgLA3NhIqcBv1BJU1d46c0rGcrij2B56Z2rNiSLaZOYW5cUk7yLQ==", - Network accessline 1728
"resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.0.tgz", - Network accessline 1743
"node_modules/tsx/node_modules/@esbuild/linux-s390x": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz", - Network accessline 1744
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz", "integrity": "sha512-SCfR0HN8CEEjnYnySJTd2cw0k9OHB/YFzt5zgJEwa+wL/T/raGWYMBqwDNAC6dqFKmJYZoQBRfHjgwLHGSrn3Q==", - Network accessline 1745
"resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.0.tgz", - Network accessline 1760
"node_modules/tsx/node_modules/@esbuild/linux-x64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz", - Network accessline 1761
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz", "integrity": "sha512-us0dSb9iFxIi8srnpl931Nvs65it/Jd2a2K3qs7fz2WfGPHqzfzZTfec7oxZJRNPXPnNYZtanmRc4AL/JwVzHQ==", - Network accessline 1762
"resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.0.tgz", - Network accessline 1777
"node_modules/tsx/node_modules/@esbuild/netbsd-arm64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz", - Network accessline 1778
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz", "integrity": "sha512-CR/RYotgtCKwtftMwJlUU7xCVNg3lMYZ0RzTmAHSfLCXw3NtZtNpswLEj/Kkf6kEL3Gw+BpOekRX0BYCtklhUw==", - Network accessline 1779
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.0.tgz", - Network accessline 1794
"node_modules/tsx/node_modules/@esbuild/netbsd-x64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz", - Network accessline 1795
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz", "integrity": "sha512-nU1yhmYutL+fQ71Kxnhg8uEOdC0pwEW9entHykTgEbna2pw2dkbFSMeqjjyHZoCmt8SBkOSvV+yNmm94aUrrqw==", - Network accessline 1796
"resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.0.tgz", - Network accessline 1811
"node_modules/tsx/node_modules/@esbuild/openbsd-arm64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz", - Network accessline 1812
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz", "integrity": "sha512-cXb5vApOsRsxsEl4mcZ1XY3D4DzcoMxR/nnc4IyqYs0rTI8ZKmW6kyyg+11Z8yvgMfAEldKzP7AdP64HnSC/6g==", - Network accessline 1813
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.0.tgz", - Network accessline 1828
"node_modules/tsx/node_modules/@esbuild/openbsd-x64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz", - Network accessline 1829
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz", "integrity": "sha512-8wZM2qqtv9UP3mzy7HiGYNH/zjTA355mpeuA+859TyR+e+Tc08IHYpLJuMsfpDJwoLo1ikIJI8jC3GFjnRClzA==", - Network accessline 1830
"resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.0.tgz", - Network accessline 1845
"node_modules/tsx/node_modules/@esbuild/openharmony-arm64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz", - Network accessline 1846
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz", "integrity": "sha512-FLGfyizszcef5C3YtoyQDACyg95+dndv79i2EekILBofh5wpCa1KuBqOWKrEHZg3zrL3t5ouE5jgr94vA+Wb2w - Network accessline 1847
"resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.0.tgz", - Network accessline 1862
"node_modules/tsx/node_modules/@esbuild/sunos-x64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz", - Network accessline 1863
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz", "integrity": "sha512-1ZgjUoEdHZZl/YlV76TSCz9Hqj9h9YmMGAgAPYd+q4SicWNX3G5GCyx9uhQWSLcbvPW8Ni7lj4gDa1T40akdlw==", - Network accessline 1864
"resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.0.tgz", - Network accessline 1879
"node_modules/tsx/node_modules/@esbuild/win32-arm64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz", - Network accessline 1880
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz", "integrity": "sha512-Q9StnDmQ/enxnpxCCLSg0oo4+34B9TdXpuyPeTedN/6+iXBJ4J+zwfQI28u/Jl40nOYAxGoNi7mFP40RUtkmUA==", - Network accessline 1881
"resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.0.tgz", - Network accessline 1896
"node_modules/tsx/node_modules/@esbuild/win32-ia32": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz", - Network accessline 1897
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz", "integrity": "sha512-zF3ag/gfiCe6U2iczcRzSYJKH1DCI+ByzSENHlM2FcDbEeo5Zd2C86Aq0tKUYAJJ1obRP84ymxIAksZUcdztHA==", - Network accessline 1898
"resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.0.tgz", - Network accessline 1913
"node_modules/tsx/node_modules/@esbuild/win32-x64": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz", - Network accessline 1914
"version": "0.28.0", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz", "integrity": "sha512-pEl1bO9mfAmIC+tW5btTmrKaujg3zGtUmWNdCw/xs70FBjwAL3o9OEKNHvNmnyylD6ubxUERiEhdsL0xBQ9efw==", - Network accessline 1915
"resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.0.tgz", - Network accessline 1930
"node_modules/tsx/node_modules/esbuild": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", - Network accessline 1931
"version": "0.28.0", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", "integrity": "sha512-sNR9MHpXSUV/XB4zmsFKN+QgVG82Cc7+/aaxJ8Adi8hyOac+EXptIp45QBPaVyX3N70664wRbTcLTOemCAnyqw==", - Network accessline 1932
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", - Network accessline 1972
"node_modules/typescript": { "version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - Network accessline 1973
"version": "5.9.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", - Network accessline 1974
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", - Network accessline 1986
"node_modules/ufo": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", - Network accessline 1987
"version": "1.6.3", "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", - Network accessline 1988
"resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", - Network accessline 1993
"node_modules/undici-types": { "version": "7.18.2", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", - Network accessline 1994
"version": "7.18.2", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz", "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==", - Network accessline 1995
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz",
sdk/mcp/package.json
sdk/mcp/src/index.test.ts
- Executable scriptline 1
Executable file - Network accessline 85
it('every fetch() sends headers built by letsfgHeaders()', () => { - Network accessline 88
for (const call of fetches) { assert.ok(/headers:\s*letsfgHeaders\(/.test(call), `a fetch() builds its own headers instead of calling letsfgHeaders():\n${call.slice(0, 200)}`); - Network accessline 89
assert.ok(/headers:\s*letsfgHeaders\(/.test(call), `a fetch() builds its own headers instead of calling letsfgHeaders():\n${call.slice(0, 200)}`); } - Network accessline 90
`a fetch() builds its own headers instead of calling letsfgHeaders():\n${call.slice(0, 200)}`); - Network accessline 369
const DECLINE = { error: 'payment_declined', message: 'Not booked - your Visa was declined for 412.30 EUR: there was not enough money on the card. Nothing was booked and nothing was charged.\nPay for this booking another way (any ca - Network accessline 370
error: 'payment_declined', message: 'Not booked - your Visa was declined for 412.30 EUR: there was not enough money on the card. Nothing was booked and nothing was charged.\nPay for this booking another way (any card, Apple Pay, Google - Network accessline 371
message: 'Not booked - your Visa was declined for 412.30 EUR: there was not enough money on the card. Nothing was booked and nothing was charged.\nPay for this booking another way (any card, Apple Pay, Google Pay or Revolut Pay): https://le - Network accessline 372
decline_reason: 'insufficient_funds', decline_message: 'there was not enough money on the card', pay_url: 'https://letsfg.co/pay/b_1_3ds', - Network accessline 373
decline_message: 'there was not enough money on the card', pay_url: 'https://letsfg.co/pay/b_1_3ds', retry_booking_id: 'b_1_3ds', - Network accessline 374
pay_url: 'https://letsfg.co/pay/b_1_3ds', - Network accessline 394
[Credential-related source omitted] - Network accessline 395
[Credential-related source omitted] - Network accessline 396
[Credential-related source omitted] - Access to secretsline 396
[Credential-related source omitted]
sdk/mcp/src/index.ts
- Executable scriptline 1
#!/usr/bin/env node - Access to secretsline 8
[Credential-related source omitted] - Network accessline 28
const BASE_URL = (process.env.LETSFG_BASE_URL || 'https://letsfg.co').replace(/\/$/, ''); - Access to secretsline 29
[Credential-related source omitted] - Access to secretsline 30
[Credential-related source omitted] - Network accessline 46
const USER_AGENT = `Mozilla/5.0 (compatible; letsfg-mcp/${VERSION}; +https://github.com/LetsFG/LetsFG)`; - Access to secretsline 105
[Credential-related source omitted] - Access to secretsline 106
[Credential-related source omitted] - Network accessline 121
return `HTTP ${status} from ${path}: an anti-bot challenge page was returned instead of the API. + `This is the network path in front of letsfg.co answering, not the search itself — a valid token cannot get past it. + `It is m - Network accessline 122
+ `This is the network path in front of letsfg.co answering, not the search itself — a valid token cannot get past it. ` + `It is most often seen from datacenter/VPS IPs. Set LETSFG_USER_AGENT to override the client User-Agent, ` - Network accessline 123
+ `It is most often seen from datacenter/VPS IPs. Set LETSFG_USER_AGENT to override the client User-Agent, ` + `or report the host and egress IP at https://github.com/LetsFG/LetsFG/issues.`; } - Network accessline 124
+ `or report the host and egress IP at https://github.com/LetsFG/LetsFG/issues.`; - Network accessline 153
async function searchPFS(params: Record<string, unknown>): Promise<Record<string, unknown>> { const resp = await fetch(`${BASE_URL}/api/search`, { - Network accessline 154
const resp = await fetch(`${BASE_URL}/api/search`, { - Network accessline 172
const poll = async (): Promise<Record<string, unknown> | null> => { const pollResp = await fetch(`${BASE_URL}/api/results/${search_id}`, { - Network accessline 173
const pollResp = await fetch(`${BASE_URL}/api/results/${search_id}`, { - Network accessline 277
let d: Record<string, unknown>; try { const resp = await fetch(`${BASE_URL}/api/booking-payment/${kind}`, { - Network accessline 278
try { const resp = await fetch(`${BASE_URL}/api/booking-payment/${kind}`, { method: 'POST', - Network accessline 279
const resp = await fetch(`${BASE_URL}/api/booking-payment/${kind}`, { - Network accessline 328
async function apiRequest(method: string, path: string, body?: Record<string, unknown>): Promise<unknown> { const resp = await fetch(`${BASE_URL}${path}`, { - Network accessline 329
const resp = await fetch(`${BASE_URL}${path}`, { - Access to secretsline 351
[Credential-related source omitted] - Access to secretsline 356
[Credential-related source omitted] - Network accessline 372
'\n' + '## Authentication\n' + 'Run `letsfg auth`, or call the **authenticate** tool. A person approves once in a browser at https://letsfg.co/connect — one tap, no card. Search works straight away. The card is asked for only at the fir - Network accessline 373
'## Authentication\n' + 'Run `letsfg auth`, or call the **authenticate** tool. A person approves once in a browser at https://letsfg.co/connect — one tap, no card. Search works straight away. The card is asked for only at the first bookin - Network accessline 374
'Run `letsfg auth`, or call the **authenticate** tool. A person approves once in a browser at https://letsfg.co/connect — one tap, no card. Search works straight away. The card is asked for only at the first booking: book_flight returns an - Access to secretsline 427
[Credential-related source omitted] - Network accessline 694
description: 'Explain how to connect LetsFG so this server can search and book. Connecting is one tap at ' + 'https://letsfg.co/connect and needs no card. Search works straight away. The card is asked ' + - Network accessline 695
'Explain how to connect LetsFG so this server can search and book. Connecting is one tap at ' + 'https://letsfg.co/connect and needs no card. Search works straight away. The card is asked ' + 'for only at the first booking: book - Network accessline 696
'https://letsfg.co/connect and needs no card. Search works straight away. The card is asked ' + - Network accessline 700
'approve once in a browser — there is no endpoint that mints a token from card details, so do ' + 'not ask the user for card numbers and do not try to automate this step.\n\n' + 'Two ways in: (a) add LetsFG as a connector (https - Network accessline 701
'not ask the user for card numbers and do not try to automate this step.\n\n' + 'Two ways in: (a) add LetsFG as a connector (https://letsfg.co/mcp) in an assistant that ' + 'supports remote MCP servers and approve it, or (b) any - Network accessline 702
'Two ways in: (a) add LetsFG as a connector (https://letsfg.co/mcp) in an assistant that ' + - Network accessline 703
'supports remote MCP servers and approve it, or (b) any OAuth-capable client can register ' + 'itself — see https://letsfg.co/for-agents, section "Option B". Both land on the same ' + 'one-tap approval at letsfg.co/connect.\n\n' - Network accessline 704
'itself — see https://letsfg.co/for-agents, section "Option B". Both land on the same ' + - Access to secretsline 721
[Credential-related source omitted] - Access to secretsline 733
[Credential-related source omitted] - Access to secretsline 752
[Credential-related source omitted] - Access to secretsline 754
[Credential-related source omitted] - Network accessline 999
payload.confirm = args.confirm === true; } const resp = await fetch(`${BASE_URL}/api/booking-payment/${kind}`, { - Network accessline 1000
} const resp = await fetch(`${BASE_URL}/api/booking-payment/${kind}`, { method: 'POST', - Network accessline 1001
const resp = await fetch(`${BASE_URL}/api/booking-payment/${kind}`, { - Network accessline 1122
const resp = await fetch(`${BASE_URL}/api/agent-access/request`, { - Access to secretsline 1136
[Credential-related source omitted] - Access to secretsline 1166
[Credential-related source omitted] - Access to secretsline 1171
[Credential-related source omitted] - Access to secretsline 1267
[Credential-related source omitted]
sdk/python/README.md
- Network accessline 5
[](https://github.com/LetsFG/LetsFG) - Network accessline 6
[](https://pypi.org/project/letsfg/) - Network accessline 10
| | **CLI / SDK** (PFS Bearer token) | **Developer API** | |---|---|---| | **Search cost** | Free (token from [letsfg.co/connect](https://letsfg.co/connect), one tap, no card) | Prepaid credits | - Network accessline 11
|---|---|---| | **Search cost** | Free (token from [letsfg.co/connect](https://letsfg.co/connect), one tap, no card) | Prepaid credits | | **Booking** | `POST /api/agent-book` — fare held on your card, a LetsFG agent buys the ticket, captur - Network accessline 12
| **Search cost** | Free (token from [letsfg.co/connect](https://letsfg.co/connect), one tap, no card) | Prepaid credits | - Network accessline 13
| **Booking** | `POST /api/agent-book` — fare held on your card, a LetsFG agent buys the ticket, captured only on a real PNR. Every offer. | `POST /flights/book` — the same hold-then-capture flow, no unlock step, no booking or transaction f - Network accessline 15
| **Setup** | `pip install letsfg`, then connect at [letsfg.co/mcp](https://letsfg.co/mcp) | [letsfg.co/developers](https://letsfg.co/developers) | - Network accessline 17
> **Building a product, or need hotels?** Use the [Developer API](https://letsfg.co/developers) — look-to-book search (200 free after every booking, then $0.01), booking through `POST /flights/book`, no booking fee and no transaction fee. - Network accessline 25
Connect once at [letsfg.co/connect](https://letsfg.co/connect) (one tap, no - Access to secretsline 29
[Credential-related source omitted] - Network accessline 40
Connect LetsFG as an MCP server at `https://letsfg.co/mcp` and - Network accessline 41
approve the connection — in Claude (from its connector directory, [claude.ai/directory/letsfg](https://claude.ai/directory/letsfg)), ChatGPT, Cursor, Windsurf, or Claude Code (`claude mcp add --transport http letsfg https://letsfg.co/mcp`). - Network accessline 42
[claude.ai/directory/letsfg](https://claude.ai/directory/letsfg)), ChatGPT, Cursor, Windsurf, or Claude Code - Network accessline 43
(`claude mcp add --transport http letsfg https://letsfg.co/mcp`). - Network accessline 44
The consent step opens [letsfg.co/connect](https://letsfg.co/connect): one tap, - Access to secretsline 80
[Credential-related source omitted] - Access to secretsline 86
[Credential-related source omitted] - Network accessline 115
flights = bt.search("LHR", "JFK", "2026-04-15") except BearerTokenError: print("Token missing or revoked — reconnect at https://letsfg.co/connect through the MCP") - Network accessline 117
print("Token missing or revoked — reconnect at https://letsfg.co/connect through the MCP") - Network accessline 155
from letsfg.connectors.auth import get_bearer_token while True: status = requests.post( - Network accessline 156
while True: status = requests.post( "https://letsfg.co/api/agent-book/status", - Network accessline 157
status = requests.post( - Network accessline 158
"https://letsfg.co/api/agent-book/status", - Network accessline 280
Full semantics: [docs/api-search.md](https://github.com/LetsFG/LetsFG/blob/main/docs/api-search.md#starlink-wi-fi). - Network accessline 310
print(f"Started: {result['booking_ref']} — poll /api/agent-book/status") except BearerTokenError: print("Token missing or revoked — reconnect at https://letsfg.co/connect") - Network accessline 312
print("Token missing or revoked — reconnect at https://letsfg.co/connect") - Access to secretsline 320
[Credential-related source omitted] - Access to secretsline 410
[Credential-related source omitted] - Network accessline 467
| `LETSFG_BEARER_TOKEN` | PFS Bearer token (from the connect flow). Takes priority over `~/.letsfg/config.json`. | | `LETSFG_API_KEY` | Developer API key (look-to-book search + booking) | | `LETSFG_BASE_URL` | API URL override (default: `ht - Access to secretsline 468
[Credential-related source omitted] - Network accessline 469
| `LETSFG_BASE_URL` | API URL override (default: `https://letsfg.co`) | - Network accessline 482
> Retired 2026-09-08: the `unlock` step (and its 1% / min $3 fee) no longer exists, and neither do > the Stripe onboarding routes. Both answer `410 Gone` naming their replacement. See > <https://letsfg.co/developers/api/docs>. - Network accessline 484
> <https://letsfg.co/developers/api/docs>. - Network accessline 490
- **MCP Server**: `npx letsfg-mcp` — [npm](https://www.npmjs.com/package/letsfg-mcp) - Network accessline 491
- **JS/TS SDK**: `npm install letsfg` — [npm](https://www.npmjs.com/package/letsfg) - Network accessline 492
- **Try without installing**: [letsfg.co](https://letsfg.co) — search instantly in your browser - Network accessline 493
- **GitHub**: [LetsFG/LetsFG](https://github.com/LetsFG/LetsFG) - Network accessline 495
> ⭐ **[Star the repo](https://github.com/LetsFG/LetsFG)** — we appreciate the support. - Network accessline 507
> the reservation-fee fields retired on 2026-09-11 (`expected_balance`, no `expected_cost`), and the API refuses > every hotel booking they make. Update with `pip install -U letsfg`, `npm install letsfg@latest` or > `npx -y letsfg-mcp@lates - Network accessline 509
> `npx -y letsfg-mcp@latest`. The hosted MCP at `https://letsfg.co/mcp` needs no update. - Access to secretsline 616
[Credential-related source omitted]
sdk/python/_jetstar_checkout_validate.py
- Executable scriptline 1
Executable file
sdk/python/examples/quickstart.py
- Executable scriptline 1
Executable file
sdk/python/google_checkout_live_sweep.py
- Executable scriptline 1
Executable file
sdk/python/google_checkout_live_sweep_japan_longhaul.json
- Network accessline 6
"seller_price": 1130.0, "seller_currency": "EUR", "resolved_booking_url": "https://checknfly.co.uk/flights/passenger_details?sid=4c8278d3-6258-4c32-a675-53b00d648834%5Eab35cd12-4be1-4fab-b9a3-1d4d16b0c475", - Network accessline 7
"seller_currency": "EUR", "resolved_booking_url": "https://checknfly.co.uk/flights/passenger_details?sid=4c8278d3-6258-4c32-a675-53b00d648834%5Eab35cd12-4be1-4fab-b9a3-1d4d16b0c475", "checkout_page": "passengers", - Network accessline 8
"resolved_booking_url": "https://checknfly.co.uk/flights/passenger_details?sid=4c8278d3-6258-4c32-a675-53b00d648834%5Eab35cd12-4be1-4fab-b9a3-1d4d16b0c475", - Network accessline 48
"seller_price": 638.0, "seller_currency": "EUR", "resolved_booking_url": "https://bookingportal.china-airlines.com/eRetailPortal/Booking.svc/Booking/Search", - Network accessline 49
"seller_currency": "EUR", "resolved_booking_url": "https://bookingportal.china-airlines.com/eRetailPortal/Booking.svc/Booking/Search", "checkout_page": "payment", - Network accessline 50
"resolved_booking_url": "https://bookingportal.china-airlines.com/eRetailPortal/Booking.svc/Booking/Search", - Network accessline 98
"seller_price": 745.0, "seller_currency": "EUR", "resolved_booking_url": "https://www.lastminute.com/msr/route/gfs?Adult=1&PointOfSaleCountry=FR&DisplayedPrice=744.79&DisplayedPriceCurrency=EUR&UserLanguage=fr&UserCurrency=EUR&TripT - Network accessline 99
"seller_currency": "EUR", "resolved_booking_url": "https://www.lastminute.com/msr/route/gfs?Adult=1&PointOfSaleCountry=FR&DisplayedPrice=744.79&DisplayedPriceCurrency=EUR&UserLanguage=fr&UserCurrency=EUR&TripType=RoundTrip&Slice1=1,2&Sl - Network accessline 100
"resolved_booking_url": "https://www.lastminute.com/msr/route/gfs?Adult=1&PointOfSaleCountry=FR&DisplayedPrice=744.79&DisplayedPriceCurrency=EUR&UserLanguage=fr&UserCurrency=EUR&TripType=RoundTrip&Slice1=1,2&Slice2=3,4&Cabin1=Economy&Carrie - Network accessline 132
"seller_price": 1060.0, "seller_currency": "EUR", "resolved_booking_url": "https://oversea.csair.com/tk/eu/en/book/flights?ref=googleflights&p=100&m=1&t=FRA-HND-20260624-20260628&rc=GGSS01&utm_source=googleflights_eu&utm_medium=meta - Network accessline 133
"seller_currency": "EUR", "resolved_booking_url": "https://oversea.csair.com/tk/eu/en/book/flights?ref=googleflights&p=100&m=1&t=FRA-HND-20260624-20260628&rc=GGSS01&utm_source=googleflights_eu&utm_medium=metasearch", "checkout_page" - Network accessline 134
"resolved_booking_url": "https://oversea.csair.com/tk/eu/en/book/flights?ref=googleflights&p=100&m=1&t=FRA-HND-20260624-20260628&rc=GGSS01&utm_source=googleflights_eu&utm_medium=metasearch", - Network accessline 174
"seller_price": 1566.0, "seller_currency": "EUR", "resolved_booking_url": "https://www.flighthub.com/checkout/gdeeplink?Adult=1&PointOfSaleCountry=PL&DisplayedPrice=1822.72&DisplayedPriceCurrency=USD&UserLanguage=en&TripType=RoundTr - Network accessline 175
"seller_currency": "EUR", "resolved_booking_url": "https://www.flighthub.com/checkout/gdeeplink?Adult=1&PointOfSaleCountry=PL&DisplayedPrice=1822.72&DisplayedPriceCurrency=USD&UserLanguage=en&TripType=RoundTrip&Slice1=1,2&Slice2=3,4&Cab - Network accessline 176
"resolved_booking_url": "https://www.flighthub.com/checkout/gdeeplink?Adult=1&PointOfSaleCountry=PL&DisplayedPrice=1822.72&DisplayedPriceCurrency=USD&UserLanguage=en&TripType=RoundTrip&Slice1=1,2&Slice2=3,4&Cabin1=Economy&Carrier1=OZ&Depart
sdk/python/google_checkout_live_sweep_longhaul_london_us.json
- Network accessline 6
"seller_price": 835.0, "seller_currency": "EUR", "resolved_booking_url": "https://www.google.com/travel/flights/booking?tfs=CBwQAho_EgoyMDI2LTA2LTI0Ih8KA0xIUhIKMjAyNi0wNi0yNBoDTEFYKgJWUzIDMTQxagcIARIDTEhScgcIARIDTEFYGj4SCjIwMjYtMDYt - Network accessline 7
"seller_currency": "EUR", "resolved_booking_url": "https://www.google.com/travel/flights/booking?tfs=CBwQAho_EgoyMDI2LTA2LTI0Ih8KA0xIUhIKMjAyNi0wNi0yNBoDTEFYKgJWUzIDMTQxagcIARIDTEhScgcIARIDTEFYGj4SCjIwMjYtMDYtMjgiHgoDTEFYEgoyMDI2LTA2LTI - Network accessline 8
"resolved_booking_url": "https://www.google.com/travel/flights/booking?tfs=CBwQAho_EgoyMDI2LTA2LTI0Ih8KA0xIUhIKMjAyNi0wNi0yNBoDTEFYKgJWUzIDMTQxagcIARIDTEhScgcIARIDTEFYGj4SCjIwMjYtMDYtMjgiHgoDTEFYEgoyMDI2LTA2LTI4GgNMSFIqAlZTMgIyNGoHCAESA0xBW - Network accessline 56
"seller_price": null, "seller_currency": null, "resolved_booking_url": "https://www.google.com/travel/flights/booking?tfs=CBwQAhpfEgoyMDI2LTA2LTI0Ih0KA0xIUhIKMjAyNi0wNi0yNBoDTVNQKgJETDIBOSIgCgNNU1ASCjIwMjYtMDYtMjQaA1NGTyoCREwyBDI4MD - Network accessline 57
"seller_currency": null, "resolved_booking_url": "https://www.google.com/travel/flights/booking?tfs=CBwQAhpfEgoyMDI2LTA2LTI0Ih0KA0xIUhIKMjAyNi0wNi0yNBoDTVNQKgJETDIBOSIgCgNNU1ASCjIwMjYtMDYtMjQaA1NGTyoCREwyBDI4MDlqBwgBEgNMSFJyBwgBEgNTRk8a - Network accessline 58
"resolved_booking_url": "https://www.google.com/travel/flights/booking?tfs=CBwQAhpfEgoyMDI2LTA2LTI0Ih0KA0xIUhIKMjAyNi0wNi0yNBoDTVNQKgJETDIBOSIgCgNNU1ASCjIwMjYtMDYtMjQaA1NGTyoCREwyBDI4MDlqBwgBEgNMSFJyBwgBEgNTRk8aYRIKMjAyNi0wNi0yOCIgCgNTRk8SC - Network accessline 79
"seller_price": null, "seller_currency": null, "resolved_booking_url": "https://www.google.com/travel/flights/booking?tfs=CBwQAhpgEgoyMDI2LTA2LTI0Ih8KA0xIUhIKMjAyNi0wNi0yNBoDS0VGKgJGSTIDNDU1Ih8KA0tFRhIKMjAyNi0wNi0yNRoDU0VBKgJGSTIDNj - Network accessline 80
"seller_currency": null, "resolved_booking_url": "https://www.google.com/travel/flights/booking?tfs=CBwQAhpgEgoyMDI2LTA2LTI0Ih8KA0xIUhIKMjAyNi0wNi0yNBoDS0VGKgJGSTIDNDU1Ih8KA0tFRhIKMjAyNi0wNi0yNRoDU0VBKgJGSTIDNjg1agcIARIDTEhScgcIARIDU0VB - Network accessline 81
"resolved_booking_url": "https://www.google.com/travel/flights/booking?tfs=CBwQAhpgEgoyMDI2LTA2LTI0Ih8KA0xIUhIKMjAyNi0wNi0yNBoDS0VGKgJGSTIDNDU1Ih8KA0tFRhIKMjAyNi0wNi0yNRoDU0VBKgJGSTIDNjg1agcIARIDTEhScgcIARIDU0VBGoIBEgoyMDI2LTA2LTI4IiAKA1NFQ - Network accessline 102
"seller_price": 1136.0, "seller_currency": "EUR", "resolved_booking_url": "https://www.google.com/travel/flights/booking?tfs=CBwQAho-EgoyMDI2LTA2LTI0Ih4KA0xIUhIKMjAyNi0wNi0yNBoDSkZLKgJWUzICMjVqBwgBEgNMSFJyBwgBEgNKRksaPRIKMjAyNi0wNi0 - Network accessline 103
"seller_currency": "EUR", "resolved_booking_url": "https://www.google.com/travel/flights/booking?tfs=CBwQAho-EgoyMDI2LTA2LTI0Ih4KA0xIUhIKMjAyNi0wNi0yNBoDSkZLKgJWUzICMjVqBwgBEgNMSFJyBwgBEgNKRksaPRIKMjAyNi0wNi0yOCIdCgNKRksSCjIwMjYtMDYtMjg - Network accessline 104
"resolved_booking_url": "https://www.google.com/travel/flights/booking?tfs=CBwQAho-EgoyMDI2LTA2LTI0Ih4KA0xIUhIKMjAyNi0wNi0yNBoDSkZLKgJWUzICMjVqBwgBEgNMSFJyBwgBEgNKRksaPRIKMjAyNi0wNi0yOCIdCgNKRksSCjIwMjYtMDYtMjgaA0xIUioCREwyATNqBwgBEgNKRktyB
sdk/python/google_checkout_live_sweep_results.json
- Network accessline 6
"seller_price": 68.0, "seller_currency": "EUR", "resolved_booking_url": "https://tickets.vueling.com/booking/selectFlight", - Network accessline 7
"seller_currency": "EUR", "resolved_booking_url": "https://tickets.vueling.com/booking/selectFlight", "checkout_page": "extras", - Network accessline 8
"resolved_booking_url": "https://tickets.vueling.com/booking/selectFlight", - Network accessline 110
"seller_price": 459.0, "seller_currency": "EUR", "resolved_booking_url": "https://www.vietjetair.com/en/select-flight", - Network accessline 111
"seller_currency": "EUR", "resolved_booking_url": "https://www.vietjetair.com/en/select-flight", "checkout_page": "passengers", - Network accessline 112
"resolved_booking_url": "https://www.vietjetair.com/en/select-flight", - Network accessline 144
"seller_price": 902.0, "seller_currency": "EUR", "resolved_booking_url": "https://www.google.com/travel/flights/booking?tfs=CBwQAho_EgoyMDI2LTA2LTE4Ih8KA0xIUhIKMjAyNi0wNi0xOBoDSkZLKgJCQTIDMTc1agcIARIDTEhScgcIARIDSkZLGj8SCjIwMjYtMDYt - Network accessline 145
"seller_currency": "EUR", "resolved_booking_url": "https://www.google.com/travel/flights/booking?tfs=CBwQAho_EgoyMDI2LTA2LTE4Ih8KA0xIUhIKMjAyNi0wNi0xOBoDSkZLKgJCQTIDMTc1agcIARIDTEhScgcIARIDSkZLGj8SCjIwMjYtMDYtMjIiHwoDSkZLEgoyMDI2LTA2LTI - Network accessline 146
"resolved_booking_url": "https://www.google.com/travel/flights/booking?tfs=CBwQAho_EgoyMDI2LTA2LTE4Ih8KA0xIUhIKMjAyNi0wNi0xOBoDSkZLKgJCQTIDMTc1agcIARIDTEhScgcIARIDSkZLGj8SCjIwMjYtMDYtMjIiHwoDSkZLEgoyMDI2LTA2LTIyGgNMSFIqAkFBMgMxMDBqBwgBEgNKR - Network accessline 203
"seller_price": 167.0, "seller_currency": "EUR", "resolved_booking_url": "https://www.lionair.co.id/", - Network accessline 204
"seller_currency": "EUR", "resolved_booking_url": "https://www.lionair.co.id/", "checkout_page": "passengers", - Network accessline 205
"resolved_booking_url": "https://www.lionair.co.id/", - Network accessline 237
"seller_price": 115.0, "seller_currency": "EUR", "resolved_booking_url": "https://www.despegar.com.mx/shop/flights/results/generate?Adult=1&PointOfSaleCountry=MX&DisplayedPrice=2305&DisplayedPriceCurrency=MXN&UserLanguage=en&TripTyp - Network accessline 238
"seller_currency": "EUR", "resolved_booking_url": "https://www.despegar.com.mx/shop/flights/results/generate?Adult=1&PointOfSaleCountry=MX&DisplayedPrice=2305&DisplayedPriceCurrency=MXN&UserLanguage=en&TripType=RoundTrip&Slice1=1&Slice2 - Network accessline 239
"resolved_booking_url": "https://www.despegar.com.mx/shop/flights/results/generate?Adult=1&PointOfSaleCountry=MX&DisplayedPrice=2305&DisplayedPriceCurrency=MXN&UserLanguage=en&TripType=RoundTrip&Slice1=1&Slice2=2&Cabin1=Economy&Carrier1=AM& - Network accessline 279
"seller_price": 358.0, "seller_currency": "EUR", "resolved_booking_url": "https://www.martigo.pl/service/flight?Adult=1&Child=0&Infant=0&PointOfSaleCountry=IT&DisplayedPrice=357.51&DisplayedPriceCurrency=EUR&UserLanguage=pl&UserCurr - Network accessline 280
"seller_currency": "EUR", "resolved_booking_url": "https://www.martigo.pl/service/flight?Adult=1&Child=0&Infant=0&PointOfSaleCountry=IT&DisplayedPrice=357.51&DisplayedPriceCurrency=EUR&UserLanguage=pl&UserCurrency=PLN&TripType=Return&Va - Network accessline 281
"resolved_booking_url": "https://www.martigo.pl/service/flight?Adult=1&Child=0&Infant=0&PointOfSaleCountry=IT&DisplayedPrice=357.51&DisplayedPriceCurrency=EUR&UserLanguage=pl&UserCurrency=PLN&TripType=Return&ValidatingCarrier=BA&Slice1=1&Sl - Network accessline 321
"seller_price": 416.0, "seller_currency": "EUR", "resolved_booking_url": "https://www.google.com/travel/flights/booking?tfs=CBwQAhpfEgoyMDI2LTA2LTI1Ih8KA0JFWRIKMjAyNi0wNi0yNRoDU0FXKgJWRjIDMjYyIh4KA1NBVxIKMjAyNi0wNi0yNRoDQ0RHKgJWRjIC - Network accessline 322
"seller_currency": "EUR", "resolved_booking_url": "https://www.google.com/travel/flights/booking?tfs=CBwQAhpfEgoyMDI2LTA2LTI1Ih8KA0JFWRIKMjAyNi0wNi0yNRoDU0FXKgJWRjIDMjYyIh4KA1NBVxIKMjAyNi0wNi0yNRoDQ0RHKgJWRjICMTFqBwgBEgNCRVlyBwgBEgNDREc - Network accessline 323
"resolved_booking_url": "https://www.google.com/travel/flights/booking?tfs=CBwQAhpfEgoyMDI2LTA2LTI1Ih8KA0JFWRIKMjAyNi0wNi0yNRoDU0FXKgJWRjIDMjYyIh4KA1NBVxIKMjAyNi0wNi0yNRoDQ0RHKgJWRjICMTFqBwgBEgNCRVlyBwgBEgNDREcaXxIKMjAyNi0wNi0yOSIeCgNDREcSC - Network accessline 344
"seller_price": 242.0, "seller_currency": "EUR", "resolved_booking_url": "https://www.martigo.pl/service/flight?Adult=1&Child=0&Infant=0&PointOfSaleCountry=ES&DisplayedPrice=241.99&DisplayedPriceCurrency=EUR&UserLanguage=pl&UserCurr - Network accessline 345
"seller_currency": "EUR", "resolved_booking_url": "https://www.martigo.pl/service/flight?Adult=1&Child=0&Infant=0&PointOfSaleCountry=ES&DisplayedPrice=241.99&DisplayedPriceCurrency=EUR&UserLanguage=pl&UserCurrency=PLN&TripType=Return&Va - Network accessline 346
"resolved_booking_url": "https://www.martigo.pl/service/flight?Adult=1&Child=0&Infant=0&PointOfSaleCountry=ES&DisplayedPrice=241.99&DisplayedPriceCurrency=EUR&UserLanguage=pl&UserCurrency=PLN&TripType=Return&ValidatingCarrier=IB&Slice1=1&Sl
sdk/python/google_checkout_live_sweep_results_v2.json
- Network accessline 6
"seller_price": 68.0, "seller_currency": "EUR", "resolved_booking_url": "https://tickets.vueling.com/booking/selectFlight", - Network accessline 7
"seller_currency": "EUR", "resolved_booking_url": "https://tickets.vueling.com/booking/selectFlight", "checkout_page": "extras", - Network accessline 8
"resolved_booking_url": "https://tickets.vueling.com/booking/selectFlight", - Network accessline 110
"seller_price": 459.0, "seller_currency": "EUR", "resolved_booking_url": "https://www.vietjetair.com/en/select-flight", - Network accessline 111
"seller_currency": "EUR", "resolved_booking_url": "https://www.vietjetair.com/en/select-flight", "checkout_page": "passengers", - Network accessline 112
"resolved_booking_url": "https://www.vietjetair.com/en/select-flight", - Network accessline 144
"seller_price": 902.0, "seller_currency": "EUR", "resolved_booking_url": "https://www.google.com/travel/flights/booking?tfs=CBwQAho_EgoyMDI2LTA2LTE4Ih8KA0xIUhIKMjAyNi0wNi0xOBoDSkZLKgJCQTIDMTc1agcIARIDTEhScgcIARIDSkZLGj8SCjIwMjYtMDYt - Network accessline 145
"seller_currency": "EUR", "resolved_booking_url": "https://www.google.com/travel/flights/booking?tfs=CBwQAho_EgoyMDI2LTA2LTE4Ih8KA0xIUhIKMjAyNi0wNi0xOBoDSkZLKgJCQTIDMTc1agcIARIDTEhScgcIARIDSkZLGj8SCjIwMjYtMDYtMjIiHwoDSkZLEgoyMDI2LTA2LTI - Network accessline 146
"resolved_booking_url": "https://www.google.com/travel/flights/booking?tfs=CBwQAho_EgoyMDI2LTA2LTE4Ih8KA0xIUhIKMjAyNi0wNi0xOBoDSkZLKgJCQTIDMTc1agcIARIDTEhScgcIARIDSkZLGj8SCjIwMjYtMDYtMjIiHwoDSkZLEgoyMDI2LTA2LTIyGgNMSFIqAkFBMgMxMDBqBwgBEgNKR - Network accessline 203
"seller_price": 167.0, "seller_currency": "EUR", "resolved_booking_url": "https://www.lionair.co.id/", - Network accessline 204
"seller_currency": "EUR", "resolved_booking_url": "https://www.lionair.co.id/", "checkout_page": "passengers", - Network accessline 205
"resolved_booking_url": "https://www.lionair.co.id/", - Network accessline 237
"seller_price": 115.0, "seller_currency": "EUR", "resolved_booking_url": "https://www.despegar.com.mx/shop/flights/results/generate?Adult=1&PointOfSaleCountry=MX&DisplayedPrice=2305&DisplayedPriceCurrency=MXN&UserLanguage=en&TripTyp - Network accessline 238
"seller_currency": "EUR", "resolved_booking_url": "https://www.despegar.com.mx/shop/flights/results/generate?Adult=1&PointOfSaleCountry=MX&DisplayedPrice=2305&DisplayedPriceCurrency=MXN&UserLanguage=en&TripType=RoundTrip&Slice1=1&Slice2 - Network accessline 239
"resolved_booking_url": "https://www.despegar.com.mx/shop/flights/results/generate?Adult=1&PointOfSaleCountry=MX&DisplayedPrice=2305&DisplayedPriceCurrency=MXN&UserLanguage=en&TripType=RoundTrip&Slice1=1&Slice2=2&Cabin1=Economy&Carrier1=AM& - Network accessline 279
"seller_price": 358.0, "seller_currency": "EUR", "resolved_booking_url": "https://www.martigo.pl/service/flight?Adult=1&Child=0&Infant=0&PointOfSaleCountry=IT&DisplayedPrice=357.51&DisplayedPriceCurrency=EUR&UserLanguage=pl&UserCurr - Network accessline 280
"seller_currency": "EUR", "resolved_booking_url": "https://www.martigo.pl/service/flight?Adult=1&Child=0&Infant=0&PointOfSaleCountry=IT&DisplayedPrice=357.51&DisplayedPriceCurrency=EUR&UserLanguage=pl&UserCurrency=PLN&TripType=Return&Va - Network accessline 281
"resolved_booking_url": "https://www.martigo.pl/service/flight?Adult=1&Child=0&Infant=0&PointOfSaleCountry=IT&DisplayedPrice=357.51&DisplayedPriceCurrency=EUR&UserLanguage=pl&UserCurrency=PLN&TripType=Return&ValidatingCarrier=BA&Slice1=1&Sl - Network accessline 321
"seller_price": 1027.0, "seller_currency": "EUR", "resolved_booking_url": "https://www.mea.com.lb/english/plan-and-book/book-a-trip?AFT=v6EPPNv7FsdCuvALZaD8P4w&A=1&C=0&I=0&CC=E&F=BEY&T=CDG&D=2026-06-25&R=2026-06-29&RT=1&TS=2026-05-1 - Network accessline 322
"seller_currency": "EUR", "resolved_booking_url": "https://www.mea.com.lb/english/plan-and-book/book-a-trip?AFT=v6EPPNv7FsdCuvALZaD8P4w&A=1&C=0&I=0&CC=E&F=BEY&T=CDG&D=2026-06-25&R=2026-06-29&RT=1&TS=2026-05-18+18:01:12&CUR=USD&utm_sourc - Network accessline 323
"resolved_booking_url": "https://www.mea.com.lb/english/plan-and-book/book-a-trip?AFT=v6EPPNv7FsdCuvALZaD8P4w&A=1&C=0&I=0&CC=E&F=BEY&T=CDG&D=2026-06-25&R=2026-06-29&RT=1&TS=2026-05-18+18:01:12&CUR=USD&utm_source=google&utm_medium=microsite& - Network accessline 363
"seller_price": 242.0, "seller_currency": "EUR", "resolved_booking_url": "https://www.martigo.pl/service/flight?Adult=1&Child=0&Infant=0&PointOfSaleCountry=ES&DisplayedPrice=241.99&DisplayedPriceCurrency=EUR&UserLanguage=pl&UserCurr - Network accessline 364
"seller_currency": "EUR", "resolved_booking_url": "https://www.martigo.pl/service/flight?Adult=1&Child=0&Infant=0&PointOfSaleCountry=ES&DisplayedPrice=241.99&DisplayedPriceCurrency=EUR&UserLanguage=pl&UserCurrency=PLN&TripType=Return&Va - Network accessline 365
"resolved_booking_url": "https://www.martigo.pl/service/flight?Adult=1&Child=0&Infant=0&PointOfSaleCountry=ES&DisplayedPrice=241.99&DisplayedPriceCurrency=EUR&UserLanguage=pl&UserCurrency=PLN&TripType=Return&ValidatingCarrier=IB&Slice1=1&Sl - Network accessline 416
"seller_price": 799.0, "seller_currency": "EUR", "resolved_booking_url": "https://www.martigo.pl/service/flight?Adult=1&Child=0&Infant=0&PointOfSaleCountry=QA&DisplayedPrice=3400&DisplayedPriceCurrency=QAR&UserLanguage=pl&UserCurren - Network accessline 417
"seller_currency": "EUR", "resolved_booking_url": "https://www.martigo.pl/service/flight?Adult=1&Child=0&Infant=0&PointOfSaleCountry=QA&DisplayedPrice=3400&DisplayedPriceCurrency=QAR&UserLanguage=pl&UserCurrency=PLN&TripType=Return&Vali - Network accessline 418
"resolved_booking_url": "https://www.martigo.pl/service/flight?Adult=1&Child=0&Infant=0&PointOfSaleCountry=QA&DisplayedPrice=3400&DisplayedPriceCurrency=QAR&UserLanguage=pl&UserCurrency=PLN&TripType=Return&ValidatingCarrier=EY&Slice1=1,2&Sl - Network accessline 450
"seller_price": 564.0, "seller_currency": "EUR", "resolved_booking_url": "https://www.martigo.pl/service/flight?Adult=1&Child=0&Infant=0&PointOfSaleCountry=AE&DisplayedPrice=2410&DisplayedPriceCurrency=AED&UserLanguage=pl&UserCurren - Network accessline 451
"seller_currency": "EUR", "resolved_booking_url": "https://www.martigo.pl/service/flight?Adult=1&Child=0&Infant=0&PointOfSaleCountry=AE&DisplayedPrice=2410&DisplayedPriceCurrency=AED&UserLanguage=pl&UserCurrency=PLN&TripType=Return&Vali - Network accessline 452
"resolved_booking_url": "https://www.martigo.pl/service/flight?Adult=1&Child=0&Infant=0&PointOfSaleCountry=AE&DisplayedPrice=2410&DisplayedPriceCurrency=AED&UserLanguage=pl&UserCurrency=PLN&TripType=Return&ValidatingCarrier=RJ&Slice1=1,2&Sl - Network accessline 492
"seller_price": 219.0, "seller_currency": "EUR", "resolved_booking_url": "https://booking.flyscoot.com/book/flight/return/SIN/2026-06-24/BKK/BKK/2026-06-28/SIN?adult=1&child=0&infant=0&orgToken=VEUtiuQY/mW09sQ6I0betQ%3D%3D&utm_sourc - Network accessline 493
"seller_currency": "EUR", "resolved_booking_url": "https://booking.flyscoot.com/book/flight/return/SIN/2026-06-24/BKK/BKK/2026-06-28/SIN?adult=1&child=0&infant=0&orgToken=VEUtiuQY/mW09sQ6I0betQ%3D%3D&utm_source=GoogleFlights&utm_medium= - Network accessline 494
"resolved_booking_url": "https://booking.flyscoot.com/book/flight/return/SIN/2026-06-24/BKK/BKK/2026-06-28/SIN?adult=1&child=0&infant=0&orgToken=VEUtiuQY/mW09sQ6I0betQ%3D%3D&utm_source=GoogleFlights&utm_medium=Referral&utm_campaign=GoogleFl - Network accessline 526
"seller_price": 496.0, "seller_currency": "EUR", "resolved_booking_url": "https://www.delta.com/flight-search/search?cabin=BASIC-ECONOMY&paxCount=1&price=576.79&tripType=roundTrip&exitCountry=US¤cyCd=USD&fareBasis=TAWQA0BQ:UAV - Network accessline 527
"seller_currency": "EUR", "resolved_booking_url": "https://www.delta.com/flight-search/search?cabin=BASIC-ECONOMY&paxCount=1&price=576.79&tripType=roundTrip&exitCountry=US¤cyCd=USD&fareBasis=TAWQA0BQ:UAVGA0BQ&vendorRedirectFlag=tr - Network accessline 528
"resolved_booking_url": "https://www.delta.com/flight-search/search?cabin=BASIC-ECONOMY&paxCount=1&price=576.79&tripType=roundTrip&exitCountry=US¤cyCd=USD&fareBasis=TAWQA0BQ:UAVGA0BQ&vendorRedirectFlag=true&vendorID=Google&itinSegment
sdk/python/letsfg/__init__.py
sdk/python/letsfg/__main__.py
- Executable scriptline 1
Executable file
sdk/python/letsfg/cli.py
- Executable scriptline 1
Executable file - Access to secretsline 59
[Credential-related source omitted] - Access to secretsline 60
[Credential-related source omitted] - Access to secretsline 61
[Credential-related source omitted] - Access to secretsline 62
[Credential-related source omitted] - Access to secretsline 70
[Credential-related source omitted] - Access to secretsline 74
[Credential-related source omitted] - Access to secretsline 75
[Credential-related source omitted] - Access to secretsline 77
[Credential-related source omitted] - Access to secretsline 79
[Credential-related source omitted] - Access to secretsline 81
[Credential-related source omitted] - Network accessline 529
[Credential-related source omitted] - Network accessline 530
[Credential-related source omitted] - Network accessline 531
[Credential-related source omitted] - Network accessline 549
[Credential-related source omitted] - Network accessline 551
[Credential-related source omitted] - Access to secretsline 593
[Credential-related source omitted] - Access to secretsline 625
[Credential-related source omitted] - Access to secretsline 635
[Credential-related source omitted] - Access to secretsline 674
[Credential-related source omitted] - Access to secretsline 844
[Credential-related source omitted] - Access to secretsline 850
[Credential-related source omitted] - Access to secretsline 855
[Credential-related source omitted] - Access to secretsline 858
[Credential-related source omitted] - Access to secretsline 910
[Credential-related source omitted] - Access to secretsline 915
[Credential-related source omitted] - Access to secretsline 930
[Credential-related source omitted] - Access to secretsline 931
[Credential-related source omitted] - Access to secretsline 934
[Credential-related source omitted] - Access to secretsline 935
[Credential-related source omitted] - Network accessline 963
[Credential-related source omitted] - Access to secretsline 963
[Credential-related source omitted] - Network accessline 974
req = urllib.request.Request( - Network accessline 984
try: with urllib.request.urlopen(req, timeout=30) as resp: - Network accessline 985
with urllib.request.urlopen(req, timeout=30) as resp: - Access to secretsline 1007
[Credential-related source omitted] - Access to secretsline 1011
[Credential-related source omitted] - Access to secretsline 1029
[Credential-related source omitted] - Access to secretsline 1044
[Credential-related source omitted] - Access to secretsline 1073
[Credential-related source omitted] - Access to secretsline 1081
[Credential-related source omitted]
sdk/python/letsfg/client.py
- Executable scriptline 1
Executable file - Access to secretsline 12
[Credential-related source omitted] - Network accessline 59
DEFAULT_BASE_URL = "https://letsfg.co/developers" - Access to secretsline 69
[Credential-related source omitted] - Access to secretsline 71
[Credential-related source omitted] - Access to secretsline 82
[Credential-related source omitted] - Access to secretsline 109
[Credential-related source omitted] - Access to secretsline 172
[Credential-related source omitted] - Access to secretsline 330
[Credential-related source omitted] - Access to secretsline 341
[Credential-related source omitted] - Access to secretsline 346
[Credential-related source omitted] - Access to secretsline 350
[Credential-related source omitted] - Access to secretsline 352
[Credential-related source omitted] - Access to secretsline 355
[Credential-related source omitted] - Access to secretsline 358
[Credential-related source omitted] - Access to secretsline 360
[Credential-related source omitted] - Access to secretsline 361
[Credential-related source omitted] - Access to secretsline 495
[Credential-related source omitted] - Network accessline 614
"unlock step: call book() directly. The fare is held on the connected payment method " "and captured only against a real airline PNR. " "See https://letsfg.co/developers/api/docs", - Network accessline 615
"and captured only against a real airline PNR. " "See https://letsfg.co/developers/api/docs", 410, - Network accessline 616
"See https://letsfg.co/developers/api/docs", - Access to secretsline 642
[Credential-related source omitted] - Network accessline 1129
"410 Gone. Call connect_payment() instead and open the connect_url it returns; " "nothing is charged to connect. " "See https://letsfg.co/developers/api/docs", - Network accessline 1130
"nothing is charged to connect. " "See https://letsfg.co/developers/api/docs", 410, - Network accessline 1131
"See https://letsfg.co/developers/api/docs", - Network accessline 1161
"book() instead: the fare is held on the connected payment method and captured " "only against a real airline PNR. " "See https://letsfg.co/developers/api/docs", - Network accessline 1162
"only against a real airline PNR. " "See https://letsfg.co/developers/api/docs", 410, - Network accessline 1163
"See https://letsfg.co/developers/api/docs", - Access to secretsline 1202
[Credential-related source omitted] - Access to secretsline 1238
[Credential-related source omitted] - Access to secretsline 1288
[Credential-related source omitted] - Access to secretsline 1289
[Credential-related source omitted]
sdk/python/letsfg/config.py
sdk/python/letsfg/connectors/__init__.py
- Executable scriptline 1
Executable file
sdk/python/letsfg/connectors/airport_tz.py
- Executable scriptline 1
Executable file
sdk/python/letsfg/connectors/auth.py
- Executable scriptline 1
Executable file - Network accessline 9
This is a normal OAuth 2.1 + PKCE authorization-code flow. LetsFG advertises authorization_endpoint = https://letsfg.co/connect and leaves /oauth/register - Network accessline 10
authorization_endpoint = https://letsfg.co/connect and leaves /oauth/register - Network accessline 15
1. GET /developers/api/.well-known/oauth-authorization-server (discovery) 2. POST /developers/api/oauth/register with a loopback redirect_uri 3. Open https://letsfg.co/connect?... a PERSON approves (one tap) - Network accessline 16
2. POST /developers/api/oauth/register with a loopback redirect_uri 3. Open https://letsfg.co/connect?... a PERSON approves (one tap) 4. POST /developers/api/oauth/token code -> access + refresh token - Network accessline 17
3. Open https://letsfg.co/connect?... a PERSON approves (one tap) - Network accessline 51
[Credential-related source omitted] - Access to secretsline 51
[Credential-related source omitted] - Access to secretsline 81
[Credential-related source omitted] - Access to secretsline 133
[Credential-related source omitted] - Access to secretsline 151
[Credential-related source omitted] - Access to secretsline 157
[Credential-related source omitted] - Access to secretsline 166
[Credential-related source omitted] - Access to secretsline 324
[Credential-related source omitted] - Access to secretsline 341
[Credential-related source omitted] - Access to secretsline 349
[Credential-related source omitted] - Access to secretsline 356
[Credential-related source omitted] - Network accessline 372
server = _CallbackServer(state) redirect_uri = f"http://127.0.0.1:{server.port}/callback" - Network accessline 373
redirect_uri = f"http://127.0.0.1:{server.port}/callback" - Access to secretsline 425
[Credential-related source omitted] - Access to secretsline 436
[Credential-related source omitted] - Access to secretsline 456
[Credential-related source omitted]
sdk/python/letsfg/local.py
- Executable scriptline 1
Executable file - Network accessline 26
[Credential-related source omitted] - Access to secretsline 26
[Credential-related source omitted] - Access to secretsline 55
[Credential-related source omitted] - Network accessline 235
or, when the booking genuinely could not be completed: { "ok": False, "booked": False, "error": "booking_unavailable", "booking_url": "https://...", "charged": 0 } - Network accessline 237
"booking_url": "https://...", "charged": 0 }
sdk/python/letsfg/models.py
- Executable scriptline 1
Executable file
sdk/python/letsfg/models/__init__.py
- Executable scriptline 1
Executable file
sdk/python/letsfg/models/flights.py
- Executable scriptline 1
Executable file - Network accessline 413
Booking URL, airline names, and provider source are withheld. To reveal booking details, direct the user to: https://letsfg.co/book/{id} - Network accessline 414
To reveal booking details, direct the user to: https://letsfg.co/book/{id} """ - Network accessline 415
https://letsfg.co/book/{id} - Network accessline 436
[Credential-related source omitted] - Network accessline 437
[Credential-related source omitted] - Network accessline 438
[Credential-related source omitted] - Network accessline 520
fetched_at=offer.fetched_at, price_normalized=offer.price_normalized, unlock_url=f"https://letsfg.co/book/{offer.id}", - Network accessline 521
[Credential-related source omitted] - Network accessline 522
unlock_url=f"https://letsfg.co/book/{offer.id}",
sdk/python/letsfg/system_info.py
- Executable scriptline 1
Executable file
sdk/python/pyproject.toml
- Network accessline 52
[project.urls] Homepage = "https://letsfg.co" - Network accessline 53
Homepage = "https://letsfg.co" - Network accessline 54
Documentation = "https://letsfg.co/developers/api/docs" - Network accessline 55
Repository = "https://github.com/LetsFG/LetsFG" - Network accessline 56
Issues = "https://github.com/LetsFG/LetsFG/issues" - Network accessline 57
"API Reference" = "https://letsfg.co/developers/api/openapi.json"
sdk/python/tests/__init__.py
- Executable scriptline 1
Executable file
sdk/python/tests/test_ancillary_connector_parsing.py
- Executable scriptline 1
Executable file
sdk/python/tests/test_auth_user_agent.py
sdk/python/tests/test_booking_holdings_booking_urls.py
- Executable scriptline 1
Executable file - Network accessline 73
source="momondo_meta", id_prefix="mm", booking_base_url="https://www.momondo.com/flight-search", - Network accessline 74
id_prefix="mm", booking_base_url="https://www.momondo.com/flight-search", ) - Network accessline 75
booking_base_url="https://www.momondo.com/flight-search", - Network accessline 78
[Credential-related source omitted] - Network accessline 79
[Credential-related source omitted] - Network accessline 81
def test_parse_booking_holdings_keeps_absolute_clickout_url(self) -> None: offers = _parse_booking_holdings_poll( [_build_poll_response({"url": "https://www.kayak.com/book/offer-123"})], - Network accessline 82
offers = _parse_booking_holdings_poll( [_build_poll_response({"url": "https://www.kayak.com/book/offer-123"})], _build_request(), - Network accessline 83
[_build_poll_response({"url": "https://www.kayak.com/book/offer-123"})], - Network accessline 85
source="kayak_meta", id_prefix="ky", booking_base_url="https://www.kayak.com/flights", - Network accessline 86
id_prefix="ky", booking_base_url="https://www.kayak.com/flights", ) - Network accessline 87
booking_base_url="https://www.kayak.com/flights", - Network accessline 90
self.assertEqual(len(offers), 1) self.assertEqual(offers[0].booking_url, "https://www.kayak.com/book/offer-123") - Network accessline 91
self.assertEqual(offers[0].booking_url, "https://www.kayak.com/book/offer-123") - Network accessline 98
source="cheapflights_meta", id_prefix="cf", booking_base_url="https://www.cheapflights.com/flight-search", - Network accessline 99
id_prefix="cf", booking_base_url="https://www.cheapflights.com/flight-search", ) - Network accessline 100
booking_base_url="https://www.cheapflights.com/flight-search", - Network accessline 104
self.assertEqual( offers[0].booking_url, f"https://www.cheapflights.com/flight-search/LON-{req.destination}/{req.date_from.isoformat()}", - Network accessline 105
offers[0].booking_url, f"https://www.cheapflights.com/flight-search/LON-{req.destination}/{req.date_from.isoformat()}", ) - Network accessline 106
f"https://www.cheapflights.com/flight-search/LON-{req.destination}/{req.date_from.isoformat()}", - Network accessline 122
source="momondo_meta", id_prefix="mm", booking_base_url="https://www.momondo.com/flight-search", - Network accessline 123
id_prefix="mm", booking_base_url="https://www.momondo.com/flight-search", ) - Network accessline 124
booking_base_url="https://www.momondo.com/flight-search", - Network accessline 130
[Credential-related source omitted] - Network accessline 131
[Credential-related source omitted] - Network accessline 132
[Credential-related source omitted] - Network accessline 133
[Credential-related source omitted] - Network accessline 198
source="momondo_meta", id_prefix="mm", booking_base_url="https://www.momondo.com/flight-search", - Network accessline 199
id_prefix="mm", booking_base_url="https://www.momondo.com/flight-search", ) - Network accessline 200
booking_base_url="https://www.momondo.com/flight-search", - Network accessline 239
source="momondo_meta", id_prefix="mm", booking_base_url="https://www.momondo.com/flight-search", - Network accessline 240
id_prefix="mm", booking_base_url="https://www.momondo.com/flight-search", ) - Network accessline 241
booking_base_url="https://www.momondo.com/flight-search", - Network accessline 255
source="momondo_meta", id_prefix="mm", booking_base_url="https://www.momondo.com/flight-search", - Network accessline 256
id_prefix="mm", booking_base_url="https://www.momondo.com/flight-search", ) - Network accessline 257
booking_base_url="https://www.momondo.com/flight-search", - Network accessline 263
[Credential-related source omitted] - Network accessline 264
[Credential-related source omitted] - Network accessline 265
[Credential-related source omitted] - Network accessline 266
[Credential-related source omitted]
sdk/python/tests/test_checkout_engine_configs.py
- Executable scriptline 1
Executable file - Network accessline 230
<body> <div>Manage your booking</div> <a href="https://letsfg.test/service-options">Travel extras</a> - Network accessline 231
<div>Manage your booking</div> <a href="https://letsfg.test/service-options">Travel extras</a> </body> - Network accessline 232
<a href="https://letsfg.test/service-options">Travel extras</a> - Network accessline 264
<body> <div>Review your flight</div> <a href="https://www.momondo.com/packages">Packages</a> - Network accessline 265
<div>Review your flight</div> <a href="https://www.momondo.com/packages">Packages</a> <a href="https://www.momondo.com/book/extras">Travel extras</a> - Network accessline 266
<a href="https://www.momondo.com/packages">Packages</a> - Network accessline 267
<a href="https://www.momondo.com/book/extras">Travel extras</a> - Network accessline 274
<head><title>Momondo packages</title></head> <body> <a href="https://www.momondo.com/packages/search">Search for packages</a> - Network accessline 275
<body> <a href="https://www.momondo.com/packages/search">Search for packages</a> <a href="https://play.google.com/store/apps/details?id=com.momondo.flightsearch">Get it on Google Play</a> - Network accessline 276
<a href="https://www.momondo.com/packages/search">Search for packages</a> - Network accessline 277
<a href="https://play.google.com/store/apps/details?id=com.momondo.flightsearch">Get it on Google Play</a> - Network accessline 311
<script> setTimeout(() => { window.location.href = 'https://partner.example.com/checkout'; - Network accessline 312
setTimeout(() => { window.location.href = 'https://partner.example.com/checkout'; }, 300); - Network accessline 313
window.location.href = 'https://partner.example.com/checkout'; - Network accessline 457
{"checkout_page": "extras"}, { "current_url": "https://www.traveloka.com/en-id/flight/fullsearch?ap=CGK.DPS", - Network accessline 458
{ "current_url": "https://www.traveloka.com/en-id/flight/fullsearch?ap=CGK.DPS", "page_title": "One Way: CGK -> DPS, 15 Jun 2026", - Network accessline 459
"current_url": "https://www.traveloka.com/en-id/flight/fullsearch?ap=CGK.DPS", - Network accessline 471
{}, { "current_url": "https://carrier.example.com/checkout/review-and-pay", - Network accessline 472
{ "current_url": "https://carrier.example.com/checkout/review-and-pay", "page_title": "Review and Pay | Example Air", - Network accessline 473
"current_url": "https://carrier.example.com/checkout/review-and-pay", - Network accessline 490
page = await browser.new_page() await page.route( "https://letsfg.test/**", - Network accessline 491
await page.route( "https://letsfg.test/**", lambda route: route.fulfill(status=200, content_type="text/html", body=html), - Network accessline 492
"https://letsfg.test/**", - Network accessline 493
lambda route: route.fulfill(status=200, content_type="text/html", body=html), ) await page.goto("https://letsfg.test/checkout") - Network accessline 494
) await page.goto("https://letsfg.test/checkout") if session_storage: - Network accessline 495
await page.goto("https://letsfg.test/checkout") - Network accessline 579
page = await browser.new_page() await page.route( "https://tickets.vueling.com/booking/selectFlight", - Network accessline 580
await page.route( "https://tickets.vueling.com/booking/selectFlight", lambda route: route.fulfill(status=200, content_type="text/html", body=VUELING_SELECT_FLIGHT_HTML), - Network accessline 581
"https://tickets.vueling.com/booking/selectFlight", - Network accessline 582
lambda route: route.fulfill(status=200, content_type="text/html", body=VUELING_SELECT_FLIGHT_HTML), ) await page.goto("https://tickets.vueling.com/booking/selectFlight") - Network accessline 584
await page.goto("https://tickets.vueling.com/booking/selectFlight") - Network accessline 620
page = await browser.new_page() await page.route( "https://letsfg.test/unknown-options", - Network accessline 621
await page.route( "https://letsfg.test/unknown-options", lambda route: route.fulfill(status=200, content_type="text/html", body=GENERIC_DISCOVERY_HTML), - Network accessline 622
"https://letsfg.test/unknown-options", - Network accessline 623
lambda route: route.fulfill(status=200, content_type="text/html", body=GENERIC_DISCOVERY_HTML), ) await page.goto("https://letsfg.test/unknown-options") - Network accessline 625
await page.goto("https://letsfg.test/unknown-options") - Network accessline 649
await page.route( "https://letsfg.test/**", - Network accessline 650
"https://letsfg.test/**", - Network accessline 659
), ) await page.goto("https://letsfg.test/start") - Network accessline 661
await page.goto("https://letsfg.test/start") - Network accessline 671
self.assertEqual(details["resolved_booking_url"], "https://letsfg.test/service-options") - Network accessline 686
await page.route( "https://www.momondo.com/**", - Network accessline 687
"https://www.momondo.com/**", - Network accessline 698
), ) await page.goto("https://www.momondo.com/book/flight?demo=1") - Network accessline 700
await page.goto("https://www.momondo.com/book/flight?demo=1") - Network accessline 710
self.assertEqual(details["resolved_booking_url"], "https://www.momondo.com/book/extras") - Network accessline 726
page = await browser.new_page() await page.route( "https://www.momondo.com/**", - Network accessline 727
await page.route( "https://www.momondo.com/**", lambda route: route.fulfill(status=200, content_type="text/html", body=BOOKING_HOLDINGS_INTERSTITIAL_HTML), - Network accessline 728
"https://www.momondo.com/**", - Network accessline 730
) await page.route( "https://partner.example.com/**", - Network accessline 731
await page.route( "https://partner.example.com/**", lambda route: route.fulfill(status=200, content_type="text/html", body=BOOKING_HOLDINGS_PARTNER_HTML), - Network accessline 732
"https://partner.example.com/**", - Network accessline 733
lambda route: route.fulfill(status=200, content_type="text/html", body=BOOKING_HOLDINGS_PARTNER_HTML), ) await page.goto("https://www.momondo.com/book/flight?demo=1") - Network accessline 735
await page.goto("https://www.momondo.com/book/flight?demo=1") - Network accessline 742
self.assertEqual(final_url, "https://partner.example.com/checkout") - Network accessline 751
page = await browser.new_page() await page.route( "https://www.momondo.com/**", - Network accessline 752
await page.route( "https://www.momondo.com/**", lambda route: route.fulfill(status=200, content_type="text/html", body=BOOKING_HOLDINGS_FORBIDDEN_HTML), - Network accessline 753
"https://www.momondo.com/**", - Network accessline 754
lambda route: route.fulfill(status=200, content_type="text/html", body=BOOKING_HOLDINGS_FORBIDDEN_HTML), ) await page.goto("https://www.momondo.com/book/flight?demo=403") - Network accessline 756
await page.goto("https://www.momondo.com/book/flight?demo=403")
sdk/python/tests/test_cli_declined_card.py
- Executable scriptline 1
Executable file - Network accessline 8
PAY = "https://checkout.revolut.com/payment-link/XYZ" - Network accessline 24
def test_no_card_at_all_keeps_its_own_words(capsys): cli._print_book_result({"error": "payment_method_required", "add_card_url": "https://letsfg.co/connect?card=s"}) - Network accessline 25
cli._print_book_result({"error": "payment_method_required", "add_card_url": "https://letsfg.co/connect?card=s"}) - Network accessline 27
assert "no usable payment method" in out and "https://letsfg.co/connect?card=s" in out
sdk/python/tests/test_cli_offer_shape.py
- Executable scriptline 1
Executable file - Access to secretsline 146
[Credential-related source omitted] - Access to secretsline 147
[Credential-related source omitted] - Network accessline 160
def test_payment_method_required_shows_the_add_card_link(self): r = self._book({"error": "payment_method_required", "message": "No card.", "add_card_url": "https://letsfg.co/connect?card=abc"}) - Network accessline 161
r = self._book({"error": "payment_method_required", "message": "No card.", "add_card_url": "https://letsfg.co/connect?card=abc"}) - Network accessline 162
self.assertEqual(r.exit_code, 0, r.output) self.assertIn("https://letsfg.co/connect?card=abc", r.output) self.assertIn("Nothing was charged", r.output) - Network accessline 163
self.assertIn("https://letsfg.co/connect?card=abc", r.output) - Access to secretsline 221
[Credential-related source omitted]
sdk/python/tests/test_connect_auth.py
- Executable scriptline 1
Executable file - Network accessline 51
class CallbackServerTest(unittest.TestCase): def _hit(self, port, query): urllib.request.urlopen(f"http://127.0.0.1:{port}/callback?{query}", timeout=5).read() - Network accessline 53
urllib.request.urlopen(f"http://127.0.0.1:{port}/callback?{query}", timeout=5).read() - Access to secretsline 102
[Credential-related source omitted] - Network accessline 107
with patch.object(A, "_load_config", lambda: stored), patch.object(A, "_save_config", lambda cfg: saved.update(cfg)), patch.object(A, "_post_form", fake_post_form), patch.object(A, "_discover", lamb - Network accessline 108
patch.object(A, "_save_config", lambda cfg: saved.update(cfg)), \ patch.object(A, "_post_form", fake_post_form), \ patch.object(A, "_discover", lambda: {"token_endpoint": "https://x/token"}): - Network accessline 109
patch.object(A, "_post_form", fake_post_form), \ patch.object(A, "_discover", lambda: {"token_endpoint": "https://x/token"}): self.assertEqual(A.refresh_access_token(), "new_at") - Network accessline 110
patch.object(A, "_discover", lambda: {"token_endpoint": "https://x/token"}): - Access to secretsline 111
[Credential-related source omitted] - Network accessline 119
[Credential-related source omitted] - Access to secretsline 119
[Credential-related source omitted] - Network accessline 120
[Credential-related source omitted] - Network accessline 121
[Credential-related source omitted] - Access to secretsline 121
[Credential-related source omitted] - Network accessline 122
patch.object(A, "_discover", lambda: {"token_endpoint": "https://x/token"}): - Access to secretsline 123
[Credential-related source omitted] - Access to secretsline 132
[Credential-related source omitted] - Access to secretsline 134
[Credential-related source omitted] - Access to secretsline 140
[Credential-related source omitted]
sdk/python/tests/test_connect_auth_scope.py
- Executable scriptline 1
Executable file - Network accessline 25
# What https://letsfg.co/developers/api/.well-known/oauth-authorization-server - Network accessline 46
out = io.StringIO() with patch.object(A, "_discover", lambda: { "authorization_endpoint": "https://letsfg.co/connect", - Network accessline 47
with patch.object(A, "_discover", lambda: { "authorization_endpoint": "https://letsfg.co/connect", "token_endpoint": "https://letsfg.co/developers/api/oauth/token", - Network accessline 48
"authorization_endpoint": "https://letsfg.co/connect", - Network accessline 49
"token_endpoint": "https://letsfg.co/developers/api/oauth/token", - Network accessline 50
"registration_endpoint": "https://letsfg.co/developers/api/oauth/register", - Access to secretsline 76
[Credential-related source omitted] - Access to secretsline 85
[Credential-related source omitted] - Access to secretsline 91
[Credential-related source omitted] - Access to secretsline 96
[Credential-related source omitted]
sdk/python/tests/test_connector_parsing.py
- Executable scriptline 1
Executable file
sdk/python/tests/test_country_filter_completeness.py
- Executable scriptline 1
Executable file
sdk/python/tests/test_currency_rates.py
- Executable scriptline 1
Executable file
sdk/python/tests/test_duration_timezone.py
- Executable scriptline 1
Executable file
sdk/python/tests/test_emirates_connector.py
- Executable scriptline 1
Executable file
sdk/python/tests/test_flight_duration_backfill.py
- Executable scriptline 1
Executable file
sdk/python/tests/test_hotel_booking_contract.py
sdk/python/tests/test_india_direct_sources.py
- Executable scriptline 1
Executable file
sdk/python/tests/test_india_ota_sources.py
- Executable scriptline 1
Executable file
sdk/python/tests/test_india_user_surfaces.py
- Executable scriptline 1
Executable file
sdk/python/tests/test_models_read_bearer_lane_offers.py
- Executable scriptline 1
Executable file
sdk/python/tests/test_public_offer_masking.py
- Executable scriptline 1
Executable file - Network accessline 44
[Credential-related source omitted] - Network accessline 45
[Credential-related source omitted] - Network accessline 46
[Credential-related source omitted] - Network accessline 48
"fare_family": "BASIC", "change_allowed": "false", "outbound_booking_url": "https://www.ryanair.com/book/out", - Network accessline 49
"change_allowed": "false", "outbound_booking_url": "https://www.ryanair.com/book/out", }, - Network accessline 50
"outbound_booking_url": "https://www.ryanair.com/book/out", - Network accessline 125
offer = _offer(conditions={ "fare_family": "FLEX", "inbound_booking_url": "https://example.com/in", - Network accessline 126
"fare_family": "FLEX", "inbound_booking_url": "https://example.com/in", }) - Network accessline 127
"inbound_booking_url": "https://example.com/in",
sdk/python/tests/test_regional_cross_area_validation.py
- Executable scriptline 1
Executable file
sdk/python/tests/test_regional_india_sources.py
- Executable scriptline 1
Executable file
sdk/python/tests/test_search_api_key_lane_field_names.py
sdk/python/tests/test_search_unauthorized.py
- Executable scriptline 1
Executable file - Network accessline 27
def _http_error(status: int, body: bytes) -> HTTPError: return HTTPError("https://letsfg.co/api/search", status, "Unauthorized", {}, io.BytesIO(body)) - Network accessline 28
return HTTPError("https://letsfg.co/api/search", status, "Unauthorized", {}, io.BytesIO(body)) - Access to secretsline 44
[Credential-related source omitted]
sdk/python/tests/test_skyscanner_connector.py
- Executable scriptline 1
Executable file - Network accessline 89
self.assertEqual( offers[0].booking_url, "https://www.skyscanner.net/transport_deeplink/4.0/UK/en-GB/EUR/eduk/1/test?ticket_price=55.40&fare_type=base_fare", - Network accessline 90
offers[0].booking_url, "https://www.skyscanner.net/transport_deeplink/4.0/UK/en-GB/EUR/eduk/1/test?ticket_price=55.40&fare_type=base_fare", ) - Network accessline 91
"https://www.skyscanner.net/transport_deeplink/4.0/UK/en-GB/EUR/eduk/1/test?ticket_price=55.40&fare_type=base_fare", - Network accessline 149
self.assertEqual( offers[0].booking_url, "https://www.skyscanner.net/transport_deeplink/4.0/UK/en-GB/EUR/eduk/1/test?ticket_price=60.00&fare_type=total", - Network accessline 150
offers[0].booking_url, "https://www.skyscanner.net/transport_deeplink/4.0/UK/en-GB/EUR/eduk/1/test?ticket_price=60.00&fare_type=total", ) - Network accessline 151
"https://www.skyscanner.net/transport_deeplink/4.0/UK/en-GB/EUR/eduk/1/test?ticket_price=60.00&fare_type=total", - Network accessline 162
{ "name": "Trip.com", "url": "https://agent.example.com/checkout/offer-123", - Network accessline 163
"name": "Trip.com", "url": "https://agent.example.com/checkout/offer-123", } - Network accessline 164
"url": "https://agent.example.com/checkout/offer-123", - Network accessline 173
self.assertEqual(len(offers), 1) self.assertEqual(offers[0].booking_url, "https://agent.example.com/checkout/offer-123") - Network accessline 174
self.assertEqual(offers[0].booking_url, "https://agent.example.com/checkout/offer-123") - Network accessline 184
{ "name": "Trip.com", "url": "https://agent.example.com/checkout/offer-123", - Network accessline 185
"name": "Trip.com", "url": "https://agent.example.com/checkout/offer-123", } - Network accessline 186
"url": "https://agent.example.com/checkout/offer-123", - Network accessline 194
{ "name": "Kiwi", "url": "https://agent.example.com/checkout/offer-456", - Network accessline 195
"name": "Kiwi", "url": "https://agent.example.com/checkout/offer-456", } - Network accessline 196
"url": "https://agent.example.com/checkout/offer-456", - Network accessline 208
[offer.booking_url for offer in offers], [ "https://agent.example.com/checkout/offer-123", - Network accessline 209
[ "https://agent.example.com/checkout/offer-123", "https://agent.example.com/checkout/offer-456", - Network accessline 210
"https://agent.example.com/checkout/offer-123", - Network accessline 211
"https://agent.example.com/checkout/offer-456", - Network accessline 250
[offer.booking_url for offer in offers], [ "https://www.skyscanner.net/transport_deeplink/4.0/UK/en-GB/EUR/eduk/1/test?ticket_price=55.40&fare_type=base_fare", - Network accessline 251
[ "https://www.skyscanner.net/transport_deeplink/4.0/UK/en-GB/EUR/eduk/1/test?ticket_price=55.40&fare_type=base_fare", "https://www.skyscanner.net/transport_deeplink/4.0/UK/en-GB/EUR/eduk/1/test?ticket_price= - Network accessline 252
"https://www.skyscanner.net/transport_deeplink/4.0/UK/en-GB/EUR/eduk/1/test?ticket_price=55.40&fare_type=base_fare", - Network accessline 253
"https://www.skyscanner.net/transport_deeplink/4.0/UK/en-GB/EUR/eduk/1/test?ticket_price=60.00&fare_type=base_fare",
sdk/python/tests/test_source_country_filter.py
- Executable scriptline 1
Executable file
sdk/python/tests/test_starlink_flights.py
sdk/python/tests/test_telemetry_enrichment.py
sdk/python/tests/test_tripcom_connector.py
- Executable scriptline 1
Executable file
sdk/python/tests/test_user_agent_everywhere.py
sdk/python/tests/test_vueling_connector.py
- Executable scriptline 1
Executable file
sdk/python/tests/test_wizzair_connector.py
- Executable scriptline 1
Executable file
server.json
- Network accessline 1
{ "$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json", - Network accessline 2
"$schema": "https://static.modelcontextprotocol.io/schemas/2025-12-11/server.schema.json", - Network accessline 4
"title": "LetsFG — Flights & Hotels", "description": "Search and book flights and hotels: hundreds of airlines, plus bookable hotel rates.", "websiteUrl": "https://letsfg.co", - Network accessline 5
"description": "Search and book flights and hotels: hundreds of airlines, plus bookable hotel rates.", "websiteUrl": "https://letsfg.co", "repository": { - Network accessline 6
"websiteUrl": "https://letsfg.co", - Network accessline 7
"repository": { "url": "https://github.com/LetsFG/LetsFG", "source": "github" - Network accessline 8
"url": "https://github.com/LetsFG/LetsFG", - Network accessline 21
{ "name": "LETSFG_BEARER_TOKEN", "description": "Token from the connect flow: add https://letsfg.co/mcp as a remote MCP and approve it; consent is one tap and asks for no card. The card is asked for at the first booking, - Network accessline 22
"name": "LETSFG_BEARER_TOKEN", "description": "Token from the connect flow: add https://letsfg.co/mcp as a remote MCP and approve it; consent is one tap and asks for no card. The card is asked for at the first booking, in a 0.00 R - Network accessline 23
"description": "Token from the connect flow: add https://letsfg.co/mcp as a remote MCP and approve it; consent is one tap and asks for no card. The card is asked for at the first booking, in a 0.00 Revolut setup (nothing charged). Reaches b - Access to secretsline 29
[Credential-related source omitted] - Network accessline 39
{ "type": "streamable-http", "url": "https://letsfg.co/mcp" - Network accessline 40
"type": "streamable-http", "url": "https://letsfg.co/mcp" } - Network accessline 41
"url": "https://letsfg.co/mcp"
skills/flight-search/SKILL.md
- Network accessline 21
> and booking costs the price on the offer. Earlier revisions of this page > described an MPP charge at *unlock* time; that never shipped. See > <https://letsfg.co/for-agents>. - Network accessline 23
> <https://letsfg.co/for-agents>. - Network accessline 32
> > To search and book flights, connect LetsFG as an MCP server at > `https://letsfg.co/mcp` and approve it — the consent at - Network accessline 33
> To search and book flights, connect LetsFG as an MCP server at > `https://letsfg.co/mcp` and approve it — the consent at > <https://letsfg.co/connect> is one tap and needs no card. Then search and book. - Network accessline 34
> `https://letsfg.co/mcp` and approve it — the consent at - Network accessline 35
> <https://letsfg.co/connect> is one tap and needs no card. Then search and book. - Network accessline 36
> See <https://letsfg.co/for-agents>. - Network accessline 41
**Agent flow (PFS):** Search (free) → Book (`POST /api/agent-book`, the price shown on the offer) → Poll (`POST /api/agent-book/status`). Booking works exactly like the website checkout: the fare plus LetsFG's markup is held on the card con - Network accessline 55
**Claude (claude.ai / Claude Desktop):** add LetsFG from Claude's connector directory, <https://claude.ai/directory/letsfg> - no config. - Network accessline 56
<https://claude.ai/directory/letsfg> - no config. - Network accessline 62
"mcpServers": { "letsfg": { "url": "https://letsfg.co/mcp", - Network accessline 63
"letsfg": { "url": "https://letsfg.co/mcp", "headers": { - Network accessline 64
"url": "https://letsfg.co/mcp", - Access to secretsline 66
[Credential-related source omitted] - Access to secretsline 82
[Credential-related source omitted] - Access to secretsline 100
[Credential-related source omitted] - Network accessline 269
| `INVALID_IATA` (422) | Validation | Use `resolve_location()` to fix | | `OFFER_EXPIRED` (410) | Business | Search again for fresh offers | | `PAYMENT_REQUIRED` (402) | Business | PFS: connect a card at the `add_card_url` (https://letsfg.c - Network accessline 270
| `OFFER_EXPIRED` (410) | Business | Search again for fresh offers | | `PAYMENT_REQUIRED` (402) | Business | PFS: connect a card at the `add_card_url` (https://letsfg.co/connect). Developer API: `letsfg connect-payment` | | `FARE_CHANGED` ( - Network accessline 271
| `PAYMENT_REQUIRED` (402) | Business | PFS: connect a card at the `add_card_url` (https://letsfg.co/connect). Developer API: `letsfg connect-payment` | - Network accessline 282
flights = bt.search(origin, dest, date) except PaymentRequiredError: # No card on file — Developer API: letsfg connect-payment; PFS: https://letsfg.co/connect - Network accessline 283
except PaymentRequiredError: # No card on file — Developer API: letsfg connect-payment; PFS: https://letsfg.co/connect print("Connect a card first") - Network accessline 284
# No card on file — Developer API: letsfg connect-payment; PFS: https://letsfg.co/connect - Network accessline 322
- **API Docs:** https://letsfg.co/developers/api/docs - Network accessline 323
- **GitHub:** https://github.com/LetsFG/LetsFG - Network accessline 324
- **PyPI:** https://pypi.org/project/letsfg/ - Network accessline 325
- **npm SDK:** https://www.npmjs.com/package/letsfg - Network accessline 326
- **npm MCP:** https://www.npmjs.com/package/letsfg-mcp
skills/flight-search/references/api-reference.md
- Network accessline 6
> and booking costs the price on the offer. Earlier revisions of this page > described an MPP charge at *unlock* time; that never shipped. See > <https://letsfg.co/for-agents>. - Network accessline 8
> <https://letsfg.co/for-agents>. - Network accessline 17
> > To search and book flights, connect LetsFG as an MCP server at > `https://letsfg.co/mcp` and approve it — the consent at - Network accessline 18
> To search and book flights, connect LetsFG as an MCP server at > `https://letsfg.co/mcp` and approve it — the consent at > <https://letsfg.co/connect> is one tap and needs no card. Then search and book. - Network accessline 19
> `https://letsfg.co/mcp` and approve it — the consent at - Network accessline 20
> <https://letsfg.co/connect> is one tap and needs no card. Then search and book. - Network accessline 21
> See <https://letsfg.co/for-agents>. - Network accessline 25
**Base URL:** `https://letsfg.co/developers/api/v1` - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 57
[Credential-related source omitted] - Network accessline 68
{ "status": "connect_required", "connect_url": "https://letsfg.co/connect?dev=sess_abc123", - Network accessline 69
"status": "connect_required", "connect_url": "https://letsfg.co/connect?dev=sess_abc123", "expires_in_seconds": 3600 - Network accessline 70
"connect_url": "https://letsfg.co/connect?dev=sess_abc123", - Network accessline 76
connect.** A connected method is what opens search, and it is what bookings and top-ups are charged to. Agents on the PFS lane do not use this — their card is saved at <https://letsfg.co/connect> when they connect the MCP server. - Network accessline 78
<https://letsfg.co/connect> when they connect the MCP server. - Network accessline 225
The endpoints above are the paid Developer API. Agents use the PFS lane on `https://letsfg.co` with the Bearer token from the connect flow (see `mcp-setup.md`): - Network accessline 226
`https://letsfg.co` with the Bearer token from the connect flow (see `mcp-setup.md`): - Network accessline 248
`{"error":"missing_details","missing_fields":[...],"charged":0}`. No card → `payment_method_required`, card refused → `payment_declined`, both with `add_card_url: https://letsfg.co/connect` and `charged: 0`. - Network accessline 250
`add_card_url: https://letsfg.co/connect` and `charged: 0`. - Network accessline 265
| `INVALID_DATE` | validation | 422 | Date in wrong format or in the past | | `OFFER_EXPIRED` | business | 410 | Offer no longer available — search again | | `PAYMENT_REQUIRED` | business | 402 | No card on file — Developer API: `POST /agen - Network accessline 266
| `OFFER_EXPIRED` | business | 410 | Offer no longer available — search again | | `PAYMENT_REQUIRED` | business | 402 | No card on file — Developer API: `POST /agents/connect-payment`, open the link; PFS: `add_card_url` → https://letsfg.co/ - Network accessline 267
| `PAYMENT_REQUIRED` | business | 402 | No card on file — Developer API: `POST /agents/connect-payment`, open the link; PFS: `add_card_url` → https://letsfg.co/connect | - Network accessline 273
| Endpoint | URL | |----------|-----| | OpenAPI/Swagger | https://letsfg.co/developers/api/docs | - Network accessline 274
|----------|-----| | OpenAPI/Swagger | https://letsfg.co/developers/api/docs | | Agent discovery | https://letsfg.co/developers/api/.well-known/ai-plugin.json | - Network accessline 275
| OpenAPI/Swagger | https://letsfg.co/developers/api/docs | - Network accessline 276
| Agent discovery | https://letsfg.co/developers/api/.well-known/ai-plugin.json | - Network accessline 277
| Agent manifest | https://letsfg.co/developers/api/.well-known/agent.json | - Network accessline 278
| LLM instructions | https://letsfg.co/developers/api/llms.txt | - Network accessline 279
| MCP (Streamable HTTP) | https://letsfg.co/mcp |
skills/flight-search/references/mcp-setup.md
- Network accessline 10
> > To search and book flights, connect LetsFG as an MCP server at > `https://letsfg.co/mcp` and approve it — the consent at - Network accessline 11
> To search and book flights, connect LetsFG as an MCP server at > `https://letsfg.co/mcp` and approve it — the consent at > <https://letsfg.co/connect> is one tap and needs no card. Then search and book. - Network accessline 12
> `https://letsfg.co/mcp` and approve it — the consent at - Network accessline 13
> <https://letsfg.co/connect> is one tap and needs no card. Then search and book. - Network accessline 14
> See <https://letsfg.co/for-agents>. - Network accessline 20
The way in is the remote server at `https://letsfg.co/mcp`. Your - Network accessline 21
client runs OAuth; the consent step opens <https://letsfg.co/connect>: one tap, - Network accessline 29
# Claude Code claude mcp add --transport http letsfg https://letsfg.co/mcp - Network accessline 30
claude mcp add --transport http letsfg https://letsfg.co/mcp - Network accessline 33
Claude: add it from Claude's official connector directory, <https://claude.ai/directory/letsfg>, and approve - Network accessline 53
curl -X POST https://letsfg.co/developers/api/v1/agents/register \ - Network accessline 65
{ "mcpServers": { "letsfg": { "url": "https://letsfg.co/mcp" } - Network accessline 66
"mcpServers": { "letsfg": { "url": "https://letsfg.co/mcp" } } - Network accessline 67
"letsfg": { "url": "https://letsfg.co/mcp" } - Network accessline 76
"mcpServers": { "letsfg": { "url": "https://letsfg.co/mcp", - Network accessline 77
[Credential-related source omitted] - Network accessline 78
"url": "https://letsfg.co/mcp", - Access to secretsline 79
[Credential-related source omitted] - Access to secretsline 94
[Credential-related source omitted] - Network accessline 105
No config needed: add LetsFG from Claude's connector directory, <https://claude.ai/directory/letsfg>. To use a Developer - Network accessline 110
"mcpServers": { "letsfg": { "url": "https://letsfg.co/mcp", - Network accessline 111
"letsfg": { "url": "https://letsfg.co/mcp", "headers": { - Network accessline 112
"url": "https://letsfg.co/mcp", - Access to secretsline 114
[Credential-related source omitted] - Access to secretsline 132
[Credential-related source omitted] - Access to secretsline 150
[Credential-related source omitted] - Access to secretsline 168
[Credential-related source omitted] - Access to secretsline 184
[Credential-related source omitted]
skills/hotel-search/SKILL.md
- Network accessline 21
**The same card authorises flights and hotels.** The PFS Bearer token (from connecting the MCP server — consent is one tap and asks for no card; the card is added at <https://letsfg.co/connect> when it is first needed) is - Network accessline 22
connecting the MCP server — consent is one tap and asks for no card; the card is added at <https://letsfg.co/connect> when it is first needed) is accepted by the hotel endpoints, and so is a **Developer API key** (`X-API-Key`). Use whicheve - Network accessline 23
<https://letsfg.co/connect> when it is first needed) is - Access to secretsline 60
[Credential-related source omitted] - Network accessline 134
| `400 invalid_details` | A guest name, phone or e-mail was rejected (`invalid_fields` says which). Nothing held | Fix the details and call again | | `400 price_mismatch` | Prices not copied verbatim from the offer | Send the offer's `price - Network accessline 135
| `400 price_mismatch` | Prices not copied verbatim from the offer | Send the offer's `price`, `expected_cost`, `currency` and `fx_rate` | | `401` | Credential invalid, expired or revoked | Reconnect at https://letsfg.co/connect, or check t - Network accessline 136
| `401` | Credential invalid, expired or revoked | Reconnect at https://letsfg.co/connect, or check the API key | - Network accessline 145
- Hotels guide: <https://letsfg.co/developers/docs/hotels/> - Network accessline 146
- Agent guide: <https://letsfg.co/for-agents> - Network accessline 147
- Repo: <https://github.com/LetsFG/LetsFG>
smithery.yaml
- Network accessline 3
# Flight search returns in 8-10s and can include split tickets (two tickets, # two sellers, one trip) - always flagged with self_transfer: unprotected. # https://smithery.ai/docs/publishing - Network accessline 5
# https://smithery.ai/docs/publishing - Access to secretsline 12
[Credential-related source omitted] - Access to secretsline 24
[Credential-related source omitted]
test/model-test.js
- Executable scriptline 1
Executable file - Possible obfuscationline 32
eq(M.safeText("<U+202E>evil"), "evil", "RTL override is dropped") - Possible obfuscationline 33
eq(M.safeText("a<U+200B>b"), "ab", "zero-width space is dropped") - Network accessline 41
section("safeHttpsUrl is an allowlist") eq(M.safeHttpsUrl("https://letsfg.co/book/abc"), "https://letsfg.co/book/abc", "plain https passes") - Network accessline 42
eq(M.safeHttpsUrl("https://letsfg.co/book/abc"), "https://letsfg.co/book/abc", "plain https passes") - Network accessline 43
eq(M.safeHttpsUrl("https://www.ryanair.com/x?y=1&z=2"), "https://www.ryanair.com/x?y=1&z=2", "query strings pass") - Network accessline 44
eq(M.safeHttpsUrl("http://letsfg.co"), "", "plain http is refused") - Network accessline 47
eq(M.safeHttpsUrl("data:text/html,<h1>x"), "", "data: is refused") eq(M.safeHttpsUrl("file:///etc/passwd"), "", "file: is refused") eq(M.safeHttpsUrl(" https://letsfg.co"), "", "leading whitespace is refused") - Network accessline 48
eq(M.safeHttpsUrl("file:///etc/passwd"), "", "file: is refused") eq(M.safeHttpsUrl(" https://letsfg.co"), "", "leading whitespace is refused") eq(M.safeHttpsUrl("https://evil.com@letsfg.co/x"), "", "userinfo confusion is refused") - Network accessline 49
eq(M.safeHttpsUrl(" https://letsfg.co"), "", "leading whitespace is refused") - Network accessline 50
eq(M.safeHttpsUrl("https://evil.com@letsfg.co/x"), "", "userinfo confusion is refused") - Network accessline 51
eq(M.safeHttpsUrl("https://letsfg.co/a�b"), "", "embedded NUL is refused") - Network accessline 52
eq(M.safeHttpsUrl("https://letsfg.co/a b"), "", "embedded space is refused") - Network accessline 53
eq(M.safeHttpsUrl('https://letsfg.co/"onclick='), "", "embedded quote is refused") - Network accessline 54
eq(M.safeHttpsUrl("https://letsfg.co\\@evil.com"), "", "backslash is refused") - Network accessline 55
eq(M.safeHttpsUrl("https://пример.com/x"), "", "non-ASCII host is refused") - Network accessline 56
eq(M.safeHttpsUrl("https://" + "a".repeat(3000)), "", "over-long URL is refused") - Network accessline 61
section("request URLs cannot leave the pinned origin") eq(M.searchUrl(), "https://letsfg.co/api/search", "search URL is pinned") - Network accessline 62
eq(M.searchUrl(), "https://letsfg.co/api/search", "search URL is pinned") - Network accessline 63
eq(M.resultsUrl("abc-123_XY"), "https://letsfg.co/api/results/abc-123_XY", "results URL is built from a clean id") - Network accessline 68
ok((function () { try { M.resultsUrl("a?x=1"); return false } catch (e) { return true } })(), "a query string in the search id throws") ok((function () { try { M.apiUrl("https://evil.com/x"); return false } catch (e) { return true } })() - Network accessline 69
"a query string in the search id throws") ok((function () { try { M.apiUrl("https://evil.com/x"); return false } catch (e) { return true } })(), "an absolute URL as a path throws") - Network accessline 70
ok((function () { try { M.apiUrl("https://evil.com/x"); return false } catch (e) { return true } })(), - Network accessline 72
ok((function () { try { M.apiUrl("//evil.com/x"); return true } catch (e) { return true } })(), "a protocol-relative path is handled") eq(M.apiUrl("//evil.com/x").indexOf("https://letsfg.co/"), 0, "even a protocol-relative path stays on - Network accessline 74
eq(M.apiUrl("//evil.com/x").indexOf("https://letsfg.co/"), 0, "even a protocol-relative path stays on the origin") - Network accessline 104
var sentHeaders = {} var fakeXhr = { setRequestHeader: function (k, v) { sentHeaders[k] = v } } sess.applyTo(fakeXhr, "https://letsfg.co/api/search") - Network accessline 105
var fakeXhr = { setRequestHeader: function (k, v) { sentHeaders[k] = v } } sess.applyTo(fakeXhr, "https://letsfg.co/api/search") eq(sentHeaders["Authorization"], "Bearer letsfg_xxxx_abcdef123456", "the token is applied to an on-origin reque - Network accessline 106
sess.applyTo(fakeXhr, "https://letsfg.co/api/search") - Network accessline 107
eq(sentHeaders["Authorization"], "Bearer letsfg_xxxx_abcdef123456", "the token is applied to an on-origin request") ok((function () { try { sess.applyTo(fakeXhr, "https://evil.com/api/search"); return false } catch (e) { return true } })(), - Network accessline 108
ok((function () { try { sess.applyTo(fakeXhr, "https://evil.com/api/search"); return false } catch (e) { return true } })(), - Network accessline 109
"applying credentials off-origin throws") ok((function () { try { sess.applyTo(fakeXhr, "https://letsfg.co.evil.com/x"); return false } catch (e) { return true } })(), "a suffix-confusion host is refused") - Network accessline 110
ok((function () { try { sess.applyTo(fakeXhr, "https://letsfg.co.evil.com/x"); return false } catch (e) { return true } })(), - Network accessline 112
sess.forget() ok(!sess.ready(), "forget clears the session") ok((function () { try { sess.applyTo(fakeXhr, "https://letsfg.co/api/search"); return false } catch (e) { return true } })(), - Network accessline 113
ok(!sess.ready(), "forget clears the session") ok((function () { try { sess.applyTo(fakeXhr, "https://letsfg.co/api/search"); return false } catch (e) { return true } })(), "applying with no token throws") - Network accessline 114
ok((function () { try { sess.applyTo(fakeXhr, "https://letsfg.co/api/search"); return false } catch (e) { return true } })(), - Network accessline 139
eq(M.oauthRegisterUrl(), "https://letsfg.co/developers/api/oauth/register", "registration is on the pinned origin") - Network accessline 140
eq(M.oauthTokenUrl(), "https://letsfg.co/developers/api/oauth/token", "the token endpoint is on the pinned origin") - Network accessline 155
var cu = M.connectUrl("lfg_client_abc", "CHAL", "ST") eq(cu.indexOf("https://letsfg.co/connect?"), 0, "the connect page is on the pinned origin") - Network accessline 156
eq(cu.indexOf("https://letsfg.co/connect?"), 0, "the connect page is on the pinned origin") - Network accessline 171
ok(M.parseConnectReturn(M.CONNECT_REDIRECT_URI + "?error=access_denied", "ST").error.indexOf("declined") >= 0, "a decline is explained") eq(M.parseConnectReturn("", "ST").ok, false, "an empty paste is refused") eq(M.parseConnectReturn("http - Network accessline 172
eq(M.parseConnectReturn("", "ST").ok, false, "an empty paste is refused") eq(M.parseConnectReturn("https://letsfg.co/connect?client_id=x", "ST").ok, false, "the connect page itself is not a code") eq(M.parseConnectReturn("code=<script>", "S - Network accessline 173
eq(M.parseConnectReturn("https://letsfg.co/connect?client_id=x", "ST").ok, false, "the connect page itself is not a code") - Access to secretsline 182
[Credential-related source omitted] - Access to secretsline 186
[Credential-related source omitted] - Access to secretsline 188
[Credential-related source omitted] - Access to secretsline 189
[Credential-related source omitted] - Access to secretsline 196
[Credential-related source omitted] - Access to secretsline 198
[Credential-related source omitted] - Network accessline 238
} rs.sendRefresh(refreshXhr, { "X-LetsFG-Client": "test" }) eq(sent.url, "https://letsfg.co/developers/api/oauth/token", "the refresh goes to the token endpoint on the pinned origin") - Network accessline 239
rs.sendRefresh(refreshXhr, { "X-LetsFG-Client": "test" }) eq(sent.url, "https://letsfg.co/developers/api/oauth/token", "the refresh goes to the token endpoint on the pinned origin") eq(sent.method, "POST", "as a POST") - Network accessline 240
eq(sent.url, "https://letsfg.co/developers/api/oauth/token", "the refresh goes to the token endpoint on the pinned origin") - Access to secretsline 251
[Credential-related source omitted] - Network accessline 647
eq(multi.length, 2, "both operating carriers are returned") eq(multi.map(function (c) { return c.code }), ["KL", "BR"], "in itinerary order") eq(multi[1].logoUrl, "https://images.kiwi.com/airlines/64/BR.png", "each carrier carries its own l - Network accessline 649
eq(multi[1].logoUrl, "https://images.kiwi.com/airlines/64/BR.png", "each carrier carries its own logo") - Network accessline 708
departure_time: "2026-09-14T06:35:00", arrival_time: "2026-09-14T09:50:00", stops: 0, duration_minutes: 195, is_combo: true, booking_url: "https://letsfg.co/book/off_1", - Network accessline 709
stops: 0, duration_minutes: 195, is_combo: true, booking_url: "https://letsfg.co/book/off_1", segments: [{ airline: "Wizz Air" }], - Network accessline 710
booking_url: "https://letsfg.co/book/off_1", - Network accessline 727
eq(view[0].returnAirline, "Ryanair", "the return leg comes from trip_breakdown") eq(view[0].extraCarriers, "Ryanair", "a second carrier is surfaced") eq(view[0].bookingUrl, "https://letsfg.co/book/off_1", "a good booking URL survives") - Network accessline 728
eq(view[0].extraCarriers, "Ryanair", "a second carrier is surfaced") eq(view[0].bookingUrl, "https://letsfg.co/book/off_1", "a good booking URL survives") eq(view[0].arrivesNextDay, 0, "a same-day arrival is not marked") - Network accessline 729
eq(view[0].bookingUrl, "https://letsfg.co/book/off_1", "a good booking URL survives") - Possible obfuscationline 768
airline: "Evil<U+001B>[2JAir<U+202E>", origin: "AAA", destination: "BBB", - Possible obfuscationline 774
ok(nasty[0].airline.indexOf("<U+202E>") === -1, "an RTL override in the airline name is stripped") - Network accessline 795
section("the popular ranking comes from the real page, not a hardcoded list") var POP_HTML = '<div class="lp-pop-track">' + '<a class="lp-pop-card" href="/en?qfill=to%20Lisbon"><img src="https://images.pexels.com/photos/1/x.jpeg" alt="Lis - Network accessline 796
var POP_HTML = '<div class="lp-pop-track">' + '<a class="lp-pop-card" href="/en?qfill=to%20Lisbon"><img src="https://images.pexels.com/photos/1/x.jpeg" alt="Lisbon" class="lp-pop-img"/>' + '<span class="lp-pop-overlay"></span><span clas - Network accessline 797
+ '<a class="lp-pop-card" href="/en?qfill=to%20Lisbon"><img src="https://images.pexels.com/photos/1/x.jpeg" alt="Lisbon" class="lp-pop-img"/>' - Network accessline 799
+ '<a class="lp-pop-card"><img src="/destinations/bali.jpg" class="lp-pop-img"/>' + '<span class="lp-pop-city">Bali</span><span class="lp-pop-code">DPS</span></a>' + '<a class="lp-pop-card"><img src="https://evil.example/track.gif" clas - Network accessline 800
+ '<span class="lp-pop-city">Bali</span><span class="lp-pop-code">DPS</span></a>' + '<a class="lp-pop-card"><img src="https://evil.example/track.gif" class="lp-pop-img"/>' + '<span class="lp-pop-city">Nowhere</span><span class="lp-pop-c - Network accessline 801
+ '<a class="lp-pop-card"><img src="https://evil.example/track.gif" class="lp-pop-img"/>' - Network accessline 806
eq(pop[0].code, "LIS", "the code is read") eq(pop[0].city, "Lisbon", "the city is read") eq(pop[0].image, "https://images.pexels.com/photos/1/x.jpeg", "an allowlisted image host survives") - Network accessline 807
eq(pop[0].city, "Lisbon", "the city is read") eq(pop[0].image, "https://images.pexels.com/photos/1/x.jpeg", "an allowlisted image host survives") eq(pop[1].image, "https://letsfg.co/destinations/bali.jpg", "a site-relative image resolves on - Network accessline 808
eq(pop[0].image, "https://images.pexels.com/photos/1/x.jpeg", "an allowlisted image host survives") - Network accessline 809
eq(pop[1].image, "https://letsfg.co/destinations/bali.jpg", "a site-relative image resolves onto the pinned origin") - Network accessline 814
eq(M.allowedPopularImage("https://evil.com/x.jpg"), "", "an arbitrary host is refused") - Network accessline 815
eq(M.allowedPopularImage("http://images.pexels.com/x.jpg"), "", "plain http is refused even on a known host") - Network accessline 821
section("map tiles are pinned and the projection is right") eq(M.tileUrl(10, 570, 337), "https://basemaps.cartocdn.com/rastertiles/voyager/10/570/337.png", - Network accessline 822
eq(M.tileUrl(10, 570, 337), "https://basemaps.cartocdn.com/rastertiles/voyager/10/570/337.png", - Network accessline 830
eq(M.tileUrl(2, 4, 1), "https://basemaps.cartocdn.com/rastertiles/voyager/2/0/1.png", - Network accessline 876
var OPT = { departDate: "2026-09-21", currency: "USD", adults: 1 } var link = M.offerUrl("ws_4c8ebdc223854a3d", OFF, OPT) ok(link.indexOf("https://letsfg.co/en?stage=results") === 0, "it is a letsfg.co results deep link") - Network accessline 877
var link = M.offerUrl("ws_4c8ebdc223854a3d", OFF, OPT) ok(link.indexOf("https://letsfg.co/en?stage=results") === 0, "it is a letsfg.co results deep link") ok(link.indexOf("sid=ws_4c8ebdc223854a3d") !== -1, "the search id is carried") - Network accessline 878
ok(link.indexOf("https://letsfg.co/en?stage=results") === 0, "it is a letsfg.co results deep link") - Network accessline 1027
eq(M.airlineLogoUrl("W6"), "https://images.kiwi.com/airlines/64/W6.png", "a good IATA code builds a CDN URL") - Network accessline 1028
eq(M.airlineLogoUrl("fr"), "https://images.kiwi.com/airlines/64/FR.png", "lower case is normalised") - Network accessline 1029
eq(M.airlineLogoUrl("W4"), "https://images.kiwi.com/airlines/64/W6.png", "a Wizz sub-brand reuses the parent mark") - Network accessline 1031
eq(M.airlineLogoUrl("WN"), "https://pics.avs.io/100/100/WN.png", "a Kiwi-missing code goes straight to avs.io") - Network accessline 1034
eq(M.airlineLogoUrl("U2"), "https://images.kiwi.com/airlines/64/U2.png", "easyJet is not special-cased, matching the site") - Network accessline 1035
eq(M.airlineLogoFallbackUrl("W6"), "https://pics.avs.io/100/100/W6.png", "the fallback is avs.io") - Network accessline 1036
eq(M.airlineLogoFallbackUrl("W4"), "https://pics.avs.io/100/100/W6.png", "the fallback honours aliases too") - Network accessline 1040
eq(M.airlineLogoUrl("../../evil"), "", "a traversal attempt is refused") eq(M.airlineLogoUrl("W6.png"), "", "a code carrying an extension is refused") eq(M.airlineLogoUrl("https://evil.com/x.png"), "", "a full URL as a code is refused") - Network accessline 1041
eq(M.airlineLogoUrl("W6.png"), "", "a code carrying an extension is refused") eq(M.airlineLogoUrl("https://evil.com/x.png"), "", "a full URL as a code is refused") eq(M.airlineLogoUrl(""), "", "an empty code is refused") - Network accessline 1042
eq(M.airlineLogoUrl("https://evil.com/x.png"), "", "a full URL as a code is refused") - Network accessline 1053
id: "h", price: 10, currency: "EUR", airline_code: "../../../etc/passwd", logo: "https://evil.example/track.png", - Network accessline 1054
airline_code: "../../../etc/passwd", logo: "https://evil.example/track.png", logo_url: "https://evil.example/track.png" - Network accessline 1055
logo: "https://evil.example/track.png", - Network accessline 1056
logo_url: "https://evil.example/track.png" - Network accessline 1223
// logos, tiles and avatars each apply their own allowlist after it. Booking // links were the one consumer that did not, and the only one whose result is // handed to the user's browser. "https://checkout.stripe.com.evil.com/x" - Network accessline 1224
// links were the one consumer that did not, and the only one whose result is // handed to the user's browser. "https://checkout.stripe.com.evil.com/x" // passes a shape check and reads like Stripe at a glance. - Network accessline 1225
// handed to the user's browser. "https://checkout.stripe.com.evil.com/x" - Network accessline 1229
eq(M.offerBookingUrl("https://letsfg.co/en/book/abc"), "https://letsfg.co/en/book/abc", - Network accessline 1230
"an on-origin booking link is kept") eq(M.offerBookingUrl("https://checkout.stripe.com.evil.com/x"), "", "a lookalike host is dropped, not opened") - Network accessline 1231
eq(M.offerBookingUrl("https://checkout.stripe.com.evil.com/x"), "", - Network accessline 1232
"a lookalike host is dropped, not opened") eq(M.offerBookingUrl("https://evil.com/x"), "", "an off-origin https link is dropped") eq(M.offerBookingUrl("https://letsfg.co.evil.com/x"), "", - Network accessline 1233
eq(M.offerBookingUrl("https://evil.com/x"), "", "an off-origin https link is dropped") - Network accessline 1234
eq(M.offerBookingUrl("https://letsfg.co.evil.com/x"), "", - Network accessline 1243
eq(M.safeHttpsUrl("https://checkout.stripe.com.evil.com/x"), - Network accessline 1244
"https://checkout.stripe.com.evil.com/x", - Network accessline 1253
origin: "WAW", destination: "LIS", departure_time: "2026-09-08T10:00:00", arrival_time: "2026-09-08T13:00:00", stops: 0, duration_minutes: 180, booking_url: "https://checkout.stripe.com.evil.com/phish" - Network accessline 1254
arrival_time: "2026-09-08T13:00:00", stops: 0, duration_minutes: 180, booking_url: "https://checkout.stripe.com.evil.com/phish" }] - Network accessline 1255
booking_url: "https://checkout.stripe.com.evil.com/phish"
tools/build-airports.py
tools/build-icons.py
- Executable scriptline 1
Executable file - Network accessline 16
Icons: Lucide (https://lucide.dev), ISC licence -- see assets/icons/LICENSE. - Network accessline 103
io.open(os.path.join(OUT, "LICENSE"), "w", encoding="utf-8").write( "Icons from Lucide (https://lucide.dev) - ISC License.\n\n" - Network accessline 104
"Icons from Lucide (https://lucide.dev) - ISC License.\n\n"
tools/build-ranking.py
- Executable scriptline 1
Executable file
tools/check-search-invariant.py
- Executable scriptline 1
Executable file
tools/split-comparison.py
- Executable scriptline 1
#!/usr/bin/env python3 - Network accessline 32
[Credential-related source omitted] - Access to secretsline 32
[Credential-related source omitted] - Access to secretsline 33
[Credential-related source omitted] - Access to secretsline 34
[Credential-related source omitted] - Network accessline 67
def post(path: str, body: dict) -> dict: req = urllib.request.Request( - Network accessline 68
req = urllib.request.Request( - Network accessline 69
f"{BASE}{path}", data=json.dumps(body).encode(), headers=headers(json_body=True), method="POST") with urllib.request.urlopen(req, timeout=60) as r: - Network accessline 70
headers=headers(json_body=True), method="POST") with urllib.request.urlopen(req, timeout=60) as r: return json.loads(r.read()) - Network accessline 71
with urllib.request.urlopen(req, timeout=60) as r: - Network accessline 75
def get(path: str) -> dict: req = urllib.request.Request(f"{BASE}{path}", headers=headers(), method="GET") - Network accessline 76
req = urllib.request.Request(f"{BASE}{path}", headers=headers(), method="GET") - Network accessline 77
with urllib.request.urlopen(req, timeout=30) as r:
tools/validate.sh
- Executable scriptline 1
#!/usr/bin/env bash
How the signals fit together
Facts from a static read of the files at the pinned commit. They describe what the code does, not why.
Some files could not be read; the facts below still hold.
Declared and executed: 7 facts
- Contacts images.kiwi.com, which SKILL.md, the README and the plugin manifest do not mentionModel.js:200High confidence
- Contacts pics.avs.io, which SKILL.md, the README and the plugin manifest do not mentionModel.js:201High confidence
- Contacts basemaps.cartocdn.com, which SKILL.md, the README and the plugin manifest do not mentionModel.js:1679High confidence
- Contacts i.travelapi.com, which SKILL.md, the README and the plugin manifest do not mentionModel.js:2016High confidence
- Contacts q-xx.bstatic.com, which SKILL.md, the README and the plugin manifest do not mentionModel.js:2017High confidence
- Contacts images.pexels.com, which SKILL.md, the README and the plugin manifest do not mentionModel.js:2179High confidence
- Contacts upload.wikimedia.org, which SKILL.md, the README and the plugin manifest do not mentionModel.js:2180High confidence
Signal confidence: 493 facts
- Network access in prose of documentationAGENTS.md:16Low confidence
- Network access in prose of documentationAGENTS.md:17Low confidence
- Network access in prose of documentationAGENTS.md:18Low confidence
- Network access in prose of documentationAGENTS.md:19Low confidence
- Network access in prose of documentationAGENTS.md:21Low confidence
- Network access in prose of documentationAGENTS.md:40Low confidence
- Network access in prose of documentationAGENTS.md:45Low confidence
- Network access in prose of documentationAGENTS.md:47Low confidence
- Network access in prose of documentationAGENTS.md:49Low confidence
- Network access in prose of documentationAGENTS.md:51Low confidence
- Network access in prose of documentationAGENTS.md:77Low confidence
- Network access in prose of documentationAGENTS.md:92Low confidence
- Network access in prose of documentationAGENTS.md:93Low confidence
- Network access in prose of documentationAGENTS.md:94Low confidence
- Access to secrets in code of documentation: a variable, placeholder or call, not a stored valueAGENTS.md:120Low confidence
- Network access in prose of documentationAGENTS.md:133Low confidence
- Network access in code of documentationAGENTS.md:135Low confidence
- Network access in code of documentationAGENTS.md:139Low confidence
- Network access in code of documentationAGENTS.md:141Low confidence
- Access to secrets in code of documentation: a variable, placeholder or call, not a stored valueAGENTS.md:177Low confidence
- Network access in code of documentationAGENTS.md:194Low confidence
- Network access in code of documentationAGENTS.md:195Low confidence
- Network access in code of documentationAGENTS.md:196Low confidence
- Network access in prose of documentationAGENTS.md:222Low confidence
- Network access in prose of documentationAGENTS.md:223Low confidence
- Network access in prose of documentationAGENTS.md:224Low confidence
- Network access in prose of documentationAGENTS.md:225Low confidence
- Access to secrets in code of documentation: a variable, placeholder or call, not a stored valueAGENTS.md:239Low confidence
- Access to secrets in code of documentationAGENTS.md:260Low confidence
- Access to secrets in prose of documentation: a variable, placeholder or call, not a stored valueAGENTS.md:313Low confidence
- Network access in prose of documentationAGENTS.md:337Low confidence
- Network access in prose of documentationAGENTS.md:338Low confidence
- Network access in code of documentationAGENTS.md:342Low confidence
- Network access in code of documentationAGENTS.md:343Low confidence
- Network access in code of documentationAGENTS.md:348Low confidence
- Network access in code of documentationAGENTS.md:349Low confidence
- Network access in code of documentationAGENTS.md:350Low confidence
- Network access in prose of documentationAGENTS.md:355Low confidence
- Network access in prose of documentationAGENTS.md:356Low confidence
- Network access in prose of documentationAGENTS.md:359Low confidence
- Network access in prose of documentationAGENTS.md:360Low confidence
- Access to secrets in prose of documentationAGENTS.md:364Low confidence
- Access to secrets in prose of documentationAGENTS.md:388Low confidence
- Network access in code of documentationAGENTS.md:416Low confidence
- Network access in code of documentationAGENTS.md:417Low confidence
- Access to secrets in code of documentationAGENTS.md:421Low confidence
- Access to secrets in code of documentationAGENTS.md:426Low confidence
- Access to secrets in code of documentation: a variable, placeholder or call, not a stored valueAGENTS.md:427Low confidence
- Network access in code of documentationAGENTS.md:429Low confidence
- Network access in code of documentationAGENTS.md:430Low confidence
and 443 more
Only the first 500 facts are listed.
Works with
| Agent | Status | Evidence | Install to |
|---|---|---|---|
| Claude Code | Native | Manifest integrations/openclaw/.claude-plugin/plugin.json | .claude/skills/<skill-name>/ |
| Codex | Native | Manifest AGENTS.md | .agents/skills/<skill-name>/ |
| Cursor | Compatible | Standard SKILL.md SKILL.md | .cursor/skills/<skill-name>/ |
| Gemini CLI | Compatible | Standard SKILL.md SKILL.md | .gemini/skills/<skill-name>/ |
| GitHub Copilot | Compatible | Standard SKILL.md SKILL.md | .github/skills/<skill-name>/ |
| OpenCode | Compatible | Standard SKILL.md SKILL.md | .opencode/skills/<skill-name>/ |
- Native The repository ships a manifest, folder or frontmatter field for this agent.
- Compatible A standard SKILL.md that this agent can read.
- Unknown No evidence either way.
Derived automatically from paths, manifests and frontmatter. Not tested on each agent.
Explore alternatives and comparisons
Add this badge to your README
It updates every night and links to this page.
[](https://hotskills.dev/skill/letsfg-letsfg/)