Commit Graph

217 Commits

Author SHA1 Message Date
Bryan Frimin
2fe6ba3171 Release probod/v0.240.0
Signed-off-by: Bryan Frimin <bryan@probo.com>
2026-07-29 19:18:50 +02:00
Bryan Frimin
c8424174d7 Release prb/v0.206.0
Signed-off-by: Bryan Frimin <bryan@probo.com>
2026-07-29 19:18:25 +02:00
Ludovic Vielle
c6ad0154b9 Release probo-agent/v0.4.1
Signed-off-by: Ludovic Vielle <ludovic@probo.com>
2026-07-29 17:42:09 +02:00
Ludovic Vielle
c597b13f73 Simplify macOS agent installer enrollment copy
PKG users enroll in the browser at /enroll (or via
the menu bar icon), not through CLI install steps.
Shorten welcome and conclusion panes and drop path
inventories, MDM notes, and admin CLI setup.

Signed-off-by: Ludovic Vielle <ludovic@probo.com>
2026-07-29 17:21:16 +02:00
Ludovic Vielle
c9fa85ac52 Release probo-agent/v0.4.0
Signed-off-by: Ludovic Vielle <ludovic@probo.com>
2026-07-29 16:51:57 +02:00
Ludovic Vielle
4860acce35 Release probod/v0.239.0
Signed-off-by: Ludovic Vielle <ludovic@probo.com>
2026-07-29 16:51:44 +02:00
Bryan Frimin
8ff40db35f Release probod/v0.238.0
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-07-28 18:43:39 +02:00
Bryan Frimin
0446d89eda Release prb/v0.205.0
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-07-28 18:43:15 +02:00
Ludovic Vielle
570395c4ac Add opt-in shell lint and format targets
Introduce make lint-shell / fmt-shell with shellcheck and
shfmt (-i 2 -ci -bn), normalize first-party scripts, and
document the new targets. Keep them out of make lint / fmt.

Signed-off-by: Ludovic Vielle <ludovic@probo.com>
2026-07-28 17:37:34 +02:00
Bryan Frimin
bc64e5ead8 Release probod/v0.237.0 2026-07-27 19:01:37 +02:00
Bryan Frimin
e94d224261 Release prb/v0.204.0 2026-07-27 19:01:17 +02:00
Bryan Frimin
308b18dd10 Release probod/v0.236.0 2026-07-27 14:36:59 +02:00
Ludovic Vielle
1b7b2594eb Release probo-agent/v0.3.1
Signed-off-by: Ludovic Vielle <ludovic@probo.com>
2026-07-27 11:43:36 +02:00
Ludovic Vielle
d73fd02e91 Fix white frame around Probo Agent app icon
The master PNG was fully opaque, so its white corners showed as a
square frame once macOS composited the icon onto its rounded plate.
Swap in the auditor-mode artwork, which has transparent corners.

Signed-off-by: Ludovic Vielle <ludovic@probo.com>
2026-07-27 10:38:25 +02:00
Bryan Frimin
d872449091 Release probod/v0.235.0 2026-07-25 13:18:57 +02:00
Ludovic Vielle
ec65b54583 Release probo-agent/v0.3.0
Signed-off-by: Ludovic Vielle <ludovic@probo.com>
2026-07-24 22:48:32 +02:00
Ludovic Vielle
2532b0bb6b Add branded Finder icon for Probo Agent.app
The macOS URL-handler bundle had no CFBundleIconFile, so
Finder showed the generic app icon after PKG install. Keep a
single master PNG and generate AppIcon.icns at build time
with sips/iconutil, matching the auditor-mode approach.

Signed-off-by: Ludovic Vielle <ludovic@probo.com>
2026-07-24 22:16:15 +02:00
Ludovic Vielle
cb151c7c5a Release probo-agent/v0.2.0
Signed-off-by: Ludovic Vielle <ludovic@probo.com>
2026-07-24 16:54:01 +02:00
Ludovic Vielle
0dc64e1944 Simplify macOS pkg to one fat darwin.pkg
Signed-off-by: Ludovic Vielle <ludovic@probo.com>
2026-07-24 15:08:41 +02:00
Ludovic Vielle
85864a580c Install macOS helper from PKG for XPC enroll
Browser enrollment used osascript on every elevate. Ship a signed
privileged helper installed at PKG time so probo:// can enroll over
XPC with no second admin prompt. Add make install/uninstall/clean for
local PKG test loops, and show alerts only on failure.

Mirror the Go lint path for the macOS SPM package: Make
targets, root configs, and a Linux CI job. Keep checks
syntax-only so they do not need a macOS SDK. Format the
existing sources so the new gates start clean.

