Skip to content

Log in through the connector proxy, relist Playtomic, offer catalog matches for known base URLs - #1127

Merged
helpcodeai merged 5 commits into
mainfrom
feat/playtomic-proxy-login-catalog-match
Oct 19, 2026
Merged

helpcodeai merged 5 commits into
mainfrom
feat/playtomic-proxy-login-catalog-match

Conversation

@helpcodeai

Copy link
Copy Markdown
Contributor

Summary

Two fixes for connectors people want but can't find or can't use.

Playtomic is usable again. Playtomic answers logins from datacenter IPs with a 403 HTML page, which is why both adapters were unlisted in #1042. Their tools already had useProxy: true, but the LOGIN_TOKEN login went out directly, so it never got a token. Now the login goes through the connector proxy whenever the tool call it serves is proxied. 8 marketplace searches for "playtomic" in the last 14 days found nothing.

The custom connector form offers the catalog connector. This month users built by hand connectors the catalog already had: Fatture in Cloud, Printify, Printful, Pinterest, Yandex Disk, Etsy and Telegram. The form now sends the typed base URL to GET /api/adapters/match-url. When a listed adapter serves that API, the form shows it with its tool count and a "Set it up instead" link to the guided setup.

Changes

Login through the proxy

  • LoginTokenService.getToken and forceRelogin take { proxyUrl }. The REST and GraphQL engines pass the call's proxy, and the login (including a salt fetch) uses the same unblocker agent as the tool call.
  • Without a proxy nothing changes.

Playtomic

  • playtomic and playtomic-public lose unlisted.
  • Their instructions explain the proxy routing, including that the proxy terminates TLS.
  • The live specs assert that both adapters are listed and that every tool is proxied.
  • docs/connectors/proxy.md documents the proxied login.

Catalog match for a base URL

  • New catalog-url-match.ts: it matches by host, without www.
  • A variable host label ({{SHOP}}.myshopify.com) matches any value as long as a fixed domain is left. A host that is only a variable ({{ODOO_URL}}) never matches.
  • When several adapters share a host (graph.facebook.com, googleapis.com), only those whose base path the URL starts with are kept, and the longest path ranks first. At most 5 results.
  • AdaptersService.matchByUrl covers listed adapters only, through the same installability filter as the catalog.
  • GET /api/adapters/match-url?url= requires a JWT.
  • The new-connector form debounces the request (400 ms) and skips it for Database connectors.

Counts: 475 → 477 adapters (adapter-count --check).

Cloud and self-hosted: both behave the same. Proxied login only happens where CONNECTOR_PROXY_URL is set and the tool opted in; on Cloud, the workspace proxy quota still counts tool calls only. The URL match uses each deployment's own installable catalog.

Type

  • Bug fix
  • New feature

Testing

Commands run in packages/backend unless noted:

  • npx tsc --noEmit -p tsconfig.json: exit 0.
  • npx jest: 660 suites passed, 4 skipped, 1 failed.
    • 19,798 tests passed.
    • The failing suite is database.engine.hana.spec.ts with "Cannot find module 'hdb'". The hdb module is missing from my local node_modules; this is unrelated to the change.
  • New tests:
    • login-token.service.spec.ts: the login and the salt fetch go through the proxy agent with proxy: false, and a call without a proxy logs in directly.
    • catalog-url-match.spec.ts: 17 tests, including the base URLs users actually typed checked against the real catalog.
  • npx eslint on the changed backend files: clean.
  • Repository root:
    • node scripts/validate-adapters.mjs --warn: exit 0, warnings identical to origin/main.
    • node scripts/adapter-count.mjs --check: OK, 477 adapters (20 keyless, 7,183 tools).
    • node scripts/regenerate-catalog.mjs: catalog.ts unchanged.
  • packages/frontend:
    • npx tsc --noEmit: exit 0.
    • npx eslint on the changed files: clean.
    • npx playwright test tests/e2e/catalog-url-match.spec.ts: 1 passed. An unknown URL shows no offer; api.printify.com/v1 shows Printify with a link to /connectors/setup/printify.
  • Live check from the Cloud droplet, with an existing customer Playtomic connector, read-only, printing status codes only:
    • login direct: 403 HTML;
    • login through the proxy: 200 with access_token;
    • GET /v1/tenants through the proxy: 200, 3 clubs.

Checklist

  • My code follows the existing code style
  • I have tested my changes locally
  • I have updated documentation
  • All existing tests pass (except the HANA suite noted above)
  • This PR has a descriptive title

Related Issues

Relates to #1042, which unlisted Playtomic.

Comment thread packages/frontend/tests/e2e/catalog-url-match.spec.ts Fixed
…atches

A LOGIN_TOKEN login now goes through the connector proxy when the tool call
it serves is proxied. Playtomic answers logins from datacenter IPs with a 403
page, so its proxied tools never got a token; through the proxy the login
and club search answer 200 again (checked from the Cloud droplet). Both
Playtomic adapters are listed again.

The custom connector form asks /api/adapters/match-url with the base URL the
user types and offers the ready-made catalog connector for that API. Users
built Printify, Fatture in Cloud, Pinterest, Yandex Disk, Etsy and Telegram
connectors by hand this month while the catalog had them.
@helpcodeai
helpcodeai force-pushed the feat/playtomic-proxy-login-catalog-match branch from d5c27f7 to e6633a7 Compare October 18, 2026 21:03
@helpcodeai
helpcodeai enabled auto-merge (squash) October 19, 2026 07:24
@helpcodeai
helpcodeai merged commit b4e6d84 into main Oct 19, 2026
14 checks passed
@helpcodeai
helpcodeai deleted the feat/playtomic-proxy-login-catalog-match branch October 19, 2026 07:58
@github-actions github-actions Bot locked and limited conversation to collaborators Oct 19, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants