Skip to content

Commit f6c9998

Browse files
v0.6.90: resource breadcrumb flash fix, dedupe external URL fetches, fal-ai hosted key
2 parents b5b2d83 + 4fab03c commit f6c9998

72 files changed

Lines changed: 1521 additions & 323 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.

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,7 @@ Get the execution timeline for an Azure DevOps build — every stage, job, and t
280280
|`warningCount` | number | Number of warnings |
281281
|`startTime` | string | ISO 8601 start timestamp |
282282
|`finishTime` | string | ISO 8601 finish timestamp |
283-
|`failedRecords` | array | Subset of records where result === "failed" — use logId to fetch logs |
283+
|`failedRecords` | array | Subset of records where result is failed, partiallySucceeded, or succeededWithIssues — use logId to fetch logs |
284284
|`id` | string | Record GUID |
285285
|`name` | string | Step name |
286286
|`type` | string | Stage \| Phase \| Job \| Task |
@@ -333,7 +333,8 @@ Execute a WIQL query to search for work items in Azure DevOps and return full fi
333333
| --------- | ---- | ----------- |
334334
| `content` | string | Human-readable summary of matching work items |
335335
| `metadata` | object | Work items metadata |
336-
|`count` | number | Number of work items returned |
336+
|`count` | number | Number of work items returned \(after hydration\) |
337+
|`totalMatched` | number | Total number of work items matched by the WIQL query before hydration |
337338
|`workItems` | array | Array of work item details |
338339
|`id` | number | Work item ID |
339340
|`title` | string | Work item title |
@@ -372,15 +373,15 @@ Fetch full details of a single work item by ID from Azure DevOps, including titl
372373

373374
### `azure_devops_get_work_items_batch`
374375