Signed-off-by: Ludovic Vielle <ludovic@probo.com>
2026-07-24 15:08:37 +02:00
Ludovic Vielle
754d12d583 Skip tray re-register on deep-link enroll
Browser enrollment succeeds once the device is ACTIVE, but the
macOS URL handler failed whenever install re-bootstrapped a tray
LaunchAgent the PKG had already installed. Skip registration when
the plist is current, treat live bootstrap as best-effort, and
exit successfully if the device is already enrolled so retries
do not show "Enrollment failed".

Signed-off-by: Ludovic Vielle <ludovic@probo.com>
2026-07-24 15:08:35 +02:00
Ludovic Vielle
afe0c84881 Ship signed universal macOS probo-agent pkg
Publish a notarized arm64+x86_64 .pkg from CI with the CGO tray
binary, Probo Agent.app, and global LaunchAgent. Keep the
LaunchDaemon enrollment-gated, align its plist path with the
launchd label, and document the Apple signing secrets.

Signed-off-by: Ludovic Vielle <ludovic@probo.com>
2026-07-24 15:08:33 +02:00
Ludovic Vielle
ae769f52a1 Serialize enrollment install with enrolling.lock
Concurrent enroll-url launches could both pass the enrollment
marker check and run overlapping elevated installs, racing on
LoadOrExchangeAPIKey and overwriting agent.key.

Add an exclusive flock on {configDir}/enrolling.lock for the
full install path and re-check IsEnrolled under that lock so
only one install exchanges a token and configures the device.

Signed-off-by: Ludovic Vielle <ludovic@probo.com>
2026-07-24 15:08:30 +02:00
Ludovic Vielle
1329f2a28e Add tray browser enrollment with region picker
The tray helper carried a ServerURL default that nothing read.
Unenrolled users can now open the console /enroll page from the
menu: US, EU, or self-hosted in production, or --server for dev.

Signed-off-by: Ludovic Vielle <ludovic@probo.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-07-24 15:08:29 +02:00
Ludovic Vielle
d0dd87c6c7 Add probo-agent binary, installer, and CI
Signed-off-by: Ludovic Vielle <ludovic@probo.com>
2026-07-24 15:08:25 +02:00
Bryan Frimin
b963730433 Release probod/v0.234.0 2026-07-24 14:24:30 +02:00
Bryan Frimin
318bbd40ef Release probod/v0.233.0 2026-07-22 17:56:12 +02:00
Ludovic Vielle
7ede7cd904 Release probod/v0.232.0
Signed-off-by: Ludovic Vielle <ludovic@probo.com>
2026-07-22 17:01:04 +02:00
Bryan Frimin
a77ada6f27 Release probod/v0.231.0 2026-07-22 14:18:06 +02:00
Bryan Frimin
a9a8cba1e2 Release prb/v0.203.0 2026-07-22 14:17:03 +02:00
Bryan Frimin
1f47bcae3c Release probod/v0.230.0 2026-07-21 18:24:25 +02:00
Bryan Frimin
9a23f6c9d0 Release prb/v0.202.0 2026-07-21 18:24:02 +02:00
Émile Ré
8f22fa93ad Release probod/v0.229.1
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-07-21 11:39:37 +02:00
Émile Ré
c68324307b Release probod/v0.229.0 2026-07-20 19:53:33 +02:00
Émile Ré
7b2934b388 Release prb/v0.201.0 2026-07-20 19:53:20 +02:00
Émile Ré
e27a830d76 Release probod/v0.228.0
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-07-20 18:28:49 +02:00
Émile Ré
26595b724f Serve compliance-portal instead of trust
Embed and build @probo/compliance-portal for the
/trust path and custom-domain SPA so production
ships the v2 portal. Keep apps/trust in the repo
for local use on port 5175; portal takes 5174.

Signed-off-by: Émile Ré <emile@probo.com>
2026-07-20 17:38:45 +02:00
Bryan Frimin
0cea92ac78 Release prb/v0.200.0
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-07-20 12:36:42 +02:00
Bryan Frimin
52991b9aac Release probod/v0.227.0
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-07-20 12:36:04 +02:00
Sacha Al Himdani
05d3f17ae7 Release probod/v0.226.1
Signed-off-by: Sacha Al Himdani <sacha@probo.com>
2026-07-15 18:50:40 +02:00
Sacha Al Himdani
54af2f7846 Release probod/v0.226.0
Signed-off-by: Sacha Al Himdani <sacha@probo.com>
2026-07-15 16:58:56 +02:00
Sacha Al Himdani
944bcb7380 Add updated-from entity snapshot to updated webhooks
Update webhook events now carry a top-level "updatedFrom" field
alongside "data", containing a full snapshot of the entity as it was
before the update. This lets subscribers diff old vs new state (for
example the prior membership role on user:updated) without tracking
prior state themselves. It is a complete snapshot with the same shape as
"data", not a partial diff, so consumers select whatever fields they
need. The field is omitted for non-update events.

