Skip to content

Commit 16aa2e4

Browse files
Merge remote-tracking branch 'origin/staging' into codex/research-sim-dashboards
# Conflicts: # apps/sim/app/workspace/[workspaceId]/layout.tsx # scripts/check-tool-registry-boundary.baseline.json
2 parents 51f665e + c30d58d commit 16aa2e4

178 files changed

Lines changed: 13933 additions & 1548 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.

‎.agents/skills/add-integration/SKILL.md‎

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,7 @@ Follow `.agents/skills/add-block/SKILL.md` for the block structure, subBlock typ
123123
`canvasPresentation`; `bun run apps/sim/scripts/check-canvas-sentences.ts --block={service}` must
124124
pass (CI runs `check:canvas-sentences --require-coverage`).
125125

126-
Two rules that are easy to get wrong when copying from existing blocks:
126+
Three rules that are easy to get wrong when copying from existing blocks:
127127

128128
- Every remote `selectorKey` must use the unified server selector path. Apply the `add-selector` skill:
129129
add browser-safe metadata to `apps/sim/lib/selectors/manifest.ts`, reuse or extract a server-only
@@ -135,6 +135,12 @@ Two rules that are easy to get wrong when copying from existing blocks:
135135
(e.g. `channelSelector` + `channelId` → `canonicalParamId: 'channel'`). It is the only key that
136136
survives serialization, so `inputs` and `tools.config.params` reference the canonical id, never the
137137
subblock ids. It is unique block-wide, and every member of a group shares the same `required` value.
138+
- Every text-entry subBlock (`short-input`, `long-input`, `code`) and every selector declares a
139+
`placeholder`; an empty box tells the user nothing. Secrets read `Enter your {thing}` (e.g.
140+
`Enter your API key`), free text names what to type (`Enter branch name`), and formatted values
141+
show the shape (`2023-01-01T00:00:00Z`, `1 to 1000`). An optional field with a server-side default
142+
names that default (`Defaults to the database region`). Dropdowns, switches, and `oauth-input` do
143+
not need one.
138144

139145
## Step 4: Add Icon
140146

@@ -309,6 +315,28 @@ bun run docs:check
309315

310316
This creates `apps/docs/content/docs/integrations/{service}.mdx` — one page per service carrying the block's Actions and, if it has one, its Triggers section. Never hand-edit generated pages; the only editable region is the `{/* MANUAL-CONTENT */}` block (see `scripts/README.md`).
311317

318+
Every generated integration page carries a hand-written intro directly under `<BlockInfoCard />`. The
319+
generator preserves it across regenerations, so write it once after the first generate:
320+
321+
```mdx
322+
{/* MANUAL-CONTENT-START:intro */}
323+
[{Service}](https://service.com/) is {one sentence on what the service is}.
324+
325+
With the {Service} block, you can:
326+
327+
- **{Capability}**: {what the operations in this group do}
328+
- **{Capability}**: {...}
329+
330+
{How to connect: which credential to create and where, if it is not OAuth.}
331+
332+
In Sim, the {Service} block lets your agents {concrete workflow uses}.
333+
{/* MANUAL-CONTENT-END */}
334+
```
335+
336+
Group the bullets by what the user gets done, not one bullet per tool. Only describe operations the
337+
block actually ships. Follow `.claude/rules/constitution.md` for voice. Re-run
338+
`bun run scripts/generate-docs.ts` afterwards and confirm the section survived unchanged.
339+
312340
The docs generator refreshes `packages/deployment-config/src/integrations.json`, and the deployment
313341
config generator projects service-account provider IDs from that catalog plus the canonical OAuth
314342
registry. The checks compare both committed projections with their sources. Review the generated
@@ -368,6 +396,7 @@ If creating V2 versions (API-aligned outputs):
368396
- [ ] Defined operation dropdown with all operations
369397
- [ ] Added credential field with `requiredScopes: getScopesForService('{service}')`
370398
- [ ] Added conditional fields per operation
399+
- [ ] Every `short-input`, `long-input`, `code`, and selector subBlock has a `placeholder`
371400
- [ ] Set up dependsOn for cascading selectors
372401
- [ ] Every remote `selectorKey` exists in the shared manifest and has one server attachment with
373402
trusted credential provider binding and a fixed, credential-bound, or explicitly reviewed
@@ -415,6 +444,7 @@ If creating V2 versions (API-aligned outputs):
415444
- [ ] Ran `bun run scripts/generate-docs.ts`
416445
- [ ] Ran `bun run deployment-config:generate` for OAuth or service-account changes
417446
- [ ] Verified docs file created
447+
- [ ] Wrote the `{/* MANUAL-CONTENT-START:intro */}` section under `<BlockInfoCard />` and confirmed it survives a regenerate
418448
- [ ] Reviewed and committed the generated `packages/deployment-config/src/integrations.json` change
419449
- [ ] `bun run integration-catalog:check` passes
420450
- [ ] `bun run docs:check` passes — CI fails on stale generated docs, so commit the full generator