375-
Fetch full details for multiple work items by ID from Azure DevOps in a single call. Pass comma-separated IDs (e.g.
376+
Fetch full details for multiple work items by ID from Azure DevOps. Pass comma-separated IDs (e.g.
376377

377378
#### Input
378379

379380
| Parameter | Type | Required | Description |
380381
| --------- | ---- | -------- | ----------- |
381382
| `organization` | string | Yes | Azure DevOps organization name |
382383
| `project` | string | Yes | Azure DevOps project name |
383-
| `ids` | string | Yes | Comma-separated work item IDs to fetch \(e.g. "123,456,789"\). Maximum 200 IDs. |
384+
| `ids` | string | Yes | Comma-separated work item IDs to fetch \(e.g. "123,456,789"\). Lists longer than 200 IDs are chunked automatically. |
384385

385386
#### Output
386387

@@ -389,6 +390,7 @@ Fetch full details for multiple work items by ID from Azure DevOps in a single c
389390
| `content` | string | Human-readable summary of the fetched work items |
390391
| `metadata` | object | Work items metadata |
391392
|`count` | number | Number of work items returned |
393+
|`totalRequested` | number | Total number of IDs requested \(across all chunks\) |
392394
|`workItems` | array | Array of work item details |
393395
|`id` | number | Work item ID |
394396
|`title` | string | Work item title |

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

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,6 @@
195195
"upstash",
196196
"vercel",
197197
"video_generator",
198-
"vision",
199198
"wealthbox",
200199
"webflow",
201200
"whatsapp",

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

Lines changed: 0 additions & 60 deletions
This file was deleted.

apps/docs/content/docs/en/triggers/azure_devops.mdx

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ Trigger workflow when an Azure DevOps build fails, is canceled, or partially suc
3131
| `branch` | string | Source branch name \(refs/heads/ prefix stripped\) |
3232
| `commitSha` | string | Source commit SHA |
3333
| `triggeredBy` | string | Display name of the person who triggered the build |
34-
| `triggeredByEmail` | string | Email/unique name of the person who triggered the build |
34+
| `triggeredByEmail` | string | Email/unique name of the person who triggered the build, or null if not set |
3535
| `startTime` | string | Build start time \(ISO 8601\) |
3636
| `finishTime` | string | Build finish time \(ISO 8601\) |
3737
| `buildUrl` | string | API URL for the build resource |
@@ -72,12 +72,12 @@ Trigger workflow when a work item is created in Azure DevOps
7272
| `workItemType` | string | Work item type for Basic process \(e.g. Issue, Task, Epic\) |
7373
| `title` | string | Work item title |
7474
| `state` | string | Work item state for Basic process \(e.g. To Do, Doing, Done\) |
75-
| `createdBy` | string | Display name of the creator |
76-
| `assignedTo` | string | Assignee display name, or empty string if unassigned |
75+
| `createdBy` | string | Display name of the creator, or null if not set |
76+
| `assignedTo` | string | Assignee display name, or null if unassigned |
7777
| `priority` | number | Priority \(1–4\), or 0 if not set |
7878
| `areaPath` | string | Area path |
7979
| `iterationPath` | string | Iteration path |
80-
| `description` | string | Work item description \(HTML\), or empty string if not set |
80+
| `description` | string | Work item description \(HTML\), or null if not set |
8181
| `projectName` | string | Azure DevOps project name |
8282
| `workItemUrl` | string | API URL for the work item resource |
8383

apps/sim/app/(landing)/integrations/data/icon-mapping.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ import {
5757
EvernoteIcon,
5858
ExaAIIcon,
5959
ExtendIcon,
60-
EyeIcon,
6160
FathomIcon,
6261
FindymailIcon,
6362
FirecrawlIcon,
@@ -405,7 +404,6 @@ export const blockTypeToIconMap: Record<string, IconComponent> = {
405404
upstash: UpstashIcon,
406405
vercel: VercelIcon,
407406
video_generator_v3: VideoIcon,
408-
vision_v2: EyeIcon,
409407
wealthbox: WealthboxIcon,
410408
webflow: WebflowIcon,
411409
whatsapp: WhatsAppIcon,

apps/sim/app/(landing)/integrations/data/integrations.json

Lines changed: 2 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1938,7 +1938,7 @@
19381938
},
19391939
{
19401940
"name": "Get Work Items Batch",
1941-
"description": "Fetch full details for multiple work items by ID from Azure DevOps in a single call. Pass comma-separated IDs (e.g. "
1941+
"description": "Fetch full details for multiple work items by ID from Azure DevOps. Pass comma-separated IDs (e.g. "
19421942
},
19431943
{
19441944
"name": "Create Work Item",
@@ -4156,10 +4156,6 @@
41564156
"name": "Fetch",
41574157
"description": "Fetch and parse a file from a URL with optional custom headers."
41584158
},
4159-
{
4160-
"name": "Get",
4161-
"description": "Get a workspace file object from a selected file or canonical workspace file ID."
4162-
},
41634159
{
41644160
"name": "Write",
41654161
"description": "Create a new workspace file. If a file with the same name already exists, a numeric suffix is added (e.g., "
@@ -4169,7 +4165,7 @@
41694165
"description": "Append content to an existing workspace file. The file must already exist. Content is added to the end of the file."
41704166
}
41714167
],
4172-
"operationCount": 5,
4168+
"operationCount": 4,
41734169
"triggers": [],
41744170
"triggerCount": 0,
41754171
"authType": "none",
@@ -14253,24 +14249,6 @@
1425314249
"integrationTypes": ["ai", "design"],
1425414250
"tags": ["video-generation", "llm"]
1425514251
},
14256-
{
14257-
"type": "vision_v2",
14258-
"slug": "vision",
14259-
"name": "Vision",
14260-
"description": "Analyze images with vision models",
14261-
"longDescription": "Integrate Vision into the workflow. Can analyze images with vision models.",
14262-
"bgColor": "#4D5FFF",
14263-
"iconName": "EyeIcon",
14264-
"docsUrl": "https://docs.sim.ai/tools/vision",
14265-
"operations": [],
14266-
"operationCount": 0,
14267-
"triggers": [],
14268-
"triggerCount": 0,
14269-
"authType": "api-key",
14270-
"category": "tools",
14271-
"integrationTypes": ["ai", "documents"],
14272-
"tags": ["llm", "document-processing", "ocr"]
14273-
},
1427414252
{
1427514253
"type": "wealthbox",
1427614254
"slug": "wealthbox",

apps/sim/app/api/files/parse/route.test.ts

Lines changed: 49 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,6 @@ const {
3131
mockFsWriteFile,
3232
mockJoin,
3333
actualPath,
34-
mockFileExistsInWorkspace,
35-
mockListWorkspaceFiles,
3634
mockUploadWorkspaceFile,
3735
} = vi.hoisted(() => {
3836
// eslint-disable-next-line @typescript-eslint/no-require-imports
@@ -62,9 +60,19 @@ const {
6260
return actualPath.join(...args)
6361
}),
6462
actualPath,
65-
mockFileExistsInWorkspace: vi.fn().mockResolvedValue(false),
66-
mockListWorkspaceFiles: vi.fn().mockResolvedValue([]),
67-
mockUploadWorkspaceFile: vi.fn().mockResolvedValue({}),
63+
mockUploadWorkspaceFile: vi
64+
.fn()
65+
.mockImplementation(
66+
async (workspaceId: string, _userId: string, _buffer: Buffer, fileName: string) => ({
67+
id: 'wf_test',
68+
name: fileName,
69+
size: 0,
70+
type: 'application/octet-stream',
71+
url: `/api/files/serve/${workspaceId}/${fileName}`,
72+
key: `${workspaceId}/${fileName}`,
73+
context: 'workspace',
74+
})
75+
),
6876
}
6977
})
7078

@@ -110,9 +118,7 @@ vi.mock('@/lib/uploads/contexts/execution', () => ({
110118
uploadExecutionFile: vi.fn(),
111119
}))
112120

