Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
16 commits
Select commit Hold shift + click to select a range
e46349f
fix(monday): expose items_page cursor pagination on get items
waleedlatif1 Nov 14, 2026
de39ffb
fix(asana): send assignee/offset on task lists, add search limit, kee…
waleedlatif1 Nov 14, 2026
bb356ab
fix(clickup): keep model args on agent tool calls, add task date filt…
waleedlatif1 Nov 14, 2026
21e11d6
fix(airtable): accept already-parsed JSON inputs on tool calls and ad…
waleedlatif1 Nov 14, 2026
72a0935
fix(notion): split long text into 2000-char rich text objects and pag…
waleedlatif1 Nov 14, 2026
2df07e2
fix(supabase): accept PostgREST-form and multi-column order-by, read …
waleedlatif1 Nov 14, 2026
58b2739
fix(amplitude): send the second segmentation group-by as a repeated g…
waleedlatif1 Nov 14, 2026
3154c66
fix(box): request the fields Box omits by default, add marker paginat…
waleedlatif1 Nov 14, 2026
5bc8831
fix(docusign): page envelope and template lists, ignore missing signi…
waleedlatif1 Nov 14, 2026
56d22b7
fix(dropbox): read the nested existing shared link and page list fold…
waleedlatif1 Nov 14, 2026
c5e0b76
fix(integrations): keep per-operation pagination values from leaking …
waleedlatif1 Nov 14, 2026
498dbb3
fix(docusign): note that freeform signing can be disabled per account
waleedlatif1 Nov 14, 2026
627acc8
chore(docs): regenerate integration docs, catalog, and tool metadata
waleedlatif1 Nov 14, 2026
b200178
chore(notion): replace non-null assertions in tests and shrink the ex…
waleedlatif1 Nov 14, 2026
8f985ec
fix(integrations): fail loudly on partial Notion reads, validate Asan…
waleedlatif1 Nov 14, 2026
c29ad1b
fix(box): mark nextMarker nullable
waleedlatif1 Nov 14, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions apps/docs/content/docs/integrations/airtable.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ List all bases the authenticated user has access to
| `bases` | array | Array of Airtable bases with id, name, and permissionLevel |
| ↳ `id` | string | Base ID \(starts with "app"\) |
| ↳ `name` | string | Base name |
| ↳ `permissionLevel` | string | Permission level \(none, read, comment, edit, create\) |
| ↳ `permissionLevel` | string | Permission level \(none, read, comment, edit, create, interfaceOnly, permissionSetOnly\) |
| `metadata` | json | Pagination and count metadata |
| ↳ `offset` | string | Offset for next page of results |
| ↳ `totalBases` | number | Number of bases returned |
Expand Down Expand Up @@ -111,8 +111,11 @@ Read records from an Airtable table
| --------- | ---- | -------- | ----------- |
| `baseId` | string | Yes | Airtable base ID \(starts with "app", e.g., "appXXXXXXXXXXXXXX"\) |
| `tableId` | string | Yes | Table ID \(starts with "tbl"\) or table name |
| `maxRecords` | number | No | Maximum number of records to return \(default: all records\) |
| `maxRecords` | number | No | Maximum total number of records to return. Each request returns at most one page \(pageSize, up to 100\); use offset to fetch the next page |
| `filterFormula` | string | No | Formula to filter records \(e.g., "\(\{Field Name\} = 'Value'\)"\) |
| `pageSize` | number | No | Number of records per page \(max 100, default 100\) |
| `offset` | string | No | Pagination offset from a previous response, to fetch the next page of records |
| `view` | string | No | View name or ID. Only records in the view are returned, sorted in the view order |

#### Output

