Skip to content

Commit 0f3632f

Browse files
committed
fix(core): clear delegated credentials on retarget
1 parent 31e88f2 commit 0f3632f

2 files changed

Lines changed: 43 additions & 10 deletions

File tree

packages/junior/src/chat/tools/event-tasks.ts

Lines changed: 27 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,21 @@ function cleanEvents(events: string[]): string[] {
140140
return clean;
141141
}
142142

143+
function changesTriggerSource(
144+
current: EventTask["trigger"],
145+
next: EventTask["trigger"],
146+
): boolean {
147+
const currentEvents = [...current.events].sort();
148+
const nextEvents = [...next.events].sort();
149+
return (
150+
current.provider !== next.provider ||
151+
current.resourceRef !== next.resourceRef ||
152+
current.resourceType !== next.resourceType ||
153+
currentEvents.length !== nextEvents.length ||
154+
currentEvents.some((event, index) => event !== nextEvents[index])
155+
);
156+
}
157+
143158
function nextUpdatedAtMs(task: EventTask): number {
144159
return Math.max(Date.now(), task.updatedAtMs + 1);
145160
}
@@ -316,24 +331,26 @@ export function createUpdateEventTaskTool(context: ToolRuntimeContext) {
316331
) {
317332
throw new ToolInputError("Event task update requires a change.");
318333
}
334+
const nextTrigger = input.trigger
335+
? {
336+
provider: input.trigger.provider,
337+
resourceRef: input.trigger.resourceRef,
338+
resourceType: input.trigger.resourceType,
339+
label: input.trigger.label,
340+
events: cleanEvents(input.trigger.events),
341+
}
342+
: current.trigger;
319343
const changesExecution =
320-
input.task !== undefined && input.task !== current.task.text;
344+
(input.task !== undefined && input.task !== current.task.text) ||
345+
changesTriggerSource(current.trigger, nextTrigger);
321346
const next: EventTask = {
322347
...current,
323348
credentialMode:
324349
changesExecution && !isCreator
325350
? "system"
326351
: (input.credentialMode ?? current.credentialMode),
327352
task: input.task ? { text: input.task } : current.task,
328-
trigger: input.trigger
329-
? {
330-
provider: input.trigger.provider,
331-
resourceRef: input.trigger.resourceRef,
332-
resourceType: input.trigger.resourceType,
333-
label: input.trigger.label,
334-
events: cleanEvents(input.trigger.events),
335-
}
336-
: current.trigger,
353+
trigger: nextTrigger,
337354
updatedAtMs: nextUpdatedAtMs(current),
338355
};
339356
const saved = await updateActiveEventTask(

packages/junior/tests/integration/event-tasks.test.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,22 @@ describe("event tasks", () => {
197197
credentialMode: "creator",
198198
trigger: { label: "Updated GitHub PR label" },
199199
});
200+
await execute(createUpdateEventTaskTool(context("U999")), {
201+
taskId: first.task.id,
202+
trigger: {
203+
provider: "github",
204+
resourceRef: "github:pull_request:getsentry/junior#1176",
205+
resourceType: "pull_request",
206+
label: "GitHub PR getsentry/junior#1176",
207+
events: ["review.changes_requested"],
208+
},
209+
});
210+
expect(await getEventTask(fixture.sql.db(), first.task.id)).toMatchObject({
211+
credentialMode: "system",
212+
trigger: {
213+
resourceRef: "github:pull_request:getsentry/junior#1176",
214+
},
215+
});
200216
await expect(
201217
execute(createUpdateEventTaskTool(context("U999")), {
202218
taskId: first.task.id,

0 commit comments

Comments
 (0)