Commit Graph

3044 Commits

Author SHA1 Message Date
Bryan Frimin
04cb9e08fb Add proboctl framework and control commands
Add create, list, view, update, and delete commands
for managing frameworks and controls.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-16 15:41:49 +01:00
Bryan Frimin
5a230278b2 Add proboctl risk commands
Add create, list, view, update, and delete commands
for managing risks.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-16 15:41:49 +01:00
Bryan Frimin
b313fbb951 Add proboctl org and user commands
Add organization list and user list/view commands.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-16 15:41:49 +01:00
Bryan Frimin
72c15b2a17 Add proboctl browse command
Add a command to open Probo resources in the web browser.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-16 15:41:49 +01:00
Bryan Frimin
94673d4ee2 Add proboctl config commands
Add get, set, and list commands for managing CLI
configuration values.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-16 15:41:48 +01:00
Bryan Frimin
907ba623e8 Add proboctl api command
Add a raw API command for executing GraphQL queries
directly against the Probo API.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-16 15:41:48 +01:00
Bryan Frimin
95d83872bc Add proboctl auth commands
Add login, logout, and status commands for managing
authentication with the Probo API.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-16 15:41:48 +01:00
Bryan Frimin
6919b9372a Add proboctl core skeleton and build system
Introduce the proboctl CLI entry point, root command, version,
completion, iostreams, shared cmdutil helpers (flags, table, JSON,
time formatting), API client with pagination, config management,
goreleaser configuration, and build system integration.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-16 15:41:47 +01:00
Sacha Al Himdani
0b7c0e0806 Add validation to mailman service
Signed-off-by: Sacha Al Himdani <sacha@getprobo.com>
2026-03-16 14:37:34 +01:00
Émile Ré
f62a2cb494 Fix build
Signed-off-by: Émile Ré <emile@getprobo.com>
2026-03-16 16:50:57 +04:00
Bryan Frimin
f4a027e719 Fix generated files
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-16 12:07:37 +01:00
Bryan Frimin
5c22789624 Add reviewdog to post lint errors as PR comments
Use reviewdog in the CI lint job so golangci-lint and eslint
failures appear as inline comments on pull request files instead
of only in job logs.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-16 00:41:22 +01:00
Bryan Frimin
6a77d42dd6 Style
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-16 00:28:47 +01:00
Bryan Frimin
7147cf189a Reorganize GraphQL docs: separate Go backend from frontend Relay client
Move frontend Relay client documentation into relay.md and create new graphql.md dedicated to Go backend patterns. Covers gqlgen schema-first approach, @goModel/@goEnum/@goField directives, connection type patterns, and cursor pagination implementation.

- relay.md: Frontend Relay client (environments, compiler, queries, fragments, mutations)
- graphql.md: Go backend gqlgen (directives, connection types, pagination schema, keyset pagination)
- AGENTS.md: Update documentation references

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-15 19:09:39 +01:00
Bryan Frimin
0ca6b6775d Expand e2e CLAUDE.md with full test patterns
Document client setup, factory pattern, test structure,
authorization testing, assertion helpers, and file
organization.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-15 15:04:35 +01:00
Bryan Frimin
9a37283e24 Require e2e tests for new Go API endpoints
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-15 15:04:34 +01:00
Bryan Frimin
5114a06acc Use for loop and ticker in worker pattern
Replace goto/LOOP with a for/select on time.Ticker for
clearer control flow.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-15 15:04:34 +01:00
Bryan Frimin
064a461d80 Remove extracted sections from AGENTS.md
Tests, workers, and service orchestration now live in
their own files under contrib/claude/.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-15 15:04:34 +01:00
Bryan Frimin
76e6d5a9a7 Move Go service orchestration to contrib/claude
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-15 15:04:33 +01:00
Bryan Frimin
54183598cd Move Go worker pattern to contrib/claude
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-15 15:04:33 +01:00
Bryan Frimin
377807be2a Move Go test conventions to contrib/claude
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-15 15:04:32 +01:00
Bryan Frimin
21eaaef30a Extend license header to all source file types
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-15 15:04:32 +01:00
Bryan Frimin
4ea629283b Move license header to contrib/claude
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-15 15:04:32 +01:00
Bryan Frimin
740112b348 Add reference docs and API surface rules to AGENTS.md
Move commit message section to contrib/claude/commit.md and
add rules requiring every feature to be exposed through
GraphQL, MCP, and CLI.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-15 15:04:31 +01:00
Bryan Frimin
c6f2c6a71c Move commit message conventions to contrib/claude
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-15 15:04:31 +01:00
Bryan Frimin
1b5f79c7d1 Add frontend Relay client guide
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-15 15:04:30 +01:00
Bryan Frimin
b0841becde Add Relay cursor pagination guide
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-15 15:04:30 +01:00
Bryan Frimin
7a4101185b Add per-folder CLAUDE.md for key packages
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-15 15:04:27 +01:00
Bryan Frimin
ecba352307 Revert relay generics that cause cascade type errors
Adding TypeScript generics to useMutation, usePaginationFragment,
and useRefetchableFragment in graph hooks and page files causes
cascade type mismatches: string values are not assignable to
generated enum types, and typed refetch functions are incompatible
with SortableTable's generic refetch prop.

