#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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

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.

Compare on GitHub

View on GitHubAdd to my skills

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>/
2.2kGitHub stars
23stars in 7 days
5skills in this repository
17commits in 30 days

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

Aug 1, 2026Nov 6, 20262,236

Individual skills in this repository

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 tokens

Always available to the agent

SKILL.md

7,487 tokens

When the skill is activated

Reference documents

118,704 tokens

Loaded on request

Token counts are estimates. Scripts run separately; they are not counted as reference context.

The playbook

  1. Identity
  2. Access Modes
  3. Skills
  4. Authentication
  5. Complete Workflow
  6. CLI Usage
  7. Python SDK Usage
  8. MCP Server Setup
  9. MCP Tools
  10. Search Flags Reference
  11. Error Handling
  12. Rate Limits
  13. Pricing Summary
  14. Key Facts

Scripts executed separately

  • Dockerfile
  • Model.js
  • assets/ranking.js
  • docs/assets/domain-redirect.js
  • integrations/openclaw/package.json
  • lighthouserc.js
  • models/__init__.py
  • models/flights.py
  • preview/build_stubs.py
  • preview/run.py
  • sdk/js/package.json
  • sdk/js/src/auth.test.ts
  • sdk/js/src/auth.ts
  • sdk/js/src/cli.ts
  • sdk/js/src/index.test.ts
  • sdk/js/src/index.ts
  • sdk/js/src/offer-details.ts
  • sdk/js/src/ranking.ts
  • sdk/js/src/trip-purpose.ts
  • sdk/mcp/package.json
  • sdk/mcp/src/index.test.ts
  • sdk/mcp/src/index.ts
  • sdk/python/_jetstar_checkout_validate.py
  • sdk/python/examples/quickstart.py
  • sdk/python/google_checkout_live_sweep.py
  • sdk/python/letsfg/__init__.py
  • sdk/python/letsfg/__main__.py
  • sdk/python/letsfg/cli.py
  • sdk/python/letsfg/client.py
  • sdk/python/letsfg/config.py
  • sdk/python/letsfg/connectors/__init__.py
  • sdk/python/letsfg/connectors/airport_tz.py
  • sdk/python/letsfg/connectors/auth.py
  • sdk/python/letsfg/local.py
  • sdk/python/letsfg/models.py
  • sdk/python/letsfg/models/__init__.py
  • sdk/python/letsfg/models/flights.py
  • sdk/python/letsfg/system_info.py
  • sdk/python/tests/__init__.py
  • sdk/python/tests/test_ancillary_connector_parsing.py
  • sdk/python/tests/test_auth_user_agent.py
  • sdk/python/tests/test_booking_holdings_booking_urls.py
  • sdk/python/tests/test_checkout_engine_configs.py
  • sdk/python/tests/test_cli_declined_card.py
  • sdk/python/tests/test_cli_offer_shape.py
  • sdk/python/tests/test_connect_auth.py
  • sdk/python/tests/test_connect_auth_scope.py
  • sdk/python/tests/test_connector_parsing.py
  • sdk/python/tests/test_country_filter_completeness.py
  • sdk/python/tests/test_currency_rates.py
  • sdk/python/tests/test_duration_timezone.py
  • sdk/python/tests/test_emirates_connector.py
  • sdk/python/tests/test_flight_duration_backfill.py
  • sdk/python/tests/test_hotel_booking_contract.py
  • sdk/python/tests/test_india_direct_sources.py
  • sdk/python/tests/test_india_ota_sources.py
  • sdk/python/tests/test_india_user_surfaces.py
  • sdk/python/tests/test_models_read_bearer_lane_offers.py
  • sdk/python/tests/test_public_offer_masking.py
  • sdk/python/tests/test_regional_cross_area_validation.py
  • sdk/python/tests/test_regional_india_sources.py
  • sdk/python/tests/test_search_api_key_lane_field_names.py
  • sdk/python/tests/test_search_unauthorized.py
  • sdk/python/tests/test_skyscanner_connector.py
  • sdk/python/tests/test_source_country_filter.py
  • sdk/python/tests/test_starlink_flights.py
  • sdk/python/tests/test_telemetry_enrichment.py
  • sdk/python/tests/test_tripcom_connector.py
  • sdk/python/tests/test_user_agent_everywhere.py
  • sdk/python/tests/test_vueling_connector.py
  • sdk/python/tests/test_wizzair_connector.py
  • test/model-test.js
  • tools/build-airports.py
  • tools/build-icons.py
  • tools/build-ranking.py
  • tools/check-search-invariant.py
  • tools/split-comparison.py
  • tools/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 bytes
  • AGENTS.mddoc51,475 bytes
  • BarWidget.qmlasset4,101 bytes
  • CLAUDE.mddoc14,324 bytes
  • CODE_OF_CONDUCT.mddoc2,531 bytes
  • CONTRIBUTING.mddoc3,794 bytes
  • Dockerfileruns881 bytes
  • Dockerfile.pythonasset1,786 bytes
  • LICENSEasset2,173 bytes
  • Model.jsruns120,021 bytes
  • OMARCHY-PLUGIN.mddoc26,133 bytes
  • Panel.qmlasset193,098 bytes
  • README.mddoc48,499 bytes
  • SECURITY.mddoc2,280 bytes
  • SKILL.mdcore28,502 bytes
  • SKILL.mdcore28,502 bytes
  • SKILL.mdcore28,502 bytes
  • SKILL.mdcore28,502 bytes
  • SKILL.mdcore28,502 bytes
  • SKILL.mdcore28,502 bytes
  • SKILL.mdcore28,502 bytes
  • assets/Kalam-Bold.ttfasset460,896 bytes
  • assets/Lexend.ttfasset175,756 bytes
  • assets/OFL-Kalam.txtdoc4,373 bytes
  • assets/OFL.txtdoc4,436 bytes
  • assets/airports.jsonasset477,620 bytes
  • assets/badge-instagram.svgasset398 bytes
  • assets/badge-tiktok.svgasset392 bytes
  • assets/badge-x.svgasset382 bytes
  • assets/banner.pngasset36,027 bytes
  • assets/demo.gifasset4,037,616 bytes
  • assets/demo.mp4asset2,541,044 bytes
  • assets/destinations/BCN.jpgasset19,174 bytes
  • assets/destinations/DPS.jpgasset20,004 bytes
  • assets/destinations/DXB.jpgasset19,456 bytes
  • assets/destinations/NYC.jpgasset9,627 bytes
  • assets/destinations/PAR.jpgasset22,306 bytes
  • assets/destinations/TYO.jpgasset26,518 bytes
  • assets/icons/LICENSEasset922 bytes
  • assets/icons/arrow-left-right-muted.pngasset742 bytes
  • assets/icons/arrow-left-right-orange.pngasset610 bytes
  • assets/icons/arrow-right-faint.pngasset458 bytes
  • assets/icons/arrow-right-muted.pngasset525 bytes
  • assets/icons/arrow-up-down-muted.pngasset761 bytes
  • assets/icons/arrow-up-down-orange.pngasset678 bytes
  • assets/icons/backpack-green.pngasset1,250 bytes
  • assets/icons/backpack-muted.pngasset1,240 bytes
  • assets/icons/calendar-ink.pngasset701 bytes
  • assets/icons/calendar-muted.pngasset780 bytes
  • assets/icons/chevron-down-faint.pngasset412 bytes
  • assets/icons/chevron-down-muted.pngasset455 bytes
  • assets/icons/chevron-down-orange.pngasset380 bytes
  • assets/icons/circle-check-green.pngasset1,703 bytes
  • assets/icons/globe-muted.pngasset2,175 bytes
  • assets/icons/hotel-faint.pngasset905 bytes
  • assets/icons/hotel-muted.pngasset913 bytes
  • assets/icons/hotel-orange.pngasset832 bytes
  • assets/icons/luggage-green.pngasset850 bytes
  • assets/icons/luggage-muted.pngasset867 bytes
  • assets/icons/map-pin-muted.pngasset2,019 bytes
  • assets/icons/map-pin-orange.pngasset1,813 bytes
  • assets/icons/minus-faint.pngasset230 bytes
  • assets/icons/minus-muted.pngasset231 bytes
  • assets/icons/plane-faint.pngasset1,906 bytes
  • assets/icons/plane-muted.pngasset1,917 bytes
  • assets/icons/plane-orange.pngasset1,787 bytes
  • assets/icons/plane-white.pngasset1,097 bytes
  • assets/icons/plus-faint.pngasset379 bytes
  • assets/icons/plus-muted.pngasset385 bytes
  • assets/icons/search-muted.pngasset1,404 bytes
  • assets/icons/search-white.pngasset793 bytes
  • assets/icons/triangle-alert-amber.pngasset1,118 bytes
  • assets/icons/users-ink.pngasset1,150 bytes
  • assets/icons/users-muted.pngasset1,323 bytes
  • assets/icons/x-muted.pngasset597 bytes
  • assets/letsfg-logo.pngasset7,948 bytes
  • assets/logo.pngasset23,376 bytes
  • assets/name-fallbacks.jsonasset767 bytes
  • assets/ranking.jsruns106,976 bytes
  • assets/sponsor-evomi.pngasset231,377 bytes
  • context7.jsonasset3,630 bytes
  • docker-compose.ymlasset1,532 bytes
  • docs/TESTING.mddoc12,672 bytes
  • docs/agent-guide.mddoc23,884 bytes
  • docs/api-booking.mddoc11,326 bytes
  • docs/api-errors.mddoc4,377 bytes
  • docs/api-guide.mddoc7,601 bytes
  • docs/api-onboarding.mddoc6,587 bytes
  • docs/api-polling.mddoc5,118 bytes
  • docs/api-sandbox.mddoc17,051 bytes
  • docs/api-search.mddoc17,692 bytes
  • docs/architecture-guide.mddoc15,296 bytes
  • docs/assets/domain-redirect.jsruns399 bytes
  • docs/assets/extra-20261004.cssasset16,373 bytes
  • docs/assets/extra.cssasset15,355 bytes
  • docs/assets/letsfg-favicon.pngasset3,088 bytes
  • docs/assets/letsfg-wordmark.pngasset7,563 bytes
  • docs/cli-reference.mddoc7,470 bytes
  • docs/getting-started.mddoc11,043 bytes
  • docs/hotels.mddoc10,325 bytes
  • docs/index.mddoc9,896 bytes
  • docs/mcp.mddoc6,466 bytes
  • docs/openapi.mddoc3,970 bytes
  • docs/overrides/.gitkeepasset75 bytes
  • docs/packages.mddoc11,087 bytes
  • docs/quickstart-claude.mddoc5,523 bytes
  • docs/quickstart-cursor.mddoc4,970 bytes
  • docs/quickstart-windsurf.mddoc4,902 bytes
  • docs/self-hosting.mddoc5,507 bytes
  • docs/tutorials.mddoc19,639 bytes
  • glama.jsonasset103 bytes
  • integrations/hermes/.gitattributesasset32 bytes
  • integrations/hermes/LICENSEasset1,091 bytes
  • integrations/hermes/README.mddoc8,250 bytes
  • integrations/hermes/assets/banner.pngasset24,787 bytes
  • integrations/hermes/assets/logo.pngasset23,376 bytes
  • integrations/hermes/plugin.jsonasset625 bytes
  • integrations/openclaw/.claude-plugin/plugin.jsonasset493 bytes
  • integrations/openclaw/.gitattributesasset32 bytes
  • integrations/openclaw/.mcp.jsonasset330 bytes
  • integrations/openclaw/LICENSEasset1,091 bytes
  • integrations/openclaw/README.mddoc5,290 bytes
  • integrations/openclaw/assets/icon.pngasset23,376 bytes
  • integrations/openclaw/openclaw.plugin.jsonasset753 bytes
  • integrations/openclaw/package.jsonruns680 bytes
  • lighthouserc.jsruns1,167 bytes
  • manifest.jsonasset567 bytes
  • mcp-config.jsonasset764 bytes
  • mkdocs.ymlasset2,313 bytes
  • models/__init__.pyruns49 bytes
  • models/flights.pyruns6,232 bytes
  • openapi.yamlasset44,151 bytes
  • preview.pngasset379,511 bytes
  • preview/build_stubs.pyruns14,935 bytes
  • preview/fixture-offers-250.jsonasset147,999 bytes
  • preview/fixture-offers.jsonasset6,120 bytes
  • preview/main.qmlasset11,812 bytes
  • preview/run.pyruns13,354 bytes
  • preview/stubs/Quickshell/Io/FileView.qmlasset1,789 bytes
  • preview/stubs/Quickshell/Io/IpcHandler.qmlasset204 bytes
  • preview/stubs/Quickshell/Io/qmldirasset77 bytes
  • preview/stubs/Quickshell/Quickshell.qmlasset615 bytes
  • preview/stubs/Quickshell/qmldirasset58 bytes
  • preview/stubs/qs/Commons/Border.qmlasset206 bytes
  • preview/stubs/qs/Commons/Color.qmlasset544 bytes
  • preview/stubs/qs/Commons/Style.qmlasset921 bytes
  • preview/stubs/qs/Commons/qmldirasset110 bytes
  • preview/stubs/qs/Ui/BarWidget.qmlasset599 bytes
  • preview/stubs/qs/Ui/Button.qmlasset1,693 bytes
  • preview/stubs/qs/Ui/KeyboardPanel.qmlasset913 bytes
  • preview/stubs/qs/Ui/OpticalGlyph.qmlasset295 bytes
  • preview/stubs/qs/Ui/Panel.qmlasset1,347 bytes
  • preview/stubs/qs/Ui/PanelKeyCatcher.qmlasset383 bytes
  • preview/stubs/qs/Ui/PanelSeparator.qmlasset294 bytes
  • preview/stubs/qs/Ui/TextField.qmlasset720 bytes
  • preview/stubs/qs/Ui/WidgetButton.qmlasset1,540 bytes
  • preview/stubs/qs/Ui/qmldirasset293 bytes
  • sdk/js/README.mddoc16,754 bytes
  • sdk/js/letsfg-2026.5.72.tgzasset74,720 bytes
  • sdk/js/package-lock.jsonasset63,994 bytes
  • sdk/js/package.jsonruns1,288 bytes
  • sdk/js/src/auth.test.tsruns5,132 bytes
  • sdk/js/src/auth.tsruns13,481 bytes
  • sdk/js/src/cli.tsruns16,742 bytes
  • sdk/js/src/index.test.tsruns20,572 bytes
  • sdk/js/src/index.tsruns46,255 bytes
  • sdk/js/src/offer-details.tsruns23,004 bytes
  • sdk/js/src/ranking.tsruns65,760 bytes
  • sdk/js/src/trip-purpose.tsruns1,185 bytes
  • sdk/js/tsconfig.jsonasset330 bytes
  • sdk/mcp/README.mddoc28,408 bytes
  • sdk/mcp/letsfg-mcp-2026.5.75.tgzasset21,210 bytes
  • sdk/mcp/package-lock.jsonasset64,008 bytes
  • sdk/mcp/package.jsonruns1,162 bytes
  • sdk/mcp/src/index.test.tsruns20,530 bytes
  • sdk/mcp/src/index.tsruns65,773 bytes
  • sdk/mcp/tsconfig.jsonasset284 bytes
  • sdk/python/LICENSEasset1,063 bytes
  • sdk/python/README.mddoc28,830 bytes
  • sdk/python/_jetstar_checkout_validate.pyruns1,589 bytes
  • sdk/python/examples/quickstart.pyruns1,836 bytes
  • sdk/python/google_checkout_live_sweep.pyruns6,699 bytes
  • sdk/python/google_checkout_live_sweep_japan_longhaul.jsonasset7,188 bytes
  • sdk/python/google_checkout_live_sweep_longhaul_london_us.jsonasset5,735 bytes
  • sdk/python/google_checkout_live_sweep_results.jsonasset15,397 bytes
  • sdk/python/google_checkout_live_sweep_results_v2.jsonasset21,197 bytes
  • sdk/python/letsfg/__init__.pyruns1,861 bytes
  • sdk/python/letsfg/__main__.pyruns81 bytes
  • sdk/python/letsfg/cli.pyruns47,460 bytes
  • sdk/python/letsfg/client.pyruns53,978 bytes
  • sdk/python/letsfg/config.pyruns493 bytes
  • sdk/python/letsfg/connectors/__init__.pyruns350 bytes
  • sdk/python/letsfg/connectors/airport_tz.pyruns2,897 bytes
  • sdk/python/letsfg/connectors/auth.pyruns19,672 bytes
  • sdk/python/letsfg/local.pyruns11,853 bytes
  • sdk/python/letsfg/models.pyruns11,028 bytes
  • sdk/python/letsfg/models/__init__.pyruns12,761 bytes
  • sdk/python/letsfg/models/flights.pyruns22,239 bytes
  • sdk/python/letsfg/system_info.pyruns127 bytes
  • sdk/python/pyproject.tomlasset2,277 bytes
  • sdk/python/result.txtdoc0 bytes
  • sdk/python/tests/__init__.pyruns63 bytes
  • sdk/python/tests/test_ancillary_connector_parsing.pyruns13,614 bytes
  • sdk/python/tests/test_auth_user_agent.pyruns2,745 bytes
  • sdk/python/tests/test_booking_holdings_booking_urls.pyruns10,360 bytes
  • sdk/python/tests/test_checkout_engine_configs.pyruns33,096 bytes
  • sdk/python/tests/test_cli_declined_card.pyruns1,663 bytes
  • sdk/python/tests/test_cli_offer_shape.pyruns11,649 bytes
  • sdk/python/tests/test_connect_auth.pyruns6,430 bytes
  • sdk/python/tests/test_connect_auth_scope.pyruns4,384 bytes
  • sdk/python/tests/test_connector_parsing.pyruns8,417 bytes
  • sdk/python/tests/test_country_filter_completeness.pyruns848 bytes
  • sdk/python/tests/test_currency_rates.pyruns1,766 bytes
  • sdk/python/tests/test_duration_timezone.pyruns6,400 bytes
  • sdk/python/tests/test_emirates_connector.pyruns3,918 bytes
  • sdk/python/tests/test_flight_duration_backfill.pyruns3,438 bytes
  • sdk/python/tests/test_hotel_booking_contract.pyruns5,474 bytes
  • sdk/python/tests/test_india_direct_sources.pyruns9,414 bytes
  • sdk/python/tests/test_india_ota_sources.pyruns5,535 bytes
  • sdk/python/tests/test_india_user_surfaces.pyruns4,238 bytes
  • sdk/python/tests/test_models_read_bearer_lane_offers.pyruns5,192 bytes
  • sdk/python/tests/test_public_offer_masking.pyruns8,755 bytes
  • sdk/python/tests/test_regional_cross_area_validation.pyruns5,506 bytes
  • sdk/python/tests/test_regional_india_sources.pyruns3,618 bytes
  • sdk/python/tests/test_search_api_key_lane_field_names.pyruns1,651 bytes
  • sdk/python/tests/test_search_unauthorized.pyruns4,024 bytes
  • sdk/python/tests/test_skyscanner_connector.pyruns11,484 bytes
  • sdk/python/tests/test_source_country_filter.pyruns3,771 bytes
  • sdk/python/tests/test_starlink_flights.pyruns4,129 bytes
  • sdk/python/tests/test_telemetry_enrichment.pyruns3,604 bytes
  • sdk/python/tests/test_tripcom_connector.pyruns3,073 bytes
  • sdk/python/tests/test_user_agent_everywhere.pyruns4,698 bytes
  • sdk/python/tests/test_vueling_connector.pyruns5,598 bytes
  • sdk/python/tests/test_wizzair_connector.pyruns1,581 bytes
  • server.jsonasset1,535 bytes
  • smithery.yamlasset1,355 bytes
  • split-comparison.jsonasset9,180 bytes
  • test/model-test.jsruns84,199 bytes
  • tools/build-airports.pyruns12,094 bytes
  • tools/build-icons.pyruns5,241 bytes
  • tools/build-ranking.pyruns6,586 bytes
  • tools/check-search-invariant.pyruns3,061 bytes
  • tools/split-comparison.pyruns10,811 bytes
  • tools/validate.shruns4,744 bytes