Expand Down
5 changes: 3 additions & 2 deletions apps/docs/content/docs/integrations/amplitude.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -209,13 +209,14 @@ Query event analytics data with segmentation. Get event counts, uniques, average
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `eventType` | string | Yes | Event type name to analyze |
| `secondEventType` | string | No | Second event type to query alongside the first \(event B in a formula such as "UNIQUES\(A\)/UNIQUES\(B\)"\) |
| `start` | string | Yes | Start date in YYYYMMDD format |
| `end` | string | Yes | End date in YYYYMMDD format |
| `metric` | string | No | Metric type: uniques, totals, pct_dau, average, histogram, sums, value_avg, or formula \(default: uniques\) |
| `interval` | string | No | Time interval: 1 \(daily\), 7 \(weekly\), or 30 \(monthly\) |
| `interval` | string | No | Time interval: -300000 \(real-time\), -3600000 \(hourly\), 1 \(daily\), 7 \(weekly\), or 30 \(monthly\) |
| `groupBy` | string | No | Property name to group by \(prefix custom user properties with "gp:"\) |
| `groupBy2` | string | No | Second property name to group by \(prefix custom user properties with "gp:"\) |
| `limit` | string | No | Maximum number of group-by values \(max 1000\) |
| `limit` | string | No | Maximum number of group-by values \(default 1000, max 20000\) |
| `filters` | string | No | JSON array of filter objects applied to the event, e.g. \[\{"subprop_type":"event","subprop_key":"city","subprop_op":"is","subprop_value":\["San Francisco"\]\}\] |
| `formula` | string | No | Required when metric is "formula", e.g. "UNIQUES\(A\)/UNIQUES\(B\)" |
| `segment` | string | No | JSON segment definition\(s\) applied to the query |
Expand Down
15 changes: 11 additions & 4 deletions apps/docs/content/docs/integrations/asana.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,11 @@ Retrieve a single task by GID or get multiple tasks with filters
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `taskGid` | string | No | The globally unique identifier \(GID\) of the task. If not provided, will get multiple tasks. |
| `workspace` | string | No | Asana workspace GID \(numeric string\) to filter tasks \(required when not using taskGid\) |
| `workspace` | string | No | Asana workspace GID \(numeric string\) to filter tasks. Asana requires an assignee alongside a workspace filter; use project instead to list a project |
| `assignee` | string | No | Assignee to filter tasks on \(user GID, email, or "me"\). Required by Asana when filtering by workspace; ignored when filtering by project |
| `project` | string | No | Asana project GID \(numeric string\) to filter tasks |
| `limit` | number | No | Maximum number of tasks to return \(default: 50\) |
| `limit` | number | No | Maximum number of tasks to return, 1-100 \(default: 50\) |
| `offset` | string | No | Pagination offset token from a previous response next_page.offset |

#### Output

Expand All @@ -74,6 +76,10 @@ Retrieve a single task by GID or get multiple tasks with filters
| ↳ `gid` | string | Task GID |
| ↳ `name` | string | Task name |
| ↳ `completed` | boolean | Completion status |
| `next_page` | object | Pagination info when fetching multiple tasks; null on the last page |
| ↳ `offset` | string | Offset token for the next page |
| ↳ `path` | string | API path |
| ↳ `uri` | string | Full URI |

</ReferenceDetails>

Expand Down Expand Up @@ -175,10 +181,11 @@ Search for tasks in an Asana workspace
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `workspace` | string | Yes | Asana workspace GID \(numeric string\) to search tasks in |
| `text` | string | No | Text to search for in task names |
| `text` | string | No | Full-text search on task names and descriptions |
| `assignee` | string | No | Filter tasks by assignee user GID |
| `projects` | array | No | Array of Asana project GIDs \(numeric strings\) to filter tasks by |
| `completed` | boolean | No | Filter by completion status |
| `limit` | number | No | Maximum number of tasks to return, 1-100 |

#### Output

Expand All @@ -199,7 +206,7 @@ Search for tasks in an Asana workspace
| ↳ `due_on` | string | Due date |
| ↳ `created_at` | string | Creation timestamp |
| ↳ `modified_at` | string | Modified timestamp |
| `next_page` | object | Pagination info |
| `next_page` | object | Not returned by Asana search, which has no pagination; sort by created_at and filter to page manually |
| ↳ `offset` | string | Offset token |
| ↳ `path` | string | API path |
| ↳ `uri` | string | Full URI |
Expand Down
7 changes: 5 additions & 2 deletions apps/docs/content/docs/integrations/box.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,9 @@ List files and folders in a Box folder
| --------- | ---- | -------- | ----------- |
| `folderId` | string | Yes | The ID of the folder to list items from \(use "0" for root\) |
| `limit` | number | No | Maximum number of items to return per page |
| `offset` | number | No | The offset for pagination |
| `offset` | number | No | The offset for pagination \(ignored when using marker-based pagination\) |
| `usemarker` | boolean | No | Use marker-based pagination instead of offsets \(recommended for large folders\); returns nextMarker |
| `marker` | string | No | Marker from a previous response to fetch the next page \(implies usemarker\) |
| `sort` | string | No | Sort field: id, name, date, or size |
| `direction` | string | No | Sort direction: ASC or DESC |

