MCPcopy Create free account
hub / github.com/github/copilot-sdk / assertToolTurnOrdering

Function assertToolTurnOrdering

nodejs/test/e2e/multi_turn.e2e.test.ts:20–97  ·  view source on GitHub ↗
(turnEvents: SessionEvent[], turnDescription: string)

Source from the content-addressed store, hash-verified

18 }
19
20 function assertToolTurnOrdering(turnEvents: SessionEvent[], turnDescription: string): void {
21 const types = turnEvents.map((e) => e.type);
22 const observedTypes = types.join(", ");
23
24 const userMsgIdx = types.indexOf("user.message");
25 expect(
26 userMsgIdx,
27 `Expected user.message in ${turnDescription}. Observed: ${observedTypes}`
28 ).toBeGreaterThanOrEqual(0);
29
30 const toolStarts = turnEvents
31 .map((e, i) => ({ e, i }))
32 .filter(({ e }) => e.type === "tool.execution_start");
33 const toolCompletes = turnEvents
34 .map((e, i) => ({ e, i }))
35 .filter(({ e }) => e.type === "tool.execution_complete");
36
37 expect(
38 toolStarts.length,
39 `Expected tool starts in ${turnDescription}. Observed: ${observedTypes}`
40 ).toBeGreaterThan(0);
41 expect(
42 toolCompletes.length,
43 `Expected tool completes in ${turnDescription}. Observed: ${observedTypes}`
44 ).toBeGreaterThan(0);
45
46 const firstToolStartIdx = Math.min(...toolStarts.map(({ i }) => i));
47 expect(
48 userMsgIdx,
49 `Expected user.message before first tool start in ${turnDescription}. Observed: ${observedTypes}`
50 ).toBeLessThan(firstToolStartIdx);
51
52 for (const { e: complete, i: completeIdx } of toolCompletes) {
53 const matchingStart = toolStarts.find(
54 ({ e: start, i: startIdx }) =>
55 start.data.toolCallId === complete.data.toolCallId && startIdx < completeIdx
56 );
57 expect(
58 matchingStart,
59 `Expected matching tool start for tool complete with id ${complete.data.toolCallId}`
60 ).toBeDefined();
61 }
62
63 const lastToolCompleteIdx = Math.max(...toolCompletes.map(({ i }) => i));
64 let assistantAfterToolsIdx = -1;
65 for (let i = lastToolCompleteIdx + 1; i < turnEvents.length; i++) {
66 if (turnEvents[i]!.type === "assistant.message") {
67 assistantAfterToolsIdx = i;
68 break;
69 }
70 }
71
72 let sessionIdleIdx = -1;
73 const searchFrom = assistantAfterToolsIdx >= 0 ? assistantAfterToolsIdx + 1 : 0;
74 for (let i = searchFrom; i < turnEvents.length; i++) {
75 if (turnEvents[i]!.type === "session.idle") {
76 sessionIdleIdx = i;
77 break;

Callers 1

Calls 1

joinMethod · 0.80

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…