You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit a5405fc
Browse filesBrowse the repository at this point in the historyBrowse files
Renumber the personal-organization migrations 0455-0459 to 0456-0460 after
staging's 0455_api_key_access, rechaining their snapshots and journal.
Port read-only API keys and creation-time expiry (#9855) into the Platform:
the create-key modal offers access (behind api-key-read-only) and expiry,
the deploy dialog and MCP server detail issue full-access keys only, and the
keys list shows a Read only tag and expiry. The flag is seeded through the
organization surface. Legacy layouts and settings modified on staging stay
deleted.
Copy file name to clipboardExpand all lines: .github/CI.md
+2-2Lines changed: 2 additions & 2 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -4,13 +4,13 @@ The `changes` job runs Turborepo 2.9.14's `affectedTasks` query before installin
4
4
5
5
A PR compares the checked-out GitHub merge commit with its first parent: the actual target revision tested by that merge. The PR event's base SHA can become stale when the target advances. Scoping requires a matching GitHub merge ref and SHA, exactly two merge parents, and a usable target parent; otherwise every check runs. This works with the existing depth-two checkout without fetching older ancestry. Main/staging pushes execute all checks; the parent `ci` workflow skips checks on `dev` pushes, while PRs targeting `dev` still run checks. A manual `checks` run executes all checks unless supplied a full base commit SHA to reproduce a scoped plan. Missing history, an empty diff, unknown files outside the workspace graph, root script/CI changes, or a planner error run every check. Missing selection outputs fail the aggregate gate. The gate also rejects an omitted dependency, any failed/cancelled job, and any skip that its explicit selection flag did not authorize.
6
6
7
-
Dedicated docs verification uses the same planner, comparing pushes with their previous commit and PRs with the tested merge's first parent. Site acceptance follows `docs#build` and its transitive package dependencies. The app's docs-consumer task depends on server runtime and that docs build: backend-only changes run the platform consumer against the docs app, while site changes also run corpus and browser checks. Independent SDK and unit-only edits skip those production jobs. The required `docs HTTP` gate verifies explicit site/platform selections before accepting any skip.
7
+
Dedicated docs verification uses the same planner, comparing pushes with their previous commit and PRs with the tested merge's first parent. Site acceptance follows `docs#build` and its transitive package dependencies. The app's docs-consumer task depends on server runtime and that docs build: backend-only changes run the platform consumer against the docs app, while site changes also run corpus and browser checks. Standalone package and unit-only edits skip those production jobs. The required `docs HTTP` gate verifies explicit site/platform selections before accepting any skip.
8
8
9
9
Docs production builds run once and publish an artifact to isolated HTTP, corpus, Chromium, and WebKit jobs. Source checks keep their own checkout because generator verification mutates inputs. Content caches use separate lint/source/build namespaces; generation validates every restore, repairs missing declarations, and removes obsolete modules. The Next build cache keeps its supported incremental behavior. Content and Next caches have size limits, and Next cache files expire after seven days; successful content eviction happens after all consumers finish.
10
10
11
11
| Change | Expensive checks selected |
12
12
| --- | --- |
13
-
|Independent SDK| That workspace's tests and type-check; no app build, services, or browsers |
13
+
|Standalone package| That workspace's tests and type-check; no app build, services, or browsers |
14
14
| App unit test | App test shards and test type check |
15
15
| Integration test | Both provision paths; no HTTP/browser job merely for the test edit |
16
16
| Workspace UI | Database integration, mobile, SEO and live Electron, plus app tests/build |
Copy file name to clipboardExpand all lines: .github/CONTRIBUTING.md
+5-9Lines changed: 5 additions & 9 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -140,23 +140,19 @@ Using clear and consistent commit messages makes it easier for everyone to under
140
140
141
141
To set up your local development environment:
142
142
143
-
### Option 1: Using NPM Package (Simplest)
143
+
### Option 1: Using the Setup Wizard (Simplest)
144
144
145
-
The easiest way to run Sim locally is using our NPM package:
145
+
The easiest way to run Sim locally is the interactive setup wizard:
146
146
147
147
```bash
148
-
npx simstudio
148
+
npx sim-setup
149
149
```
150
150
151
-
After running this command, open [http://localhost:3000/](http://localhost:3000/) in your browser.
152
-
153
-
#### Options
154
-
155
-
-`-p, --port <port>`: Specify the port to run Sim on (default: 3000)
156
-
-`--no-pull`: Skip pulling the latest Docker images
151
+
When it finishes, open [http://localhost:3000/](http://localhost:3000/) in your browser. Inside a cloned Sim repository, run `bun run sim-setup --mode dev` for the local development mode.
157
152
158
153
#### Requirements
159
154
155
+
- Node.js 20+
160
156
- Docker must be installed and running on your machine
Copy file name to clipboardExpand all lines: apps/docs/content/docs/api-reference/authentication.mdx
+18-1Lines changed: 18 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -24,7 +24,7 @@ Workspace Admins can turn off **Allow personal API keys**. The workspace policy
24
24
## Create and store a key [#generating-api-keys]
25
25
26
26
1. Open **Account settings → Sim API keys** to create a personal key, or **Workspace settings → Sim API keys** to create a workspace key.
27
-
2. Select **Create API key**, enter a name, and create it. Workspace-key creation requires workspace **Admin** access and the applicable key-management permission.
27
+
2. Select **Create API key** and enter a name. Choose its **Access**and when it **Expires**, then create it. Workspace-key creation requires workspace **Admin** access and the applicable key-management permission.
28
28
3. Copy the key and store it in a server-side environment variable such as `SIM_API_KEY`.
29
29
30
30
<Callouttype="warn">
@@ -33,6 +33,23 @@ Sim shows the complete key once, immediately after creation. Copy it before clos
33
33
34
34
Delete a key from the same settings page to revoke it. Update applications that used it with a replacement key.
35
35
36
+
### Access [#key-access]
37
+
38
+
| Access | Allows |
39
+
| --- | --- |
40
+
|**Full access**| Everything the key's identity can do: reads, changes, deploys, and workflow runs |
41
+
|**Read only**| The operations the [`api:read` scope](#oauth-access-tokens) allows, including searches sent as POST requests and search chat |
42
+
43
+
A read-only key cannot change workspace resources or run, resume, or cancel workflows. Reads can still cost credits: searches use embedding credits, and search chat uses model credits and keeps a private conversation history. Selector lookups call third-party services with your connected accounts.
44
+
45
+
A refused request fails with `403` and the message `This API key is read-only and cannot perform this operation`. Where the surface carries a code, it is `READ_ONLY_API_KEY`: in `error.details.code` on the v2 API and the Sim MCP server, in `details.code` on the v1 API and workflow execution, and in `error.data.code` on a workflow MCP server.
46
+
47
+
Access narrows a key; it never grants more than the key's identity already has. Access is fixed at creation, so create a new key to change it. Keys created before access levels existed have full access. Keys created from the deploy modal or for a workflow MCP server always have full access, because they exist to run workflows. If **Access** isn't shown when you create a key, read-only keys aren't available on your deployment yet.
48
+
49
+
### Expiration [#key-expiration]
50
+
51
+
A key expires 30 days, 90 days, or 1 year after creation, or never. The settings page defaults to never. After it expires, every request with the key fails with `401`. The v1 and v2 APIs, both MCP servers, and workflow execution answer with the message `API key has expired`. Create a replacement before then. The key list shows each key's expiration date. `GET /api/v2/meta` reports the calling key's `expiresAt` and `scopes`.
52
+
36
53
## Send an API key [#using-api-keys]
37
54
38
55
Send the key in `X-API-Key`. The v2 API accepts `Authorization: Bearer` only for [OAuth access tokens](#oauth-access-tokens), not API keys. For example, with `SIM_API_KEY` and `WORKFLOW_ID` set:
sim workflows run 3a9e21d8-5f47-4c0b-b2ea-91d7c6034ef8 --input '{"source":"nightly"}' --output json
155
155
```
156
156
157
-
The environment key overrides stored authentication. Use a workspace key only for supported workspace-scoped operations; organization audit logs and fork administration require a personal credential. Never commit credentials. `SIM_CONFIG_DIR` relocates local state when a runner has no writable home directory.
157
+
The environment key overrides stored authentication. Use a workspace key only for supported workspace-scoped operations; organization audit logs and fork administration require a personal credential. A job that runs workflows needs a **Full access** key; a **Read only** key suits jobs that only read, such as exporting logs. Choose an expiration your secret rotation covers: an expired key fails with `401` and `API key has expired`. See [key access and expiration](/api-reference/authentication#key-access). Never commit credentials. `SIM_CONFIG_DIR` relocates local state when a runner has no writable home directory.
|`blockId`| Yes | Trigger block in the deployed workflow. |
8267
+
8268
+
</CommandTable>
8269
+
8270
+
**Options**
8271
+
8272
+
<CommandTable>
8273
+
8274
+
| Option | Required | Description |
8275
+
| --- | --- | --- |
8276
+
|`--enabled <true\|false>`| Yes | Whether the trigger should fire. A disable lasts until the next deploy or version activation, which re-enables every trigger. Accepted values: `true`, `false`. |
8277
+
8278
+
</CommandTable>
8279
+
8280
+
API request and response schemas: [updateWorkflowTrigger](/api-reference/workflows/updateWorkflowTrigger).
|`blockId`| Yes | Trigger block in the deployed workflow. |
466
+
467
+
</CommandTable>
468
+
469
+
**Options**
470
+
471
+
<CommandTable>
472
+
473
+
| Option | Required | Description |
474
+
| --- | --- | --- |
475
+
|`--enabled <true\|false>`| Yes | Whether the trigger should fire. A disable lasts until the next deploy or version activation, which re-enables every trigger. Accepted values: `true`, `false`. |
476
+
477
+
</CommandTable>
478
+
479
+
API request and response schemas: [updateWorkflowTrigger](/api-reference/workflows/updateWorkflowTrigger).
Copy file name to clipboardExpand all lines: apps/docs/content/docs/integrations/firecrawl.mdx
+1-1Lines changed: 1 addition & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -184,7 +184,7 @@ Crawl entire websites and extract structured content from all accessible pages
184
184
| --------- | ---- | -------- | ----------- |
185
185
|`url`| string | Yes | The website URL to crawl \(e.g., "https://example.com" or "https://docs.example.com/guide")|
186
186
|`limit`| number | No | Maximum number of pages to crawl \(e.g., 50, 100, 500\). Default: 100 |
187
-
|`maxDepth`| number | No | Maximum URL path depth \(e.g., 1 allows /docs and /docs/index.html\). Independent of link discovery depth |
187
+
|`maxDepth`| number | No | Maximum URL path depth below the starting URL \(e.g., from /docs, 1 allows /docs/guide\). Independent of link discovery depth |
188
188
|`formats`| json | No | Output formats for scraped content \(e.g., \["markdown"\], \["markdown", "html"\], \["markdown", "links"\]\)|
189
189
|`prompt`| string | No | Natural-language crawl guidance supplied by existing configurations |
190
190
|`excludePaths`| json | No | URL paths to exclude from crawling \(e.g., \["/blog/*", "/admin/*", "/*.pdf"\]\)|
Copy file name to clipboardExpand all lines: apps/docs/content/docs/integrations/mistral_parse.mdx
+11-6Lines changed: 11 additions & 6 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
---
2
2
title: Mistral Parser
3
-
description: Extract text from PDF documents
3
+
description: Extract text, tables, and images from PDF documents
4
4
integration:
5
5
type: "mistral_parse_v3"
6
6
color: "#000000"
@@ -10,12 +10,12 @@ import { ReferenceDetails } from "@sim/emcn-docs/reference-details"
10
10
11
11
12
12
{/* MANUAL-CONTENT-START:intro */}
13
-
Use [Mistral's OCR API](https://mistral.ai/) to extract text and page structure from a PDF uploaded to Sim or supplied by URL. The current parser returns page Markdown, image metadata, the model, and usage information. **Specific Pages** accepts zero-based indices such as `0,1,2`; leave it empty to process all pages. The block offers Markdown, plain-text, and JSON format values, but its current result uses the structured page output documented below. Base64 image data is a hidden tool input and has no block control.
13
+
Use [Mistral's OCR API](https://mistral.ai/) to extract text and page structure from a PDF uploaded to Sim or supplied by URL. The current parser returns page Markdown, image metadata, the model, and usage information. **Specific Pages** accepts zero-based indices such as `0,1,2`; leave it empty to process all pages. The block offers Markdown, plain-text, and JSON format values, but its current result uses the structured page output documented below. Turn on **Extract Images** to get the images Mistral finds in the document (figures, logos, photos) as files on the `images` output, up to 100 per parse; each page's image entry carries a `file_name` matching its file. **Max Images**and **Min Image Size** (advanced) narrow what is extracted. **Tables** keeps tables inline in the page Markdown by default, or returns them separately as Markdown or HTML in each page's `tables` list.
14
14
{/* MANUAL-CONTENT-END */}
15
15
16
16
## Use the block [#usage-instructions]
17
17
18
-
Extract textfrom uploaded PDF documents, or from a URL.
18
+
Extract text, tables, and images from uploaded PDF documents, or from a URL. Images come back as files an agent can pass on.
19
19
20
20
## Actions
21
21
@@ -31,7 +31,11 @@ Parse PDF documents using Mistral OCR API
31
31
| --------- | ---- | -------- | ----------- |
32
32
|`file`| file | Yes | Normalized UserFile from file upload or file reference |
33
33
|`resultType`| string | No | Legacy parser output format \(markdown, text, or json; default markdown\). Versions 2 and 3 return structured OCR pages regardless of this value. |
34
+
|`includeImageBase64`| boolean | No | Extract the images in the document \(figures, logos, photos\) as files on the images output |
34
35
|`pages`| array | No | Specific pages to process \(array of page numbers, starting from 0\)|
36
+
|`imageLimit`| number | No | Maximum number of images to extract \(at most 100\)|
37
+
|`imageMinSize`| number | No | Minimum height and width of images to extract from the PDF |
38
+
|`tableFormat`| string | No | Return tables separately on each page as markdown or html instead of inline in the page markdown |
35
39
|`apiKey`| string | Yes | Mistral API key \(MISTRAL_API_KEY\)|
36
40
37
41
#### Output
@@ -47,20 +51,21 @@ Parse PDF documents using Mistral OCR API
47
51
| ↳ `top_left_y`| number | Top-left Y coordinate in pixels |
48
52
| ↳ `bottom_right_x`| number | Bottom-right X coordinate in pixels |
49
53
| ↳ `bottom_right_y`| number | Bottom-right Y coordinate in pixels |
50
-
| ↳ `image_base64`| string |Base64-encoded image data; returned only when the hidden includeImageBase64 input is enabled|
54
+
| ↳ `file_name`| string |Name of this image in the images output; present only when image extraction is on|
51
55
| ↳ `dimensions`| object | Page dimensions |
52
56
| ↳ `dpi`| number | Dots per inch |
53
57
| ↳ `height`| number | Page height in pixels |
54
58
| ↳ `width`| number | Page width in pixels |
55
-
| ↳ `tables`| array | Separate table objects, referenced from the markdown via placeholders like \[tbl-0.html\]. Mistral populates these only when table_format is "markdown" or "html"; Sim never sets it, so tables stay inline in the markdown and this list is empty |
56
-
| ↳ `hyperlinks`| array | Array of URL strings detected in the page \(e.g., \["https://...", "mailto:..."\]\)|
59
+
| ↳ `tables`| array | Separate table objects\(\{ id, content, format \}\), referenced from the markdown via placeholders like \[tbl-0.html\]. Populated only when tableFormat is markdown or html; otherwise tables stay inline in the markdown and this list is empty |
60
+
| ↳ `hyperlinks`| array | Array of URL strings detected in the page |
57
61
| ↳ `header`| string | Page header content. Mistral returns it only when extract_header is true \(it defaults to false\); Sim never sets it, so this is not returned |
58
62
| ↳ `footer`| string | Page footer content. Mistral returns it only when extract_footer is true \(it defaults to false\); Sim never sets it, so this is not returned |
59
63
|`model`| string | Mistral OCR model identifier \(e.g., mistral-ocr-latest\)|
60
64
|`usage_info`| object | Usage and processing statistics |
61
65
| ↳ `pages_processed`| number | Total number of pages processed |
62
66
| ↳ `doc_size_bytes`| number | Document file size in bytes |
63
67
|`document_annotation`| string | Structured annotation data as JSON string \(when applicable\)|
68
+
|`images`| file[]| Images extracted from the document, named page-<index>-<image id>; empty unless image extraction is on |
Copy file name to clipboardExpand all lines: apps/docs/content/docs/mcp/authentication.mdx
+3-1Lines changed: 3 additions & 1 deletion
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -55,8 +55,10 @@ A personal key uses your current access in the workspaces you can reach. A works
55
55
56
56
The Cursor process must receive `SIM_API_KEY` for its environment interpolation to work. For a self-hosted deployment, replace the Cloud URL in both examples with your server URL.
57
57
58
+
For an agent that only reads, create a **Read only** key: it reaches the operations `api:read` allows, and a tool call that changes something or runs a workflow fails with `403` and the code `READ_ONLY_API_KEY`. Search and search chat still use credits. See [key access](/api-reference/authentication#key-access).
59
+
58
60
<Callouttype="warn">
59
-
Keys created in Sim settings have no default expiration. Revoke a key when it is no longer needed. Prefer OAuth for an app that
61
+
Keys created in Sim settings never expire unless you choose an expiration. Revoke a key when it is no longer needed. Prefer OAuth for an app that
60
62
supports browser sign-in, and store keys in your app's secret or environment
0 commit comments