Skip to content

Commit 282e8df

Browse files
committed
Remove blocking field
1 parent 7bbc40a commit 282e8df

7 files changed

Lines changed: 35 additions & 35 deletions

File tree

apps/web/src/lib/server/conversation-state.test.ts

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ describe("deriveConversationReplyState", () => {
6262
expect.objectContaining({
6363
slot: "time",
6464
status: "pending",
65-
blocking: true
65+
6666
})
6767
]);
6868
expect(result.discourseState?.mode).toBe("clarifying");
@@ -147,7 +147,7 @@ describe("deriveConversationReplyState", () => {
147147
slot: "time",
148148
question: "What time should I schedule it?",
149149
status: "pending",
150-
blocking: true,
150+
151151
createdAt: "2026-03-22T16:01:00.000Z",
152152
createdTurnId: "assistant:1"
153153
}
@@ -186,12 +186,7 @@ describe("deriveConversationReplyState", () => {
186186
})
187187
])
188188
);
189-
expect(result.discourseState?.pending_clarifications).toEqual([
190-
expect.objectContaining({
191-
id: "clar-1",
192-
status: "resolved"
193-
})
194-
]);
189+
expect(result.discourseState?.pending_clarifications).toEqual([]);
195190
expect(result.discourseState?.mode).toBe("confirming");
196191
});
197192

