Commit Graph

3255 Commits

Author SHA1 Message Date
Bryan Frimin
bb910b4314 Style
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-31 14:49:21 +02:00
Bryan Frimin
8095ac6233 Validate session transfer redirect with saferedirect
The session transfer handler was blindly redirecting to the continue URL
from the signed token. Use saferedirect with a trust center domain check
to prevent open redirects, and only trigger session transfer for known
trust center custom domains instead of any non-base-URL host.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-31 14:49:21 +02:00
Bryan Frimin
84a35c90e9 Add session transfer for SSO cookies on custom domains
After OIDC login, if the redirect targets a trust center custom
domain, the callback now redirects through a session-transfer
endpoint on that domain. The endpoint verifies an HMAC-signed,
time-limited token and sets the session cookie on the custom
domain before redirecting to the final URL.

The continue URL is bound into the signed token payload to
prevent open-redirect attacks via parameter tampering.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-31 14:49:20 +02:00
Sacha Al Himdani
5d6d0bdd7f Move document classification from document to document version
Classification now lives exclusively on DocumentVersion. The field is
removed from the Document model, all SQL queries, GraphQL Document
type, SignableDocument type, UpdateDocumentInput, and MCP Document
schema.

New documents still accept classification in CreateDocumentInput,
applied to the first version. New drafts inherit classification from
the previous version. PDF generation uses the version classification.