Use eslint-disable-next-line relay/generated-typescript-types
instead until the calling code is updated to use enum types.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-15 13:45:23 +01:00
Bryan Frimin
43d6ab38fb Fix formatting and React hook dependency lint errors
Fix max-len violations by breaking long lines across multiple
lines. Fix react-hooks/exhaustive-deps by adding missing deps
and removing unnecessary ones. Remove stale eslint-disable
comments in DataTable stories.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-15 13:32:54 +01:00
Bryan Frimin
13ca50df68 Fix relay lint in components and pages
Remove unused GraphQL fields (createdAt, updatedAt, totalCount,
__id, sourceId, etc.) from queries and fragments across 50+ files.

Add TypeScript generics to useMutation, usePaginationFragment,
useRefetchableFragment, and useLazyLoadQuery calls to satisfy
relay/generated-typescript-types.

Add justified eslint-disable comments for fields needed by Relay
cache normalization (id) or consumed by sibling components through
fragment spreads.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-15 13:32:43 +01:00
Bryan Frimin
d263cda3f6 Add eslint-disable and TypeScript generics to graph hooks
Centralized graph files (hooks/graph/*.ts) define GraphQL
queries consumed by multiple page components. This architecture
intentionally separates field definitions from usage, triggering
relay/unused-fields and relay/must-colocate-fragment-spreads.
File-level eslint-disable comments suppress these false positives.

Also adds explicit TypeScript generics to useMutation and
usePaginationFragment calls to satisfy relay/generated-typescript-types
without eslint-disable.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-15 13:32:18 +01:00
Bryan Frimin
dbb4811a2c Update CHANGELOG
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-14 12:40:26 +01:00
Bryan Frimin
76f781ead1 Clear conflicting external_id when enrolling manual profile into SCIM
When a SCIM provider sends CreateUser for a user whose email matches an
existing manual profile, but another profile already holds that
external_id (e.g. created by a prior CreateUser with a different email),
clear the conflicting external_id before enrolling the manual profile.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-14 12:40:26 +01:00
Bryan Frimin
2f76eaf4ae Clear external_id and user_name when resetting SCIM sources
When a SCIM configuration is deleted, ResetSCIMSources now clears
external_id and user_name so stale values don't cause unique constraint
violations when SCIM is reconfigured.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-14 12:40:26 +01:00
Bryan Frimin
a3af41e6a1 Use errors.AsType in MembershipProfile.Insert
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-14 12:40:25 +01:00
Bryan Frimin
a74ebdd8b8 Add commit format intrsuction
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-14 12:39:28 +01:00
Bryan Frimin
5d2b394bac Include error in tool_end event for interrupted tools
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-14 12:28:26 +01:00
Bryan Frimin
d01ee914c1 Style
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-13 20:00:22 +01:00
Bryan Frimin
deac1538e5 Style
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-13 19:58:02 +01:00
Bryan Frimin
d80a0fa7e4 Reject null input in agent tool parameter validation
JSON null unmarshals into an empty string, so the presence-only
key check let {"input":null} through, running the nested agent
with a blank user message.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-13 19:57:18 +01:00
Bryan Frimin
9d999559f1 Emit OnToolEnd hooks for interrupted and failed tools
executeSingleTool had three exit paths but only the success path
emitted all end signals. The interrupted path (nested agent
approval) skipped OnToolEnd and StreamEventToolEnd entirely,
leaving hook consumers with an unpaired OnToolStart. The error
path also missed StreamEventToolEnd and AgentHooks.OnToolEnd.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-13 19:53:08 +01:00
Bryan Frimin
5c889a1d47 Fall back to StructuredContent in MCP tool results
When an MCP server sets StructuredContent without populating
Content with TextContent entries, extractMCPContent returned
an empty string, making successful tool calls look empty to
the agent. Now the function serializes StructuredContent as
JSON when no text parts are found.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-13 19:43:19 +01:00
Bryan Frimin
cb6189d7ac Close inner stream before finalizing trace span
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-13 19:40:54 +01:00
Bryan Frimin
91be6dcbfb Preserve extra JSON Schema fields in Anthropic tools
buildTools was only copying "properties" and "required" into
ToolInputSchemaParam, silently dropping root-level constraints
like additionalProperties and $defs. Forward them through the
SDK's ExtraFields map so the full schema reaches the API.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-13 19:36:44 +01:00
Bryan Frimin
1f5e68abe6 Fix typeName panic for interface type parameters
reflect.TypeOf on a nil interface value returns nil, causing a
panic when Kind() is called. Use reflect.TypeFor[T]() instead,
which resolves the type directly from the type parameter.

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-13 19:34:07 +01:00
Bryan Frimin
0c3893ee8b Skip nil handoffs to prevent panic during run
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-13 19:31:09 +01:00
Bryan Frimin
cb4b893dfc Skip nil MCP servers in WithMCPServers
Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-13 19:26:29 +01:00
Bryan Frimin
da9a594f79 Here's a commit message following the repo's style:
Fix Wait draining events from concurrent consumers
Wait() was ranging over the public Events channel, competing
with any concurrent reader for events. Callers that streamed
events in one goroutine and called Wait() in another would
lose an arbitrary subset of events. Wait now only blocks on
the done channel; the result fields are already visible thanks
to the close ordering (set fields → close events → close done).

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-13 19:22:46 +01:00
Bryan Frimin
2df9a3fe59 Propagate model through streamed responses
StreamAccumulator never set its model field, so
Response().Model was always empty for streamed
completions. Add a Model field to stream events
and populate it in all three providers (OpenAI,
Anthropic, Bedrock).

Signed-off-by: Bryan Frimin <bryan@getprobo.com>
2026-03-13 19:17:17 +01:00