Commit Graph

3738 Commits

Author SHA1 Message Date
Émile Ré
7cd8c516b9 Add uncategorised cookie category
Replace the `required` boolean column on cookie_categories with a `kind`
enum (NORMAL, NECESSARY, UNCATEGORISED). The Necessary category remains
undeletable and always-on for consent; the new Uncategorised category is
also undeletable but users can opt out of it.

When a category is deleted, its cookies are merged into the Uncategorised
category (lazy-created for legacy banners that don't have one yet).

Signed-off-by: Émile Ré <emile@getprobo.com>
2026-04-21 11:40:21 +04:00
Émile Ré
2147cded9f Add configuration propagation rules
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-04-21 11:38:52 +04:00
Sacha Al Himdani
f7070c43a4 Serialize gqlgen codegen to fix build cache race
Parallel gqlgen instances race on the Go build cache, causing
Rewriter.getSource() to panic with "slice bounds out of range"
when go/packages returns empty source. Chain gqlgen targets with
order-only prerequisites in the Makefile and switch the CI build
job to sequential generation.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-04-20 16:33:58 +02:00
Émile Ré
16f4fcd9da Fix type errors on cookie banner pages
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-04-20 18:07:30 +04:00
Émile Ré
7f852aebc5 Comment unused graphql field
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-04-20 18:02:26 +04:00
Émile Ré
4555d1e867 Fix missing space + hide page from sidebar
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-04-20 17:59:36 +04:00
Émile Ré
3ed1d5e4dd Add links to docs
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-04-20 17:52:17 +04:00
Émile Ré
6dc234bbe9 Fix review issues: clipboard error handling, merge conflicts, mutation error checks, and category ranking
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-04-20 17:47:07 +04:00
Émile Ré
09ddbb1f51 Replace back link with breadcrumb on NewCookieBannerPage and remove CookieBannersLayout
Move the PageHeader into CookieBannersOverviewPage directly since
the layout had only one child route left after extracting the "new"
route as a sibling, making the wrapper unnecessary.

Signed-off-by: Émile Ré <emile@getprobo.com>
2026-04-20 17:47:07 +04:00
Émile Ré
d27d36f1ae Remove additionnal code snippets
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-04-20 17:47:07 +04:00
Émile Ré
5094ff49df Add reorderCookieCategory mutation
Category reordering previously required two separate
updateCookieCategory calls to swap ranks, which was not
atomic. Replace with a single reorderCookieCategory mutation
that shifts all affected ranks in one SQL statement, and
remove the rank field from UpdateCookieCategoryInput.

Signed-off-by: Émile Ré <emile@getprobo.com>
2026-04-20 17:47:07 +04:00
Émile Ré
9511fa3bd4 Review fixes
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-04-20 17:47:06 +04:00
Émile Ré
de73199ff2 Rename useMutation destructured vars to match graphql tagged node
Replace generic names (commitMutation, commitCreate, isInFlight, etc.)
with names derived from the graphql tagged-template variable minus the
Mutation suffix. Add naming convention rule to contrib/claude/relay.md.

Signed-off-by: Émile Ré <emile@getprobo.com>
2026-04-20 17:47:06 +04:00
Émile Ré
465f43d359 Refactor UX to remove useless page
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-04-20 17:47:06 +04:00
Émile Ré
a6c9b2f3a7 Remove examples on snippet page
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-04-20 17:47:05 +04:00
Émile Ré
a60f5dfa95 Fix relay/unused-fields ESLint warnings
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-04-20 17:47:05 +04:00
Émile Ré
ddc97208e5 Handle cookie banner version sync on updates
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-04-20 17:47:05 +04:00
Émile Ré
c271938525 Add cookies page + refactor relay tree
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-04-20 17:47:04 +04:00
Émile Ré
619cdd0e6c Update contrib guides
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-04-20 17:47:04 +04:00
Émile Ré
1ec8e475de Add UX for cookie banner management
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-04-20 17:47:04 +04:00
Sacha Al Himdani
6c5c1fa818 Remove meeting feature
Drop meetings and meeting_attendees tables, remove all meeting-related
code across GraphQL, MCP, CLI, N8N, webhooks, frontend, and e2e tests.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-04-20 15:37:39 +02:00
Sacha Al Himdani
c32aff5e9e Add migration to deduplicate connectors and enforce uniqueness
Delete duplicate connectors per (organization_id, provider), keeping the
oldest one, then add a unique index to prevent future duplicates.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-04-20 15:07:30 +02:00
Sacha Al Himdani
55563226cb Data as document: replace snapshot with publish workflow
Mirror the SOA-to-document migration for the data list. Remove data
from the snapshot system and add a publish workflow that generates a
ProseMirror document for the full organization data inventory.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-04-20 14:44:00 +02:00
Bryan Frimin
472ca703b5 Mitiate SSRF attack
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-04-20 12:11:17 +02:00
Sacha Al Himdani
5b8918bd5a Add approval quorum and decision read tools
Expose document version approval quorums and decisions
through MCP, CLI, and n8n. This lets users inspect who
approved or rejected a document version, including the
rejection comment, without relying solely on the audit
log.

MCP tools: listDocumentVersionApprovalQuorums,
getDocumentVersionApprovalQuorum,
listDocumentVersionApprovalDecisions,
getDocumentVersionApprovalDecision.

CLI commands: document list-approval-quorums,
view-approval-quorum, list-approval-decisions,
view-approval-decision.

n8n operations: Get/Get Many Approval Quorums and
Approval Decisions on the Document resource.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-04-20 10:45:17 +02:00
Bryan Frimin
685e9d2e69 Fix non-constant-time string != comparison
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-04-20 09:46:44 +02:00
Émile Ré
80a4d44e6d Add CSS custom properties for font size and button radius
Expose --probo-font-size and --probo-btn-radius so customers
can scale typography and button shape without overriding
internals. The type scale now uses calc() offsets from the
base variable. The settings button defaults now follow
--probo-accent so a single accent change updates both the
banner and the floating button.

Signed-off-by: Émile Ré <emile@getprobo.com>
2026-04-20 10:52:36 +04:00
Émile Ré
0ab448691d Fix race between initClient and disconnectedCallback
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-04-20 10:52:36 +04:00
Émile Ré
bc766ae5c9 Fix event listener and observer leaks in cookie banner
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-04-20 10:52:35 +04:00
Émile Ré
11a63b5dec Add readme
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-04-20 10:52:35 +04:00
Émile Ré
4da05b1368 Stop exposing internals
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-04-20 10:52:35 +04:00
Émile Ré
1e306e5076 Rename default banner to themed banner
Rename src/default/ to src/themed-banner/, update class names
(ProboDefaultBanner → ProboThemedBanner), style constant
(DEFAULT_STYLES → THEMED_STYLES), registration function
(registerDefault → registerThemedBanner), and adjust build
entrypoints and package.json exports accordingly.

Signed-off-by: Émile Ré <emile@getprobo.com>
2026-04-20 10:52:35 +04:00
Émile Ré
2e066c82ad Remove shadow DOM from headless components
Headless components are behavioral wrappers meant to be styled
by the consumer with regular CSS. Shadow DOM on each child
created unnecessary style boundaries with no visual content to
protect. Only ProboSettingsButton retains its own shadow root
since it renders encapsulated styled markup.

Also removes the auto-registerComponents() side effect from
the main entrypoint so consumers opt in explicitly.

Signed-off-by: Émile Ré <emile@getprobo.com>
2026-04-20 10:52:35 +04:00
Émile Ré
f0b5a13f6f Use URL objects for API endpoint construction
Store baseUrl as URL and build endpoints with new URL(path, base).
Accept URL | string in fetchJSON to avoid unnecessary .href calls.

Signed-off-by: Émile Ré <emile@getprobo.com>
2026-04-20 10:52:35 +04:00
Émile Ré
ce77091e6c Add validation for preference panel and category template
Validate that <probo-preference-panel> contains <probo-category-list>
and <probo-save-button>, and that the category template includes
<probo-category-toggle> and <probo-cookie-list>.

Signed-off-by: Émile Ré <emile@getprobo.com>
2026-04-20 10:52:34 +04:00
Émile Ré
d802ee611f Add headless web components for cookie banner UI
Introduce Shadow DOM-based custom elements that let customers build
their own cookie banner and preference panel while the SDK validates
structural compliance and auto-renders categories/cookies from config.

Components: probo-cookie-banner (root), probo-banner, probo-accept-button,
probo-reject-button, probo-customize-button, probo-preference-panel,
probo-category-list, probo-category, probo-category-toggle,
probo-cookie-list, probo-cookie, probo-save-button, probo-settings-button.

Signed-off-by: Émile Ré <emile@getprobo.com>
2026-04-20 10:52:34 +04:00
Bryan Frimin
82811f3b0b Style
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-04-19 12:00:53 +02:00
Bryan Frimin
0e701ec6e9 Style
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-04-19 12:00:53 +02:00
Bryan Frimin
11770b4058 Add OAuth2/OpenID Connect authorization server
Implement a full OAuth2 2.0 and OpenID Connect 1.0 authorization
server with support for authorization code flow (with PKCE),
refresh token rotation, device authorization grant, dynamic
client registration, token introspection, and token revocation.

Includes database schema, coredata layer, service logic, HTTP
handlers, OIDC discovery endpoint, and JWKS publishing.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-04-19 12:00:53 +02:00
Bryan Frimin
e84094e62c Add logging and encryption rules
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-04-19 11:59:22 +02:00
Bryan Frimin
5efe9e5b0f Update agent rules
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-04-19 11:49:55 +02:00
Bryan Frimin
29818714a8 Style
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-04-19 11:44:05 +02:00
Bryan Frimin
ab52dc0a34 Clean agent rules
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-04-19 11:42:50 +02:00
Émile Ré
aee77184df Add missing document migration instructions to changelog
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-04-18 10:04:46 +04:00
Sacha Al Himdani
db852522a4 Release v0.170.0
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-04-17 14:58:14 +02:00
Sacha Al Himdani
9c9c60d0eb Add webhook subscription MCP tools and N8N operations
Expose webhook subscription CRUD and event listing through the MCP API
(list, get, create, update, delete subscriptions + list events) and add
a new webhook resource to the N8N node with matching operations.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-04-17 13:14:49 +02:00
Aurélien Sibiril
7143944fba Use @deleteRecord on SCIM disconnect mutation
The custom updater on the SCIM disconnect mutation ran on every
response and nulled organization.scimConfiguration in the Relay store
-- including on error responses, which flipped the UI to the
"disconnected" state even when the backend had actually rejected the
delete.

Replace the updater with a @deleteRecord directive on the returned
deletedScimConfigurationId, matching the pattern already used in
SCIMConfiguration.tsx. @deleteRecord is a no-op when the returned id
is null, so error responses no longer produce a false-positive UI
update.

Signed-off-by: Aurélien Sibiril <81782+aureliensibiril@users.noreply.github.com>
2026-04-16 16:27:30 +02:00
Aurélien Sibiril
f15936dcdf Preserve shared connector on SCIM disconnect
DeleteSCIMConfiguration unconditionally deleted the underlying OAuth2
connector together with the SCIM bridge and config. When the same
connector was also referenced from access_sources -- which happens
when Google Workspace is used for both SCIM and access reviews -- the
access_sources.connector_id foreign key (NO ACTION) rejected the
DELETE, aborting the whole transaction. Nothing was deleted and the
resolver returned an INTERNAL error.

Check the access_sources reference count before deleting the connector
and skip the connector delete when it is still in use. The bridge's
own connector_id FK is ON DELETE SET NULL, so dropping the bridge
alone is sufficient to unbind SCIM; leaving the connector untouched
keeps the access source working.

Signed-off-by: Aurélien Sibiril <81782+aureliensibiril@users.noreply.github.com>
2026-04-16 16:27:30 +02:00
Aurélien Sibiril
2ea5f56ad6 Add CountByConnectorID helper on access sources
Helper for callers that need to know whether a given connector row is
still referenced by any access_sources. Used by the SCIM disconnect
flow, which would otherwise fail with a foreign-key violation when the
connector is shared with an access source.

Mirrors the shape of CountByOrganizationID.

Signed-off-by: Aurélien Sibiril <81782+aureliensibiril@users.noreply.github.com>
2026-04-16 16:27:30 +02:00
Aurélien Sibiril
0a5dfc652f Use typed error when SCIM bridge is not found
UpdateSCIMBridge returned bare fmt.Errorf("SCIM bridge not found")
strings on the two not-found branches (resource missing, and
cross-tenant mismatch). Every other call site returning the same
condition uses the typed NewSCIMBridgeNotFoundError(bridgeID) (see
lines 1962 and 2153 in this file).

Switch both branches to the typed error so the error shape is
consistent across the service and callers can use errors.As to
detect the condition.

Signed-off-by: Aurélien Sibiril <81782+aureliensibiril@users.noreply.github.com>
2026-04-16 16:24:09 +02:00