Skip to content

Commit d0d37b1

Browse files
committed
Merge remote-tracking branch 'origin/staging' into codex/admin-dashboard-release-gate
# Conflicts: # scripts/check-api-validation-contracts.ts
2 parents a6b7ae4 + 5b28da1 commit d0d37b1

76 files changed

Lines changed: 23479 additions & 393 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

apps/docs/components/icons.tsx

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5151,6 +5151,30 @@ export function BasetenIcon(props: SVGProps<SVGSVGElement>) {
51515151
)
51525152
}
51535153

5154+
export function CohereIcon(props: SVGProps<SVGSVGElement>) {
5155+
return (
5156+
<svg {...props} height='1em' width='1em' viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'>
5157+
<title>Cohere</title>
5158+
<path
5159+
d='M8.128 14.099c.592 0 1.77-.033 3.398-.703 1.897-.781 5.672-2.2 8.395-3.656 1.905-1.018 2.74-2.366 2.74-4.18A4.56 4.56 0 0018.1 1H7.549A6.55 6.55 0 001 7.55c0 3.617 2.745 6.549 7.128 6.549z'
5160+
clipRule='evenodd'
5161+
fill='#39594D'
5162+
fillRule='evenodd'
5163+
/>
5164+
<path
5165+
d='M9.912 18.61a4.387 4.387 0 012.705-4.052l3.323-1.38c3.361-1.394 7.06 1.076 7.06 4.715a5.104 5.104 0 01-5.105 5.104l-3.597-.001a4.386 4.386 0 01-4.386-4.387z'
5166+
clipRule='evenodd'
5167+
fill='#D18EE2'
5168+
fillRule='evenodd'
5169+
/>
5170+
<path
5171+
d='M4.776 14.962A3.775 3.775 0 001 18.738v.489a3.776 3.776 0 007.551 0v-.49a3.775 3.775 0 00-3.775-3.775z'
5172+
fill='#FF7759'
5173+
/>
5174+
</svg>
5175+
)
5176+
}
5177+
51545178
export function MondayIcon(props: SVGProps<SVGSVGElement>) {
51555179
return (
51565180
<svg

apps/docs/content/docs/en/cli/reference.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2979,7 +2979,7 @@ sim tables rows query <tableId> [options]
29792979

29802980
| Option | Required | Description |
29812981
| --- | --- | --- |
2982-
| `--filter <json\|@file>` | No | Predicate: &#123;"all":[&#123;"field":"status","op":"eq","value":"active"&#125;]&#125;; groups use all/any. Operators: eq, ne, gt, gte, lt, lte, in, nin, contains, ncontains, startsWith, endsWith, like, ilike, nlike, nilike, isEmpty, isNotEmpty, isNull, isNotNull (JSON, or @path / @- to read a file or stdin). |
2982+
| `--filter <json\|@file>` | No | Condition: &#123;"field":"status","op":"eq","value":"active"&#125;. Groups: &#123;"all":[&#123;"field":"status","op":"eq","value":"active"&#125;]&#125; or &#123;"any":[&#123;"field":"status","op":"eq","value":"active"&#125;]&#125;; group entries may also be nested groups. Operators: eq, ne, gt, gte, lt, lte, in, nin, contains, ncontains, startsWith, endsWith, like, ilike, nlike, nilike, isEmpty, isNotEmpty, isNull, isNotNull (JSON, or @path / @- to read a file or stdin). |
29832983
| `--sort <json\|@file>` | No | Ordered sort keys: [&#123;"field":"createdAt","direction":"desc"&#125;] (direction: asc or desc) (JSON, or @path / @- to read a file or stdin). |
29842984
| `--limit <n>` | No | Maximum items to return (0 for everything). Defaults to `100`. |
29852985

@@ -3009,7 +3009,7 @@ sim tables rows count <tableId> [options]
30093009

30103010
| Option | Required | Description |
30113011
| --- | --- | --- |
3012-
| `--filter <json\|@file>` | No | Predicate: &#123;"all":[&#123;"field":"status","op":"eq","value":"active"&#125;]&#125;; groups use all/any. Operators: eq, ne, gt, gte, lt, lte, in, nin, contains, ncontains, startsWith, endsWith, like, ilike, nlike, nilike, isEmpty, isNotEmpty, isNull, isNotNull (JSON, or @path / @- to read a file or stdin). |
3012+
| `--filter <json\|@file>` | No | Condition: &#123;"field":"status","op":"eq","value":"active"&#125;. Groups: &#123;"all":[&#123;"field":"status","op":"eq","value":"active"&#125;]&#125; or &#123;"any":[&#123;"field":"status","op":"eq","value":"active"&#125;]&#125;; group entries may also be nested groups. Operators: eq, ne, gt, gte, lt, lte, in, nin, contains, ncontains, startsWith, endsWith, like, ilike, nlike, nilike, isEmpty, isNotEmpty, isNull, isNotNull (JSON, or @path / @- to read a file or stdin). |
30133013

30143014
</CommandTable>
30153015

apps/docs/content/docs/en/cli/tables.mdx

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -642,7 +642,7 @@ sim tables rows query <tableId> [options]
642642

643643
| Option | Required | Description |
644644
| --- | --- | --- |
645-
| `--filter <json\|@file>` | No | Predicate: &#123;"all":[&#123;"field":"status","op":"eq","value":"active"&#125;]&#125;; groups use all/any. Operators: eq, ne, gt, gte, lt, lte, in, nin, contains, ncontains, startsWith, endsWith, like, ilike, nlike, nilike, isEmpty, isNotEmpty, isNull, isNotNull (JSON, or @path / @- to read a file or stdin). |
645+
| `--filter <json\|@file>` | No | Condition: &#123;"field":"status","op":"eq","value":"active"&#125;. Groups: &#123;"all":[&#123;"field":"status","op":"eq","value":"active"&#125;]&#125; or &#123;"any":[&#123;"field":"status","op":"eq","value":"active"&#125;]&#125;; group entries may also be nested groups. Operators: eq, ne, gt, gte, lt, lte, in, nin, contains, ncontains, startsWith, endsWith, like, ilike, nlike, nilike, isEmpty, isNotEmpty, isNull, isNotNull (JSON, or @path / @- to read a file or stdin). |
646646
| `--sort <json\|@file>` | No | Ordered sort keys: [&#123;"field":"createdAt","direction":"desc"&#125;] (direction: asc or desc) (JSON, or @path / @- to read a file or stdin). |
647647
| `--limit <n>` | No | Maximum items to return (0 for everything). Defaults to `100`. |
648648

@@ -670,7 +670,7 @@ sim tables rows count <tableId> [options]
670670

671671
| Option | Required | Description |
672672
| --- | --- | --- |
673-
| `--filter <json\|@file>` | No | Predicate: &#123;"all":[&#123;"field":"status","op":"eq","value":"active"&#125;]&#125;; groups use all/any. Operators: eq, ne, gt, gte, lt, lte, in, nin, contains, ncontains, startsWith, endsWith, like, ilike, nlike, nilike, isEmpty, isNotEmpty, isNull, isNotNull (JSON, or @path / @- to read a file or stdin). |
673+
| `--filter <json\|@file>` | No | Condition: &#123;"field":"status","op":"eq","value":"active"&#125;. Groups: &#123;"all":[&#123;"field":"status","op":"eq","value":"active"&#125;]&#125; or &#123;"any":[&#123;"field":"status","op":"eq","value":"active"&#125;]&#125;; group entries may also be nested groups. Operators: eq, ne, gt, gte, lt, lte, in, nin, contains, ncontains, startsWith, endsWith, like, ilike, nlike, nilike, isEmpty, isNotEmpty, isNull, isNotNull (JSON, or @path / @- to read a file or stdin). |
674674

675675
</CommandTable>
676676

apps/docs/content/docs/en/platform/costs.mdx

Lines changed: 88 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -215,34 +215,102 @@ Use your own API keys for supported providers instead of Sim's hosted keys to pa
215215

216216
### Supported Providers
217217

218-
| Provider | Usage |
219-
|----------|-------|
220-
| OpenAI | Knowledge Base embeddings, Agent block |
221-
| Anthropic | Agent block |
222-
| Google | Agent block |
223-
| Mistral | Knowledge Base OCR, Agent block |
224-
| Fireworks | Agent block |
225-
| Firecrawl | Web scraping, crawling, search, and extraction |
226-
| Exa | AI-powered search and research |
227-
| Serper | Google search API |
228-
| Linkup | Web search and content retrieval |
229-
| Parallel AI | Web search, extraction, and deep research |
230-
| Perplexity | AI-powered chat and web search |
231-
| Jina AI | Web reading and search |
232-
| Google Cloud | Translate, Maps, PageSpeed, and Books APIs |
233-
| Brandfetch | Brand assets, logos, colors, and company info |
218+
The BYOK settings page groups providers the same way.
219+
220+
<Tabs items={['Models', 'Search & web', 'Enrichment']}>
221+
<Tab>
222+
| Provider | Usage |
223+
|----------|-------|
224+
| OpenAI | LLM calls and Knowledge Base embeddings |
225+
| Anthropic | LLM calls |
226+
| Google | LLM calls |
227+
| Mistral | LLM calls and Knowledge Base OCR |
228+
| Z.ai | LLM calls |
229+
| Cohere | Embeddings and Knowledge Base reranking |
230+
| xAI | LLM calls |
231+
| Kimi | LLM calls |
232+
| Fireworks | LLM calls |
233+
| Together AI | LLM calls |
234+
| Baseten | LLM calls |
235+
| Ollama Cloud | LLM calls |
236+
| Fal.ai | Image and video generation |
237+
</Tab>
238+
<Tab>
239+
| Provider | Usage |
240+
|----------|-------|
241+
| Firecrawl | Web scraping, crawling, search, and extraction |
242+
| Exa | AI-powered search and research |
243+
| Context.dev | Web scraping, crawling, search, and brand intelligence |
244+
| Serper | Google search API |
245+
| Linkup | Web search and content retrieval |
246+
| Parallel AI | Web search, extraction, and deep research |
247+
| Perplexity | AI-powered chat and web search |
248+
| Jina AI | Web reading and search |
249+
| Google Cloud | Translate, Maps, PageSpeed, and Books APIs |
250+
</Tab>
251+
<Tab>
252+
| Provider | Usage |
253+
|----------|-------|
254+
| Brandfetch | Brand assets, logos, colors, and company info |
255+
| Hunter | Email finder, verification, and domain search |
256+
| People Data Labs | Person and company enrichment, search, and identity |
257+
| Findymail | Email finder, verification, and phone lookup |
258+
| Prospeo | Person and company enrichment and search |
259+
| Wiza | Prospect search, individual reveal, and company enrichment |
260+
| Datagma | Email, phone, person, and company enrichment |
261+
| Dropcontact | GDPR-compliant contact enrichment and email finding |
262+
| LeadMagic | Email finding, validation, and B2B profile enrichment |
263+
| Icypeas | Email finding and verification |
264+
| Enrow | Email finding and verification |
265+
| ZeroBounce | Real-time email validation and deliverability checks |
266+
| NeverBounce | Real-time email verification and list cleaning |
267+
| MillionVerifier | Real-time email verification and deliverability checks |
268+
</Tab>
269+
</Tabs>
270+
271+
### Key scopes
272+
273+
A key is stored at one of two scopes.
274+
275+
| Scope | Applies to | Who can manage | Plan |
276+
|-------|------------|----------------|------|
277+
| **Workspace** | That workspace only | Workspace **admin** | Any plan on Sim Cloud |
278+
| **Organization** | Every current and future workspace in the organization | Organization **admin** or **owner** | Any organization plan on Sim Cloud — Pro for Teams, Max for Teams, or Enterprise |
279+
280+
Organization keys let you set a provider key once instead of repeating it in every workspace. A new workspace added to the organization picks them up automatically.
281+
282+
### Which key a run uses
283+
284+
Precedence is resolved **per provider**, not per workspace:
285+
286+
1. The workspace's own key for that provider, if it has one
287+
2. Otherwise, the organization's key for that provider
288+
3. Otherwise, Sim's hosted key, with the multiplier applied
289+
290+
So a workspace that stores its own OpenAI key still inherits the organization's Anthropic key. A workspace key always wins over the organization key for the same provider — adding one is how you override inheritance for a single workspace.
291+
292+
The BYOK settings page tags every provider your workspace is inheriting, so you can see which keys come from the organization before you override them.
234293

235294
### Setup
236295

237296
1. Navigate to **Settings****BYOK** in your workspace
238-
2. Click **Add Key** for your provider
239-
3. Enter your API key and save
297+
2. Choose **Workspace** or **Organization** (organization admins only)
298+
3. Click **Add Key** for your provider
299+
4. Enter your API key and save
300+
301+
You can store several keys per provider per scope. Requests are distributed evenly across the keys in whichever scope is in effect.
240302

241303
<Callout type="info">
242-
BYOK keys are encrypted at rest. Only workspace admins can manage keys.
304+
BYOK keys are encrypted at rest and are never returned to the browser in full — the settings page only ever shows a masked value.
243305
</Callout>
244306

245-
When configured, workflows use your key instead of Sim's hosted keys. If removed, workflows automatically fall back to hosted keys with the multiplier.
307+
<Callout type="warn">
308+
The Pi block's **Create PR**, **Update PR**, and **Plan** modes run the model client inside a sandbox, so the resolved key — including an inherited organization key — is exposed to that sandbox. To keep an organization key out of it, give the workspace its own key for that provider. Pi's optional web search never falls back to a stored key; it always requires an explicit key on the block.
309+
</Callout>
310+
311+
Deleting a workspace key makes that workspace fall back to the organization key if one exists, and to Sim's hosted keys otherwise. Deleting an organization key makes every workspace that was inheriting it fall back the same way.
312+
313+
If your organization's plan lapses, organization keys stop applying and those workspaces fall back to Sim's hosted keys with the multiplier. The keys are retained, and organization admins can still delete them, but adding or updating them requires an active organization plan.
246314

247315
## Voice Input
248316

apps/docs/openapi-v2-billing.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,7 @@
452452
"description": "Human-readable explanation of the error."
453453
},
454454
"details": {
455-
"description": "Structured error details. On a `403` whose cause a caller can act on, this carries a `code` from a closed set:\n- `INSUFFICIENT_WORKSPACE_ROLE` — The caller has access to the workspace but its role is below the one this operation requires.\n- `PERSONAL_API_KEYS_DISABLED` — The workspace's organization does not allow personal API keys. Use a workspace API key.\n- `WORKSPACE_KEY_OPERATION_NOT_PERMITTED` — This operation is not available to a workspace-scoped API key. Use a personal API key.\n- `PRINCIPAL_KIND_NOT_PERMITTED` — This operation does not accept the caller’s kind of API key.\n- `ORGANIZATION_MEMBERSHIP_REQUIRED` — The caller is not a member of the organization it named.\n- `ORGANIZATION_ADMIN_REQUIRED` — The caller is a member of the organization but not an admin or owner.\n- `ENTERPRISE_PLAN_REQUIRED` — The organization has no active enterprise subscription.\n- `AUDIT_LOGS_DISABLED` — Audit logging is not enabled for this deployment.\n- `SKILL_EDITOR_ACCESS_REQUIRED` — The caller can write in the workspace but is not an editor of this skill.\n- `SECRET_ADMIN_ACCESS_REQUIRED` — The caller can write in the workspace but is not an admin of this secret. Ask a workspace admin, or someone holding admin on the secret, to grant access or set the value.\n- `WORKSPACE_RESOURCE_LIMIT_REACHED` — The workspace already holds the maximum number of resources of this kind. Delete one, or contact Sim to raise the limit; the message names the ceiling.\n- `PUBLIC_SHARING_NOT_ALLOWED` — The workspace's organization does not permit sharing this resource publicly. An organization admin controls the policy.\n- `CREDENTIAL_ADMIN_ACCESS_REQUIRED` — The caller can reach the workspace but cannot administer this credential.\n- `MCP_SERVER_URL_NOT_ALLOWED` — The supplied MCP server URL is outside the allowed domains or resolves to an internal address."
455+
"description": "Structured error details. On a `403` whose cause a caller can act on, this carries a `code` from a closed set:\n- `INSUFFICIENT_WORKSPACE_ROLE` — The caller has access to the workspace but its role is below the one this operation requires.\n- `PERSONAL_API_KEYS_DISABLED` — The workspace's organization does not allow personal API keys. Use a workspace API key.\n- `WORKSPACE_KEY_OPERATION_NOT_PERMITTED` — This operation is not available to a workspace-scoped API key. Use a personal API key.\n- `PRINCIPAL_KIND_NOT_PERMITTED` — This operation does not accept the caller’s kind of API key.\n- `ORGANIZATION_MEMBERSHIP_REQUIRED` — The caller is not a member of the organization it named.\n- `ORGANIZATION_ADMIN_REQUIRED` — The caller is a member of the organization but not an admin or owner.\n- `ENTERPRISE_PLAN_REQUIRED` — The organization has no active enterprise subscription.\n- `ORGANIZATION_PLAN_REQUIRED` — The organization has no active organization subscription (Pro for Teams, Max for Teams, or Enterprise).\n- `AUDIT_LOGS_DISABLED` — Audit logging is not enabled for this deployment.\n- `SKILL_EDITOR_ACCESS_REQUIRED` — The caller can write in the workspace but is not an editor of this skill.\n- `SECRET_ADMIN_ACCESS_REQUIRED` — The caller can write in the workspace but is not an admin of this secret. Ask a workspace admin, or someone holding admin on the secret, to grant access or set the value.\n- `WORKSPACE_RESOURCE_LIMIT_REACHED` — The workspace already holds the maximum number of resources of this kind. Delete one, or contact Sim to raise the limit; the message names the ceiling.\n- `PUBLIC_SHARING_NOT_ALLOWED` — The workspace's organization does not permit sharing this resource publicly. An organization admin controls the policy.\n- `CREDENTIAL_ADMIN_ACCESS_REQUIRED` — The caller can reach the workspace but cannot administer this credential.\n- `MCP_SERVER_URL_NOT_ALLOWED` — The supplied MCP server URL is outside the allowed domains or resolves to an internal address."
456456
}
457457
},
458458
"required": ["code", "message"],

apps/docs/openapi-v2-files-audit.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2297,7 +2297,7 @@
22972297
"description": "Human-readable explanation of the error."
22982298
},
22992299
"details": {
2300-
"description": "Structured error details. On a `403` whose cause a caller can act on, this carries a `code` from a closed set:\n- `INSUFFICIENT_WORKSPACE_ROLE` — The caller has access to the workspace but its role is below the one this operation requires.\n- `PERSONAL_API_KEYS_DISABLED` — The workspace's organization does not allow personal API keys. Use a workspace API key.\n- `WORKSPACE_KEY_OPERATION_NOT_PERMITTED` — This operation is not available to a workspace-scoped API key. Use a personal API key.\n- `PRINCIPAL_KIND_NOT_PERMITTED` — This operation does not accept the caller’s kind of API key.\n- `ORGANIZATION_MEMBERSHIP_REQUIRED` — The caller is not a member of the organization it named.\n- `ORGANIZATION_ADMIN_REQUIRED` — The caller is a member of the organization but not an admin or owner.\n- `ENTERPRISE_PLAN_REQUIRED` — The organization has no active enterprise subscription.\n- `AUDIT_LOGS_DISABLED` — Audit logging is not enabled for this deployment.\n- `SKILL_EDITOR_ACCESS_REQUIRED` — The caller can write in the workspace but is not an editor of this skill.\n- `SECRET_ADMIN_ACCESS_REQUIRED` — The caller can write in the workspace but is not an admin of this secret. Ask a workspace admin, or someone holding admin on the secret, to grant access or set the value.\n- `WORKSPACE_RESOURCE_LIMIT_REACHED` — The workspace already holds the maximum number of resources of this kind. Delete one, or contact Sim to raise the limit; the message names the ceiling.\n- `PUBLIC_SHARING_NOT_ALLOWED` — The workspace's organization does not permit sharing this resource publicly. An organization admin controls the policy.\n- `CREDENTIAL_ADMIN_ACCESS_REQUIRED` — The caller can reach the workspace but cannot administer this credential.\n- `MCP_SERVER_URL_NOT_ALLOWED` — The supplied MCP server URL is outside the allowed domains or resolves to an internal address."
2300+
"description": "Structured error details. On a `403` whose cause a caller can act on, this carries a `code` from a closed set:\n- `INSUFFICIENT_WORKSPACE_ROLE` — The caller has access to the workspace but its role is below the one this operation requires.\n- `PERSONAL_API_KEYS_DISABLED` — The workspace's organization does not allow personal API keys. Use a workspace API key.\n- `WORKSPACE_KEY_OPERATION_NOT_PERMITTED` — This operation is not available to a workspace-scoped API key. Use a personal API key.\n- `PRINCIPAL_KIND_NOT_PERMITTED` — This operation does not accept the caller’s kind of API key.\n- `ORGANIZATION_MEMBERSHIP_REQUIRED` — The caller is not a member of the organization it named.\n- `ORGANIZATION_ADMIN_REQUIRED` — The caller is a member of the organization but not an admin or owner.\n- `ENTERPRISE_PLAN_REQUIRED` — The organization has no active enterprise subscription.\n- `ORGANIZATION_PLAN_REQUIRED` — The organization has no active organization subscription (Pro for Teams, Max for Teams, or Enterprise).\n- `AUDIT_LOGS_DISABLED` — Audit logging is not enabled for this deployment.\n- `SKILL_EDITOR_ACCESS_REQUIRED` — The caller can write in the workspace but is not an editor of this skill.\n- `SECRET_ADMIN_ACCESS_REQUIRED` — The caller can write in the workspace but is not an admin of this secret. Ask a workspace admin, or someone holding admin on the secret, to grant access or set the value.\n- `WORKSPACE_RESOURCE_LIMIT_REACHED` — The workspace already holds the maximum number of resources of this kind. Delete one, or contact Sim to raise the limit; the message names the ceiling.\n- `PUBLIC_SHARING_NOT_ALLOWED` — The workspace's organization does not permit sharing this resource publicly. An organization admin controls the policy.\n- `CREDENTIAL_ADMIN_ACCESS_REQUIRED` — The caller can reach the workspace but cannot administer this credential.\n- `MCP_SERVER_URL_NOT_ALLOWED` — The supplied MCP server URL is outside the allowed domains or resolves to an internal address."
23012301
}
23022302
},
23032303
"required": ["code", "message"],

0 commit comments

Comments
 (0)