File size: 3,534 Bytes
4e23b01
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import { z } from 'zod';

import { isoDateTimeSchema, timelineMessageBase } from './base';

export const interactionApprovalRequestSchema = z.object({
  tool_name: z.string().min(1),
  action: z.string(),
  tool_input_display: z.unknown().optional(),
  expires_at: isoDateTimeSchema.optional(),
});

export type InteractionApprovalRequest = z.infer<typeof interactionApprovalRequestSchema>;

export const interactionApprovalResponseSchema = z.object({
  decision: z.enum(['approved', 'rejected', 'cancelled']),
  scope: z.literal('session').optional(),
  feedback: z.string().optional(),
  selected_label: z.string().optional(),
});

export type InteractionApprovalResponse = z.infer<typeof interactionApprovalResponseSchema>;

export const interactionQuestionOptionSchema = z.object({
  id: z.string().min(1),
  label: z.string(),
  description: z.string().optional(),
});

export type InteractionQuestionOption = z.infer<typeof interactionQuestionOptionSchema>;

export const interactionQuestionItemSchema = z.object({
  id: z.string().min(1),
  question: z.string(),
  header: z.string().optional(),
  body: z.string().optional(),
  options: z.array(interactionQuestionOptionSchema),
  multi_select: z.boolean().optional(),
  allow_other: z.boolean().optional(),
  other_label: z.string().optional(),
  other_description: z.string().optional(),
});

export type InteractionQuestionItem = z.infer<typeof interactionQuestionItemSchema>;

export const interactionQuestionRequestSchema = z.object({
  questions: z.array(interactionQuestionItemSchema),
});

export type InteractionQuestionRequest = z.infer<typeof interactionQuestionRequestSchema>;

export const interactionQuestionAnswerSchema = z.discriminatedUnion('kind', [
  z.object({ kind: z.literal('single'), option_id: z.string().min(1) }),
  z.object({ kind: z.literal('multi'), option_ids: z.array(z.string().min(1)).min(1) }),
  z.object({ kind: z.literal('other'), text: z.string() }),
  z.object({
    kind: z.literal('multi_with_other'),
    option_ids: z.array(z.string().min(1)),
    other_text: z.string(),
  }),
  z.object({ kind: z.literal('skipped') }),
]);

export type InteractionQuestionAnswer = z.infer<typeof interactionQuestionAnswerSchema>;

export const interactionQuestionResponseSchema = z.object({
  answers: z.record(z.string().min(1), interactionQuestionAnswerSchema),
  method: z.enum(['enter', 'space', 'number_key', 'click']).optional(),
  note: z.string().optional(),
});

export type InteractionQuestionResponse = z.infer<typeof interactionQuestionResponseSchema>;

export const interactionStatusSchema = z.enum([
  'pending',
  'approved',
  'rejected',
  'cancelled',
  'answered',
  'dismissed',
]);

export type InteractionStatus = z.infer<typeof interactionStatusSchema>;

const interactionMessageBase = {
  type: z.literal('interaction'),
  ...timelineMessageBase,
  interaction_id: z.string().min(1),
  status: interactionStatusSchema,
  tool_call_id: z.string().min(1).optional(),
};

export const interactionMessageSchema = z.discriminatedUnion('kind', [
  z.object({
    ...interactionMessageBase,
    kind: z.literal('approval'),
    request: interactionApprovalRequestSchema.optional(),
    response: interactionApprovalResponseSchema.optional(),
  }),
  z.object({
    ...interactionMessageBase,
    kind: z.literal('question'),
    request: interactionQuestionRequestSchema.optional(),
    response: interactionQuestionResponseSchema.optional(),
  }),
]);

export type InteractionMessage = z.infer<typeof interactionMessageSchema>;