Navin

Navin Enterprise

Enterprise sits above Team: quote-based pricing (no Stripe checkout), high execution limits, SSO config storage, append-only audit, and org RBAC.

Individual Free remains available with bring-your-own keys (BYOK).

Plan

  • Defined in site/src/lib/plans.ts as enterprise.
  • priceUsd = 0, stripePriceEnv = null → pricing UI shows Contact / Contact sales.
  • Limits via enterpriseLimits() (high concurrent agents, devices, steps).
  • AI budget is contract-specific: resolveEnterprisePlan(aiBudgetUsd).

Assign Enterprise manually from the site admin console (/admin → Attribuer un abonnement) or via /api/admin/assign with plan: "enterprise". Prefer sales-led onboarding; do not expose a self-serve Stripe path.

Database

Migration: site/supabase/2026-08-02-enterprise.sql

ObjectRole
audit_eventsAppend-only audit log (org_id, actor_user_id, action, resource, metadata, created_at)
audit_events_reject_mutation()Trigger function blocking UPDATE/DELETE
org_sso_configsPer-org OIDC/SAML stub (provider, issuer, client_id, enabled, metadata)

RLS: org admins can SELECT. Authenticated users cannot INSERT/UPDATE/DELETE audit rows; writes go through the service role (/api/audit, helpers).

APIs

MethodPathWho
GET/api/audit?orgId=Org admin (audit_read)
POST/api/auditService (Authorization: Bearer $SUPABASE_SERVICE_ROLE_KEY) or org admin
GET/api/orgs/sso?orgId=Org admin (manage_sso)
PUT/api/orgs/ssoOrg admin (manage_sso)

Helper: site/src/lib/audit.ts (appendAuditEvent, listAuditEvents).

Alias: /api/enterprise/sso re-exports the orgs SSO handlers (prefer /api/orgs/sso).

RBAC

site/src/lib/rbac.ts - roles admin | member | viewer.

Actionadminmemberviewer
readyesyesyes
writeyesyesno
invite / manage_members / manage_sso / audit_read / adminyesnono

Check: node site/scripts/test-rbac.mjs

SSO wiring (not implemented end-to-end)

Config is stored only. Choose one path later:

WorkOS

  1. Set WORKOS_API_KEY and WORKOS_CLIENT_ID.
  2. Create a WorkOS Organization with external_id = organizations.id.
  3. Enable SAML or OIDC; store issuer, client_id, and metadata.connection_id via PUT /api/orgs/sso.
  4. Add /api/auth/sso/startworkos.sso.getAuthorizationUrl(...).
  5. Callback: exchange code, upsert Supabase user, set session cookie.

Supabase SAML

  1. Dashboard → Authentication → SSO → Add SAML 2.0 provider.
  2. Map IdP Entity ID / ACS URL; keep domain mapping in Supabase.
  3. Persist domain / provider_id in org_sso_configs.metadata.
  4. Login with supabase.auth.signInWithSSO({ domain }).

Tool policy (runtime)

navin/enterprise/policy.py - org allow/deny lists for tools:

from navin.enterprise import check_tool_allowed

ok = check_tool_allowed("shell", {"allow": ["shell", "read_file"], "deny": ["browser"]})

Deny wins. A non-empty allowlist is fail-closed for unknown tools.

Evals harness

Offline golden prompts (mock model, no network):

python -m navin.evals.runner navin/evals/datasets/smoke.jsonl
python -m unittest navin.evals.tests.test_evals_harness

Admin note

When assigning Enterprise from /admin:

  • Prefer after a signed quote (custom AI budget / seats).
  • Enterprise is not self-serve Stripe; use assign or sales ops.
  • Enable SSO and audit only for orgs on the Enterprise plan (product gate can be added later on top of these foundations).

Source: content/docs/enterprise.md