Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
92 commits
Select commit Hold shift + click to select a range
62d0800
fix(credential-groups): stop requiring a human subject on workflow op…
TheodoreSpeaks Aug 29, 2026
4e78409
feat(function): mount referenced files into the code sandbox (#7251)
icecrasher321 Aug 29, 2026
bc07d2d
feat(admin): move a workspace between organizations (#7254)
mzxchandra Aug 29, 2026
d7c9f51
feat(library): AI Agents for Marketing Automation: Building Agentic W…
icecrasher321 Aug 29, 2026
95d1969
fix(provenance): let a run that never started report why it failed (#…
icecrasher321 Aug 29, 2026
f607c01
feat(billing): track E2B and Daytona Function sandbox usage (#7184)
BillLeoutsakosvl346 Aug 29, 2026
029ded6
refactor(tables): add column type extension points (#7119)
j15z Aug 29, 2026
7353b7c
feat(tables): add automatic row expiration with TTL (#7071)
j15z Aug 29, 2026
674ca8d
fix(timezone): consolidate table wall-clock conversion (#7072)
j15z Aug 29, 2026
f8f2d5f
feat(tables): trigger workflows on row deletes (#7161)
j15z Aug 29, 2026
2b00d96
fix(elasticsearch): resolve Cloud IDs to the real host and correct th…
waleedlatif1 Aug 30, 2026
c53837f
improvement(integrations): refresh Slack integration page SEO copy (#…
waleedlatif1 Aug 30, 2026
4851ae3
fix(helm): bump chart appVersion to the release it ships with (#7285)
waleedlatif1 Aug 30, 2026
cd42dce
fix(charts): strip ECharts navigation sinks from .chart documents (#7…
waleedlatif1 Aug 30, 2026
553849a
fix(sandbox): spend each file ceiling once across every source (#7288)
icecrasher321 Aug 30, 2026
faec125
fix(admin): report a completed workspace move's true source and its c…
icecrasher321 Aug 30, 2026
a996881
feat(files): add workspace content search (#7289)
icecrasher321 Aug 31, 2026
ba3cf4d
fix(files): dispatch search indexing from Trigger workers (#7293)
icecrasher321 Aug 31, 2026
27d7926
feat(library): Best AI Agents for Lead Enrichment in 2026 (#7292)
icecrasher321 Aug 31, 2026
ddab4a9
fix(github): wire the block fields whose ids do not match their tool …
waleedlatif1 Aug 31, 2026
f41e27a
fix(tables): harden timezone and expiration handling (#7291)
j15z Aug 31, 2026
eefbb20
fix(tables): run workflow groups from deployments (#7240)
TheodoreSpeaks Aug 31, 2026
b19553e
feat(files): add an overwrite option to file write (#7295)
TheodoreSpeaks Aug 31, 2026
d99fe97
fix(connectors): keep rate limits out of failure breaker (#7302)
waleedlatif1 Aug 31, 2026
9b0c62f
fix(chat): scope selection clipboard chips to workspace (#7298)
BillLeoutsakosvl346 Aug 31, 2026
2a8fa38
fix(workflows): authorize paused execution reads (#7303)
waleedlatif1 Aug 31, 2026
f3fb445
fix(incidentio): align declared outputs and enum hints with the v2 AP…
waleedlatif1 Aug 31, 2026
bd49a7e
fix(okta): describe each user param the way its endpoint accepts it (…
waleedlatif1 Aug 31, 2026
158214a
fix(github): make branch protection usable and wire workflow_id to it…
waleedlatif1 Aug 31, 2026
d6ef784
feat(sso): add safe member provisioning (#7309)
waleedlatif1 Aug 31, 2026
afccb72
fix(egress): unify SSRF/egress behind one policy with named provenanc…
waleedlatif1 Aug 31, 2026
27e4632
improvement(selectors): unify server-side selector execution (#7185)
BillLeoutsakosvl346 Aug 31, 2026
cb4a84d
improvement(ui): move secret visibility below description (#7315)
waleedlatif1 Aug 31, 2026
f9c22fd
fix(auth): revoke stale email share access (#7314)
waleedlatif1 Aug 31, 2026
70783dc
improvement(settings): accelerate navigation and data loading (#7299)
waleedlatif1 Aug 31, 2026
8e9aeb9
fix(executor): stop resolved data from breaking out of generated cond…
icecrasher321 Aug 31, 2026
b64a138
fix(settings): restore SSO recovery and lifecycle test isolation (#7317)
waleedlatif1 Aug 31, 2026
d8a6b6b
improvement(desktop): harden browser agent (#7311)
waleedlatif1 Aug 31, 2026
19e4570
chore(security): add proxy rate-limit regression coverage (#7318)
waleedlatif1 Aug 31, 2026
8309ad5
chore(copilot): sync mothership contracts (#7316)
j15z Aug 31, 2026
bd75254
feat(workspace): support GIF logos (#7322)
waleedlatif1 Sep 1, 2026
bd7995e
fix(selectors): normalize Bitbucket workspace UUIDs (#7320)
BillLeoutsakosvl346 Sep 1, 2026
04f7cd2
fix(notion): resolve custom page title properties (#7323)
BillLeoutsakosvl346 Sep 1, 2026
898ecdb
chore(analytics): remove Profound request tracking (#7326)
waleedlatif1 Sep 1, 2026
f4f1850
feat(library): Sim vs. Dedicated Chatbot Builders (#7325)
icecrasher321 Sep 1, 2026
616d5e9
fix(selectors): paginate HubSpot list options (#7327)
BillLeoutsakosvl346 Sep 1, 2026
e100c5a
fix(files): bound YAML expansion and buffered reads on the file-serve…
icecrasher321 Sep 1, 2026
e5e67b3
feat(circleback): add API tools, expanded block, and knowledge base c…
waleedlatif1 Sep 1, 2026
2173a70
feat(slack): add agent sessions and streaming (#7296)
TheodoreSpeaks Sep 1, 2026
fde8cf9
fix(cron): derive async job retention cutoffs from one clock read (#7…
TheodoreSpeaks Sep 1, 2026
8430f0f
fix(tables): make the agent tool picker version-aware and enrich the …
mzxchandra Sep 1, 2026
2598f44
fix(workflows): preserve contrast on gradient tiles (#7332)
waleedlatif1 Sep 1, 2026
507663f
fix(selectors): paginate SharePoint sites and lists (#7335)
BillLeoutsakosvl346 Sep 1, 2026
dcaaf8e
feat(sailpoint): add SailPoint (IGA) integration (#6092)
mzxchandra Sep 1, 2026
1c197c1
fix(selectors): paginate BigQuery resources (#7334)
BillLeoutsakosvl346 Sep 1, 2026
f2e20aa
fix(execution): stop treating the workflow owner as a live execution …
icecrasher321 Sep 1, 2026
27734f5
fix(webflow): paginate collection item selectors (#7337)
BillLeoutsakosvl346 Sep 1, 2026
b1b5de7
improvement(integrations): add Twilio SMS AEO content (#7342)
waleedlatif1 Sep 1, 2026
beef0ea
improvement(oauth): resolve credential tokens in-process instead of h…
waleedlatif1 Sep 1, 2026
694c34b
improvement(integrations): refine Slack AEO content (#7344)
waleedlatif1 Sep 1, 2026
1404e65
fix(slack): restore assistant operation compatibility (#7339)
TheodoreSpeaks Sep 1, 2026
48f72a2
feat(copilot): let Run agent cancel workflow runs (#7151)
j15z Sep 1, 2026
b4bc9b9
fix(sailpoint): complete integration validation (#7345)
waleedlatif1 Sep 1, 2026
fd061f5
improvement(deps): harden dependency graph (#7343)
waleedlatif1 Sep 1, 2026
4941c73
feat(streaming): support nested workflow outputs (#7346)
TheodoreSpeaks Sep 1, 2026
3de31cb
feat(slack): list DMs for managed credentials (#7349)
TheodoreSpeaks Sep 1, 2026
358af42
fix(docker): allow pruned lockfile normalization (#7350)
TheodoreSpeaks Sep 1, 2026
d7b31a8
feat(permission-groups): enforce every config key server-side (#7347)
waleedlatif1 Sep 1, 2026
36a4b6a
fix(canvas): repair React Flow v12 and dependency upgrade regressions…
waleedlatif1 Sep 1, 2026
9c35e18
fix(tool-input): render every tool param through the canonical sub-bl…
icecrasher321 Sep 1, 2026
349f40a
feat(sidebar): live workflow and folder registry updates via workspac…
waleedlatif1 Sep 1, 2026
11b10fb
fix(selectors): drain Snowflake result partitions (#7357)
BillLeoutsakosvl346 Sep 1, 2026
9d8d595
fix(cloudwatch): paginate log selectors (#7360)
BillLeoutsakosvl346 Sep 1, 2026
69d7266
fix(selectors): close residual cancellation gaps (#7358)
BillLeoutsakosvl346 Sep 1, 2026
4c20ff6
improvement(audits): eliminate repeated parsing and scans (#7361)
waleedlatif1 Sep 1, 2026
2ce2bec
chore(api): remove unused and superseded API routes (#7364)
waleedlatif1 Sep 1, 2026
83e5f5f
feat(library): Sim: The Open Source Zapier Alternative for AI Agents …
icecrasher321 Sep 1, 2026
e7cfef9
fix(selectors): paginate HubSpot owner options (#7359)
BillLeoutsakosvl346 Sep 1, 2026
f59c69f
fix(confluence): normalize space identifiers (#7324)
BillLeoutsakosvl346 Sep 1, 2026
df833ef
feat(ashby): expand hiring operations and webhooks (#7341)
waleedlatif1 Sep 1, 2026
d8ecc5b
perf(tests): cut per-file import graphs in apps/sim and shard the sui…
waleedlatif1 Sep 1, 2026
9acf0f8
perf(tests): drop dead upload-context re-exports and unify the CI dum…
waleedlatif1 Sep 1, 2026
23e1663
fix(deps): preserve runtime and canvas behavior (#7366)
waleedlatif1 Sep 1, 2026
1c2f708
chore(skills): teach babysit about cubic, not just Greptile (#7372)
icecrasher321 Sep 1, 2026
c43e842
fix(slack): paginate selector resources (#7362)
BillLeoutsakosvl346 Sep 1, 2026
e5a8852
feat(file): search workspace files by regular expression (#7370)
icecrasher321 Sep 1, 2026
78780c9
fix(selectors): expose incomplete loaded catalogs (#7338)
BillLeoutsakosvl346 Sep 2, 2026
150bff4
perf(tests): trim sweep, copilot, and timer-bound suites; run three C…
waleedlatif1 Sep 2, 2026
b2b4d0e
feat(models): add Claude Fable 5.1 and align Anthropic prompt-cache m…
waleedlatif1 Sep 2, 2026
4f42c61
feat(credential-groups): add event trigger (#7379)
TheodoreSpeaks Sep 2, 2026
452e542
feat(resources): remember list preferences (#7371)
j15z Sep 2, 2026
51d2118
feat(tools): run one integration tool over v2, and fix the ones that …
icecrasher321 Sep 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 1 addition & 1 deletion .agents/skills/add-block-preview/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ A revealed block that is not globally GA (`enabled !== true`, or env-revealed) r
- GA via config (code cleanup pending): `{ "enabled": true }` — suffix disappears everywhere within ~30s (AppConfig TTL) + client refetch.

Same runbook as `feature-flags`: edit the hosted document, `aws appconfig start-deployment` with the `sim-<env>-fast` strategy (see the infra README).
5. **GA cleanup:** delete `preview: true` from the block (now visible to self-hosters on their next upgrade), add its `BlockMeta` + regen docs, and drop the AppConfig entry. For a v2 upgrade, this is also when v1 gets `hideFromToolbar: true` (the superseded-version paradigm).
5. **GA cleanup:** delete `preview: true` from the block (now visible to self-hosters on their next upgrade), add its `BlockMeta` + regen docs, and drop the AppConfig entry. For a v2 upgrade, this is also when v1 gets `hideFromToolbar: true` **and** `sunset: { status: 'legacy', replacedBy: '<v2-type>' }` (the superseded-version paradigm). Both edits must land in the **same commit** as the `preview: true` removal — `check-block-registry` fails a sunset block whose `replacedBy` is still `preview`, so splitting them breaks the build in between. Also move the block's `BLOCK_DISPLAY_WORKFLOWS` entry (`apps/docs/components/workflow-preview/block-display-workflows.ts`) to the new type, or `BlockPreview` silently renders nothing on the docs page.

## Kill switch (shipped blocks)

Expand Down
25 changes: 22 additions & 3 deletions .agents/skills/add-block/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -207,6 +207,7 @@ silently available.
id: 'channel',
title: 'Channel',
type: 'channel-selector',
selectorKey: '{service}.channels',
serviceId: '{service}',
placeholder: 'Select channel',
dependsOn: ['credential'],
Expand All @@ -217,6 +218,7 @@ silently available.
id: 'project',
title: 'Project',
type: 'project-selector',
selectorKey: '{service}.projects',
serviceId: '{service}',
dependsOn: ['credential'],
}
Expand All @@ -226,6 +228,7 @@ silently available.
id: 'file',
title: 'File',
type: 'file-selector',
selectorKey: '{service}.files',
serviceId: '{service}',
mimeType: 'application/pdf',
dependsOn: ['credential'],
Expand All @@ -236,6 +239,7 @@ silently available.
id: 'user',
title: 'User',
type: 'user-selector',
selectorKey: '{service}.users',
serviceId: '{service}',
dependsOn: ['credential'],
}
Expand Down Expand Up @@ -691,6 +695,10 @@ export const ServiceBlock: BlockConfig = {
type: 'service',
name: 'Service (Legacy)',
hideFromToolbar: true, // Hide from toolbar
// Required: drives the amber legacy badge and its click-to-upgrade action.
// `check-block-registry` fails a legacy block with no `replacedBy`, one whose
// target does not exist, or one whose target is itself sunset or still `preview`.
sunset: { status: 'legacy', replacedBy: 'service_v2' },
// ... rest of config
}

Expand Down Expand Up @@ -1065,7 +1073,11 @@ After creating the block, you MUST validate it against every tool it references:

A sub-block gets its choices from exactly one of two places. There is no third.

**`selectorKey` — every remote list.** Register the list in `hooks/selectors/providers/<service>/selectors.ts`, add its key to `SelectorKey`, and point the sub-block at it. A selector is parameterized by an explicit `SelectorContext`, so the same definition serves the canvas, the workspace-fork sync modal, and anything added later.
**`selectorKey` — every remote list.** Use the `add-selector` skill to add browser-safe metadata in
`apps/sim/lib/selectors/manifest.ts`. Attach `provider-server` selectors under
`apps/sim/lib/selectors/server/providers/` and `internal-server` selectors in
`apps/sim/lib/selectors/server/internal.ts`. Point the sub-block at that key. All remote selectors
execute through `selectors.execute`; never add a client provider module or selector-only fetch route.

```ts
{ id: 'triggerCredentials', type: 'oauth-input', canonicalParamId: 'oauthCredential', mode: 'trigger' },
Expand All @@ -1074,7 +1086,13 @@ A sub-block gets its choices from exactly one of two places. There is no third.
{ id: 'manualLabelIds', type: 'short-input', mode: 'trigger-advanced' },
```

`canonicalParamId: 'oauthCredential'` on the credential sub-block is the line people forget. `buildSelectorContextFromBlock` keys the context on a sub-block's CANONICAL id, so without it `context.oauthCredential` is never set and the picker looks unfixable without reading the store. (A credential field is also recognised by its `oauth-input` TYPE as a fallback, so a block whose shipped param is already named something else does not have to rename it.)
`canonicalParamId: 'oauthCredential'` on the credential sub-block is the line people forget. The
shared context builder projects only active `dependsOn` values and keys canonical pairs by their
canonical id. Exact environment references such as `{{GMAIL_CREDENTIAL_ID}}` stay unresolved in the
browser and are resolved only by the authorized server executor. The builder does not infer a
nonstandard credential id from `type: 'oauth-input'`; give it
`canonicalParamId: 'oauthCredential'`, or declare an explicit manifest `sourceFields` alias when a
legacy source id must be retained.

**`options` — everything else.** A static array, or a pure function of the block's own values for a list that narrows to a sibling's selection. No I/O.

Expand All @@ -1089,5 +1107,6 @@ options: (params) => {

Two rules the checks enforce:

- **A secret never enters a selector's `getQueryKey`.** A query key identifies a resource; a credential authorizes access to it. A credential *id* is fine; a typed password is not (see `imap.mailboxes`).
- **Selector query keys contain no context values.** This includes credential IDs, raw secrets,
unresolved references, and hashes of those values; the shared facade uses an opaque local revision.
- **A sub-block that `dependsOn` a credential / knowledge-base / table selector must be reconfigurable at fork-sync time** — a `selectorKey`, a canonical pair whose basic member is a selector, or a `short-input`/`long-input`. `bun run check:fork-dependent-coverage` fails otherwise, because a fork sync clears those fields on every push and an unofferable one can never be set anywhere that sticks.
37 changes: 25 additions & 12 deletions .agents/skills/add-connector/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,14 @@ Three field types are supported: `short-input`, `dropdown`, and `selector`.

## Dynamic Selectors (Canonical Pairs)

Use `type: 'selector'` to fetch options dynamically from the existing selector registry (`hooks/selectors/registry.ts`). Selectors are always paired with a manual fallback input using the **canonical pair** pattern — a `selector` field (basic mode) and a `short-input` field (advanced mode) linked by `canonicalParamId`.
Use `type: 'selector'` for a key declared in the browser-safe selector manifest at
`apps/sim/lib/selectors/manifest.ts`. Remote selectors execute through the authorized
`selectors.execute` server operation and a server attachment; connectors never call providers or
resolve credentials in the browser. Apply the `add-selector` skill when the key does not exist.

Selectors are paired with a manual fallback input using the **canonical pair** pattern — a
`selector` field (basic mode) and a `short-input` field (advanced mode) linked by
`canonicalParamId`.

The user sees a toggle button (ArrowLeftRight) to switch between the selector dropdown and manual text input. On submit, the modal resolves each canonical pair to the active mode's value, keyed by `canonicalParamId`.

Expand All @@ -217,7 +224,7 @@ configFields: [
id: 'baseSelector',
title: 'Base',
type: 'selector',
selectorKey: 'airtable.bases', // Must exist in hooks/selectors/registry.ts
selectorKey: 'airtable.bases', // Must exist in lib/selectors/manifest.ts
canonicalParamId: 'baseId',
mode: 'basic',
placeholder: 'Select a base',
Expand Down Expand Up @@ -260,7 +267,9 @@ configFields: [

### Selector with domain dependency (Jira/Confluence pattern)

When a selector depends on a plain `short-input` field (no canonical pair), `dependsOn` references that field's `id` directly. The `domain` field's value maps to `SelectorContext.domain` automatically via `SELECTOR_CONTEXT_FIELDS`.
When a selector depends on a plain `short-input` field (no canonical pair), `dependsOn` references
that field's `id` directly. Exact references such as `{{JIRA_DOMAIN}}` remain unresolved in the
browser and are resolved only after workspace authorization on the server.

```typescript
configFields: [
Expand Down Expand Up @@ -296,16 +305,16 @@ configFields: [

### How `dependsOn` maps to `SelectorContext`

The connector selector field builds a `SelectorContext` from dependency values. For the mapping to work, each dependency's `canonicalParamId` (or field `id` for non-canonical fields) must exist in `SELECTOR_CONTEXT_FIELDS` (`lib/workflows/subblocks/context.ts`):

```
oauthCredential, domain, teamId, projectId, knowledgeBaseId, planId,
siteId, collectionId, spreadsheetId, fileId, baseId, datasetId, serviceDeskId
```
The shared connector context builder projects only active dependencies. A canonical dependency uses
its active basic or advanced value under `canonicalParamId`; a non-canonical dependency uses its
field `id`. The resulting key must be a `SelectorContextKey` in
`apps/sim/lib/selectors/types.ts` and must be explicitly allowed by that selector's manifest entry.
The browser sends the connector's workspace scope, not the complete connector configuration.

### Available selector keys

Check `hooks/selectors/types.ts` for the full `SelectorKey` union. Common ones for connectors:
Check `apps/sim/lib/selectors/manifest.ts` for the exhaustive selector keys. Common ones for
connectors:

| SelectorKey | Context Deps | Returns |
|-------------|-------------|---------|
Expand Down Expand Up @@ -607,9 +616,13 @@ export const CONNECTOR_META_REGISTRY: ConnectorMetaRegistry = {
- [ ] **Selector fields configured correctly (if applicable):**
- Every `type: 'selector'` field has a canonical pair (`short-input` or `dropdown` with same `canonicalParamId` and `mode: 'advanced'`)
- `required` is identical on both fields in each canonical pair
- `selectorKey` exists in `hooks/selectors/registry.ts`
- `selectorKey` exists in `apps/sim/lib/selectors/manifest.ts`
- `dependsOn` references selector field IDs (not `canonicalParamId`)
- Dependency `canonicalParamId` values exist in `SELECTOR_CONTEXT_FIELDS`
- Each projected dependency key is a `SelectorContextKey` allowed by the selector manifest
- Every remote key has one server attachment with credential provider binding and a reviewed
`fixed`, `credential-bound`, or `user-controlled` destination policy
- No connector selector adds a client provider module, browser token request, or selector-only
API route
- [ ] `listDocuments` handles pagination with metadata-based content hashes
- [ ] `syncContext.listingCapped = true` set whenever the listing is truncated (max-items cap or transient per-item error) — required to prevent the engine's deletion reconciliation from removing unseen documents
- [ ] `contentDeferred: true` used if content requires per-doc API calls (file download, export, blocks fetch)
Expand Down
26 changes: 24 additions & 2 deletions .agents/skills/add-integration/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -270,15 +270,24 @@ export const {Service}Block: BlockConfig = {
{
id: 'project',
type: 'project-selector',
selectorKey: '{service}.projects',
dependsOn: ['credential'],
},
{
id: 'issue',
type: 'file-selector',
selectorKey: '{service}.issues',
dependsOn: ['credential', 'project'],
}
```

Every remote `selectorKey` must use the unified server selector path. Apply the `add-selector` skill:
add browser-safe metadata to `apps/sim/lib/selectors/manifest.ts`, reuse or extract a server-only
provider listing primitive, and add a credential- and destination-bound server attachment. Do not
add code under `hooks/selectors/providers`, a provider-specific query key, browser token acquisition,
or a selector-only API route. The shared context builder sends only active `dependsOn` values and
preserves exact `{{KEY}}` environment references for server-side resolution.

**Basic/Advanced mode for dual UX:**
```typescript
// Basic: Visual selector
Expand Down Expand Up @@ -589,7 +598,15 @@ If creating V2 versions (API-aligned outputs):

1. **V2 Tools** - Add `_v2` suffix, version `2.0.0`, flat outputs
2. **V2 Block** - Add `_v2` type, use `createVersionedToolSelector`
3. **V1 Block** - Add `(Legacy)` to name, set `hideFromToolbar: true`
3. **V1 Block** - Add `(Legacy)` to name, set `hideFromToolbar: true`, and add
`sunset: { status: 'legacy', replacedBy: '{service}_v2' }` — `check-block-registry`
fails a legacy block with no `replacedBy`, and the amber legacy badge plus its
click-to-upgrade action read from that field.

**Only add `replacedBy` once the target is GA.** The same check also fails when
the target is unregistered, itself sunset, or still `preview: true`. If v2 is
preview-gated, leave v1 alone until GA and drop `preview` in the *same commit*
that adds the sunset — splitting them breaks the build in between.
4. **Registry** - Register both versions

```typescript
Expand Down Expand Up @@ -630,6 +647,10 @@ If creating V2 versions (API-aligned outputs):
- [ ] Added credential field with `requiredScopes: getScopesForService('{service}')`
- [ ] Added conditional fields per operation
- [ ] Set up dependsOn for cascading selectors
- [ ] Every remote `selectorKey` exists in the shared manifest and has one server attachment with
trusted credential provider binding and a fixed, credential-bound, or explicitly reviewed
user-controlled destination policy
- [ ] No selector provider logic, credential resolution, or provider route call runs in the browser
- [ ] Configured tools.access with all tool IDs
- [ ] Configured tools.config.tool selector
- [ ] Defined outputs matching tool outputs
Expand Down Expand Up @@ -922,7 +943,8 @@ requiredScopes: getScopesForService('{service}'),
3. **Block type is snake_case** - `type: 'stripe'`, not `type: 'Stripe'`
4. **Alphabetical ordering** - Keep imports and registry entries alphabetically sorted
5. **Required can be conditional** - Use `required: { field: 'op', value: 'create' }` instead of always true
6. **DependsOn clears options** - When a dependency changes, selector options are refetched
6. **DependsOn clears options** - When an active dependency changes, the shared selector facade
refetches with an opaque query revision; dependency values and references never enter query keys
7. **Never pass Buffer directly to fetch** - Convert to `new Uint8Array(buffer)` for TypeScript compatibility
8. **Always handle legacy file params** - Keep hidden `fileContent` params for backwards compatibility
9. **Optional fields use advanced mode** - Set `mode: 'advanced'` on rarely-used optional fields
Expand Down
Loading
Loading