Expand All @@ -154,9 +156,10 @@ List files and folders in a Box folder
| ↳ `size` | number | Item size in bytes |
| ↳ `createdAt` | string | Creation timestamp |
| ↳ `modifiedAt` | string | Last modified timestamp |
| `totalCount` | number | Total number of items in the folder |
| `totalCount` | number | Total number of items in the folder; null with marker pagination, where Box omits it |
| `offset` | number | Current pagination offset |
| `limit` | number | Current pagination limit |
| `nextMarker` | string | Marker for the next page when using marker-based pagination |

</ReferenceDetails>

Expand Down
11 changes: 10 additions & 1 deletion apps/docs/content/docs/integrations/clickup.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,7 @@ Delete a task from ClickUp

### ClickUp Get Tasks

List the tasks in a ClickUp list (100 tasks per page; increment page until an empty result to paginate)
List the tasks in a ClickUp list (100 tasks per page; increment page until lastPage is true to paginate)

<ReferenceDetails>

Expand All @@ -168,12 +168,17 @@ List the tasks in a ClickUp list (100 tasks per page; increment page until an em
| `tags` | array | No | Filter tasks by tag names |
| `dueDateGt` | number | No | Only tasks due after this Unix timestamp in milliseconds |
| `dueDateLt` | number | No | Only tasks due before this Unix timestamp in milliseconds |
| `dateCreatedGt` | number | No | Only tasks created after this Unix timestamp in milliseconds |
| `dateCreatedLt` | number | No | Only tasks created before this Unix timestamp in milliseconds |
| `dateUpdatedGt` | number | No | Only tasks updated after this Unix timestamp in milliseconds |
| `dateUpdatedLt` | number | No | Only tasks updated before this Unix timestamp in milliseconds |

#### Output

| Parameter | Type | Description |
| --------- | ---- | ----------- |
| `tasks` | array | Tasks in the list |
| `lastPage` | boolean | Whether this is the last page of results |

</ReferenceDetails>

Expand Down Expand Up @@ -202,6 +207,10 @@ Search tasks across a ClickUp workspace with filters for lists, folders, spaces,
| `tags` | array | No | Filter tasks by tag names |
| `dueDateGt` | number | No | Only tasks due after this Unix timestamp in milliseconds |
| `dueDateLt` | number | No | Only tasks due before this Unix timestamp in milliseconds |
| `dateCreatedGt` | number | No | Only tasks created after this Unix timestamp in milliseconds |
| `dateCreatedLt` | number | No | Only tasks created before this Unix timestamp in milliseconds |
| `dateUpdatedGt` | number | No | Only tasks updated after this Unix timestamp in milliseconds |
| `dateUpdatedLt` | number | No | Only tasks updated before this Unix timestamp in milliseconds |

#### Output

Expand Down
14 changes: 11 additions & 3 deletions apps/docs/content/docs/integrations/docusign.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ Create and send a DocuSign envelope with a document for e-signature
| `signerName` | string | Yes | Full name of the signer |
| `ccEmail` | string | No | Email address of carbon copy recipient |
| `ccName` | string | No | Full name of carbon copy recipient |
| `file` | file | No | Document file to send for signature |
| `file` | file | No | Document file to send for signature. Text "/sig1/" and "/date1/" in the document anchor the signature and date fields; without them the signer places fields freely, unless the DocuSign account disables freeform signing |
| `status` | string | No | Envelope status: "sent" to send immediately, "created" for draft \(default: "sent"\) |

#### Output
Expand Down Expand Up @@ -137,7 +137,8 @@ List envelopes from your DocuSign account with optional filters
| `toDate` | string | No | End date filter \(ISO 8601\) |
| `envelopeStatus` | string | No | Filter by status: created, sent, delivered, completed, declined, voided |
| `searchText` | string | No | Search text to filter envelopes |
| `count` | string | No | Maximum number of envelopes to return \(default: 25\) |
| `count` | string | No | Maximum number of envelopes to return \(max 1000\) |
| `startPosition` | string | No | Zero-based index of the first result to return, for paging through envelopes \(default: 0\) |

#### Output

Expand All @@ -153,6 +154,9 @@ List envelopes from your DocuSign account with optional filters
| ↳ `statusChangedDateTime` | string | ISO 8601 datetime of last status change |
| `totalSetSize` | number | Total number of matching envelopes |
| `resultSetSize` | number | Number of envelopes returned in this response |
| `startPosition` | number | Zero-based index of the first result in this page |
| `endPosition` | number | Zero-based index of the last result in this page |
| `nextUri` | string | URI of the next page of results; null on the last page |

</ReferenceDetails>

Expand Down Expand Up @@ -213,7 +217,8 @@ List available templates in your DocuSign account
| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `searchText` | string | No | Search text to filter templates by name |
| `count` | string | No | Maximum number of templates to return |
| `count` | string | No | Maximum number of templates to return \(DocuSign returns up to 2000 when omitted\) |
| `startPosition` | string | No | Zero-based index of the first result to return, for paging through templates \(default: 0\) |

#### Output

Expand All @@ -228,6 +233,9 @@ List available templates in your DocuSign account
| ↳ `lastModified` | string | ISO 8601 last modified date |
| `totalSetSize` | number | Total number of matching templates |
| `resultSetSize` | number | Number of templates returned in this response |
| `startPosition` | number | Zero-based index of the first result in this page |
| `endPosition` | number | Zero-based index of the last result in this page |
| `nextUri` | string | URI of the next page of results; null on the last page |

</ReferenceDetails>

Expand Down
12 changes: 7 additions & 5 deletions apps/docs/content/docs/integrations/dropbox.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -104,11 +104,12 @@ List the contents of a folder in Dropbox

| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `path` | string | Yes | The path of the folder to list \(use "" for root\) |
| `path` | string | No | The path of the folder to list \(use "" for root\). Required unless cursor is set |
| `recursive` | boolean | No | If true, list contents recursively |
| `includeDeleted` | boolean | No | If true, include deleted files/folders |
| `includeMediaInfo` | boolean | No | If true, include media info for photos/videos |
| `limit` | number | No | Maximum number of results to return \(default: 500\) |
| `limit` | number | No | Approximate maximum number of entries to return per page \(1-2000\) |
| `cursor` | string | No | Cursor from a previous List Folder call to fetch the next page via list_folder/continue \(other options are ignored when set\) |

#### Output

Expand All @@ -119,7 +120,7 @@ List the contents of a folder in Dropbox
| ↳ `name` | string | Name of the file/folder |
| ↳ `path_display` | string | Display path |
| ↳ `size` | number | Size in bytes \(files only\) |
| `cursor` | string | Cursor for pagination |
| `cursor` | string | Cursor to pass back as the cursor input to fetch the next page |
| `hasMore` | boolean | Whether there are more results |

</ReferenceDetails>
Expand Down Expand Up @@ -321,10 +322,11 @@ Search for files and folders in Dropbox

| Parameter | Type | Required | Description |
| --------- | ---- | -------- | ----------- |
| `query` | string | Yes | The search query |
| `query` | string | No | The search query. Required unless cursor is set |
| `path` | string | No | Dropbox folder path to limit search scope \(e.g., /folder/subfolder\) |
| `fileExtensions` | string | No | Comma-separated list of file extensions to filter by \(e.g., pdf,xlsx\) |
| `maxResults` | number | No | Maximum number of results to return \(default: 100\) |
| `cursor` | string | No | Cursor from a previous Search call to fetch the next page via search/continue_v2 \(other options are ignored when set\) |

#### Output

Expand All @@ -334,7 +336,7 @@ Search for files and folders in Dropbox
| ↳ `match_type` | object | Type of match: filename, content, or both |
| ↳ `metadata` | object | File or folder metadata |
| `hasMore` | boolean | Whether there are more results |
| `cursor` | string | Cursor for pagination |
| `cursor` | string | Cursor to pass back as the cursor input to fetch the next page |

</ReferenceDetails>

Expand Down
2 changes: 2 additions & 0 deletions apps/docs/content/docs/integrations/monday.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,7 @@ Get items from a Monday.com board
| `boardId` | string | Yes | The ID of the board to get items from |
| `groupId` | string | No | Filter items by group ID |
| `limit` | number | No | Maximum number of items to return \(default 25, max 500\) |
| `cursor` | string | No | Pagination cursor from a previous Get Items response |

#### Output

Expand All @@ -179,6 +180,7 @@ Get items from a Monday.com board
| ↳ `updatedAt` | string | Last updated timestamp |
| ↳ `url` | string | Item URL |
| `count` | number | Number of items returned |
| `cursor` | string | Pagination cursor for fetching the next page \(null when there are no more items\) |

</ReferenceDetails>

Expand Down
10 changes: 5 additions & 5 deletions apps/docs/content/docs/integrations/supabase.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ Query data from a Supabase table
| `schema` | string | No | Database schema to query from \(default: public\). Use this to access tables in other schemas. |
| `select` | string | No | Columns to return \(comma-separated\). Defaults to * \(all columns\) |
| `filter` | string | No | PostgREST filter \(e.g., "id=eq.123"\) |
| `orderBy` | string | No | Column to order by \(add DESC for descending\) |
| `orderBy` | string | No | Column\(s\) to order by, comma-separated \(e.g., "created_at DESC" or "created_at.desc,name.asc"\) |
| `limit` | number | No | Maximum number of rows to return |
| `offset` | number | No | Number of rows to skip \(for pagination\) |

Expand Down Expand Up @@ -288,7 +288,7 @@ Invoke a Supabase Edge Function over HTTP

### Supabase Introspect

Introspect Supabase database schema from its OpenAPI spec to get table and column structures (best-effort primary/foreign key detection)
Introspect Supabase database schema from its OpenAPI spec to get table and column structures, primary keys, and foreign keys

<ReferenceDetails>

Expand All @@ -311,9 +311,9 @@ Introspect Supabase database schema from its OpenAPI spec to get table and colum
| ↳ `type` | string | Column data type |
| ↳ `nullable` | boolean | Whether the column allows null values — a NOT NULL column that has a default value is misreported as nullable, since the OpenAPI spec this is derived from omits it from the required list in that case |
| ↳ `default` | string | Default value for the column |
| ↳ `isPrimaryKey` | boolean | Best-effort guess based on the column being named "id" \(not authoritative\) |
| ↳ `isForeignKey` | boolean | True only if the column has a "references table.column" SQL comment; most databases will show false even for real foreign keys |
| ↳ `references` | object | Foreign key reference details, when detected via SQL comment |
| ↳ `isPrimaryKey` | boolean | Whether the column is part of the table primary key |
| ↳ `isForeignKey` | boolean | Whether the column is a foreign key to another table |
| ↳ `references` | object | Foreign key reference details |
| ↳ `table` | string | Referenced table name |
| ↳ `column` | string | Referenced column name |
| ↳ `primaryKey` | array | Array of primary key column names |
Expand Down
31 changes: 31 additions & 0 deletions apps/sim/blocks/blocks/airtable.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -91,4 +91,35 @@ describe('AirtableBlock typecast', () => {
})
).not.toHaveProperty('typecast')
})

it.each(operationCases)(
'accepts already-parsed $operation values from a tool call or a second mapping pass',
({ operation, payload }) => {
expect(buildParams({ ...baseParams, operation, ...payload })).toMatchObject(payload)
}
)

it('accepts already-parsed record IDs for delete', () => {
expect(
buildParams({ ...baseParams, operation: 'delete', recordIds: ['rec123'] })
).toMatchObject({ recordIds: ['rec123'] })
})
})

describe('Airtable pagination offsets', () => {
const mapParams = AirtableBlock.tools.config?.params
if (!mapParams) throw new Error('Airtable block is missing its params mapper')

it('does not send a List Bases offset to List Records on the canvas', () => {
const mapped = mapParams({ ...baseParams, operation: 'list', basesOffset: 'itrBases' })
expect(mapped.offset).toBeUndefined()
})

it('keeps the model offset on a List Records tool call', () => {
const mapped = mapParams(
{ ...baseParams, operation: 'list', offset: 'itrModel' },
{ operation: 'list' }
)
expect(mapped.offset).toBe('itrModel')
})
})
Loading
Loading