No excerpt is shown for this license. Read the source on GitHub.

View the complete source on GitHub

Skills 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

  1. #495 from Oct 30 to Nov 1
  2. #498 on Nov 2
  3. #499 on Nov 3
  4. #501 on Nov 4
  5. #499 on Nov 5
  6. #501 since Nov 6
78 earlier periods
  1. #428 on Aug 1
  2. #413 on Aug 7
  3. #415 on Aug 8
  4. #404 on Aug 9
  5. #418 on Aug 10
  6. #416 on Aug 11
  7. #410 on Aug 12
  8. #418 on Aug 13
  9. #417 on Aug 14
  10. #412 on Aug 15
  11. #421 on Aug 17
  12. #425 on Aug 18
  13. #429 on Aug 19
  14. #423 on Aug 20
  15. #426 on Aug 21
  16. #411 on Aug 22
  17. #421 on Aug 23
  18. #415 on Aug 24
  19. #411 on Aug 25
  20. #406 on Aug 26
  21. #410 on Aug 27
  22. #411 on Aug 28
  23. #406 on Aug 29
  24. #398 on Aug 30
  25. #412 on Aug 31
  26. #416 on Sep 1
  27. #412 on Sep 2
  28. #415 on Sep 3
  29. #412 on Sep 5
  30. #407 on Sep 6
  31. #417 on Sep 7
  32. #420 on Sep 8
  33. #417 from Sep 9 to Sep 10
  34. #419 on Sep 11
  35. #415 from Sep 12 to Sep 13
  36. #425 on Sep 14
  37. #424 on Sep 15
  38. #429 on Sep 16
  39. #421 on Sep 17
  40. #428 on Sep 18
  41. #418 on Sep 19
  42. #424 on Sep 20
  43. #426 on Sep 21
  44. #433 on Sep 22
  45. #427 on Sep 23
  46. #420 on Sep 24
  47. #421 on Sep 25
  48. #418 on Sep 26
  49. #430 on Sep 27
  50. #435 on Sep 28
  51. #443 on Sep 29
  52. #439 on Sep 30
  53. #438 on Oct 1
  54. #434 on Oct 2
  55. #423 on Oct 3
  56. #418 on Oct 4
  57. #429 on Oct 5
  58. #436 on Oct 6
  59. #441 on Oct 7
  60. #446 on Oct 8
  61. #450 on Oct 9
  62. #441 on Oct 10
  63. #454 on Oct 12
  64. #449 on Oct 13
  65. #451 on Oct 14
  66. #453 on Oct 15
  67. #458 on Oct 16
  68. #447 on Oct 17
  69. #454 on Oct 18
  70. #463 on Oct 19
  71. #466 on Oct 20
  72. #473 on Oct 21
  73. #467 on Oct 22
  74. #465 on Oct 23
  75. #454 on Oct 24
  76. #488 on Oct 25
  77. #493 on Oct 28
  78. #492 on Oct 29

