Skip to content

Commit 4c12914

Browse files
v0.5.113: jira, ashby, google ads, grain updates
2 parents e9bdc57 + d90f828 commit 4c12914

File tree

88 files changed

+3567
-234
lines changed

Some content is hidden

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

88 files changed

+3567
-234
lines changed

apps/docs/components/icons.tsx

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3572,6 +3572,27 @@ export const ResendIcon = (props: SVGProps<SVGSVGElement>) => (
35723572
</svg>
35733573
)
35743574

3575+
export const GoogleAdsIcon = (props: SVGProps<SVGSVGElement>) => (
3576+
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'>
3577+
<g transform='matrix(.257748 0 0 .257745 -.361416 2.515516)'>
3578+
<path
3579+
d='M85.9 28.6c2.4-6.3 5.7-12.1 10.6-16.8 19.6-19.1 52-14.3 65.3 9.7 10 18.2 20.6 36 30.9 54l51.6 89.8c14.3 25.1-1.2 56.8-29.6 61.1-17.4 2.6-33.7-5.4-42.7-21l-45.4-78.8c-.3-.6-.7-1.1-1.1-1.6-1.6-1.3-2.3-3.2-3.3-4.9L88.8 62.2c-3.9-6.8-5.7-14.2-5.5-22 .3-4 .8-8 2.6-11.6'
3580+
fill='#3c8bd9'
3581+
/>
3582+
<path
3583+
d='M85.9 28.6c-.9 3.6-1.7 7.2-1.9 11-.3 8.4 1.8 16.2 6 23.5l32.9 56.9c1 1.7 1.8 3.4 2.8 5l-18.1 31.1-25.3 43.6c-.4 0-.5-.2-.6-.5-.1-.8.2-1.5.4-2.3 4.1-15 .7-28.3-9.6-39.7-6.3-6.9-14.3-10.8-23.5-12.1-12-1.7-22.6 1.4-32.1 8.9-1.7 1.3-2.8 3.2-4.8 4.2-.4 0-.6-.2-.7-.5l14.3-24.9L85.2 29.7c.2-.4.5-.7.7-1.1'
3584+
fill='#fabc04'
3585+
/>
3586+
<path
3587+
d='M11.8 158l5.7-5.1c24.3-19.2 60.8-5.3 66.1 25.1 1.3 7.3.6 14.3-1.6 21.3-.1.6-.2 1.1-.4 1.7-.9 1.6-1.7 3.3-2.7 4.9-8.9 14.7-22 22-39.2 20.9C20 225.4 4.5 210.6 1.8 191c-1.3-9.5.6-18.4 5.5-26.6 1-1.8 2.2-3.4 3.3-5.2.5-.4.3-1.2 1.2-1.2'
3588+
fill='#34a852'
3589+
/>
3590+
<path d='M11.8 158c-.4.4-.4 1.1-1.1 1.2-.1-.7.3-1.1.7-1.6l.4.4' fill='#fabc04' />
3591+
<path d='M81.6 201c-.4-.7 0-1.2.4-1.7l.4.4-.8 1.3' fill='#e1c025' />
3592+
</g>
3593+
</svg>
3594+
)
3595+
35753596
export const GoogleBigQueryIcon = (props: SVGProps<SVGSVGElement>) => (
35763597
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 64 64'>
35773598
<path

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ import {
5151
GitLabIcon,
5252
GmailIcon,
5353
GongIcon,
54+
GoogleAdsIcon,
5455
GoogleBigQueryIcon,
5556
GoogleBooksIcon,
5657
GoogleCalendarIcon,
@@ -216,6 +217,7 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
216217
gitlab: GitLabIcon,
217218
gmail_v2: GmailIcon,
218219
gong: GongIcon,
220+
google_ads: GoogleAdsIcon,
219221
google_bigquery: GoogleBigQueryIcon,
220222
google_books: GoogleBooksIcon,
221223
google_calendar_v2: GoogleCalendarIcon,

apps/docs/content/docs/en/tools/ashby.mdx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ With Ashby, you can:
2222
- **List and view jobs**: Browse all open, closed, and archived job postings with location and department info
2323
- **List applications**: View all applications across your organization with candidate and job details, status tracking, and pagination
2424

25+
The Ashby block also supports **webhook triggers** that automatically start workflows in response to Ashby events. Available triggers include Application Submitted, Candidate Stage Change, Candidate Hired, Candidate Deleted, Job Created, and Offer Created. Webhooks are fully managed — Sim automatically creates the webhook in Ashby when you save the trigger and deletes it when you remove it, so there's no manual webhook configuration needed. Just provide your Ashby API key (with `apiKeysWrite` permission) and select the event type.
26+
2527
In Sim, the Ashby integration enables your agents to programmatically manage your recruiting pipeline. Agents can search for candidates, create new candidate records, add notes after interviews, and monitor applications across jobs. This allows you to automate recruiting workflows like candidate intake, interview follow-ups, pipeline reporting, and cross-referencing candidates across roles.
2628
{/* MANUAL-CONTENT-END */}
2729

apps/docs/content/docs/en/tools/evernote.mdx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,21 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
1010
color="#E0E0E0"
1111
/>
1212

13+
{/* MANUAL-CONTENT-START:intro */}
14+
[Evernote](https://evernote.com/) is a note-taking and organization platform that helps individuals and teams capture ideas, manage projects, and store information across devices. With notebooks, tags, and powerful search, Evernote serves as a central hub for knowledge management.
15+
16+
With the Sim Evernote integration, you can:
17+
18+
- **Create and update notes**: Programmatically create new notes with content and tags, or update existing notes in any notebook.
19+
- **Search and retrieve notes**: Use Evernote's search grammar to find notes by keyword, tag, notebook, or other criteria, and retrieve full note content.
20+
- **Organize with notebooks and tags**: Create notebooks and tags, list existing ones, and move or copy notes between notebooks.
21+
- **Delete and manage notes**: Move notes to trash or copy them to different notebooks as part of automated workflows.
22+
23+
**How it works in Sim:**
24+
Add an Evernote block to your workflow and select an operation (e.g., create note, search notes, list notebooks). Provide your Evernote developer token and any required parameters. The block calls the Evernote API and returns structured data you can pass to downstream blocks — for example, searching for meeting notes and sending summaries to Slack, or creating notes from AI-generated content.
25+
{/* MANUAL-CONTENT-END */}
26+
27+
1328
## Usage Instructions
1429

1530
Integrate with Evernote to manage notes, notebooks, and tags. Create, read, update, copy, search, and delete notes. Create and list notebooks and tags.

apps/docs/content/docs/en/tools/fathom.mdx

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,21 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
1010
color="#181C1E"
1111
/>
1212

13+
{/* MANUAL-CONTENT-START:intro */}
14+
[Fathom](https://fathom.video/) is an AI meeting assistant that automatically records, transcribes, and summarizes your video calls. It works across platforms like Zoom, Google Meet, and Microsoft Teams, generating highlights and action items so your team can stay focused during meetings and catch up quickly afterward.
15+
16+
With the Sim Fathom integration, you can:
17+
18+
- **List and filter meetings**: Retrieve recent meetings recorded by you or shared with your team, with optional filters by date range, recorder, or team.
19+
- **Get meeting summaries**: Pull structured, markdown-formatted summaries for any recorded meeting to quickly review key discussion points.
20+
- **Access full transcripts**: Retrieve complete transcripts with speaker attribution and timestamps for detailed review or downstream processing.
21+
- **Manage teams and members**: List teams in your Fathom organization and view team member details to coordinate meeting workflows.
22+
23+
**How it works in Sim:**
24+
Add a Fathom block to your workflow and select an operation. Provide your Fathom API key and any required parameters (such as a recording ID for summaries and transcripts). The block calls the Fathom API and returns structured data you can pass to downstream blocks — for example, sending a summary to Slack or extracting action items with an AI agent.
25+
{/* MANUAL-CONTENT-END */}
26+
27+
1328
## Usage Instructions
1429

1530
Integrate Fathom AI Notetaker into your workflow. List meetings, get transcripts and summaries, and manage team members and teams. Can also trigger workflows when new meeting content is ready.
Lines changed: 192 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,192 @@
1+
---
2+
title: Google Ads
3+
description: Query campaigns, ad groups, and performance metrics
4+
---
5+
6+
import { BlockInfoCard } from "@/components/ui/block-info-card"
7+
8+
<BlockInfoCard
9+
type="google_ads"
10+
color="#E0E0E0"
11+
/>
12+
13+
{/* MANUAL-CONTENT-START:intro */}
14+
[Google Ads](https://ads.google.com) is Google's online advertising platform that lets businesses create ads to reach customers across Google Search, YouTube, Gmail, and millions of partner websites. It supports campaign types including Search, Display, Video, Shopping, and Performance Max, with detailed targeting, bidding strategies, and performance analytics.
15+
16+
In Sim, the Google Ads integration enables your agents to query campaign data, monitor ad group performance, and pull detailed metrics using the Google Ads Query Language (GAQL). This supports use cases such as automated performance reporting, budget monitoring, campaign health checks, and data-driven optimization workflows. By connecting Sim with Google Ads, your agents can retrieve real-time advertising data and act on insights without manual dashboard navigation.
17+
{/* MANUAL-CONTENT-END */}
18+
19+
20+
## Usage Instructions
21+
22+
Connect to Google Ads to list accessible accounts, list campaigns, view ad group details, get performance metrics, and run custom GAQL queries.
23+
24+
25+
26+
## Tools
27+
28+
### `google_ads_list_customers`
29+
30+
List all Google Ads customer accounts accessible by the authenticated user
31+
32+
#### Input
33+
34+
| Parameter | Type | Required | Description |
35+
| --------- | ---- | -------- | ----------- |
36+
| `developerToken` | string | Yes | Google Ads API developer token |
37+
38+
#### Output
39+
40+
| Parameter | Type | Description |
41+
| --------- | ---- | ----------- |
42+
| `customerIds` | array | List of accessible customer IDs |
43+
| `totalCount` | number | Total number of accessible customer accounts |
44+
45+
### `google_ads_search`
46+
47+
Run a custom Google Ads Query Language (GAQL) query
48+
49+
#### Input
50+
51+
| Parameter | Type | Required | Description |
52+
| --------- | ---- | -------- | ----------- |
53+
| `customerId` | string | Yes | Google Ads customer ID \(numeric, no dashes\) |
54+
| `developerToken` | string | Yes | Google Ads API developer token |
55+
| `managerCustomerId` | string | No | Manager account customer ID \(if accessing via manager account\) |
56+
| `query` | string | Yes | GAQL query to execute |
57+
| `pageToken` | string | No | Page token for pagination |
58+
59+
#### Output
60+
61+
| Parameter | Type | Description |
62+
| --------- | ---- | ----------- |
63+
| `results` | json | Array of result objects from the GAQL query |
64+
| `totalResultsCount` | number | Total number of matching results |
65+
| `nextPageToken` | string | Token for the next page of results |
66+
67+
### `google_ads_list_campaigns`
68+
69+
List campaigns in a Google Ads account with optional status filtering
70+
71+
#### Input
72+
73+
| Parameter | Type | Required | Description |
74+
| --------- | ---- | -------- | ----------- |
75+
| `customerId` | string | Yes | Google Ads customer ID \(numeric, no dashes\) |
76+
| `developerToken` | string | Yes | Google Ads API developer token |
77+
| `managerCustomerId` | string | No | Manager account customer ID \(if accessing via manager account\) |
78+
| `status` | string | No | Filter by campaign status \(ENABLED, PAUSED, REMOVED\) |
79+
| `limit` | number | No | Maximum number of campaigns to return |
80+
81+
#### Output
82+
83+
| Parameter | Type | Description |
84+
| --------- | ---- | ----------- |
85+
| `campaigns` | array | List of campaigns in the account |
86+
|`id` | string | Campaign ID |
87+
|`name` | string | Campaign name |
88+
|`status` | string | Campaign status \(ENABLED, PAUSED, REMOVED\) |
89+
|`channelType` | string | Advertising channel type \(SEARCH, DISPLAY, SHOPPING, VIDEO, PERFORMANCE_MAX\) |
90+
|`startDate` | string | Campaign start date \(YYYY-MM-DD\) |
91+
|`endDate` | string | Campaign end date \(YYYY-MM-DD\) |
92+
|`budgetAmountMicros` | string | Daily budget in micros \(divide by 1,000,000 for currency value\) |
93+
| `totalCount` | number | Total number of campaigns returned |
94+
95+
### `google_ads_campaign_performance`
96+
97+
Get performance metrics for Google Ads campaigns over a date range
98+
99+
#### Input
100+
101+
| Parameter | Type | Required | Description |
102+
| --------- | ---- | -------- | ----------- |
103+
| `customerId` | string | Yes | Google Ads customer ID \(numeric, no dashes\) |
104+
| `developerToken` | string | Yes | Google Ads API developer token |
105+
| `managerCustomerId` | string | No | Manager account customer ID \(if accessing via manager account\) |
106+
| `campaignId` | string | No | Filter by specific campaign ID |
107+
| `dateRange` | string | No | Predefined date range \(LAST_7_DAYS, LAST_30_DAYS, THIS_MONTH, LAST_MONTH, TODAY, YESTERDAY\) |
108+
| `startDate` | string | No | Custom start date in YYYY-MM-DD format |
109+
| `endDate` | string | No | Custom end date in YYYY-MM-DD format |
110+
111+
#### Output
112+
113+
| Parameter | Type | Description |
114+
| --------- | ---- | ----------- |
115+
| `campaigns` | array | Campaign performance data broken down by date |
116+
|`id` | string | Campaign ID |
117+
|`name` | string | Campaign name |
118+
|`status` | string | Campaign status |
119+
|`impressions` | string | Number of impressions |
120+
|`clicks` | string | Number of clicks |
121+
|`costMicros` | string | Cost in micros \(divide by 1,000,000 for currency value\) |
122+
|`ctr` | number | Click-through rate \(0.0 to 1.0\) |
123+
|`conversions` | number | Number of conversions |
124+
|`date` | string | Date for this row \(YYYY-MM-DD\) |
125+
| `totalCount` | number | Total number of result rows |
126+
127+
### `google_ads_list_ad_groups`
128+
129+
List ad groups in a Google Ads campaign
130+
131+
#### Input
132+
133+
| Parameter | Type | Required | Description |
134+
| --------- | ---- | -------- | ----------- |
135+
| `customerId` | string | Yes | Google Ads customer ID \(numeric, no dashes\) |
136+
| `developerToken` | string | Yes | Google Ads API developer token |
137+
| `managerCustomerId` | string | No | Manager account customer ID \(if accessing via manager account\) |
138+
| `campaignId` | string | Yes | Campaign ID to list ad groups for |
139+
| `status` | string | No | Filter by ad group status \(ENABLED, PAUSED, REMOVED\) |
140+
| `limit` | number | No | Maximum number of ad groups to return |
141+
142+
#### Output
143+
144+
| Parameter | Type | Description |
145+
| --------- | ---- | ----------- |
146+
| `adGroups` | array | List of ad groups in the campaign |
147+
|`id` | string | Ad group ID |
148+
|`name` | string | Ad group name |
149+
|`status` | string | Ad group status \(ENABLED, PAUSED, REMOVED\) |
150+
|`type` | string | Ad group type \(SEARCH_STANDARD, DISPLAY_STANDARD, SHOPPING_PRODUCT_ADS\) |
151+
|`campaignId` | string | Parent campaign ID |
152+
|`campaignName` | string | Parent campaign name |
153+
| `totalCount` | number | Total number of ad groups returned |
154+
155+
### `google_ads_ad_performance`
156+
157+
Get performance metrics for individual ads over a date range
158+
159+
#### Input
160+
161+
| Parameter | Type | Required | Description |
162+
| --------- | ---- | -------- | ----------- |
163+
| `customerId` | string | Yes | Google Ads customer ID \(numeric, no dashes\) |
164+
| `developerToken` | string | Yes | Google Ads API developer token |
165+
| `managerCustomerId` | string | No | Manager account customer ID \(if accessing via manager account\) |
166+
| `campaignId` | string | No | Filter by campaign ID |
167+
| `adGroupId` | string | No | Filter by ad group ID |
168+
| `dateRange` | string | No | Predefined date range \(LAST_7_DAYS, LAST_30_DAYS, THIS_MONTH, LAST_MONTH, TODAY, YESTERDAY\) |
169+
| `startDate` | string | No | Custom start date in YYYY-MM-DD format |
170+
| `endDate` | string | No | Custom end date in YYYY-MM-DD format |
171+
| `limit` | number | No | Maximum number of results to return |
172+
173+
#### Output
174+
175+
| Parameter | Type | Description |
176+
| --------- | ---- | ----------- |
177+
| `ads` | array | Ad performance data broken down by date |
178+
|`adId` | string | Ad ID |
179+
|`adGroupId` | string | Parent ad group ID |
180+
|`adGroupName` | string | Parent ad group name |
181+
|`campaignId` | string | Parent campaign ID |
182+
|`campaignName` | string | Parent campaign name |
183+
|`adType` | string | Ad type \(RESPONSIVE_SEARCH_AD, EXPANDED_TEXT_AD, etc.\) |
184+
|`impressions` | string | Number of impressions |
185+
|`clicks` | string | Number of clicks |
186+
|`costMicros` | string | Cost in micros \(divide by 1,000,000 for currency value\) |
187+
|`ctr` | number | Click-through rate \(0.0 to 1.0\) |
188+
|`conversions` | number | Number of conversions |
189+
|`date` | string | Date for this row \(YYYY-MM-DD\) |
190+
| `totalCount` | number | Total number of result rows |
191+
192+

apps/docs/content/docs/en/tools/meta.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
"gitlab",
4747
"gmail",
4848
"gong",
49+
"google_ads",
4950
"google_bigquery",
5051
"google_books",
5152
"google_calendar",

apps/docs/content/docs/en/tools/obsidian.mdx

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,22 @@ import { BlockInfoCard } from "@/components/ui/block-info-card"
1010
color="#0F0F0F"
1111
/>
1212

13+
{/* MANUAL-CONTENT-START:intro */}
14+
[Obsidian](https://obsidian.md/) is a powerful knowledge base and note-taking application that works on top of a local folder of plain-text Markdown files. With features like bidirectional linking, graph views, and a rich plugin ecosystem, Obsidian is widely used for personal knowledge management, research, and documentation.
15+
16+
With the Sim Obsidian integration, you can:
17+
18+
- **Read and create notes**: Retrieve note content from your vault or create new notes programmatically as part of automated workflows.
19+
- **Update and patch notes**: Modify existing notes in full or patch content at specific locations within a note.
20+
- **Search your vault**: Find notes by keyword or content across your entire Obsidian vault.
21+
- **Manage periodic notes**: Access and create daily or other periodic notes for journaling and task tracking.
22+
- **Execute commands**: Trigger Obsidian commands remotely to automate vault operations.
23+
24+
**How it works in Sim:**
25+
Add an Obsidian block to your workflow and select an operation. This integration requires the [Obsidian Local REST API](https://github.com/coddingtonbear/obsidian-local-rest-api) plugin to be installed and running in your vault. Provide your API key and vault URL, along with any required parameters. The block communicates with your local Obsidian instance and returns structured data you can pass to downstream blocks — for example, searching your vault for research notes and feeding them into an AI agent for summarization.
26+
{/* MANUAL-CONTENT-END */}
27+
28+
1329
## Usage Instructions
1430

1531
Read, create, update, search, and delete notes in your Obsidian vault. Manage periodic notes, execute commands, and patch content at specific locations. Requires the Obsidian Local REST API plugin.

apps/sim/app/api/a2a/serve/[agentId]/route.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
isTerminalState,
1414
parseWorkflowSSEChunk,
1515
} from '@/lib/a2a/utils'
16-
import { type AuthResult, checkHybridAuth } from '@/lib/auth/hybrid'
16+
import { type AuthResult, AuthType, checkHybridAuth } from '@/lib/auth/hybrid'
1717
import { acquireLock, getRedisClient, releaseLock } from '@/lib/core/config/redis'
1818
import { validateUrlWithDNS } from '@/lib/core/security/input-validation.server'
1919
import { SSE_HEADERS } from '@/lib/core/utils/sse'
@@ -242,9 +242,9 @@ export async function POST(request: NextRequest, { params }: { params: Promise<R
242242

243243
const { id, method, params: rpcParams } = body
244244
const requestApiKey = request.headers.get('X-API-Key')
245-
const apiKey = authenticatedAuthType === 'api_key' ? requestApiKey : null
245+
const apiKey = authenticatedAuthType === AuthType.API_KEY ? requestApiKey : null
246246
const isPersonalApiKeyCaller =
247-
authenticatedAuthType === 'api_key' && authenticatedApiKeyType === 'personal'
247+
authenticatedAuthType === AuthType.API_KEY && authenticatedApiKeyType === 'personal'
248248
const billedUserId = await getWorkspaceBilledAccountUserId(agent.workspaceId)
249249
if (!billedUserId) {
250250
logger.error('Unable to resolve workspace billed account for A2A execution', {

apps/sim/app/api/auth/oauth/credentials/route.test.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ const { mockCheckSessionOrInternalAuth, mockLogger } = vi.hoisted(() => {
2424
})
2525

2626
vi.mock('@/lib/auth/hybrid', () => ({
27+
AuthType: { SESSION: 'session', API_KEY: 'api_key', INTERNAL_JWT: 'internal_jwt' },
2728
checkSessionOrInternalAuth: mockCheckSessionOrInternalAuth,
2829
}))
2930

0 commit comments

Comments
 (0)