No Providers match "<query>". With a function or company
also selected, it shows No Providers match these filters.
The directory hides functions with no visible connectors in the whole branch.
Search updates counts without removing populated functions or companies. A
selected empty function stays visible so the reader can clear it.
By Vendor shows each company with its logo, from the company’s logo. A
company without a logo shows its initials. Every company stays listed, and the
search changes only its count.
The list has sections in this order: Needs Attention, Required, Suggested,
Connected, and then all other connectors. The sections use the current
Workspace’s connections and priorities. A card shows the connections of its own
connector. The product sets the priority of each of its connectors. One
connection satisfies the product: once a connector has a connection, the
product’s other connectors leave Required and Suggested and show under All
providers. The directory has no status filter. An old
?status=requested link opens Requested. A link with any other old
?status= value opens the full catalog. A company’s page,
/platform/providers/:vendor, lists the company’s products in the same
sections. Its cards keep their description and show the release stage as a
badge, except Generally Available and Early Access. It also has no status filter, and no header of its own: the trail
names the company with its logo, and the band shows its description.
A card shows the connector’s logo and name, and no description. The name and
the release stage are the connector’s own. The release stage shows as one word
on a band across the card’s top-right corner, while the pointer is on the card
or the keyboard focus is on it: Soon for Coming Soon and Invite for
Invite Only. On a screen with no hover, such as a phone, the band shows at all
times. A screen reader reads the full stage. Generally Available and Early
Access show no band. Early Access shows none for now, on purpose. Only the
band is hidden: the connector stays in Early Access in the data. A card with a
connection shows no release stage. A status line, such as “Last sync failed”,
shows under the name. Search still matches the connector’s description. The
logo is the connector’s own, else the product’s, else the company’s, else the
initials. A connector’s own logo that only repeats its company’s counts as
none. A card opens its
connector’s page
(Provider connections),
never the company page.
A pull connection whose setup never saved a credential is under Needs
Attention. Its card says that setup is not finished and asks for the
credentials. On the connector page, the connection’s form shows empty secret
fields, because no secret is stored. A connection with stored credentials
shows masked secret fields instead, and an empty field keeps the stored value.
Request Provider sits below Browse for Parable staff. It follows the
Browse list, so it moves up when that list gets shorter. Below it,
Requested shows the number of the Workspace’s open requests. It does not
show when the Workspace has no open requests, except while its view is open. Select Requested to list the
requests and to show their statuses: Pending, Researching, and Research
Complete. Search also filters the listed requests and the status counts by
name. The Requested count stays the Workspace’s total. For Parable staff,
the last page of products ends with a Request Provider tile when there is
no search. The tile also takes the place of an empty result, from search or a
filter. It does not follow the results of a search that finds products.
Browse Providers
Leaf groupings expose the Provider Plugin choices that can be configured. A
Provider may have more than one grouping when its products or deployment modes
require different credentials or endpoints.
The product list contains the complete visible catalog. This endpoint is an
exception to server pagination: the directory computes function counts and applies
search and the function or company filter before paging. Partial catalog pages would
produce incorrect counts and omit matching products. Database reads still use
bounded pages.
The endpoint remains public for catalog discovery before Workspace setup.
Currently, tenant headers and subdomains can supply Workspace context without a
membership check. That context affects priorities and release access, including
signed-out requests. PARABLE-7337
tracks membership enforcement for this route and category
connectorIds.
A failed release-flag read retains public products and hides invite-only products.
productKey references the company’s registered product catalog. Deployment and
authentication variants share that identity. Jira Cloud and Data Center, Workday
and RaaS, and Slack and events each appear as one product. connectorIds lists its
eligible Provider Plugins. Existing unregistered definitions use a company and
connector identity until an administrator assigns a product key. Product category membership is the
union of its live connector definitions’ versioned memberships. Live definitions
include draft variants. Their assignments contribute to an existing registered
product, but the directory does not offer draft connectors as connection choices.
The product list excludes draft connectors and applies release access before
returning products. groupingIds
identifies the visible configuration variants for each product. groupingPath
identifies its default configuration route.
variants lists the same visible variants as groupingIds, in the same
order, nested and Invite Access ones included. Each variant has its grouping
id, connectorId, name, description, its own logo (null when it has
none), releaseStage, groupingPath and the Workspace’s priority for it. A
variant’s groupingPath is the slugs of its groupings, from the company’s top
grouping down. web-api builds them from the grouping read that builds the
products, so the list costs no other read. That read uses the primary database,
because each grouping carries the inputs of the Invite Access gate.
The Workspace app draws one card for each variant, and the product still
decides which variants show, their priority, and the search. Each card names
its connector, and a card opens its variant’s page.
When variants does not cover a product’s groupingIds, as from a web-api
older than the field, the product keeps one card. That card holds the
connections of all the product’s variants, and each connection opens on its
own variant’s page:
- One connection opens its row.
- Several connections, some of which need attention, open the most urgent row.
- Healthy connections that all sit on one variant open that variant’s page.
- Otherwise, as with no connection, the card opens the product’s default configuration route.
/api/connectors/categories while signed in for the function hierarchy.
Each flat category record contains parentId and effective connectorIds for
its live descendants. Deprecated parent and children fields remain for existing
clients. parent contains shallow metadata and children remains empty. New clients
must build the hierarchy from parentId. Regenerate clients to use the new field. IDs use the same release, draft, and internal-product
filters as the directory. Directory entries carry effective categoryIds, including
ancestors. Clients do not expand membership again. The Workspace app puts a
connector’s card in each category whose connectorIds include its Provider
Plugin. A Provider Plugin that no category names takes its product’s
categoryIds. Missing or deleted parents
stop inheritance. Cycle detection prevents repeated traversal. Categories marked
isLegacy preserve saved onboarding selections and do not appear in the directory.
The approved taxonomy lives in
services/pkg/connectordef/functioncategories/catalog.json. Its shape comes from
connectors-shared-types. The generated reader validates each load. The migration
renderer, development seed, research prompt, and research validator consume this
catalog. Migration 20261026153510 installs initial assignments once. The reusable
migration renderer updates vocabulary only. Development seeds initialize category
memberships only for connectors created in that seed run. They preserve all
existing memberships and removals, including an empty selection. Later additions
and removals use the connector definition lock and revision history. Admin clients use connectors.addConnectorCategory and
connectors.removeConnectorCategory, with admin.connectors.update permission.
Repeated additions retain the membership ID. Repeated removals make no change.
Category edits invalidate an older promotion preview. Rollback captures the live
baseline before restoring recorded memberships and nullable product identity.
It preserves current legacy memberships but rejects newly restored categories
that are deleted or retired. A rejected rollback changes no definition or history.
Before the first deployment, run
services/web-db/scripts/preflight/provider_product_identity.sql in a read-only
transaction against staging and production web_db. It must return no rows.
The query detects a normalized key shared across companies or owned by another
company. Resolve collisions through the control plane before deployment.
The migration rejects a collision before it writes product identities, but the
migration runner records that failed version as dirty. Do not force a dirty
version without investigating the failed migration.
New full research must return functionCategories with approved slugs. An explicit
empty array means the evidence supports no category. Older research that omits
the field preserves the connector’s current memberships during promotion.
Admin-created connectors and first promotions from older research remain
unclassified until an administrator assigns categories. Fresh full research retries
missing or unknown categories through the quality-validation loop.
A product can belong directly to a parent category. TestRail and Zephyr use
Engineering because the approved taxonomy has no test-management leaf. Parent
counts include direct members, so child counts need not sum to the parent count.
Seed logs name initial connector slugs that are absent from the installed catalog.
New onboarding requests offer populated functions at every level. Selecting a
parent includes its descendants. Existing requests retain their saved category
IDs and legacy memberships. Onboarding choices and delegation links apply release
access. Existing connections can still complete saved requests when their products
are no longer available as new choices. Email links use Workspace release access
without inheriting the sender’s staff-preview permissions. An eligible email
item with an incomplete setup path links to the Provider Directory. Invalid or deleted
categories cannot enter a new request. A legacy category is accepted only when
that Workspace already saved it for the same milestone. Category lookup or
resolution failures stop the request before it writes a delegation or sends email.
The picker shows saved categories separately from new draft items. Only cards
added to the draft enter the new request. Removing a draft card does not remove
an earlier delegation.
If category metadata cannot load, the directory keeps product search and company
browsing available. Function filters use cached metadata when available. Without
metadata, function filters are unavailable until retry succeeds. Products do not
become Uncategorized because a lookup failed. Authentication and permission errors
retain their normal response. The onboarding picker shows an error and disables
Retry while its request runs. After a successful catalog read, unknown category
or company URL filters return to All and leave the URL. A failed category read
preserves the selected category URL for retry.
Open Providers from the Workspace sidebar. The sidebar also opens People
and Protection. Use the panel under the Providers header to browse available
Providers by function or company, and to see requests. In By Function one
category is open at each level: opening a category closes its open sibling and
everything open inside it. On the directory, choosing a category by its name
selects it. The category opens when it has subcategories, and the categories
that hold it open. Choose the selected category again to select All
functions: that category closes, with everything open inside it. All
functions closes every category. The directory with no category keeps the
open categories when the reader arrives in another way, such as with the
browser’s Back button. On a
desktop the panel shows on every Providers page. On a phone a Provider’s own page shows no panel
and no search box. There the panel is part of the directory’s page, so it
keeps no place across Providers pages: back on the directory, it opens as a
reload does. On a connector’s page the panel stays where the reader
was when that place holds the connector. It opens the deepest category that
the reader had open, or had selected on the directory, that holds the connector
directly. Else it takes the deepest of those categories that holds the
connector further down, and opens the first path to the connector inside it.
The selected category wins a tie. Else it opens
the connector’s first function and first category, as a page opened from a
link or a reload does. A reader who chose By Vendor last sees By
Vendor there, with the connector’s company selected. The category lists only
the connector, selected, so the panel does not grow with the catalog. The category’s count still counts
every connector in it, and its link opens the directory with all of them. A
connector in no category opens Uncategorized the same way. On a company
page the panel opens By Vendor with the company selected. There each row
is a link. A function or a company opens the directory with that filter and
the search box’s text. The function shows there selected and open. All
functions opens the directory with every category closed.
A connector’s page holds its docs and its connections in two tabs: Learn,
and Connect, which becomes Manage once the Workspace has a connection
(Provider connections). Open
Artifacts from the directory to inspect uploaded data assets.
Inspect existing connections
List the current Workspace’s Provider connections:docs, and connector.taps is empty unless the
request adds ?includeTaps=true, which
returns every data stream with its schema. Read one connection by ID
(/api/vendors/tenant-connector-instances/{id}) for its docs and data streams.
The same rule applies to the per-Provider, per-grouping, and grouped lists.
To check only whether the data of each connection is current, list the
connection freshness. It carries no Provider Plugin, grouping, or
authentication strategy, so it stays small:
- Each item has the connection’s
id,name,connectorSlug(the{connector}inproviders.{connector}.{table}),connectorName,connectionStatus,connectionStatusMessage,lastSyncAt, andlastSyncStatus. A push connection also haslastDataReceivedAt. - The status and the last sync are the same as in the full list.
- A page holds at most
limitconnections, newest first: 50 by default, 100 at most. It stops before 40,000 characters, but it always holds one connection. - Send
nextOffsetback asoffsetfor the next page. The last page has nonextOffset.