diff --git a/.github/workflows/test-build.yml b/.github/workflows/test-build.yml
index c5028b877c1..83017381cd2 100644
--- a/.github/workflows/test-build.yml
+++ b/.github/workflows/test-build.yml
@@ -8,6 +8,80 @@ permissions:
contents: read
jobs:
+ oauth-postgres:
+ name: OAuth PostgreSQL (${{ matrix.provision }})
+ runs-on: ${{ (vars.CI_PROVIDER == '' || vars.CI_PROVIDER == 'blacksmith') && 'blacksmith-8vcpu-ubuntu-2404' || 'ubuntu-latest' }}
+ timeout-minutes: 15
+ strategy:
+ fail-fast: false
+ matrix:
+ provision: [push, migrate]
+ services:
+ postgres:
+ image: pgvector/pgvector:pg17
+ env:
+ POSTGRES_USER: postgres
+ POSTGRES_PASSWORD: postgres
+ POSTGRES_DB: sim_oauth
+ ports:
+ - 5432:5432
+ options: >-
+ --health-cmd "pg_isready -U postgres -d sim_oauth"
+ --health-interval 5s
+ --health-timeout 5s
+ --health-retries 10
+ env:
+ DATABASE_URL: postgresql://postgres:postgres@127.0.0.1:5432/sim_oauth
+ OAUTH_TOKEN_FAMILY_TEST_DATABASE_URL: postgresql://postgres:postgres@127.0.0.1:5432/sim_oauth
+ BETTER_AUTH_SECRET: oauth-postgres-ci-secret-at-least-32-characters
+ OAUTH_PROVIDER_ENABLED: 'true'
+ NEXT_PUBLIC_APP_URL: https://test.sim.ai
+ ENCRYPTION_KEY: '0000000000000000000000000000000000000000000000000000000000000000'
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6
+
+ - name: Setup Bun
+ uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2
+ with:
+ bun-version: 1.4.1
+
+ - name: Setup Node
+ uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6
+ with:
+ node-version: 24
+
+ - name: Mount Bun cache
+ uses: ./.github/actions/cache-mount
+ with:
+ provider: ${{ vars.CI_PROVIDER }}
+ key: ${{ github.repository }}-bun-cache-${{ github.event_name }}${{ github.event.pull_request.head.repo.fork && '-fork' || '' }}
+ path: ~/.bun/install/cache
+
+ - name: Install dependencies
+ run: bun install --frozen-lockfile --ignore-scripts
+
+ - name: Provision a fresh database through the supported command
+ working-directory: packages/db
+ run: |
+ bun -e 'import postgres from "postgres"; const sql = postgres(process.env.DATABASE_URL); for (const extension of ["vector", "btree_gin", "pg_trgm"]) await sql`CREATE EXTENSION IF NOT EXISTS ${sql(extension)}`; await sql.end()'
+ bun run db:${{ matrix.provision }}
+
+ - name: Verify migration replay is a no-op
+ if: matrix.provision == 'migrate'
+ working-directory: packages/db
+ run: bun run db:migrate
+
+ - name: Verify provider issuance and token lifecycle in PostgreSQL
+ working-directory: apps/sim
+ run: >-
+ bunx vitest run
+ lib/auth/oauth-token-family.postgres.test.ts
+ lib/auth/oauth-provider-lifecycle.postgres.test.ts
+ app/api/auth/oauth2/token/route.postgres.test.ts
+ lib/auth/sim-auth-adapter.test.ts
+
test-build:
name: Lint and Test
runs-on: ${{ (vars.CI_PROVIDER == '' || vars.CI_PROVIDER == 'blacksmith') && 'blacksmith-8vcpu-ubuntu-2404' || 'ubuntu-latest' }}
diff --git a/apps/docs/content/docs/api-reference/authentication.mdx b/apps/docs/content/docs/api-reference/authentication.mdx
index 6b8c50fef50..e4c9bc8ee94 100644
--- a/apps/docs/content/docs/api-reference/authentication.mdx
+++ b/apps/docs/content/docs/api-reference/authentication.mdx
@@ -1,12 +1,14 @@
---
title: Authentication
-description: API key types, generation, and how to authenticate requests
+description: Authenticate with API keys or delegated OAuth access tokens
---
import { Callout } from 'fumadocs-ui/components/callout'
import { Tab, Tabs } from 'fumadocs-ui/components/tabs'
-To access the Sim API, you need an API key. Sim supports two types of API keys — **personal keys** and **workspace keys** — each with different billing and access behaviors.
+The Sim API accepts API keys and, when enabled by your deployment, OAuth access tokens. API keys support automation and the SDKs. OAuth lets the CLI and registered applications act on your behalf with permissions you approve.
+
+Sim supports two types of API keys — **personal keys** and **workspace keys** — each with different billing and access behaviors.
## Key Types
@@ -87,6 +89,27 @@ API keys authenticate access to:
- **MCP servers** — authenticate connections to deployed MCP servers
- **SDKs** — the [Python](/api-reference/python) and [TypeScript](/api-reference/typescript) SDKs use API keys for all operations
+## OAuth access tokens
+
+Use `sim login` to authorize the CLI in your browser, or `sim login --read-only` to request read access. The CLI stores the login locally and refreshes access tokens automatically. See [CLI authentication](/cli/authentication) for profiles, sign-in, and sign-out.
+
+Registered OAuth applications send access tokens in the `Authorization` header:
+
+```bash
+curl https://www.sim.ai/api/v2/workspaces \
+ -H "Authorization: Bearer YOUR_ACCESS_TOKEN"
+```
+
+| Scope | Access |
+| --- | --- |
+| `api:read` | Read operations, including searches sent as POST requests |
+| `api:write` | Includes `api:read`, plus mutations and execution, including operations that can start external work |
+| `offline_access` | Refresh tokens for continued access after the access token expires |
+
+Scopes limit what an application may do; your current workspace membership and role still apply. Each endpoint documents its required scope. Some GET endpoints that perform external discovery require `api:write`, so HTTP method alone does not determine the permission.
+
+Manage grants in **Settings** → **Authorized apps**. Revoking an application signs out all of its logins. `sim logout` revokes the current CLI login and removes it from your machine. The Python and TypeScript SDKs currently use API keys; they do not manage OAuth sign-in or refresh tokens.
+
## Security
- Keys use the `sk-sim-` prefix and are encrypted at rest
diff --git a/apps/docs/content/docs/api-reference/getting-started.mdx b/apps/docs/content/docs/api-reference/getting-started.mdx
index db66a4fd9e6..ad4e5561b64 100644
--- a/apps/docs/content/docs/api-reference/getting-started.mdx
+++ b/apps/docs/content/docs/api-reference/getting-started.mdx
@@ -26,7 +26,7 @@ Download the [complete OpenAPI 3.1 specification](/openapi.json) as JSON for cli
### Get your API key
-Go to the Sim platform and navigate to **Settings**, then go to **Sim Keys** and click **Create**. See [Authentication](/api-reference/authentication) for details on key types.
+Open **Account settings** → **Sim API keys** to create a personal key, or **Workspace settings** → **Sim API keys** for a workspace key. These examples and the SDKs use API keys; the CLI also supports browser sign-in with `sim login`. See [Authentication](/api-reference/authentication) for key types and OAuth permissions.
diff --git a/apps/docs/content/docs/cli/audit-logs.mdx b/apps/docs/content/docs/cli/audit-logs.mdx
index 1c06a2785ee..05d0e9e3acc 100644
--- a/apps/docs/content/docs/cli/audit-logs.mdx
+++ b/apps/docs/content/docs/cli/audit-logs.mdx
@@ -15,7 +15,7 @@ Every command below also accepts the [global options](/cli/commands#global-optio
sim audit-logs get [options]
```
-Get Audit Log (personal API key required)
+Get Audit Log (OAuth login or personal API key required)
**Arguments**
@@ -33,7 +33,7 @@ Get Audit Log (personal API key required)
| Option | Required | Description |
| --- | --- | --- |
-| `--organization ` | No | Organization ID; defaults to your only organization, and is required when your account belongs to more than one (personal API key required). |
+| `--organization ` | No | Organization ID; defaults to your only organization, and is required when your account belongs to more than one (OAuth login or personal API key required). |
@@ -43,7 +43,7 @@ Get Audit Log (personal API key required)
sim audit-logs list [options]
```
-List Audit Logs (personal API key required)
+List Audit Logs (OAuth login or personal API key required)
**Options**
@@ -59,8 +59,8 @@ List Audit Logs (personal API key required)
| `--include-departed` | No | Include actions by users who have left the organization. |
| `--no-include-departed` | No | Send --include-departed as false. |
| `--limit ` | No | Maximum items to return (0 for everything). Defaults to `100`. |
-| `--organization ` | No | Organization ID; defaults to your only organization, and is required when your account belongs to more than one (personal API key required). |
+| `--organization ` | No | Organization ID; defaults to your only organization, and is required when your account belongs to more than one (OAuth login or personal API key required). |
| `--actor-email ` | No | Filter by actor email address. |
-| `--all-workspaces` | No | Do not filter to the configured workspace (personal API key required for account-wide access). |
+| `--all-workspaces` | No | Do not filter to the configured workspace (OAuth login or personal API key required for account-wide access). |
diff --git a/apps/docs/content/docs/cli/authentication.mdx b/apps/docs/content/docs/cli/authentication.mdx
index 68461afd01f..b306dd8ee30 100644
--- a/apps/docs/content/docs/cli/authentication.mdx
+++ b/apps/docs/content/docs/cli/authentication.mdx
@@ -5,8 +5,9 @@ description: Sign in from the terminal, authenticate CI with an API key, and kee
import { Callout } from 'fumadocs-ui/components/callout'
-The CLI authenticates with a Sim API key. `sim login` mints and stores one; in CI
-you supply one through the environment instead.
+`sim login` signs you in through your browser and stores a short-lived login
+that renews itself and can be revoked at any time. In CI you supply an API key
+through the environment instead.
## Signing in
@@ -14,9 +15,59 @@ you supply one through the environment instead.
sim login
```
-The terminal prints a pairing code and a URL:
+The CLI opens your browser on Sim's sign-in page, then on a consent page that
+names the Sim CLI and what it will be able to do. Approve, and the browser hands
+control back to the terminal:
```
+Signing in to https://www.sim.ai as profile default
+
+https://www.sim.ai/api/auth/oauth2/authorize?client_id=sim-cli&…
+
+Waiting for you to approve in the browser…
+
+✓ Logged in. Login stored in /Users/you/.sim/credentials
+ Renews itself; revoke it any time in Settings → Authorized apps, or with: sim logout
+ No default workspace. Set one with: sim configure --set-workspace
+```
+
+This is the OAuth 2.0 authorization-code flow with PKCE and a loopback redirect,
+aligned with current OAuth security guidance. The browser only ever carries a one-time code;
+the tokens are exchanged over the terminal's own connection and written to
+`~/.sim/credentials` with `0600` permissions. Access tokens last an hour and are
+renewed automatically from a refresh token. The complete login has a fixed
+30-day lifetime; after it expires, run `sim logout`, then sign in again.
+
+
+Only approve a consent page you reached by running `sim login` yourself. A
+consent page that appears unprompted, or one you were sent a link to, is not
+your login.
+
+
+| Option | What it does |
+| --- | --- |
+| `--no-browser` | Print the URL instead of opening a browser |
+| `--browserless` | Use the pairing-code handoff instead (see below) |
+| `--read-only` | Ask only for permission to read, never to change anything |
+| `--callback-port ` | Pin the loopback callback port, primarily for an SSH session that forwards the same fixed port |
+| `--scope ` | Key space for the pairing-code handoff. Only `copilot` changes anything, and it forces that flow |
+| `-y, --yes` | Overwrite an existing API-key profile without prompting |
+
+### Over SSH or in a container
+
+The browser login needs your browser to reach a listener on the machine running
+`sim`. When it cannot — an SSH session, a dev container, a remote box — use the
+pairing-code handoff, which the CLI selects automatically in an SSH session:
+
+```bash
+sim login --browserless
+```
+
+The terminal prints a pairing code and a URL you can open on any device:
+
+```
+Signing in to https://www.sim.ai as profile default
+
Pairing code: K7M2-P9XT
Confirm this code matches what the browser shows before approving.
@@ -27,45 +78,50 @@ Waiting for approval…
Personal key, defaulting to 2f6d0b1c-8a34-4d92-b7e5-31c8a0f45d67. Override per command with --workspace.
```
-There is no loopback listener, so this works over SSH and inside containers.
-
Confirm the pairing code in the browser matches the one in your terminal before
approving. That check is what binds the approval to your terminal.
-| Option | What it does |
-| --- | --- |
-| `--no-browser` | Print the URL instead of opening a browser |
-| `--scope ` | Key space to mint from: `platform` (default) or `copilot` |
-| `-y, --yes` | Overwrite an existing profile without prompting |
+The handoff issues a permanent personal API key rather than a renewing login,
+so revoke it under **Settings → API keys** when you are done with that machine.
+It is also the path for a deployment that predates OAuth sign-in, or one with
+the provider switched off; the CLI detects that and falls back on its own.
+
+`--read-only` and `--callback-port` belong to the browser login and have no
+meaning here, so combining either with the handoff stops the login rather than
+storing a credential you did not ask for. If your SSH session forwards a port
+from the remote loopback interface to the browser's machine, pass that same
+`--callback-port ` on its own. An ordinary container port publication
+cannot reach a listener bound to the container's own loopback interface; use
+`--browserless` there.
### Picking a workspace
-You choose the workspace on the approval page. `sim login` issues a **personal** key. The workspace you pick becomes the
-profile's default `workspace`; it does **not** restrict the key to that
-workspace. Target another workspace the key can reach with `--workspace`:
+A normal login can act across every workspace you belong to; `--read-only`
+limits it to read operations. The profile's `workspace` setting only decides the default target.
+Set it after signing in, or pass `--workspace` per command:
```bash
+sim workspaces list
+sim configure --set-workspace 2f6d0b1c-8a34-4d92-b7e5-31c8a0f45d67
sim workflows list --workspace 9b4c7e02-1d58-4f36-a0c9-6e2b85df413a
```
-`sim login --workspace ` preselects a workspace in the picker, and
-re-logging into an existing profile preselects the one already configured.
+With the pairing-code handoff you choose the default workspace on the approval
+page instead.
-To save another workspace without minting or copying another personal key, add
-a workspace profile:
+To target another workspace without a second login, add a workspace profile:
```bash
-sim workspaces list
sim profile add acme --workspace 7e2d9c14-6b83-4a55-8f01-c4d3e9a76b28
sim --profile acme whoami
```
The new profile stores `auth_profile = default` and its own workspace. Omit
-`--workspace` in an interactive terminal to choose from the workspaces the
-active key can access; scripts must provide the workspace ID explicitly. The
-picker is capped at 1,000 entries and asks for an explicit ID above that.
+`--workspace` in an interactive terminal to choose from the workspaces your
+login can access; scripts must provide the workspace ID explicitly. The picker
+is capped at 1,000 entries and asks for an explicit ID above that.
## Checking who you are
@@ -74,9 +130,10 @@ sim whoami # resolved settings, plus a live check that they work
sim whoami --no-verify # resolved settings only, no request
```
-Prints the resolved endpoint, workspace, and output format, and which source each
-value came from, then reads the configured workspace to prove the key is accepted
-and can reach it.
+Prints the resolved endpoint, workspace, and output format, which source each
+value came from, and whether the profile holds an OAuth login or an API key,
+then reads the configured workspace to prove the credential is accepted and can
+reach it.
It exits `0` when the check passes, `1` when the credentials are wrong, and `2`
when the check could not be made at all — no workspace to check against, or an
@@ -86,25 +143,31 @@ logging in again.
## Signing out
```bash
-sim logout # remove the stored key
+sim logout # sign out of Sim and remove the stored login
sim logout --all # remove the profile entirely, including its settings
```
-A workspace profile that shares authentication cannot remove the shared key.
+For an OAuth login, `sim logout` revokes that login's complete token family
+before removing it from disk, including access tokens issued before earlier
+rotations. Other machines that ran their own `sim login` remain signed in. To
+cut off every independent login for the client, revoke the grant under
+**Settings → Authorized apps**.
+
+A workspace profile that shares authentication cannot remove the shared login.
Remove only that local profile with `sim logout --all --profile `, or log
out of the authentication profile named by the error message. Removing an
authentication profile entirely is refused until its workspace profiles are
removed, so it cannot leave dangling references.
-`sim logout` removes the key from disk but does **not** revoke it. Revoke keys in
-Sim under **Settings → API keys**.
+For a login created with `--browserless`, `sim logout` removes the API key from
+disk but does **not** revoke it. Revoke keys under **Settings → API keys**.
## Authenticating CI
-Set the key and workspace in the environment; the CLI never reads or writes a
-config file:
+Set an API key and workspace in the environment; the CLI never reads or writes
+a config file, and an explicit key outranks any stored login:
```bash
export SIM_API_KEY="sim_…"
@@ -148,7 +211,7 @@ sim workflows list --profile dev
sim workflows list --profile prod
```
-Use workspace profiles when one personal key should target several workspaces:
+Use workspace profiles when one login should target several workspaces:
```bash
sim profile add marketing --workspace c3a70e58-9f21-4d6b-b842-05e7f19c6a3d
@@ -174,21 +237,47 @@ Save it to avoid repeating the flag:
sim configure --set-endpoint http://localhost:3000 --profile local
```
-## Where the key is stored
+A deployment offers OAuth sign-in when its global `oauth-provider` feature flag
+is enabled. With AppConfig, enable it in the existing `feature-flags` document
+using `"oauth-provider": { "enabled": true }`. When AppConfig is disabled or no
+AppConfig document has been loaded, `OAUTH_PROVIDER_ENABLED=true` supplies the fallback.
+With the provider off, the CLI uses the pairing-code handoff; `DISABLE_AUTH=true`
+always forces OAuth off. Operators must apply the database migration and drain
+older app instances before enabling it. See [Sign in with Sim](/platform/self-hosting/authentication#sign-in-with-sim).
+
+## Where the login is stored
-Keys live in `~/.sim/credentials`, written `0600`, separate from the non-secret
+Logins live in `~/.sim/credentials`, written `0600`, separate from the non-secret
`~/.sim/config`. Commit `config` to a dotfiles repo if you like; never
`credentials`.
```ini title="~/.sim/credentials"
[default]
-api_key = sim_…
-
-[dev]
+access_token = sim_oat_…
+refresh_token = sim_ort_…
+token_expires_at = 1788547200000
+oauth_issuer = https://www.sim.ai/api/auth
+oauth_login_id = …
+oauth_scope = offline_access api:read api:write
+
+[ci-box]
api_key = sim_…
```
+A profile holds one login. A stored API key can be replaced after confirmation
+or with `--yes`; a live OAuth login must be revoked with `sim logout` before
+signing in again. Several `sim` commands running at once share one renewal, so
+a parallel shell loop cannot sign itself out.
+
+Run `sim login` separately on each machine. Copying `~/.sim/credentials` copies
+one single-use refresh-token family; simultaneous use from both copies is
+treated as token replay and revokes that login. If a refresh response is lost
+because the process or connection stops, the CLI does not retry the consumed
+token: run `sim logout`, then `sim login` again. This fail-closed behavior keeps
+a copied token from surviving an ambiguous refresh.
+
## Organization audit logs
-`sim audit-logs` requires a **personal** API key — the kind `sim login` issues.
-A workspace-scoped key cannot read organization-level audit logs.
+`sim audit-logs` requires a **personal** credential — an OAuth login, or the
+personal API key `sim login --browserless` issues. A workspace-scoped key cannot
+read organization-level audit logs.
diff --git a/apps/docs/content/docs/cli/billing.mdx b/apps/docs/content/docs/cli/billing.mdx
index 2df8ad9d9dc..7460d6e630b 100644
--- a/apps/docs/content/docs/cli/billing.mdx
+++ b/apps/docs/content/docs/cli/billing.mdx
@@ -13,7 +13,7 @@ Every command below also accepts the [global options](/cli/commands#global-optio
sim billing status [options]
```
-Show billing status and current-period credit usage (credits and storage require a personal API key)
+Show billing status and current-period credit usage (credits and storage require an OAuth login or personal API key)
**Options**
@@ -21,7 +21,7 @@ Show billing status and current-period credit usage (credits and storage require
| Option | Required | Description |
| --- | --- | --- |
-| `--all-workspaces` | No | Do not filter to the configured workspace (personal API key required for account-wide access). |
+| `--all-workspaces` | No | Do not filter to the configured workspace (OAuth login or personal API key required for account-wide access). |
@@ -31,7 +31,7 @@ Show billing status and current-period credit usage (credits and storage require
sim billing logs [options]
```
-List credit usage events (a personal API key reports only your own events; a workspace API key reports every member's in aggregate, unattributed)
+List credit usage events (an OAuth login or personal API key reports only your events; a workspace API key reports every member's in aggregate, unattributed)
**Options**
@@ -44,6 +44,6 @@ List credit usage events (a personal API key reports only your own events; a wor
| `--start-date ` | No | Custom period start (ISO 8601). |
| `--end-date ` | No | Custom period end (ISO 8601). |
| `--limit ` | No | Maximum items to return (0 for everything). Defaults to `100`. |
-| `--all-workspaces` | No | Do not filter to the configured workspace (personal API key required for account-wide access). |
+| `--all-workspaces` | No | Do not filter to the configured workspace (OAuth login or personal API key required for account-wide access). |
diff --git a/apps/docs/content/docs/cli/commands.mdx b/apps/docs/content/docs/cli/commands.mdx
index e8a54f5acc6..c55d7e89044 100644
--- a/apps/docs/content/docs/cli/commands.mdx
+++ b/apps/docs/content/docs/cli/commands.mdx
@@ -52,7 +52,7 @@ These apply to every command, and may be written before or after it.
| [`sim workflows`](/cli/workflows) | Manage workflows |
| [`sim workspaces`](/cli/workspaces) | Manage workspaces |
-## Authorize this terminal and store an API key for the profile
+## Sign in through the browser and store the login for the profile
```bash
sim login [options]
@@ -64,13 +64,16 @@ sim login [options]
| Option | Required | Description |
| --- | --- | --- |
-| `--scope ` | No | Key space to mint from: platform or copilot. Defaults to `platform`. |
+| `--scope ` | No | Key space for the pairing-code handoff; only "copilot" changes anything, and it forces that flow. Defaults to `platform`. |
| `--no-browser` | No | Print the URL instead of opening a browser. |
-| `-y, --yes` | No | Overwrite an existing profile without prompting. |
+| `--browserless` | No | Use the pairing-code handoff for a terminal whose browser cannot reach it (SSH, containers). |
+| `--read-only` | No | Ask only for permission to read, never to change anything. |
+| `--callback-port ` | No | Pin the local port the browser returns to. |
+| `-y, --yes` | No | Overwrite an existing API-key profile without prompting. |
-## Remove the profile's stored API key
+## Sign out and remove the profile's stored login
```bash
sim logout [options]
diff --git a/apps/docs/content/docs/cli/credentials.mdx b/apps/docs/content/docs/cli/credentials.mdx
index aec2144c459..cbab5289619 100644
--- a/apps/docs/content/docs/cli/credentials.mdx
+++ b/apps/docs/content/docs/cli/credentials.mdx
@@ -15,7 +15,7 @@ Every command below also accepts the [global options](/cli/commands#global-optio
sim credentials delete [options]
```
-Disconnect Credential (personal API key required)
+Disconnect Credential (OAuth login or personal API key required)
**Arguments**
@@ -80,7 +80,7 @@ sim credentials list [options]
sim credentials update [options]
```
-Update Credential (personal API key required)
+Update Credential (OAuth login or personal API key required)
**Arguments**
@@ -123,7 +123,7 @@ Update Credential (personal API key required)
sim credentials create [options]
```
-Create a service-account credential using its discovered provider schema (personal API key required)
+Create a service-account credential using its discovered provider schema (OAuth login or personal API key required)
**Arguments**
@@ -154,7 +154,7 @@ Create a service-account credential using its discovered provider schema (person
sim credentials connect [options]
```
-Create a short-lived link for connecting an OAuth provider (personal API key required)
+Create a short-lived link for connecting an OAuth provider (OAuth login or personal API key required)
**Arguments**
@@ -182,7 +182,7 @@ Create a short-lived link for connecting an OAuth provider (personal API key req
sim credentials reconnect
```
-Create a short-lived link for reconnecting an OAuth credential (personal API key required)
+Create a short-lived link for reconnecting an OAuth credential (OAuth login or personal API key required)
**Arguments**
diff --git a/apps/docs/content/docs/cli/files.mdx b/apps/docs/content/docs/cli/files.mdx
index be9e2330c84..89d5db8aadc 100644
--- a/apps/docs/content/docs/cli/files.mdx
+++ b/apps/docs/content/docs/cli/files.mdx
@@ -248,7 +248,7 @@ sim files share get
sim files share set [options]
```
-Enable or disable sharing for a file (personal API key required)
+Enable or disable sharing for a file (OAuth login or personal API key required)
**Arguments**
diff --git a/apps/docs/content/docs/cli/knowledge.mdx b/apps/docs/content/docs/cli/knowledge.mdx
index 5d697bb22b1..8ffe1dd8613 100644
--- a/apps/docs/content/docs/cli/knowledge.mdx
+++ b/apps/docs/content/docs/cli/knowledge.mdx
@@ -15,7 +15,7 @@ Every command below also accepts the [global options](/cli/commands#global-optio
sim knowledge from-workspace-files create [options]
```
-Index files the workspace already stores (personal API key required)
+Index files the workspace already stores (OAuth login or personal API key required)
**Arguments**
@@ -43,7 +43,7 @@ Index files the workspace already stores (personal API key required)
sim knowledge tags save [options]
```
-Declare the tag definitions a knowledge base needs (personal API key required)
+Declare the tag definitions a knowledge base needs (OAuth login or personal API key required)
**Arguments**
@@ -71,7 +71,7 @@ Declare the tag definitions a knowledge base needs (personal API key required)
sim knowledge tags create [options]
```
-Create Tag (personal API key required)
+Create Tag (OAuth login or personal API key required)
**Arguments**
@@ -101,7 +101,7 @@ Create Tag (personal API key required)
sim knowledge tags delete [options]
```
-Delete Tag (personal API key required)
+Delete Tag (OAuth login or personal API key required)
**Arguments**
@@ -130,7 +130,7 @@ Delete Tag (personal API key required)
sim knowledge tags cleanup [options]
```
-Remove tag definitions no document still uses (personal API key required)
+Remove tag definitions no document still uses (OAuth login or personal API key required)
**Arguments**
@@ -160,7 +160,7 @@ Remove tag definitions no document still uses (personal API key required)
sim knowledge tags next-slot [options]
```
-Show which tag slot a create would take for a field type (personal API key required)
+Show which tag slot a create would take for a field type (OAuth login or personal API key required)
**Arguments**
@@ -204,7 +204,7 @@ sim knowledge tags list
sim knowledge tags usage
```
-Show how many documents and chunks carry each tag (personal API key required)
+Show how many documents and chunks carry each tag (OAuth login or personal API key required)
**Arguments**
@@ -222,7 +222,7 @@ Show how many documents and chunks carry each tag (personal API key required)
sim knowledge tags update [options]
```
-Update Tag (personal API key required)
+Update Tag (OAuth login or personal API key required)
**Arguments**
@@ -252,7 +252,7 @@ Update Tag (personal API key required)
sim knowledge chunks batch-update [options]
```
-Enable, disable, or delete many chunks at once (personal API key required)
+Enable, disable, or delete many chunks at once (OAuth login or personal API key required)
**Arguments**
@@ -283,7 +283,7 @@ Enable, disable, or delete many chunks at once (personal API key required)
sim knowledge chunks create [options]
```
-Create Chunk (personal API key required)
+Create Chunk (OAuth login or personal API key required)
**Arguments**
@@ -314,7 +314,7 @@ Create Chunk (personal API key required)
sim knowledge chunks delete [options]
```
-Delete Chunk (personal API key required)
+Delete Chunk (OAuth login or personal API key required)
**Arguments**
@@ -344,7 +344,7 @@ Delete Chunk (personal API key required)
sim knowledge chunks get
```
-Get Chunk (personal API key required)
+Get Chunk (OAuth login or personal API key required)
**Arguments**
@@ -364,7 +364,7 @@ Get Chunk (personal API key required)
sim knowledge chunks list [options]
```
-List Chunks (personal API key required)
+List Chunks (OAuth login or personal API key required)
**Arguments**
@@ -397,7 +397,7 @@ List Chunks (personal API key required)
sim knowledge chunks update [options]
```
-Update Chunk (personal API key required)
+Update Chunk (OAuth login or personal API key required)
**Arguments**
@@ -429,7 +429,7 @@ Update Chunk (personal API key required)
sim knowledge documents batch-update [options]
```
-Enable or disable every matching document (personal API key required)
+Enable or disable every matching document (OAuth login or personal API key required)
**Arguments**
@@ -535,7 +535,7 @@ sim knowledge documents list [options]
sim knowledge documents update [options]
```
-Update Document (personal API key required)
+Update Document (OAuth login or personal API key required)
**Arguments**
@@ -636,7 +636,7 @@ sim knowledge create [options]
sim knowledge connectors create [options]
```
-Create Knowledge Connector (personal API key required)
+Create Knowledge Connector (OAuth login or personal API key required)
**Arguments**
@@ -668,7 +668,7 @@ Create Knowledge Connector (personal API key required)
sim knowledge connectors delete [options]
```
-Delete Knowledge Connector (personal API key required)
+Delete Knowledge Connector (OAuth login or personal API key required)
**Arguments**
@@ -699,7 +699,7 @@ Delete Knowledge Connector (personal API key required)
sim knowledge connectors get
```
-Get Knowledge Connector (personal API key required)
+Get Knowledge Connector (OAuth login or personal API key required)
**Arguments**
@@ -718,7 +718,7 @@ Get Knowledge Connector (personal API key required)
sim knowledge connectors documents list [options]
```
-List Knowledge Connector Documents (personal API key required)
+List Knowledge Connector Documents (OAuth login or personal API key required)
**Arguments**
@@ -749,7 +749,7 @@ List Knowledge Connector Documents (personal API key required)
sim knowledge connectors documents update [options]
```
-Update Knowledge Connector Documents (personal API key required)
+Update Knowledge Connector Documents (OAuth login or personal API key required)
**Arguments**
@@ -779,7 +779,7 @@ Update Knowledge Connector Documents (personal API key required)
sim knowledge connectors list [options]
```
-List Knowledge Connectors (personal API key required)
+List Knowledge Connectors (OAuth login or personal API key required)
**Arguments**
@@ -809,7 +809,7 @@ List Knowledge Connectors (personal API key required)
sim knowledge connectors sync [options]
```
-Queue a knowledge connector synchronization (personal API key required)
+Queue a knowledge connector synchronization (OAuth login or personal API key required)
**Arguments**
@@ -839,7 +839,7 @@ Queue a knowledge connector synchronization (personal API key required)
sim knowledge connectors update [options]
```
-Update Knowledge Connector (personal API key required)
+Update Knowledge Connector (OAuth login or personal API key required)
**Arguments**
diff --git a/apps/docs/content/docs/cli/logs.mdx b/apps/docs/content/docs/cli/logs.mdx
index df85aaa0bf1..186a39255de 100644
--- a/apps/docs/content/docs/cli/logs.mdx
+++ b/apps/docs/content/docs/cli/logs.mdx
@@ -70,7 +70,7 @@ sim logs list [options]
| Option | Required | Description |
| --- | --- | --- |
| `--workflow ` | No | Comma-separated workflow identifiers to include. An empty entry is rejected. At most 200 entries. (space-separated, or @path / @- with one value per line; @@value for a literal leading @). |
-| `--trigger ` | No | Comma-separated trigger types to include. An empty entry is rejected. Values are matched exactly and are case-sensitive — every recorded trigger is lowercase, so `API` matches nothing while `api` matches. The vocabulary is open: it covers the core trigger types (`manual`, `api`, `schedule`, `chat`, `webhook`, `mcp`, `copilot`, `workflow`, `custom_block`) and the provider id of any webhook trigger (`slack`, `gmail`, `github`, …), so an unrecognized member is not rejected — it selects no runs. The literal value `all` is a sentinel that disables this filter entirely, so a list containing it returns runs of every trigger type; no real trigger type is named `all`. At most 100 entries. (space-separated, or @path / @- with one value per line; @@value for a literal leading @). |
+| `--trigger ` | No | Comma-separated, lowercase trigger types or webhook provider IDs. Matching is exact and case-sensitive; unknown values select no runs. An empty entry is rejected. The sentinel `all` disables this filter, even when listed with other values. At most 100 entries. (space-separated, or @path / @- with one value per line; @@value for a literal leading @). |
| `--level ` | No | Severity level to include. Accepted values: `info`, `error`. |
| `--start-date ` | No | Only include runs started at or after this UTC ISO 8601 timestamp, e.g. `2026-08-06T00:00:00Z`. A date without a time, or a timestamp carrying a UTC offset instead of `Z`, is rejected, as is year `0000`, which names no storable instant. |
| `--end-date ` | No | Only include runs started at or before this UTC ISO 8601 timestamp, e.g. `2026-08-06T00:00:00Z`. A date without a time, or a timestamp carrying a UTC offset instead of `Z`, is rejected, as is year `0000`, which names no storable instant. |
@@ -85,7 +85,7 @@ sim logs list [options]
| `--limit ` | No | Maximum items to return (0 for everything). Defaults to `100`. |
| `--status ` | No | Comma-separated execution statuses to include, from `pending` \| `running` \| `paused` \| `redacting` \| `completed` \| `failed` \| `cancelled`. An empty entry is rejected. ANDed with `level`, which reports severity rather than lifecycle. |
| `--workflow-name ` | No | Case-insensitive substring match against the run's workflow name. Runs whose workflow has been deleted match nothing, because the name is no longer joinable. |
-| `--include-job-runs` | No | Whether Chat and Sim-agent job runs join the sequence alongside workflow runs. Job runs report `kind: "job"`, carry no `workflow` summary, and never carry a cost ledger. They are dropped entirely — not partially matched — whenever a filter they cannot answer is set: by workflow, workflow name, folder, model, or status. A filter therefore never means two different things across the union. Accepted only when sorting by `startedAt`: job runs record cost as a document and no comparable status, so they cannot participate in the other orderings. |
+| `--include-job-runs` | No | Include Chat and Sim-agent jobs alongside workflow runs. Jobs use `kind: "job"` and have no workflow or cost ledger. Workflow, folder, model, or status filters exclude jobs. This option is valid only when sorting by `startedAt`. |
| `--no-include-job-runs` | No | Send --include-job-runs as false. |
| `--run-id ` | No | Exact run identifier to match. |
| `--sort-by ` | No | Field used to sort the result. `durationMs` and `cost` are null until a run settles; those runs order as though the value were below every recorded one, so they trail an ascending page and lead a descending one. Only `startedAt` can order Chat and Sim-agent job runs, so any other value is rejected when job runs are included. Accepted values: `startedAt`, `durationMs`, `cost`, `status`. |
diff --git a/apps/docs/content/docs/cli/mcp-servers.mdx b/apps/docs/content/docs/cli/mcp-servers.mdx
index db0f65a115a..ca1607cc7f9 100644
--- a/apps/docs/content/docs/cli/mcp-servers.mdx
+++ b/apps/docs/content/docs/cli/mcp-servers.mdx
@@ -103,7 +103,7 @@ sim mcp-servers list [options]
sim mcp-servers tools list [options]
```
-List MCP Server Tools (personal API key required)
+List MCP Server Tools (OAuth login or personal API key required)
**Arguments**
diff --git a/apps/docs/content/docs/cli/reference.mdx b/apps/docs/content/docs/cli/reference.mdx
index 28bab99672f..792ec073437 100644
--- a/apps/docs/content/docs/cli/reference.mdx
+++ b/apps/docs/content/docs/cli/reference.mdx
@@ -26,7 +26,7 @@ These apply to every command, and may be written before or after it.
## sim login
-Authorize this terminal and store an API key for the profile
+Sign in through the browser and store the login for the profile
```bash
sim login [options]
@@ -38,15 +38,18 @@ sim login [options]
| Option | Required | Description |
| --- | --- | --- |
-| `--scope ` | No | Key space to mint from: platform or copilot. Defaults to `platform`. |
+| `--scope ` | No | Key space for the pairing-code handoff; only "copilot" changes anything, and it forces that flow. Defaults to `platform`. |
| `--no-browser` | No | Print the URL instead of opening a browser. |
-| `-y, --yes` | No | Overwrite an existing profile without prompting. |
+| `--browserless` | No | Use the pairing-code handoff for a terminal whose browser cannot reach it (SSH, containers). |
+| `--read-only` | No | Ask only for permission to read, never to change anything. |
+| `--callback-port ` | No | Pin the local port the browser returns to. |
+| `-y, --yes` | No | Overwrite an existing API-key profile without prompting. |
## sim logout
-Remove the profile's stored API key
+Sign out and remove the profile's stored login
```bash
sim logout [options]
@@ -175,7 +178,7 @@ Also spelled `sim audit-log`.
### sim audit-logs get
-Get Audit Log (personal API key required)
+Get Audit Log (OAuth login or personal API key required)
```bash
sim audit-logs get [options]
@@ -197,13 +200,13 @@ sim audit-logs get [options]
| Option | Required | Description |
| --- | --- | --- |
-| `--organization ` | No | Organization ID; defaults to your only organization, and is required when your account belongs to more than one (personal API key required). |
+| `--organization ` | No | Organization ID; defaults to your only organization, and is required when your account belongs to more than one (OAuth login or personal API key required). |
### sim audit-logs list
-List Audit Logs (personal API key required)
+List Audit Logs (OAuth login or personal API key required)
```bash
sim audit-logs list [options]
@@ -223,9 +226,9 @@ sim audit-logs list [options]
| `--include-departed` | No | Include actions by users who have left the organization. |
| `--no-include-departed` | No | Send --include-departed as false. |
| `--limit ` | No | Maximum items to return (0 for everything). Defaults to `100`. |
-| `--organization ` | No | Organization ID; defaults to your only organization, and is required when your account belongs to more than one (personal API key required). |
+| `--organization ` | No | Organization ID; defaults to your only organization, and is required when your account belongs to more than one (OAuth login or personal API key required). |
| `--actor-email ` | No | Filter by actor email address. |
-| `--all-workspaces` | No | Do not filter to the configured workspace (personal API key required for account-wide access). |
+| `--all-workspaces` | No | Do not filter to the configured workspace (OAuth login or personal API key required for account-wide access). |
@@ -233,7 +236,7 @@ sim audit-logs list [options]
### sim billing status
-Show billing status and current-period credit usage (credits and storage require a personal API key)
+Show billing status and current-period credit usage (credits and storage require an OAuth login or personal API key)
```bash
sim billing status [options]
@@ -245,13 +248,13 @@ sim billing status [options]
| Option | Required | Description |
| --- | --- | --- |
-| `--all-workspaces` | No | Do not filter to the configured workspace (personal API key required for account-wide access). |
+| `--all-workspaces` | No | Do not filter to the configured workspace (OAuth login or personal API key required for account-wide access). |
### sim billing logs
-List credit usage events (a personal API key reports only your own events; a workspace API key reports every member's in aggregate, unattributed)
+List credit usage events (an OAuth login or personal API key reports only your events; a workspace API key reports every member's in aggregate, unattributed)
```bash
sim billing logs [options]
@@ -268,7 +271,7 @@ sim billing logs [options]
| `--start-date ` | No | Custom period start (ISO 8601). |
| `--end-date ` | No | Custom period end (ISO 8601). |
| `--limit ` | No | Maximum items to return (0 for everything). Defaults to `100`. |
-| `--all-workspaces` | No | Do not filter to the configured workspace (personal API key required for account-wide access). |
+| `--all-workspaces` | No | Do not filter to the configured workspace (OAuth login or personal API key required for account-wide access). |
@@ -367,7 +370,7 @@ Also spelled `sim credential`.
### sim credentials delete
-Disconnect Credential (personal API key required)
+Disconnect Credential (OAuth login or personal API key required)
```bash
sim credentials delete [options]
@@ -436,7 +439,7 @@ sim credentials list [options]
### sim credentials update
-Update Credential (personal API key required)
+Update Credential (OAuth login or personal API key required)
```bash
sim credentials update [options]
@@ -479,7 +482,7 @@ sim credentials update [options]
### sim credentials create
-Create a service-account credential using its discovered provider schema (personal API key required)
+Create a service-account credential using its discovered provider schema (OAuth login or personal API key required)
```bash
sim credentials create [options]
@@ -510,7 +513,7 @@ sim credentials create [options]
### sim credentials connect
-Create a short-lived link for connecting an OAuth provider (personal API key required)
+Create a short-lived link for connecting an OAuth provider (OAuth login or personal API key required)
```bash
sim credentials connect [options]
@@ -538,7 +541,7 @@ sim credentials connect [options]
### sim credentials reconnect
-Create a short-lived link for reconnecting an OAuth credential (personal API key required)
+Create a short-lived link for reconnecting an OAuth credential (OAuth login or personal API key required)
```bash
sim credentials reconnect
@@ -936,7 +939,7 @@ sim files share get
### sim files share set
-Enable or disable sharing for a file (personal API key required)
+Enable or disable sharing for a file (OAuth login or personal API key required)
```bash
sim files share set [options]
@@ -1278,7 +1281,7 @@ Also spelled `sim kb`.
### sim knowledge from-workspace-files create
-Index files the workspace already stores (personal API key required)
+Index files the workspace already stores (OAuth login or personal API key required)
```bash
sim knowledge from-workspace-files create [options]
@@ -1306,7 +1309,7 @@ sim knowledge from-workspace-files create [options]
### sim knowledge tags save
-Declare the tag definitions a knowledge base needs (personal API key required)
+Declare the tag definitions a knowledge base needs (OAuth login or personal API key required)
```bash
sim knowledge tags save [options]
@@ -1334,7 +1337,7 @@ sim knowledge tags save [options]
### sim knowledge tags create
-Create Tag (personal API key required)
+Create Tag (OAuth login or personal API key required)
```bash
sim knowledge tags create [options]
@@ -1364,7 +1367,7 @@ sim knowledge tags create [options]
### sim knowledge tags delete
-Delete Tag (personal API key required)
+Delete Tag (OAuth login or personal API key required)
```bash
sim knowledge tags delete [options]
@@ -1393,7 +1396,7 @@ sim knowledge tags delete [options]
### sim knowledge tags cleanup
-Remove tag definitions no document still uses (personal API key required)
+Remove tag definitions no document still uses (OAuth login or personal API key required)
```bash
sim knowledge tags cleanup [options]
@@ -1423,7 +1426,7 @@ sim knowledge tags cleanup [options]
### sim knowledge tags next-slot
-Show which tag slot a create would take for a field type (personal API key required)
+Show which tag slot a create would take for a field type (OAuth login or personal API key required)
```bash
sim knowledge tags next-slot [options]
@@ -1469,7 +1472,7 @@ sim knowledge tags list
### sim knowledge tags usage
-Show how many documents and chunks carry each tag (personal API key required)
+Show how many documents and chunks carry each tag (OAuth login or personal API key required)
```bash
sim knowledge tags usage
@@ -1487,7 +1490,7 @@ sim knowledge tags usage
### sim knowledge tags update
-Update Tag (personal API key required)
+Update Tag (OAuth login or personal API key required)
```bash
sim knowledge tags update [options]
@@ -1517,7 +1520,7 @@ sim knowledge tags update [options]
### sim knowledge chunks batch-update
-Enable, disable, or delete many chunks at once (personal API key required)
+Enable, disable, or delete many chunks at once (OAuth login or personal API key required)
```bash
sim knowledge chunks batch-update [options]
@@ -1548,7 +1551,7 @@ sim knowledge chunks batch-update [options]
### sim knowledge chunks create
-Create Chunk (personal API key required)
+Create Chunk (OAuth login or personal API key required)
```bash
sim knowledge chunks create [options]
@@ -1579,7 +1582,7 @@ sim knowledge chunks create [options]
### sim knowledge chunks delete
-Delete Chunk (personal API key required)
+Delete Chunk (OAuth login or personal API key required)
```bash
sim knowledge chunks delete [options]
@@ -1609,7 +1612,7 @@ sim knowledge chunks delete [options]
### sim knowledge chunks get
-Get Chunk (personal API key required)
+Get Chunk (OAuth login or personal API key required)
```bash
sim knowledge chunks get
@@ -1629,7 +1632,7 @@ sim knowledge chunks get
### sim knowledge chunks list
-List Chunks (personal API key required)
+List Chunks (OAuth login or personal API key required)
```bash
sim knowledge chunks list [options]
@@ -1662,7 +1665,7 @@ sim knowledge chunks list [options]
### sim knowledge chunks update
-Update Chunk (personal API key required)
+Update Chunk (OAuth login or personal API key required)
```bash
sim knowledge chunks update [options]
@@ -1694,7 +1697,7 @@ sim knowledge chunks update [options]
### sim knowledge documents batch-update
-Enable or disable every matching document (personal API key required)
+Enable or disable every matching document (OAuth login or personal API key required)
```bash
sim knowledge documents batch-update [options]
@@ -1806,7 +1809,7 @@ sim knowledge documents list [options]
### sim knowledge documents update
-Update Document (personal API key required)
+Update Document (OAuth login or personal API key required)
```bash
sim knowledge documents update [options]
@@ -1911,7 +1914,7 @@ sim knowledge create [options]
### sim knowledge connectors create
-Create Knowledge Connector (personal API key required)
+Create Knowledge Connector (OAuth login or personal API key required)
```bash
sim knowledge connectors create [options]
@@ -1943,7 +1946,7 @@ sim knowledge connectors create [options]
### sim knowledge connectors delete
-Delete Knowledge Connector (personal API key required)
+Delete Knowledge Connector (OAuth login or personal API key required)
```bash
sim knowledge connectors delete [options]
@@ -1974,7 +1977,7 @@ sim knowledge connectors delete [options]
### sim knowledge connectors get
-Get Knowledge Connector (personal API key required)
+Get Knowledge Connector (OAuth login or personal API key required)
```bash
sim knowledge connectors get
@@ -1993,7 +1996,7 @@ sim knowledge connectors get
### sim knowledge connectors documents list
-List Knowledge Connector Documents (personal API key required)
+List Knowledge Connector Documents (OAuth login or personal API key required)
```bash
sim knowledge connectors documents list [options]
@@ -2024,7 +2027,7 @@ sim knowledge connectors documents list [options
### sim knowledge connectors documents update
-Update Knowledge Connector Documents (personal API key required)
+Update Knowledge Connector Documents (OAuth login or personal API key required)
```bash
sim knowledge connectors documents update [options]
@@ -2054,7 +2057,7 @@ sim knowledge connectors documents update [optio
### sim knowledge connectors list
-List Knowledge Connectors (personal API key required)
+List Knowledge Connectors (OAuth login or personal API key required)
```bash
sim knowledge connectors list [options]
@@ -2084,7 +2087,7 @@ sim knowledge connectors list [options]
### sim knowledge connectors sync
-Queue a knowledge connector synchronization (personal API key required)
+Queue a knowledge connector synchronization (OAuth login or personal API key required)
```bash
sim knowledge connectors sync [options]
@@ -2114,7 +2117,7 @@ sim knowledge connectors sync [options]
### sim knowledge connectors update
-Update Knowledge Connector (personal API key required)
+Update Knowledge Connector (OAuth login or personal API key required)
```bash
sim knowledge connectors update [options]
@@ -2515,7 +2518,7 @@ sim logs list [options]
| Option | Required | Description |
| --- | --- | --- |
| `--workflow ` | No | Comma-separated workflow identifiers to include. An empty entry is rejected. At most 200 entries. (space-separated, or @path / @- with one value per line; @@value for a literal leading @). |
-| `--trigger ` | No | Comma-separated trigger types to include. An empty entry is rejected. Values are matched exactly and are case-sensitive — every recorded trigger is lowercase, so `API` matches nothing while `api` matches. The vocabulary is open: it covers the core trigger types (`manual`, `api`, `schedule`, `chat`, `webhook`, `mcp`, `copilot`, `workflow`, `custom_block`) and the provider id of any webhook trigger (`slack`, `gmail`, `github`, …), so an unrecognized member is not rejected — it selects no runs. The literal value `all` is a sentinel that disables this filter entirely, so a list containing it returns runs of every trigger type; no real trigger type is named `all`. At most 100 entries. (space-separated, or @path / @- with one value per line; @@value for a literal leading @). |
+| `--trigger ` | No | Comma-separated, lowercase trigger types or webhook provider IDs. Matching is exact and case-sensitive; unknown values select no runs. An empty entry is rejected. The sentinel `all` disables this filter, even when listed with other values. At most 100 entries. (space-separated, or @path / @- with one value per line; @@value for a literal leading @). |
| `--level ` | No | Severity level to include. Accepted values: `info`, `error`. |
| `--start-date ` | No | Only include runs started at or after this UTC ISO 8601 timestamp, e.g. `2026-08-06T00:00:00Z`. A date without a time, or a timestamp carrying a UTC offset instead of `Z`, is rejected, as is year `0000`, which names no storable instant. |
| `--end-date ` | No | Only include runs started at or before this UTC ISO 8601 timestamp, e.g. `2026-08-06T00:00:00Z`. A date without a time, or a timestamp carrying a UTC offset instead of `Z`, is rejected, as is year `0000`, which names no storable instant. |
@@ -2530,7 +2533,7 @@ sim logs list [options]
| `--limit ` | No | Maximum items to return (0 for everything). Defaults to `100`. |
| `--status ` | No | Comma-separated execution statuses to include, from `pending` \| `running` \| `paused` \| `redacting` \| `completed` \| `failed` \| `cancelled`. An empty entry is rejected. ANDed with `level`, which reports severity rather than lifecycle. |
| `--workflow-name ` | No | Case-insensitive substring match against the run's workflow name. Runs whose workflow has been deleted match nothing, because the name is no longer joinable. |
-| `--include-job-runs` | No | Whether Chat and Sim-agent job runs join the sequence alongside workflow runs. Job runs report `kind: "job"`, carry no `workflow` summary, and never carry a cost ledger. They are dropped entirely — not partially matched — whenever a filter they cannot answer is set: by workflow, workflow name, folder, model, or status. A filter therefore never means two different things across the union. Accepted only when sorting by `startedAt`: job runs record cost as a document and no comparable status, so they cannot participate in the other orderings. |
+| `--include-job-runs` | No | Include Chat and Sim-agent jobs alongside workflow runs. Jobs use `kind: "job"` and have no workflow or cost ledger. Workflow, folder, model, or status filters exclude jobs. This option is valid only when sorting by `startedAt`. |
| `--no-include-job-runs` | No | Send --include-job-runs as false. |
| `--run-id ` | No | Exact run identifier to match. |
| `--sort-by ` | No | Field used to sort the result. `durationMs` and `cost` are null until a run settles; those runs order as though the value were below every recorded one, so they trail an ascending page and lead a descending one. Only `startedAt` can order Chat and Sim-agent job runs, so any other value is rejected when job runs are included. Accepted values: `startedAt`, `durationMs`, `cost`, `status`. |
@@ -2665,7 +2668,7 @@ sim mcp-servers list [options]
### sim mcp-servers tools list
-List MCP Server Tools (personal API key required)
+List MCP Server Tools (OAuth login or personal API key required)
```bash
sim mcp-servers tools list [options]
@@ -2747,7 +2750,7 @@ Also spelled `sim sandbox`.
### sim sandboxes create
-Create Sandbox (personal API key required)
+Create Sandbox (OAuth login or personal API key required)
```bash
sim sandboxes create [options]
@@ -2769,7 +2772,7 @@ sim sandboxes create [options]
### sim sandboxes delete
-Delete Sandbox (personal API key required)
+Delete Sandbox (OAuth login or personal API key required)
```bash
sim sandboxes delete [options]
@@ -2836,7 +2839,7 @@ sim sandboxes list [options]
### sim sandboxes update
-Update Sandbox (personal API key required)
+Update Sandbox (OAuth login or personal API key required)
```bash
sim sandboxes update [options]
@@ -2872,7 +2875,7 @@ Also spelled `sim secret`.
### sim secrets delete
-Delete Secret (personal API key required)
+Delete Secret (OAuth login or personal API key required)
```bash
sim secrets delete [options]
@@ -2901,7 +2904,7 @@ sim secrets delete [options]
### sim secrets list
-List Secrets (personal API key required)
+List Secrets (OAuth login or personal API key required)
```bash
sim secrets list [options]
@@ -2923,7 +2926,7 @@ sim secrets list [options]
### sim secrets set
-Create or replace a named secret (personal API key required)
+Create or replace a named secret (OAuth login or personal API key required)
```bash
sim secrets set [options]
@@ -2959,7 +2962,7 @@ Also spelled `sim skill`.
### sim skills create
-Create Skill (personal API key required)
+Create Skill (OAuth login or personal API key required)
```bash
sim skills create [options]
@@ -2979,7 +2982,7 @@ sim skills create [options]
### sim skills delete
-Delete Skill (personal API key required)
+Delete Skill (OAuth login or personal API key required)
```bash
sim skills delete [options]
@@ -3025,7 +3028,7 @@ sim skills get
### sim skills editors create
-Grant Skill Editor (personal API key required)
+Grant Skill Editor (OAuth login or personal API key required)
```bash
sim skills editors create [options]
@@ -3083,7 +3086,7 @@ sim skills editors list [options]
### sim skills editors delete
-Revoke Skill Editor (personal API key required)
+Revoke Skill Editor (OAuth login or personal API key required)
```bash
sim skills editors delete [options]
@@ -3133,7 +3136,7 @@ sim skills list [options]
### sim skills update
-Update Skill (personal API key required)
+Update Skill (OAuth login or personal API key required)
```bash
sim skills update [options]
@@ -4548,7 +4551,7 @@ sim tables mkdir
### sim tools execute
-Run one built-in tool and print what it produced (personal API key required)
+Run one built-in tool and print what it produced (OAuth login or personal API key required)
```bash
sim tools execute [options]
@@ -4621,7 +4624,7 @@ sim tools list [options]
### sim workflow-mcp-servers create
-Create Workflow MCP Server (personal API key required)
+Create Workflow MCP Server (OAuth login or personal API key required)
```bash
sim workflow-mcp-servers create [options]
@@ -4643,7 +4646,7 @@ sim workflow-mcp-servers create [options]
### sim workflow-mcp-servers delete
-Delete Workflow MCP Server (personal API key required)
+Delete Workflow MCP Server (OAuth login or personal API key required)
```bash
sim workflow-mcp-servers delete [options]
@@ -4671,7 +4674,7 @@ sim workflow-mcp-servers delete [options]
### sim workflow-mcp-servers tools create
-Publish Workflow As MCP Tool (personal API key required)
+Publish Workflow As MCP Tool (OAuth login or personal API key required)
```bash
sim workflow-mcp-servers tools create [options]
@@ -4702,7 +4705,7 @@ sim workflow-mcp-servers tools create [options]
### sim workflow-mcp-servers tools list
-List Workflow MCP Tools (personal API key required)
+List Workflow MCP Tools (OAuth login or personal API key required)
```bash
sim workflow-mcp-servers tools list
@@ -4720,7 +4723,7 @@ sim workflow-mcp-servers tools list
### sim workflow-mcp-servers tools delete
-Unpublish Workflow MCP Tool (personal API key required)
+Unpublish Workflow MCP Tool (OAuth login or personal API key required)
```bash
sim workflow-mcp-servers tools delete [options]
@@ -4749,7 +4752,7 @@ sim workflow-mcp-servers tools delete [options]
### sim workflow-mcp-servers get
-Get Workflow MCP Server (personal API key required)
+Get Workflow MCP Server (OAuth login or personal API key required)
```bash
sim workflow-mcp-servers get
@@ -4767,7 +4770,7 @@ sim workflow-mcp-servers get
### sim workflow-mcp-servers list
-List Workflow MCP Servers (personal API key required)
+List Workflow MCP Servers (OAuth login or personal API key required)
```bash
sim workflow-mcp-servers list [options]
@@ -4787,7 +4790,7 @@ sim workflow-mcp-servers list [options]
### sim workflow-mcp-servers update
-Update Workflow MCP Server (personal API key required)
+Update Workflow MCP Server (OAuth login or personal API key required)
```bash
sim workflow-mcp-servers update [options]
@@ -4822,7 +4825,7 @@ Also spelled `sim workflow`.
### sim workflows activate create
-Activate Workflow Version (personal API key required)
+Activate Workflow Version (OAuth login or personal API key required)
```bash
sim workflows activate create [options]
@@ -4851,7 +4854,7 @@ sim workflows activate create [options]
### sim workflows operations apply
-Apply Workflow Operations (personal API key required)
+Apply Workflow Operations
```bash
sim workflows operations apply [options]
@@ -5198,7 +5201,7 @@ sim workflows delete [options]
### sim workflows chat unpublish
-Take a workflow’s chat deployment offline (personal API key required)
+Take a workflow’s chat deployment offline (OAuth login or personal API key required)
```bash
sim workflows chat unpublish [options]
@@ -5226,7 +5229,7 @@ sim workflows chat unpublish [options]
### sim workflows chat status
-Show a workflow’s chat deployment (personal API key required)
+Show a workflow’s chat deployment (OAuth login or personal API key required)
```bash
sim workflows chat status
@@ -5244,7 +5247,7 @@ sim workflows chat status
### sim workflows chat publish
-Publish or replace a workflow’s chat deployment (personal API key required)
+Publish or replace a workflow’s chat deployment
```bash
sim workflows chat publish [options]
@@ -5284,7 +5287,7 @@ sim workflows chat publish [options]
### sim workflows deploy
-Deploy Workflow (personal API key required)
+Deploy Workflow (OAuth login or personal API key required)
```bash
sim workflows deploy [options]
@@ -5439,7 +5442,7 @@ sim workflows deployment status
### sim workflows deployment update
-Update Workflow Public API Access (personal API key required)
+Update Workflow Public API Access (OAuth login or personal API key required)
```bash
sim workflows deployment update [options]
@@ -5485,7 +5488,7 @@ sim workflows state get
### sim workflows state replace
-Replace Workflow State (personal API key required)
+Replace Workflow State
```bash
sim workflows state replace [options]
@@ -5680,7 +5683,7 @@ sim workflows restore
### sim workflows revert create
-Revert Workflow To Version (personal API key required)
+Revert Workflow To Version (OAuth login or personal API key required)
```bash
sim workflows revert create [options]
@@ -5709,7 +5712,7 @@ sim workflows revert create [options]
### sim workflows rollback
-Rollback Workflow (personal API key required)
+Rollback Workflow (OAuth login or personal API key required)
```bash
sim workflows rollback [options]
@@ -5738,7 +5741,7 @@ sim workflows rollback [options]
### sim workflows undeploy
-Take a workflow out of deployment (personal API key required)
+Take a workflow out of deployment (OAuth login or personal API key required)
```bash
sim workflows undeploy [options]
diff --git a/apps/docs/content/docs/cli/sandboxes.mdx b/apps/docs/content/docs/cli/sandboxes.mdx
index 9a73cc47dae..fc2a3c125a3 100644
--- a/apps/docs/content/docs/cli/sandboxes.mdx
+++ b/apps/docs/content/docs/cli/sandboxes.mdx
@@ -15,7 +15,7 @@ Every command below also accepts the [global options](/cli/commands#global-optio
sim sandboxes create [options]
```
-Create Sandbox (personal API key required)
+Create Sandbox (OAuth login or personal API key required)
**Options**
@@ -37,7 +37,7 @@ Create Sandbox (personal API key required)
sim sandboxes delete [options]
```
-Delete Sandbox (personal API key required)
+Delete Sandbox (OAuth login or personal API key required)
**Arguments**
@@ -100,7 +100,7 @@ sim sandboxes list [options]
sim sandboxes update [options]
```
-Update Sandbox (personal API key required)
+Update Sandbox (OAuth login or personal API key required)
**Arguments**
diff --git a/apps/docs/content/docs/cli/secrets.mdx b/apps/docs/content/docs/cli/secrets.mdx
index f9bbbdb2cdb..6cd7d80aa29 100644
--- a/apps/docs/content/docs/cli/secrets.mdx
+++ b/apps/docs/content/docs/cli/secrets.mdx
@@ -15,7 +15,7 @@ Every command below also accepts the [global options](/cli/commands#global-optio
sim secrets delete [options]
```
-Delete Secret (personal API key required)
+Delete Secret (OAuth login or personal API key required)
**Arguments**
@@ -44,7 +44,7 @@ Delete Secret (personal API key required)
sim secrets list [options]
```
-List Secrets (personal API key required)
+List Secrets (OAuth login or personal API key required)
**Options**
@@ -66,7 +66,7 @@ List Secrets (personal API key required)
sim secrets set