The webhook_data table gains a nullable updated_from JSONB column, and
webhook.InsertUpdateData enqueues both snapshots; InsertData delegates to
it with a nil updatedFrom so non-update callers are unaffected. Each
*:updated emission site snapshots the entity right after load, before
mutation: obligation, third-party, user (org and SCIM flows), document,
document-version, and document-version-approval-quorum. The document
emit helpers gained an optional updatedFrom argument threaded through to
the payload.

For document-version-approval-quorum:updated the snapshot requires an
extra query, so it is now gated behind the same subscription-existence
check the emitter uses: when no subscriber is configured the load is
skipped entirely rather than running (and potentially failing the
approval) for an event nobody receives.

Add integration tests (against a real Postgres, skipped when none is
reachable) covering the updated_from round-trip, the SQL NULL behavior
when no snapshot is provided, and the no-op when no subscription matches,
plus a unit test asserting updatedFrom is omitted from the payload when
absent.

Document the new field in the probod and n8n changelogs and the n8n
README.

Signed-off-by: Sacha Al Himdani <sacha@probo.com>
2026-07-15 13:59:41 +02:00
Sacha Al Himdani
4c57d201a4 Make license declarations consistently MIT
The source headers, LICENSE files, and license metadata had drifted
apart. Align the entire project to MIT:

- Convert every source-file header to the MIT text across all comment
  styles (Go, TS, TSX, JS, MJS, SQL, CSS, GraphQL, shell), including
  SPDX-License-Identifier tags
- Set the root and cookie-banner LICENSE files to the MIT text with a
  "MIT License" title line
- Switch the package.json license fields, Docker image label, and
  cookie-banner README to MIT
- Update docs and the genmodels header generator accordingly
- Normalize copyright lines to a single format
  (Copyright (c) <year(s)> Probo Inc <hello@probo.com>.): unify the
  hello@getprobo.com and hello@probo.inc emails to hello@probo.com and
  the comma-separated years to a hyphenated range

Genuine third-party references are intentionally left untouched: the
Lucide icon attributions (Lucide is ISC) and the trivy dependency
license allowlist.

Signed-off-by: Sacha Al Himdani <sacha@probo.com>
2026-07-13 16:21:14 +02:00
Sacha Al Himdani
db841d5f19 Release probod/v0.225.0
Signed-off-by: Sacha Al Himdani <sacha@probo.com>
2026-07-13 14:47:46 +02:00
Sacha Al Himdani
920cbb0a26 Release probod/v0.224.1
Signed-off-by: Sacha Al Himdani <sacha@probo.com>
2026-07-09 11:37:10 +02:00
Sacha Al Himdani
e8bd8e486a Release probod/v0.224.0
Signed-off-by: Sacha Al Himdani <sacha@probo.com>
2026-07-09 10:55:32 +02:00
Sacha Al Himdani
86c45875a4 Whitelist ownership grants via allow policies
Replace the deny-based restriction on granting OWNER with role-scoped
allow policies so authorization fails closed: admins may create and
update memberships only when the assigned role is not OWNER, and the
absence of a target role no longer implies permission.

To keep console UI gating accurate without loosening the base grants,
the permission field gains an optional typed options argument
(PermissionOptionsInput) that forwards target_role into the dry-run
authorization. Only the two role-related console calls (create user,
update membership) pass it; the OWNER option stays hidden for admins via
the existing assignable-roles helper.

Add a non-regression test that an admin cannot promote a member to OWNER
while still being able to change members between non-owner roles.
2026-07-08 18:41:13 +02:00
Sacha Al Himdani
ff9cb881e8 Enforce owner-only member removal and ownership grants via policy
An organization ADMIN could hard-remove members, including OWNERs, because
removeUser (connect and MCP) only checked the weaker iam:membership-profile:delete
gate. Authorize the owner-only iam:membership:delete instead, and expose the
source attribute on MembershipProfile so the owner grant's non-SCIM condition
can match.

Consolidate ownership-grant authorization into policy for both createUser and
updateMembership: each resolver passes the requested role as a target_role
attribute and ADMIN is denied granting ownership via deny-create-owner /
deny-promote-owner. target_role is distinct from resource.role, which is the
target's current role and guards editing existing owners. With no callers left,
the iam:membership-role:set-owner action (grant and OAuth2 scope) is removed.

Also pass the authorized scope through to the RemoveUser/CreateUser services,
gate the console Remove action on iam:membership:delete, and add regression
tests plus a changelog entry.

Signed-off-by: Sacha Al Himdani <sacha@probo.com>
2026-07-08 17:59:45 +02:00
Ludovic Vielle
3443e63184 Release probod/v0.223.3
Signed-off-by: Ludovic Vielle <ludovic@probo.com>
2026-07-06 17:06:03 +02:00
Sacha Al Himdani
119b20bfbc Release probod/v0.223.2
Signed-off-by: Sacha Al Himdani <sacha@probo.com>
2026-07-03 17:45:53 +02:00