@@ -273,7 +268,6 @@ describe("deriveConversationReplyState", () => {
273268
slot: "time",
274269
question: "What time should I schedule it?",
275270
status: "pending",
276-
blocking: true,
277271
createdAt: "2026-03-22T16:01:00.000Z",
278272
createdTurnId: "assistant:1"
279273
}
@@ -299,12 +293,7 @@ describe("deriveConversationReplyState", () => {
299293
occurredAt: "2026-03-22T16:05:00.000Z"
300294
});
301295

302-
expect(result.discourseState?.pending_clarifications).toEqual([
303-
expect.objectContaining({
304-
id: "clar-1",
305-
status: "resolved"
306-
})
307-
]);
296+
expect(result.discourseState?.pending_clarifications).toEqual([]);
308297
expect(result.entityRegistry).toEqual(
309298
expect.arrayContaining([
310299
expect.objectContaining({
@@ -347,7 +336,7 @@ describe("deriveMutationState", () => {
347336
slot: "time",
348337
question: "What time should I schedule it?",
349338
status: "pending",
350-
blocking: true,
339+
351340
createdAt: "2026-03-22T16:01:00.000Z",
352341
createdTurnId: "assistant:1"
353342
}
@@ -420,12 +409,7 @@ describe("deriveMutationState", () => {
420409
occurredAt: "2026-03-22T16:10:00.000Z"
421410
});
422411

423-
expect(result.discourseState.pending_clarifications).toEqual([
424-
expect.objectContaining({
425-
id: "clar-1",
426-
status: "resolved"
427-
})
428-
]);
412+
expect(result.discourseState.pending_clarifications).toEqual([]);
429413
expect(result.discourseState.mode).toBe("editing");
430414
});
431415

apps/web/src/lib/server/conversation-state.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,6 @@ export function deriveConversationReplyState(input: DeriveConversationReplyState
129129
slot: clarificationSlot,
130130
question: input.reply,
131131
status: "pending",
132-
blocking: true,
133132
createdAt: occurredAt,
134133
createdTurnId: `assistant:${occurredAt}`
135134
});
@@ -256,7 +255,6 @@ export function deriveMutationState(input: DeriveMutationStateInput) {
256255
slot: input.processing.reason,
257256
question: input.processing.followUpMessage,
258257
status: "pending",
259-
blocking: true,
260258
createdAt: occurredAt,
261259
createdTurnId: `assistant:${occurredAt}`
262260
});

apps/web/src/lib/server/llm-classifier.test.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,6 @@ describe("classifyTurn", () => {
156156
slot: "time",
157157
question: "What time?",
158158
status: "pending",
159-
blocking: true,
160159
createdAt: "2026-03-20T16:00:00.000Z",
161160
createdTurnId: "t-1"
162161
}
@@ -247,7 +246,6 @@ describe("classifyTurn", () => {
247246
slot: "time",
248247
question: "What time?",
249248
status: "pending",
250-
blocking: true,
251249
createdAt: "2026-03-20T16:00:00.000Z",
252250
createdTurnId: "t-1"
253251
}

packages/core/src/discourse-state.test.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import {
1616
function buildClarification(input: Partial<PendingClarification> & Pick<PendingClarification, "id" | "slot" | "question">): PendingClarification {
1717
return {
1818
status: "pending",
19-
blocking: true,
2019
createdAt: "2026-03-22T10:00:00.000Z",
2120
createdTurnId: "assistant:turn-1",
2221
...input

packages/core/src/discourse-state.ts

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,6 @@ export const pendingClarificationSchema = z.object({
3838
slot: z.string().min(1),
3939
question: z.string().min(1),
4040
status: z.enum(["pending", "resolved", "cancelled"]),
41-
blocking: z.boolean(),
4241
createdAt: z.string().datetime(),
4342
createdTurnId: z.string().min(1),
4443
priority: z.number().int().optional()
@@ -265,11 +264,7 @@ export function deriveMode(
265264
state: DiscourseState,
266265
signals: ModeDerivationSignals = {}
267266
): ConversationMode {
268-
const hasBlockingClarification = getActivePendingClarifications(state).some(
269-
(clarification) => clarification.blocking
270-
);
271-
272-
if (hasBlockingClarification) {
267+
if (hasContractGaps(state) || getActivePendingClarifications(state).length > 0) {
273268
return "clarifying";
274269
}
275270

@@ -284,6 +279,13 @@ export function deriveMode(
284279
return "planning";
285280
}
286281

282+
function hasContractGaps(state: DiscourseState): boolean {
283+
const contract = state.pending_write_contract;
284+
if (!contract) return false;
285+
const resolved = state.resolved_slots ?? {};
286+
return contract.requiredSlots.some((slot) => resolved[slot] === undefined);
287+
}
288+
287289
export function cleanupDiscourseState(
288290
state: DiscourseState,
289291
input: CleanupDiscourseStateInput = {}
@@ -524,6 +526,7 @@ export function updateDiscourseStateFromUserTurn(
524526
nextState = setEditableEntity(nextState, input.editableEntityId);
525527
}
526528

529+
nextState = pruneStaleClarifications(nextState);
527530
nextState = cleanupDiscourseState(nextState, compactObject({
528531
validEntityIds: input.validEntityIds
529532
}));
@@ -590,6 +593,7 @@ export function updateDiscourseStateFromAssistantTurn(
590593
nextState = setEditableEntity(nextState, input.editableEntityId);
591594
}
592595

596+
nextState = pruneStaleClarifications(nextState);
593597
nextState = cleanupDiscourseState(nextState, compactObject({
594598
validEntityIds: input.validEntityIds
595599
}));
@@ -613,6 +617,15 @@ export function updateDiscourseStateFromAssistantTurn(
613617
};
614618
}
615619

620+
function pruneStaleClarifications(state: DiscourseState): DiscourseState {
621+
const pending = state.pending_clarifications.filter((c) => c.status === "pending");
622+
if (pending.length === state.pending_clarifications.length) return state;
623+
return discourseStateSchema.parse({
624+
...state,
625+
pending_clarifications: pending
626+
});
627+
}
628+
616629
function findPresentedItemByOrdinalOrOption(
617630
items: PresentedItem[],
618631
input: { ordinal?: number; optionKey?: string }

packages/integrations/src/openai.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -310,9 +310,17 @@ export async function classifyTurnWithResponses(
310310
}
311311

312312
function buildTurnClassifierPromptContext(context: TurnClassifierInput) {
313+
const discourseState = context.discourseState ?? null;
313314
return {
314315
normalizedText: context.normalizedText,
315-
discourseState: context.discourseState ?? null,
316+
discourseState: discourseState
317+
? {
318+
...discourseState,
319+
pending_clarifications: discourseState.pending_clarifications.filter(
320+
(c) => c.status === "pending"
321+
)
322+
}
323+
: null,
316324
entityRegistry: context.entityRegistry ?? []
317325
};
318326
}

packages/integrations/src/prompts/turn-classifier.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ export const turnClassifierSystemPrompt = buildPromptSpec([
4242
{
4343
title: "Context Interpretation",
4444
lines: [
45-
"discourseState.pending_clarifications: Active clarifications the assistant is waiting on. If blocking clarifications exist, the user is likely answering one.",
45+
"discourseState.pending_clarifications: Active clarifications the assistant is waiting on. If pending clarifications exist, the user is likely answering one.",
4646
"discourseState.focus_entity_id / currently_editable_entity_id: The entity the conversation is focused on. Edit verbs with pronouns ('move it', 'reschedule that') refer to this entity.",
4747
"discourseState.mode: Current conversation mode (planning, editing, clarifying, confirming).",
4848
"entityRegistry: List of conversation entities including proposal_option (pending proposals), task, clarification, etc. Check for active proposals when classifying confirmation.",

0 commit comments

Comments
 (0)