113-
vi.mock('@/lib/uploads/contexts/workspace', () => ({
114-
fileExistsInWorkspace: mockFileExistsInWorkspace,
115-
listWorkspaceFiles: mockListWorkspaceFiles,
121+
vi.mock('@/lib/uploads/contexts/workspace/workspace-file-manager', () => ({
116122
uploadWorkspaceFile: mockUploadWorkspaceFile,
117123
}))
118124

@@ -190,9 +196,7 @@ describe('File Parse API Route', () => {
190196
mockFsStat.mockResolvedValue({ isFile: () => true, size: 17 })
191197
mockFsReadFile.mockResolvedValue(Buffer.from('test file content'))
192198
mockIsSupportedFileType.mockReturnValue(true)
193-
mockFileExistsInWorkspace.mockResolvedValue(false)
194-
mockListWorkspaceFiles.mockResolvedValue([])
195-
mockUploadWorkspaceFile.mockResolvedValue({})
199+
mockUploadWorkspaceFile.mockClear()
196200
mockParseFile.mockResolvedValue({
197201
content: 'parsed content',
198202
metadata: { pageCount: 1 },
@@ -384,34 +388,32 @@ describe('File Parse API Route', () => {
384388
)
385389
})
386390

387-
it('should preserve the full download cap when an external URL reuses a workspace file', async () => {
391+
it('should never dedup external URL fetches by path filename — two URLs sharing image.png both download', async () => {
388392
inputValidationMockFns.mockValidateUrlWithDNS.mockResolvedValue({
389393
isValid: true,
390394
resolvedIP: '203.0.113.10',
391395
})
392-
inputValidationMockFns.mockSecureFetchWithPinnedIP.mockResolvedValue(
393-
new Response('file content', {
394-
status: 200,
395-
headers: { 'content-type': 'text/plain' },
396-
})
397-
)
398-
mockFileExistsInWorkspace.mockResolvedValueOnce(false).mockResolvedValueOnce(true)
399-
mockListWorkspaceFiles.mockResolvedValueOnce([
400-
{ name: 'file2.txt', key: 'workspace-file2.txt' },
401-
])
402-
403-
mockParseBuffer
404-
.mockResolvedValueOnce({
405-
content: 'a'.repeat(4 * 1024 * 1024),
406-
metadata: { pageCount: 1 },
407-
})
408-
.mockResolvedValueOnce({
409-
content: 'second file',
410-
metadata: { pageCount: 1 },
411-
})
396+
inputValidationMockFns.mockSecureFetchWithPinnedIP
397+
.mockResolvedValueOnce(
398+
new Response('first image bytes', {
399+
status: 200,
400+
headers: { 'content-type': 'image/png' },
401+
})
402+
)
403+
.mockResolvedValueOnce(
404+
new Response('second image bytes — different content', {
405+
status: 200,
406+
headers: { 'content-type': 'image/png' },
407+
})
408+
)
409+
mockIsSupportedFileType.mockReturnValue(false)
410+
permissionsMockFns.mockGetUserEntityPermissions.mockResolvedValue('write')
412411

413412
const req = createMockRequest('POST', {
414-
filePath: ['https://example.com/file1.txt', 'https://example.com/file2.txt'],
413+
filePath: [
414+
'https://files.slack.com/files-pri/T07-FAAA/download/image.png',
415+
'https://files.slack.com/files-pri/T07-FBBB/download/image.png',
416+
],
415417
workspaceId: 'workspace-id',
416418
})
417419

@@ -420,9 +422,21 @@ describe('File Parse API Route', () => {
420422

421423
expect(response.status).toBe(200)
422424
expect(data.results).toHaveLength(2)
423-
expect(storageServiceMockFns.mockDownloadFile).toHaveBeenCalledWith(
424-
expect.objectContaining({ key: 'workspace-file2.txt', maxBytes: 100 * 1024 * 1024 })
425+
expect(inputValidationMockFns.mockSecureFetchWithPinnedIP).toHaveBeenCalledTimes(2)
426+
expect(inputValidationMockFns.mockSecureFetchWithPinnedIP).toHaveBeenNthCalledWith(
427+
1,
428+
'https://files.slack.com/files-pri/T07-FAAA/download/image.png',
429+
'203.0.113.10',
430+
expect.any(Object)
431+
)
432+
expect(inputValidationMockFns.mockSecureFetchWithPinnedIP).toHaveBeenNthCalledWith(
433+
2,
434+
'https://files.slack.com/files-pri/T07-FBBB/download/image.png',
435+
'203.0.113.10',
436+
expect.any(Object)
425437
)
438+
expect(mockUploadWorkspaceFile).toHaveBeenCalledTimes(2)
439+
expect(storageServiceMockFns.mockDownloadFile).not.toHaveBeenCalled()
426440
})
427441

428442
it('should stop multi-file parsing once the combined parsed output is too large', async () => {

0 commit comments

Comments
 (0)