The drawer allows editing classification on draft versions via the
updateDocumentVersion mutation. Classification is read-only on
published versions.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-31 14:11:57 +02:00
Sacha Al Himdani
851e585b9b Add ISC license headers to Go, TypeScript, and SQL files
Add ISC license headers to all .go, .ts, .tsx, and .sql files
using each file's git history to determine the correct copyright
year or year range. Trademarked icons (brand logos, vendor logos,
compliance framework logos) are excluded.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-31 13:31:30 +02:00
Bryan Frimin
de7e2c6dc9 Release v0.155.0 2026-03-31 11:35:59 +02:00
Bryan Frimin
419c93fc7d Fix compliance page login redirect to custom domains
SafeRedirect previously matched against a single static host string,
so OIDC callbacks always fell back to the console instead of
redirecting back to compliance pages on custom domains. Refactor
AllowedHost into a dynamic AllowedHostFunc and wire a trust-service
lookup into the connect handler so custom domain hosts are accepted.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-31 10:51:34 +02:00
dependabot[bot]
573e4f17f8 Bump golang.org/x/image from 0.36.0 to 0.38.0
Bumps [golang.org/x/image](https://github.com/golang/image) from 0.36.0 to 0.38.0.
- [Commits](https://github.com/golang/image/compare/v0.36.0...v0.38.0)

---
updated-dependencies:
- dependency-name: golang.org/x/image
  dependency-version: 0.38.0
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-03-30 21:15:57 +02:00
Sacha Al Himdani
68bc8cf59a Add major.minor document versioning
Introduce a two-part version scheme (major.minor) for documents.
Drafts start at 0.1 and increment minor on each new draft. Publishing
as minor keeps the current version, publishing as major bumps to the
next major.0. Both current_published_major and current_published_minor
are tracked on the document for exact version lookups.

Signatures and approval quorums aggregate across all versions sharing
the same major number using CTE joins. Approval page mutations spread
the decision fragment so Relay updates the version row state without
requiring a page refresh.

GraphQL, MCP, and service layer expose separate publishMajor and
publishMinor mutations instead of a single mutation with a type enum.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-30 18:54:28 +02:00
Sacha Al Himdani
c5a412ea41 Release v0.154.2
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-30 16:39:26 +02:00
Aditya Sharma
0b12eea733 Fix base-url to point to API server instead of Vite dev server
Signed-off-by: Aditya Sharma <aditya.sharma@usm.edu>
2026-03-30 16:08:45 +02:00
Aditya Sharma
36809432db Fix agents config in dev.yaml to use new providers schema
Signed-off-by: Aditya Sharma <aditya.sharma@usm.edu>
2026-03-30 16:08:45 +02:00
Sacha Al Himdani
0920690816 Add ability to disconnect Slack channel from compliance page
Users could connect a Slack channel to their compliance page but had no
way to remove or change the connection afterward. This adds a disconnect
button with a confirmation dialog next to connected Slack channels.

- GraphQL: deleteSlackConnection mutation with resolver
- Frontend: Disconnect button using useMutation with @deleteEdge

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-30 15:40:21 +02:00
Bryan Frimin
bc51c910ae Rename TruffleHog exclude paths file to plain text
The --exclude-paths flag expects a plain text file with one regex
per line, not a YAML file.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-30 14:18:29 +02:00
Bryan Frimin
5237e57d27 Revert "Use inline trufflehog:ignore instead of exclude paths file"
This reverts commit f10ecb8210b1176311d9372d1108b91ce8290fd4.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-30 14:18:29 +02:00
Bryan Frimin
7dcc3d21ac Use inline trufflehog:ignore instead of exclude paths file
Inline comments are more targeted than excluding the entire file
from secret scanning. Remove the .trufflehog.yml exclude file and
the --exclude-paths flag from the workflow.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-30 14:18:29 +02:00
Bryan Frimin
bba7855678 Fix TruffleHog exclude paths file format
The --exclude-paths flag expects newline-separated regexes, not YAML.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-30 14:18:29 +02:00
Bryan Frimin
b60b21aad0 Exclude guardrail test file from TruffleHog secret scanning
The sensitive_data_test.go file contains dummy connection strings
(postgres://, mongodb://, amqp://) used as test fixtures for the data
leak guardrail. These trigger false positives in TruffleHog.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-30 14:18:29 +02:00
Bryan Frimin
4725a1b080 Fix false positives in agent guardrails
Skip empty fingerprints in SystemPromptLeakGuardrail to prevent blank
values from flagging every message. Replace overly broad "sk-" pattern
in SensitiveDataGuardrail with specific LLM provider prefixes
("sk-proj-" for OpenAI, "sk-ant-" for Anthropic) to avoid false
positives on common words like "risk-based" or "task-management".

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-30 14:18:29 +02:00
Bryan Frimin
2f8674471b Fix one-argument-per-line style in prompt injection guardrail
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-30 14:18:29 +02:00
Bryan Frimin
ded859d130 Set temperature to 0 for prompt injection classifier
Deterministic output improves consistency of the safety classifier.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-30 14:18:29 +02:00
Bryan Frimin
ef8402ca93 Add reusable agent guardrails for prompt injection and data leaks
Introduce a pkg/agent/guardrail package with three guardrails that
can be composed into any agent:

- PromptInjectionGuardrail: LLM-based input classifier that detects
  prompt injection attempts before the agent processes them.
- SensitiveDataGuardrail: pattern-based output check for leaked
  tokens, keys, connection strings, and raw SQL.
- SystemPromptLeakGuardrail: configurable output check that detects
  system prompt content in responses using caller-provided
  fingerprints.

The classifier prompt is embedded from a plain text file for easy
review and editing.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-30 14:18:29 +02:00
Sacha Al Himdani
a54aaa8dca Release v0.154.1
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-30 14:16:34 +02:00
Sacha Al Himdani
454e6a52d4 Fix goreleaser snapshot signing creating missing bundle file
When running in snapshot mode, the signing step skips cosign but does
not create the expected .bundle file. The checksum step then fails
because it cannot find the signature artifact. Touch the file so the
pipeline can continue.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-30 14:06:40 +02:00
Sacha Al Himdani
3528e5d1a0 Release v0.154.0
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-30 13:36:03 +02:00
Sacha Al Himdani
0da0660c4d Update CHANGELOG
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-27 21:48:23 +01:00
Sacha Al Himdani
03d77c3bab Fix duplicate organization name returning internal error
When creating an organization with a name that produces a duplicate trust
center slug, the API now returns a Conflict response instead of a
generic Internal error.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-27 20:26:13 +01:00
Sacha Al Himdani
999171a626 Add document approval workflow
Introduce a complete approval system for document publishing. Document
versions can now require approval from selected reviewers before being
published, with automatic publishing once all approvers have approved.

- Add approval quorum and decision tables with backfill migration
- Implement request approval, approve, and reject flows with electronic
  signature support for approve decisions
- Add employee approvals page with dedicated tab and pending approvals view
- Add changelog field to publish and request approval flows
- Pre-select previous version's approvers in the publish dialog
- Show quorum approvers in document list with 100 approver hard limit
- Expose approval workflow through GraphQL, MCP, and CLI
- Remove legacy default approvers feature entirely
- Add comprehensive e2e test coverage for approval workflows

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-27 19:43:20 +01:00
Sacha Al Himdani
4a2d308da0 Add task drag-and-drop reordering
Order tasks by priority (ASC) by default. Enable drag-and-drop
on the TODO and DONE tabs using native HTML5 drag events,
following the compliance external URLs pattern. The "All" tab
remains read-only since priority is scoped per state.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-27 15:47:12 +01:00
Sacha Al Himdani
257cbcf826 Add task priority field
Introduce a rank-style priority on tasks, scoped by
(organization_id, state). New tasks auto-assign the next
priority. Reordering uses the same CTE-based algorithm as
trust center references and compliance external URLs.
Exposed through GraphQL, MCP, and the PRIORITY order field.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-27 15:47:12 +01:00
Sacha Al Himdani
72a48ff6b1 Run n8n-node lint on pull requests using n8n-node CLI
The PR lint path was running `npx eslint .` for the n8n-node package,
which uses a different config than `npx n8n-node lint` used on push.
This caused lint to pass on PRs but fail on push to main.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-27 14:24:53 +01:00
Sacha Al Himdani
596901b799 Fix n8n-node lint by scoping brace-expansion override for minimatch@3
The root brace-expansion@5 override broke minimatch@3 (used by
@eslint/config-array) because v5 changed the export API. Add a
scoped override so minimatch@3 gets brace-expansion@1.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-27 14:24:53 +01:00
Sacha Al Himdani
a8f733706b Fix npm audit vulnerabilities
Bump @n8n/node-cli to ^0.24.1 and remove stale form-data override.

Add overrides for transitive sub-dependencies with no upstream fix:
- brace-expansion ^5.0.5 (ReDoS / process hang)
- minimatch@9 ^9.0.9 (ReDoS in 9.0.0-9.0.6)
- langsmith ^0.5.0 (SSRF via tracing header injection)
- handlebars 4.7.9 (prototype pollution / XSS)
- @langchain/community ^1.1.25 (SSRF bypass)

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-27 11:23:41 +01:00
Bryan Frimin
cd62af88a3 Fix arrow-parens lint error in VerifyMagicLinkPage
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-27 09:15:41 +01:00
Bryan Frimin
8f59eb6b8a Distinguish expired magic links from invalid tokens
When a magic link token expires, the user now sees a specific
error message ("This magic link has expired. Please request a
new one.") instead of the generic "Failed to connect" error.

This adds ErrExpiredToken to the IAM error types, checks for
statelesstoken.ErrExpiredToken in both GetMagicLinkEmail and
OpenSessionWithMagicLink, and handles it in the trust resolver
and frontend.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-27 09:15:41 +01:00
Bryan Frimin
36d517e8ce Fix n8n sub-dep CVE
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-27 08:10:57 +01:00
Bryan Frimin
6d0c7fe262 Release v0.153.2 2026-03-26 21:47:25 +01:00
Bryan Frimin
095b36d6e4 Mark failed evidence descriptions instead of retrying
Previously the worker reset failed descriptions back to PENDING,
causing infinite retry loops for permanently broken evidence.
Add a FAILED status so these items stop cycling and can be
investigated.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-26 21:37:53 +01:00
Bryan Frimin
992c4ab7f3 Release v0.153.1 2026-03-26 17:56:37 +01:00
Bryan Frimin
84b71af54c Use file model MIME type instead of S3 content type
GetFileBase64 read the MIME type from the S3 response header,
which can be application/octet-stream for files uploaded without
an explicit content type. Use file.GetMimeType() from the
database instead, which stores the correct MIME type captured
at upload time. This fixes evidence description failures when
calling the OpenAI API with PDF files.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-26 17:34:04 +01:00
Bryan Frimin
644061f465 Release v0.153.0 2026-03-26 17:15:29 +01:00
Bryan Frimin
6bcd4b5c66 Fix e2e test config for new agents config structure
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-26 15:29:41 +01:00
Bryan Frimin
619ec7b882 Add AI-powered evidence description generation
Introduce a background worker that automatically generates
compliance-focused descriptions for uploaded evidence files
using configurable LLM providers. Descriptions are surfaced
across all interfaces: GraphQL API, MCP API, CLI, and the
console UI.

Key changes:
- Multi-provider LLM config with per-agent settings (pointer
  types for Temperature/MaxTokens to preserve zero values)
- Evidence description worker with bounded concurrency
- EvidenceDescriptionStatus typed enum with PostgreSQL enum type
- New `prb evidence` CLI commands (list, view, delete)
- Evidence description displayed in console table and preview
- Migration only marks evidences without files as completed

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-26 14:32:41 +01:00
Bryan Frimin
8bbed534a9 Fix batch signature dialog wording
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-26 11:25:57 +01:00
Sacha Al Himdani
a3580a5647 Treat ESLint warnings as errors in all packages
Add --max-warnings 0 to every eslint lint script so that any warning
causes a non-zero exit code. This makes `make lint` and CI fail on
warnings, not just hard errors.

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-26 10:47:33 +01:00
Sacha Al Himdani
93c3b70ecc Fix frontend lint warnings in documents and references
- Remove unused `rank` field from CompliancePageReferenceListItemFragment;
  the parent list fragment already fetches it for drag-and-drop reordering.
  Thread `rank` through the onEdit call chain so the edit dialog can still
  pre-populate the field via a dedicated parameter instead of the fragment.
- Add missing `documentTypeFilter` dependency to the refetch useEffect in
  DocumentList so stale closure values are never used on tab change.
- Break overlong line in DocumentList (canSendAnySignatureNotifications).

Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-26 10:47:33 +01:00
Bryan Frimin
d1e4f31d07 Fix empty search_engine_indexing on trust centers
Trust centers were created without setting SearchEngineIndexing,
defaulting to an empty string in the database. This caused scan
errors when loading trust centers.

Add a migration to fix corrupted rows, set a DEFAULT on the
column, and add a CHECK constraint. Also set the field explicitly
when creating new trust centers.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-26 10:13:00 +01:00
Sacha Al Himdani
c5d4912c4c Npm audit fix
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-26 09:16:26 +01:00
Sacha Al Himdani
8c02c53315 Update copyright headers across all Go files
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-25 17:38:32 +01:00
Bryan Frimin
fcf197cd1c Release v0.152.0 2026-03-25 15:23:01 +01:00