‎.agents/skills/validate-integration/SKILL.md‎

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,9 @@ For **each tool** in `tools.access`:
218218
- True/false → `switch` (a Yes/No `dropdown` only when the tool needs a third "unset" state)
219219
- Credentials → `oauth-input` with correct `serviceId`
220220
- [ ] Dropdown `value: () => 'default'` is set for dropdowns with a sensible default
221+
- [ ] Every `short-input`, `long-input`, `code`, and selector subBlock has a `placeholder` — including
222+
password fields (`Enter your API key`). Formatted values show the shape
223+
(`2023-01-01T00:00:00Z`); optional fields with a server default name it. See add-integration → Step 3
221224

222225
### Advanced Mode
223226
- [ ] Optional, rarely-used fields are set to `mode: 'advanced'`:
@@ -450,6 +453,10 @@ upstream PR that skipped regeneration), and investigate anything that looks like
450453
page losing a section usually means its source block moved or a generator input broke, not that the
451454
hunk should be reverted.
452455

456+
The integration's page must carry a `{/* MANUAL-CONTENT-START:intro */}` section directly under
457+
`<BlockInfoCard />`. If it is missing, write one using the template in add-integration → Step 8, and
458+
check an existing intro against what the block actually ships (no removed or unshipped operations).
459+
453460
If an icon changed, `apps/sim/components/icons.tsx` is the source of truth and `apps/docs/components/icons.tsx` is its generated mirror — they must end up byte-identical for that component.
454461

455462
### Validation Output
@@ -473,6 +480,7 @@ After fixing, confirm:
473480
- [ ] Validated every tool's ID, params, request, response, outputs, and types against API docs
474481
- [ ] Validated block ↔ tool alignment (every tool param has a subBlock, every condition is correct)
475482
- [ ] Validated advanced mode on optional/rarely-used fields
483+
- [ ] Validated every text-entry and selector subBlock has a `placeholder`
476484
- [ ] Validated wandConfig on timestamps and complex inputs
477485
- [ ] Validated tools.config mapping, tool selector, and type coercions
478486
- [ ] Validated block outputs match what tools return, with typed JSON where possible
@@ -496,6 +504,7 @@ After fixing, confirm:
496504
- [ ] Fixed all critical and warning issues
497505
- [ ] Ran `bun run tool-metadata:generate` if any tool outputs/params changed, and confirmed `bun run tool-metadata:check` passes
498506
- [ ] Ran `bun run scripts/generate-docs.ts` if any block metadata changed, and committed the full generated diff — including stale-page catch-up for other integrations (`bun run docs:check` fails CI on reverted generator output)
507+
- [ ] Validated the docs page has an accurate `MANUAL-CONTENT-START:intro` section
499508
- [ ] Ran `bun run lint` after fixes
500509
- [ ] Verified TypeScript compiles clean
501510
- [ ] Verified added tests fail without their fix