Before you install

Network or broad shell

Automated 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:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • assets/airports.json:1 Analysis incomplete: physical or joined line exceeds character limit
  • preview/fixture-offers-250.json:1 Analysis incomplete: physical or joined line exceeds character limit
  • agent-skills-contribution/packages/skills-catalog/skills/(tooling)/letsfg/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • agent-skills-contribution/packages/skills-catalog/skills/(tooling)/letsfg/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • agent-skills-contribution/packages/skills-catalog/skills/(tooling)/letsfg/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • agent-skills-contribution/packages/skills-catalog/skills/(tooling)/letsfg/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • agent-skills-contribution/packages/skills-catalog/skills/(tooling)/letsfg/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • agent-skills-contribution/packages/skills-catalog/skills/(tooling)/letsfg/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • agent-skills-contribution/packages/skills-catalog/skills/(tooling)/letsfg/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • agent-skills-contribution/packages/skills-catalog/skills/(tooling)/letsfg/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • agent-skills-contribution/packages/skills-catalog/skills/(tooling)/letsfg/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • agent-skills-contribution/packages/skills-catalog/skills/(tooling)/letsfg/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • agent-skills-contribution/packages/skills-catalog/skills/(tooling)/letsfg/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
  • agent-skills-contribution/packages/skills-catalog/skills/(tooling)/letsfg/SKILL.md:1 Analysis incomplete: Referenced executable target unavailable; not analyzed
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

  • Network accessline 61
    This Code of Conduct is adapted from the [Contributor Covenant](https://www.contributor-covenant.org/),
  • Network accessline 63
    [https://www.contributor-covenant.org/version/2/1/code_of_conduct.html](https://www.contributor-covenant.org/version/2/1/code_of_conduct.html).

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

  • Network accessline 38
    - Email: contact@letsfg.co - Founder: adam@letsfg.co - GitHub: https://github.com/LetsFG/LetsFG/issues
  • Network accessline 40
    - GitHub: https://github.com/LetsFG/LetsFG/issues

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
    &nbsp;&nbsp; [<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) &nbsp;&nbsp;
  • 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
    &nbsp;&nbsp; [<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) &nbsp;&nbsp;
  • 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
    &nbsp;&nbsp; [<img src="assets/badge-tiktok.svg" alt="Follow on TikTok">](https://www.tiktok.com/@letsfg_) &nbsp;&nbsp;
  • 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
    &nbsp; <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
    &nbsp; <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
    &nbsp; <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
    &nbsp; <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
    [![GitHub stars](https://letsfg.co/api/stars/badge)](https://github.com/LetsFG/LetsFG)
  • Network accessline 66
    [![PyPI](https://img.shields.io/pypi/v/letsfg)](https://pypi.org/project/letsfg/)
  • Network accessline 67
    [![npm](https://img.shields.io/npm/v/letsfg-mcp?label=npm%20%28MCP%29)](https://www.npmjs.com/package/letsfg-mcp)
  • Network accessline 68
    [![Connector Health](https://letsfg.co/developers/api/v1/analytics/connectors/health/badge)](https://letsfg.co/developers/connectors/health)
  • Network accessline 69
    [![MCPVault: claimed](https://mcpvault.io/badge/letsfg.svg)](https://mcpvault.io/servers/letsfg/health?utm_source=external_badge&utm_medium=referral&utm_campaign=mcp_health_report)
  • Network accessline 70
    [![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](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

  • Network accessline 60
    - **Security issues:** security@letsfg.co - **General questions:** Open a [GitHub Issue](https://github.com/LetsFG/LetsFG/issues)
  • Network accessline 61
    - **General questions:** Open a [GitHub Issue](https://github.com/LetsFG/LetsFG/issues)

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

  • 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: http://scripts.sil.org/OFL
  • Network accessline 5
    http://scripts.sil.org/OFL

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
    [![PyPI](https://img.shields.io/pypi/v/letsfg)](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
    [![npm](https://img.shields.io/npm/v/letsfg)](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
    [![npm](https://img.shields.io/npm/v/letsfg-mcp)](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

  • Network accessline 1
    {   "$schema": "https://glama.ai/mcp/schemas/server.json",
  • Network accessline 2
    "$schema": "https://glama.ai/mcp/schemas/server.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

  • Network accessline 2
    "mcpServers": {     "letsfg": {       "url": "https://letsfg.co/mcp",
  • Network accessline 3
    "letsfg": {       "url": "https://letsfg.co/mcp",       "description": "Enable this plugin and connect your LetsFG account in OpenClaw.",
  • Network accessline 4
    "url": "https://letsfg.co/mcp",

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

  • Network accessline 14
    "mcpServers": {     "letsfg": {       "url": "https://letsfg.co/mcp",
  • Network accessline 15
    "letsfg": {       "url": "https://letsfg.co/mcp",       "description": "Enable this plugin and connect your LetsFG account in OpenClaw.",
  • Network accessline 16
    "url": "https://letsfg.co/mcp",

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

  • Network accessline 1
    site_name: LetsFG Docs site_url: https://letsfg.co/developers/docs
  • Network accessline 2
    site_url: https://letsfg.co/developers/docs
  • Network accessline 6
    repo_url: https://github.com/LetsFG/LetsFG

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 69
    [Credential-related source omitted]
  • Access to secretsline 137
    [Credential-related source omitted]
  • Access to secretsline 146
    [Credential-related source omitted]

sdk/js/README.md

  • Network accessline 5
    [![GitHub stars](https://img.shields.io/github/stars/LetsFG/LetsFG?style=social)](https://github.com/LetsFG/LetsFG)
  • Network accessline 6
    [![npm](https://img.shields.io/npm/v/letsfg)](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
    [![npm](https://img.shields.io/npm/v/letsfg-mcp)](https://www.npmjs.com/package/letsfg-mcp)
  • Network accessline 8
    [![GitHub stars](https://img.shields.io/github/stars/LetsFG/LetsFG?style=social)](https://github.com/LetsFG/LetsFG)
  • Network accessline 9
    [![MIT License](https://img.shields.io/badge/license-MIT-blue.svg)](../../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

  • Executable scriptline 1
    Executable file
  • Network accessline 36
    "repository": {     "type": "git",     "url": "https://github.com/LetsFG/LetsFG.git"
  • Network accessline 37
    "type": "git",     "url": "https://github.com/LetsFG/LetsFG.git"   },
  • Network accessline 38
    "url": "https://github.com/LetsFG/LetsFG.git"

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
    [![GitHub stars](https://img.shields.io/github/stars/LetsFG/LetsFG?style=social)](https://github.com/LetsFG/LetsFG)
  • Network accessline 6
    [![PyPI](https://img.shields.io/pypi/v/letsfg)](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&currencyCd=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&currencyCd=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&currencyCd=USD&fareBasis=TAWQA0BQ:UAVGA0BQ&vendorRedirectFlag=true&vendorID=Google&itinSegment

sdk/python/letsfg/__init__.py

  • Executable scriptline 1
    Executable file
  • Access to secretsline 21
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 11
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Network accessline 50
    def fake_urlopen(req, timeout=None):             captured["headers"] = dict(req.header_items())             return _DummyResponse(402, {"setup_url": "https://letsfg.co/x"})
  • Network accessline 52
    return _DummyResponse(402, {"setup_url": "https://letsfg.co/x"})

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 37
    [Credential-related source omitted]
  • Access to secretsline 80
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 35
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Network accessline 70
    def test_build_search_url_encodes_query():     assert build_search_url("UA 1234") == "https://www.starlinkflights.com/search?q=UA+1234"
  • Network accessline 71
    assert build_search_url("UA 1234") == "https://www.starlinkflights.com/search?q=UA+1234"

sdk/python/tests/test_telemetry_enrichment.py

  • Executable scriptline 1
    Executable file
  • Access to secretsline 45
    [Credential-related source omitted]
  • Access to secretsline 52
    [Credential-related source omitted]
  • Access to secretsline 54
    [Credential-related source omitted]
  • Access to secretsline 77
    [Credential-related source omitted]

sdk/python/tests/test_tripcom_connector.py

  • Executable scriptline 1
    Executable file

sdk/python/tests/test_user_agent_everywhere.py

  • Executable scriptline 1
    Executable file
  • Access to secretsline 112
    [Credential-related source omitted]

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

  • Executable scriptline 1
    Executable file
  • Access to secretsline 30
    [Credential-related source omitted]

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 compatibility, from the files in this repository
AgentStatusEvidenceInstall to
Claude CodeNativeManifest integrations/openclaw/.claude-plugin/plugin.json.claude/skills/<skill-name>/
CodexNativeManifest AGENTS.md.agents/skills/<skill-name>/
CursorCompatibleStandard SKILL.md SKILL.md.cursor/skills/<skill-name>/
Gemini CLICompatibleStandard SKILL.md SKILL.md.gemini/skills/<skill-name>/
GitHub CopilotCompatibleStandard SKILL.md SKILL.md.github/skills/<skill-name>/
OpenCodeCompatibleStandard 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.

LetsFG/LetsFG: #501 on hotskills, 2.2k stars

[![LetsFG/LetsFG on hotskills](https://hotskills.dev/badge/letsfg-letsfg.svg)](https://hotskills.dev/skill/letsfg-letsfg/)