Skip to content

Commit be1d73e

Browse files
committed
fix(scheduled-tasks): open on edit/create
1 parent 0765155 commit be1d73e

3 files changed

Lines changed: 419 additions & 284 deletions

File tree

apps/sim/lib/copilot/resources/extraction.test.ts

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
* @vitest-environment node
33
*/
44
import { describe, expect, it } from 'vitest'
5-
import { extractResourcesFromToolResult } from './extraction'
5+
import { extractDeletedResourcesFromToolResult, extractResourcesFromToolResult } from './extraction'
66

77
describe('extractResourcesFromToolResult', () => {
88
it('extracts file resources from create_file results', () => {
@@ -141,4 +141,66 @@ describe('extractResourcesFromToolResult', () => {
141141

142142
expect(resources).toEqual([])
143143
})
144+
145+
it('auto-opens a scheduledtask resource from manage_scheduled_task create results', () => {
146+
const resources = extractResourcesFromToolResult(
147+
'manage_scheduled_task',
148+
{ operation: 'create', args: { title: 'Daily Report' } },
149+
{ jobId: 'sched_123', title: 'Daily Report', message: 'Job created successfully.' }
150+
)
151+
152+
expect(resources).toEqual([{ type: 'scheduledtask', id: 'sched_123', title: 'Daily Report' }])
153+
})
154+
155+
it('auto-opens a scheduledtask resource on update, falling back to the args title', () => {
156+
const resources = extractResourcesFromToolResult(
157+
'manage_scheduled_task',
158+
{ operation: 'update', args: { jobId: 'sched_123', title: 'Renamed Task' } },
159+
{ jobId: 'sched_123', updated: ['title'], message: 'Job updated successfully' }
160+
)
161+
162+
expect(resources).toEqual([{ type: 'scheduledtask', id: 'sched_123', title: 'Renamed Task' }])
163+
})
164+
165+
it('does not auto-open for read-only manage_scheduled_task operations', () => {
166+
expect(
167+
extractResourcesFromToolResult(
168+
'manage_scheduled_task',
169+
{ operation: 'list' },
170+
{ jobs: [], count: 0 }
171+
)
172+
).toEqual([])
173+
expect(
174+
extractResourcesFromToolResult(
175+
'manage_scheduled_task',
176+
{ operation: 'get', args: { jobId: 'sched_123' } },
177+
{ id: 'sched_123', title: 'Daily Report' }
178+
)
179+
).toEqual([])
180+
})
181+
})
182+
183+
describe('extractDeletedResourcesFromToolResult', () => {
184+
it('removes scheduledtask resources on manage_scheduled_task delete', () => {
185+
const resources = extractDeletedResourcesFromToolResult(
186+
'manage_scheduled_task',
187+
{ operation: 'delete', args: { jobIds: ['sched_1', 'sched_2'] } },
188+
{ deleted: ['sched_1', 'sched_2'], notFound: [] }
189+
)
190+
191+
expect(resources).toEqual([
192+
{ type: 'scheduledtask', id: 'sched_1', title: 'Scheduled Task' },
193+
{ type: 'scheduledtask', id: 'sched_2', title: 'Scheduled Task' },
194+
])
195+
})
196+
197+
it('does not remove anything for non-delete manage_scheduled_task ops', () => {
198+
expect(
199+
extractDeletedResourcesFromToolResult(
200+
'manage_scheduled_task',
201+
{ operation: 'update', args: { jobId: 'sched_1' } },
202+
{ jobId: 'sched_1', updated: ['title'] }
203+
)
204+
).toEqual([])
205+
})
144206
})

apps/sim/lib/copilot/resources/extraction.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
GenerateVideo,
1212
Knowledge,
1313
KnowledgeBase,
14+
ManageScheduledTask,
1415
UserTable,
1516
WorkspaceFile,
1617
} from '@/lib/copilot/generated/tool-catalog-v1'
@@ -29,6 +30,7 @@ const RESOURCE_TOOL_NAMES: Set<string> = new Set([
2930
FunctionExecute.id,
3031
KnowledgeBase.id,
3132
Knowledge.id,
33+
ManageScheduledTask.id,
3234
GenerateImage.id,
3335
GenerateVideo.id,
3436
GenerateAudio.id,
@@ -219,6 +221,19 @@ export function extractResourcesFromToolResult(
219221
return resources
220222
}
221223

224+
case ManageScheduledTask.id: {
225+
// Read-only ops never auto-open; only create/update surface the task.
226+
const op = getOperation(params)
227+
if (op === 'list' || op === 'get') return []
228+
const jobId = (result.jobId as string) ?? (data.jobId as string)
229+
if (jobId) {
230+
const args = asRecord(params?.args)
231+
const title = (result.title as string) ?? (args.title as string) ?? 'Scheduled Task'
232+
return [{ type: 'scheduledtask', id: jobId, title }]
233+
}
234+
return []
235+
}
236+
222237
default:
223238
return []
224239
}
@@ -229,6 +244,7 @@ const DELETE_CAPABLE_TOOL_RESOURCE_TYPE: Record<string, ResourceType> = {
229244
[WorkspaceFile.id]: 'file',
230245
[UserTable.id]: 'table',
231246
[KnowledgeBase.id]: 'knowledgebase',
247+
[ManageScheduledTask.id]: 'scheduledtask',
232248
}
233249

234250
export function hasDeleteCapability(toolName: string): boolean {
@@ -292,6 +308,12 @@ export function extractDeletedResourcesFromToolResult(
292308
return []
293309
}
294310

311+
case ManageScheduledTask.id: {
312+
if (operation !== 'delete') return []
313+
const deletedIds = Array.isArray(result.deleted) ? (result.deleted as string[]) : []
314+
return deletedIds.map((id) => ({ type: resourceType, id, title: 'Scheduled Task' }))
315+
}
316+
295317
default:
296318
return []
297319
}

0 commit comments

Comments
 (0)