‎apps/desktop/src/main/browser-agent/session.ts‎

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2012,6 +2012,22 @@ export function reloadPage(contents: WebContents): void {
20122012
contents.reload()
20132013
}
20142014

2015+
/**
2016+
* Reloads past the HTTP cache, the browser's Shift-reload. A failed or hung
2017+
* page takes the plain reload's recovery instead: a load error retries the
2018+
* URL that failed, which need not be the committed page, and a hung renderer
2019+
* must be restarted, since reloading it in place waits on the hung page.
2020+
*/
2021+
function hardReloadPage(contents: WebContents): void {
2022+
const issue = tabForContents(contents)?.pageIssue
2023+
if (issue?.kind === 'load-error' || issue?.kind === 'unresponsive') {
2024+
reloadPage(contents)
2025+
return
2026+
}
2027+
prepareExplicitNavigation(contents)
2028+
contents.reloadIgnoringCache()
2029+
}
2030+
20152031
/** Hands one page selection to the exact app window and chat hosting its tab. */
20162032
function addPageSelectionToChat(contents: WebContents, text: string): void {
20172033
if (!text.trim() || getBrowserScopeId() !== getActiveBrowserScopeId()) return
@@ -2494,8 +2510,7 @@ function initializeTabView(
24942510
return
24952511
}
24962512
if (shortcut === 'hard-reload') {
2497-
prepareExplicitNavigation(contents)
2498-
contents.reloadIgnoringCache()
2513+
hardReloadPage(contents)
24992514
return
25002515
}
25012516

@@ -3512,8 +3527,7 @@ export function handleFocusedShortcut(
35123527
reloadPage(shortcutTab.view.webContents)
35133528
return true
35143529
case 'hard-reload':
3515-
prepareExplicitNavigation(shortcutTab.view.webContents)
3516-
shortcutTab.view.webContents.reloadIgnoringCache()
3530+
hardReloadPage(shortcutTab.view.webContents)
35173531
return true
35183532
case 'back':
35193533
goBack(shortcutTab.view.webContents)

‎apps/docs/components/icons.tsx‎

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10012,3 +10012,18 @@ export function OtterIcon(props: SVGProps<SVGSVGElement>) {
1001210012
</svg>
1001310013
)
1001410014
}
10015+
10016+
export function PlanetScaleIcon(props: SVGProps<SVGSVGElement>) {
10017+
return (
10018+
<svg {...props} viewBox='0 0 454 454' fill='none' xmlns='http://www.w3.org/2000/svg'>
10019+
<path
10020+
d='M0 227C0 101.631 101.631 0 227 0C319.178 0 398.524 54.942 434.076 133.865L133.865 434.076C120.983 428.273 108.739 421.302 97.268 413.3L283.568 227H227L66.487 387.513C25.408 346.434 0 289.684 0 227Z'
10021+
fill='currentColor'
10022+
/>
10023+
<path
10024+
d='M454 227.078L227.078 454C352.385 453.958 453.958 352.385 454 227.078Z'
10025+
fill='currentColor'
10026+
/>
10027+
</svg>
10028+
)
10029+
}

‎apps/docs/components/ui/icon-mapping.ts‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,7 @@ import {
212212
PineconeIcon,
213213
PipedriveIcon,
214214
PitchBookIcon,
215+
PlanetScaleIcon,
215216
PolymarketIcon,
216217
PostgresIcon,
217218
PosthogIcon,
@@ -555,6 +556,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
555556
pinecone: PineconeIcon,
556557
pipedrive: PipedriveIcon,
557558
pitchbook: PitchBookIcon,
559+
planetscale: PlanetScaleIcon,
558560
polymarket: PolymarketIcon,
559561
postgresql: PostgresIcon,
560562
posthog: PosthogIcon,

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4142,7 +4142,7 @@ sim selectors get [options]
41424142

41434143
| Option | Required | Description |
41444144
| --- | --- | --- |
4145-
| `--selector-key <value>` | Yes | Registered selector key for discovering this field’s destination options. Accepted values: `airtable.bases`, `airtable.tables`, `asana.workspaces`, `attio.lists`, `attio.objects`, `bigquery.datasets`, `bigquery.tables`, `bitbucket.workspaces`, `bitbucket.repositories`, `calcom.eventTypes`, `calcom.schedules`, `clickup.workspaces`, `clickup.spaces`, `clickup.folders`, `clickup.lists`, `coda.docs`, `coda.pages`, `coda.tables`, `coda.columns`, `coda.rows`, `coda.formulas`, `coda.controls`, `coda.folders`, `coda.permissions`, `confluence.spaces`, `confluence.spacesById`, `confluence.pages`, `google.tasks.lists`, `gmail.labels`, `google.calendar`, `google.drive`, `google.sheets`, `harmonic.savedSearches`, `hubspot.lists`, `hubspot.owners`, `hubspot.pipelines`, `hubspot.pipelineStages`, `hubspot.properties`, `jsm.requestTypes`, `jsm.serviceDesks`, `microsoft.planner.plans`, `notion.databases`, `notion.pages`, `netsuite.recordTypes`, `netsuite.asyncTasks`, `pipedrive.pipelines`, `sharepoint.lists`, `trello.boards`, `zoho_desk.organizations`, `zoho_desk.departments`, `zoho_desk.agents`, `zoom.meetings`, `slack.channels`, `snowflake.databases`, `snowflake.schemas`, `snowflake.tables`, `snowflake.warehouses`, `snowflake.roles`, `snowflake.fileFormats`, `snowflake.procedures`, `slack.users`, `outlook.folders`, `outlook.calendars`, `microsoft.teams`, `microsoft.chats`, `microsoft.channels`, `microsoft.planner`, `onedrive.files`, `onedrive.folders`, `sharepoint.sites`, `microsoft.excel`, `microsoft.excel.drives`, `microsoft.excel.sheets`, `microsoft.word`, `wealthbox.contacts`, `jira.issues`, `jira.projects`, `jira.projectKeys`, `linear.projects`, `linear.teams`, `monday.boards`, `monday.groups`, `webflow.sites`, `webflow.collections`, `webflow.items`, `cloudwatch.logGroups`, `cloudwatch.logStreams`, `imap.mailboxes`, `mcp.tools`, `managedAgent.agents`, `managedAgent.environments`, `managedAgent.vaults`, `managedAgent.memoryStores`, `knowledge.documents`, `sim.workflows`, `table.columns`, `table.outputColumns`, `workspace.secretNames`, `workspace.sandboxes`, `providers.ollamaEmbeddingModels`, `providers.openrouterEmbeddingModels`. |
4145+
| `--selector-key <value>` | Yes | Registered selector key for discovering this field’s destination options. Accepted values: `airtable.bases`, `airtable.tables`, `asana.workspaces`, `attio.lists`, `attio.objects`, `bigquery.datasets`, `bigquery.tables`, `bitbucket.workspaces`, `bitbucket.repositories`, `calcom.eventTypes`, `calcom.schedules`, `clickup.workspaces`, `clickup.spaces`, `clickup.folders`, `clickup.lists`, `coda.docs`, `coda.pages`, `coda.tables`, `coda.columns`, `coda.rows`, `coda.formulas`, `coda.controls`, `coda.folders`, `coda.permissions`, `confluence.spaces`, `confluence.spacesById`, `confluence.pages`, `google.tasks.lists`, `gmail.labels`, `google.calendar`, `google.drive`, `google.sheets`, `harmonic.savedSearches`, `hubspot.lists`, `hubspot.owners`, `hubspot.pipelines`, `hubspot.pipelineStages`, `hubspot.properties`, `jsm.requestTypes`, `jsm.serviceDesks`, `microsoft.planner.plans`, `notion.databases`, `notion.pages`, `netsuite.recordTypes`, `netsuite.asyncTasks`, `pipedrive.pipelines`, `sharepoint.lists`, `trello.boards`, `zoho_desk.organizations`, `zoho_desk.departments`, `zoho_desk.agents`, `zoom.meetings`, `slack.channels`, `snowflake.databases`, `snowflake.schemas`, `snowflake.tables`, `snowflake.warehouses`, `snowflake.roles`, `snowflake.fileFormats`, `snowflake.procedures`, `slack.users`, `outlook.folders`, `outlook.calendars`, `microsoft.teams`, `microsoft.chats`, `microsoft.channels`, `microsoft.planner`, `onedrive.files`, `onedrive.folders`, `sharepoint.sites`, `microsoft.excel`, `microsoft.excel.drives`, `microsoft.excel.sheets`, `microsoft.word`, `wealthbox.contacts`, `jira.issues`, `jira.projects`, `jira.projectKeys`, `linear.projects`, `linear.teams`, `monday.boards`, `monday.groups`, `webflow.sites`, `webflow.collections`, `webflow.items`, `planetscale.databases`, `planetscale.branches`, `planetscale.backups`, `planetscale.deployRequests`, `cloudwatch.logGroups`, `cloudwatch.logStreams`, `imap.mailboxes`, `mcp.tools`, `managedAgent.agents`, `managedAgent.environments`, `managedAgent.vaults`, `managedAgent.memoryStores`, `knowledge.documents`, `sim.workflows`, `table.columns`, `table.outputColumns`, `workspace.secretNames`, `workspace.sandboxes`, `providers.ollamaEmbeddingModels`, `providers.openrouterEmbeddingModels`. |
41464146
| `--context <json\|@file>` | No | Only the dependencies declared by the selector, such as oauthCredential and channelId. Missing OAuth connections require human authorization. (JSON, or @path / @- to read a file or stdin). |
41474147
| `--id <value>` | Yes | Resource identifier. |
41484148

@@ -4162,7 +4162,7 @@ sim selectors list [options]
41624162

41634163
| Option | Required | Description |
41644164
| --- | --- | --- |
4165-
| `--selector-key <value>` | Yes | Registered selector key for discovering this field’s destination options. Accepted values: `airtable.bases`, `airtable.tables`, `asana.workspaces`, `attio.lists`, `attio.objects`, `bigquery.datasets`, `bigquery.tables`, `bitbucket.workspaces`, `bitbucket.repositories`, `calcom.eventTypes`, `calcom.schedules`, `clickup.workspaces`, `clickup.spaces`, `clickup.folders`, `clickup.lists`, `coda.docs`, `coda.pages`, `coda.tables`, `coda.columns`, `coda.rows`, `coda.formulas`, `coda.controls`, `coda.folders`, `coda.permissions`, `confluence.spaces`, `confluence.spacesById`, `confluence.pages`, `google.tasks.lists`, `gmail.labels`, `google.calendar`, `google.drive`, `google.sheets`, `harmonic.savedSearches`, `hubspot.lists`, `hubspot.owners`, `hubspot.pipelines`, `hubspot.pipelineStages`, `hubspot.properties`, `jsm.requestTypes`, `jsm.serviceDesks`, `microsoft.planner.plans`, `notion.databases`, `notion.pages`, `netsuite.recordTypes`, `netsuite.asyncTasks`, `pipedrive.pipelines`, `sharepoint.lists`, `trello.boards`, `zoho_desk.organizations`, `zoho_desk.departments`, `zoho_desk.agents`, `zoom.meetings`, `slack.channels`, `snowflake.databases`, `snowflake.schemas`, `snowflake.tables`, `snowflake.warehouses`, `snowflake.roles`, `snowflake.fileFormats`, `snowflake.procedures`, `slack.users`, `outlook.folders`, `outlook.calendars`, `microsoft.teams`, `microsoft.chats`, `microsoft.channels`, `microsoft.planner`, `onedrive.files`, `onedrive.folders`, `sharepoint.sites`, `microsoft.excel`, `microsoft.excel.drives`, `microsoft.excel.sheets`, `microsoft.word`, `wealthbox.contacts`, `jira.issues`, `jira.projects`, `jira.projectKeys`, `linear.projects`, `linear.teams`, `monday.boards`, `monday.groups`, `webflow.sites`, `webflow.collections`, `webflow.items`, `cloudwatch.logGroups`, `cloudwatch.logStreams`, `imap.mailboxes`, `mcp.tools`, `managedAgent.agents`, `managedAgent.environments`, `managedAgent.vaults`, `managedAgent.memoryStores`, `knowledge.documents`, `sim.workflows`, `table.columns`, `table.outputColumns`, `workspace.secretNames`, `workspace.sandboxes`, `providers.ollamaEmbeddingModels`, `providers.openrouterEmbeddingModels`. |
4165+
| `--selector-key <value>` | Yes | Registered selector key for discovering this field’s destination options. Accepted values: `airtable.bases`, `airtable.tables`, `asana.workspaces`, `attio.lists`, `attio.objects`, `bigquery.datasets`, `bigquery.tables`, `bitbucket.workspaces`, `bitbucket.repositories`, `calcom.eventTypes`, `calcom.schedules`, `clickup.workspaces`, `clickup.spaces`, `clickup.folders`, `clickup.lists`, `coda.docs`, `coda.pages`, `coda.tables`, `coda.columns`, `coda.rows`, `coda.formulas`, `coda.controls`, `coda.folders`, `coda.permissions`, `confluence.spaces`, `confluence.spacesById`, `confluence.pages`, `google.tasks.lists`, `gmail.labels`, `google.calendar`, `google.drive`, `google.sheets`, `harmonic.savedSearches`, `hubspot.lists`, `hubspot.owners`, `hubspot.pipelines`, `hubspot.pipelineStages`, `hubspot.properties`, `jsm.requestTypes`, `jsm.serviceDesks`, `microsoft.planner.plans`, `notion.databases`, `notion.pages`, `netsuite.recordTypes`, `netsuite.asyncTasks`, `pipedrive.pipelines`, `sharepoint.lists`, `trello.boards`, `zoho_desk.organizations`, `zoho_desk.departments`, `zoho_desk.agents`, `zoom.meetings`, `slack.channels`, `snowflake.databases`, `snowflake.schemas`, `snowflake.tables`, `snowflake.warehouses`, `snowflake.roles`, `snowflake.fileFormats`, `snowflake.procedures`, `slack.users`, `outlook.folders`, `outlook.calendars`, `microsoft.teams`, `microsoft.chats`, `microsoft.channels`, `microsoft.planner`, `onedrive.files`, `onedrive.folders`, `sharepoint.sites`, `microsoft.excel`, `microsoft.excel.drives`, `microsoft.excel.sheets`, `microsoft.word`, `wealthbox.contacts`, `jira.issues`, `jira.projects`, `jira.projectKeys`, `linear.projects`, `linear.teams`, `monday.boards`, `monday.groups`, `webflow.sites`, `webflow.collections`, `webflow.items`, `planetscale.databases`, `planetscale.branches`, `planetscale.backups`, `planetscale.deployRequests`, `cloudwatch.logGroups`, `cloudwatch.logStreams`, `imap.mailboxes`, `mcp.tools`, `managedAgent.agents`, `managedAgent.environments`, `managedAgent.vaults`, `managedAgent.memoryStores`, `knowledge.documents`, `sim.workflows`, `table.columns`, `table.outputColumns`, `workspace.secretNames`, `workspace.sandboxes`, `providers.ollamaEmbeddingModels`, `providers.openrouterEmbeddingModels`. |
41664166
| `--context <json\|@file>` | No | Only the dependencies declared by the selector, such as oauthCredential and channelId. Missing OAuth connections require human authorization. (JSON, or @path / @- to read a file or stdin). |
41674167
| `--search <value>` | No | Provider option search text. |
41684168
| `--cursor <value>` | No | Continue from nextCursor returned by a previous result. |

0 commit comments

Comments
 (0)