File size: 6,699 Bytes
ea39c0e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
syntax = "proto3";

package codex.code_mode.v1;

// Hosts stateful JavaScript execution and delegates nested tool calls to the
// session owner. Large tool inputs and outputs stay off the session event
// stream so independent HTTP/2 streams can make progress concurrently.
service CodeModeHost {
  // Opens a session lease. The first event is always SessionOpened; dropping
  // this stream closes the session and terminates its active cells.
  rpc OpenSession(OpenSessionRequest) returns (stream SessionEvent);
  rpc CloseSession(CloseSessionRequest) returns (CloseSessionResponse);

  // Each subscription owns an independent stream of matching invocations. An
  // empty tool_names filter matches every tool. Each invocation is routed to
  // exactly one matching subscription, even when filters overlap.
  rpc SubscribeToToolCalls(SubscribeToToolCallsRequest)
      returns (stream ToolCall);

  // Each result receives its own HTTP/2 stream, preventing a large response
  // from blocking unrelated tool completions or session control events.
  rpc CompleteToolCall(CompleteToolCallRequest)
      returns (CompleteToolCallResponse);
  rpc AcknowledgeNotification(AcknowledgeNotificationRequest)
      returns (AcknowledgeNotificationResponse);

  // Emits ExecutionStarted immediately, followed by one ExecutionOutcome when
  // the execution yields, completes, or is terminated.
  rpc Execute(ExecuteRequest) returns (stream ExecuteEvent);
  rpc Wait(WaitRequest) returns (WaitResponse);

  // Acknowledges that a canceled wait has retired before another wait starts.
  rpc CancelWait(CancelWaitRequest) returns (CancelWaitResponse);
  rpc Terminate(TerminateRequest) returns (WaitResponse);
}

message OpenSessionRequest {
  optional SessionCellExecutionLimits cell_execution_limits = 1;
}

message SessionCellExecutionLimits {
  optional uint64 max_yield_time_ms = 1;
  optional uint64 max_heap_size_bytes = 2;
}

message SessionEvent {
  oneof event {
    SessionOpened opened = 1;
    ToolCallCancelled tool_call_cancelled = 2;
    Notification notification = 3;
    NotificationCancelled notification_cancelled = 4;
    CellClosed cell_closed = 5;
  }
}

message SessionOpened {
  string session_id = 1;
}

message CloseSessionRequest {
  string session_id = 1;
}

message CloseSessionResponse {}

message SubscribeToToolCallsRequest {
  string session_id = 1;
  repeated ToolName tool_names = 2;
}

message ToolCall {
  string session_id = 1;

  // Correlates callbacks with Execute before ExecutionStarted is received.
  string execution_id = 2;
  string cell_id = 3;
  string invocation_id = 4;
  string runtime_tool_call_id = 5;
  ToolName tool_name = 6;
  ToolKind tool_kind = 7;
  optional bytes input_json = 8;

  // Starts at one and increases independently for each execution.
  uint64 sequence = 9;

  // The host tool invocation span's W3C parent context for this streamed callback.
  // gRPC metadata is fixed when the subscription stream opens, so each call
  // carries its own context in the message.
  optional string traceparent = 10;
}

message CompleteToolCallRequest {
  string session_id = 1;
  string invocation_id = 2;

  oneof outcome {
    ToolCallSucceeded succeeded = 3;
    ToolCallFailed failed = 4;
  }
}

message ToolCallSucceeded {
  bytes output_json = 1;
}

message ToolCallFailed {
  string message = 1;
}

message CompleteToolCallResponse {}

message ToolCallCancelled {
  string invocation_id = 1;

  // Cancellation can arrive before the corresponding ToolCall because session
  // control events and tool subscriptions use independent HTTP/2 streams.
}

message Notification {
  string notification_id = 1;
  string execution_id = 2;
  string cell_id = 3;
  string call_id = 4;
  string text = 5;
}

message NotificationCancelled {
  string notification_id = 1;
}

message AcknowledgeNotificationRequest {
  string session_id = 1;
  string notification_id = 2;
}

message AcknowledgeNotificationResponse {}

message CellClosed {
  string execution_id = 1;
  string cell_id = 2;

  // Last tool-call sequence issued before closure. Clients may retire the cell
  // immediately and reject tool calls delivered after its closure.
  uint64 final_tool_call_sequence = 3;
}

message ExecuteRequest {
  string session_id = 1;

  // Chosen by the client so callbacks can be correlated before cell admission.
  string execution_id = 2;
  string tool_call_id = 3;
  string source = 4;
  repeated ToolDefinition enabled_tools = 5;
  optional uint64 yield_time_ms = 6;
  optional uint64 max_output_tokens = 7;
}

message ExecuteEvent {
  oneof event {
    ExecutionStarted started = 1;
    ExecutionOutcome outcome = 2;
  }
}

message ExecutionStarted {
  string execution_id = 1;
  string cell_id = 2;
}

message WaitRequest {
  string session_id = 1;
  string cell_id = 2;
  string wait_id = 3;
  uint64 yield_time_ms = 4;
}

message WaitResponse {
  oneof state {
    ExecutionOutcome live_cell = 1;
    ExecutionOutcome missing_cell = 2;
  }
}

message CancelWaitRequest {
  string session_id = 1;
  string wait_id = 2;
}

message CancelWaitResponse {}

message TerminateRequest {
  string session_id = 1;
  string cell_id = 2;
}

message ExecutionOutcome {
  string cell_id = 1;
  repeated ContentItem content_items = 2;

  // Elapsed monotonic time from receipt of this Execute, Wait, or Terminate
  // request until its outcome is ready, before serialization and delivery.
  // Includes nested tool waits, but not background time between requests.
  // Always supplied by the host; zero is a valid measurement.
  uint64 code_mode_host_duration_ns = 6;

  oneof outcome {
    ExecutionYielded yielded = 3;
    ExecutionTerminated terminated = 4;
    ExecutionCompleted completed = 5;
  }
}

message ExecutionYielded {}

message ExecutionTerminated {}

message ExecutionCompleted {
  optional string error_text = 1;
}

message ToolDefinition {
  string name = 1;
  ToolName tool_name = 2;
  string description = 3;
  ToolKind kind = 4;
  optional bytes input_schema_json = 5;
  optional bytes output_schema_json = 6;
}

message ToolName {
  string name = 1;
  optional string namespace = 2;
}

enum ToolKind {
  TOOL_KIND_UNSPECIFIED = 0;
  TOOL_KIND_FUNCTION = 1;
  TOOL_KIND_FREEFORM = 2;
}

message ContentItem {
  oneof item {
    TextContent text = 1;
    ImageContent image = 2;
    AudioContent audio = 3;
  }
}

message TextContent {
  string text = 1;
}

message ImageContent {
  string image_url = 1;
  optional ImageDetail detail = 2;
}

message AudioContent {
  string audio_url = 1;
}

enum ImageDetail {
  IMAGE_DETAIL_UNSPECIFIED = 0;
  IMAGE_DETAIL_AUTO = 1;
  IMAGE_DETAIL_LOW = 2;
  IMAGE_DETAIL_HIGH = 3;
  IMAGE_DETAIL_ORIGINAL = 4;
}