@markusylisiurunen/tau 0.2.128 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (232) hide show
  1. package/README.md +130 -75
  2. package/dist/core/async/cli.js +12 -2
  3. package/dist/core/async/cli.js.map +1 -1
  4. package/dist/core/async/http_protocol.js +7 -1
  5. package/dist/core/async/http_protocol.js.map +1 -1
  6. package/dist/core/async/http_server.js +9 -1
  7. package/dist/core/async/http_server.js.map +1 -1
  8. package/dist/core/async/index.js.map +1 -1
  9. package/dist/core/async/session_manager.js +94 -51
  10. package/dist/core/async/session_manager.js.map +1 -1
  11. package/dist/core/auth/auth_manager.js +0 -92
  12. package/dist/core/auth/auth_manager.js.map +1 -1
  13. package/dist/core/auth/credential_store.js +247 -0
  14. package/dist/core/auth/credential_store.js.map +1 -0
  15. package/dist/core/auth/index.js +0 -1
  16. package/dist/core/auth/index.js.map +1 -1
  17. package/dist/core/cli.js +12 -15
  18. package/dist/core/cli.js.map +1 -1
  19. package/dist/core/commands/registry.js +11 -55
  20. package/dist/core/commands/registry.js.map +1 -1
  21. package/dist/core/config/index.js.map +1 -1
  22. package/dist/core/config/runtime.js +0 -1
  23. package/dist/core/config/runtime.js.map +1 -1
  24. package/dist/core/config/schema.js +102 -17
  25. package/dist/core/config/schema.js.map +1 -1
  26. package/dist/core/debug.js +1 -20
  27. package/dist/core/debug.js.map +1 -1
  28. package/dist/core/diff_review/{session.js → bridge.js} +57 -114
  29. package/dist/core/diff_review/bridge.js.map +1 -0
  30. package/dist/core/diff_review/index.js +2 -3
  31. package/dist/core/diff_review/index.js.map +1 -1
  32. package/dist/core/diff_review/review_thread.js +48 -23
  33. package/dist/core/diff_review/review_thread.js.map +1 -1
  34. package/dist/core/diff_review/snapshot.js +40 -11
  35. package/dist/core/diff_review/snapshot.js.map +1 -1
  36. package/dist/core/events/parser.js +43 -12
  37. package/dist/core/events/parser.js.map +1 -1
  38. package/dist/core/index.js +1 -2
  39. package/dist/core/index.js.map +1 -1
  40. package/dist/core/models/catalog.js +3 -3
  41. package/dist/core/models/catalog.js.map +1 -1
  42. package/dist/core/modes/index.js +1 -2
  43. package/dist/core/modes/index.js.map +1 -1
  44. package/dist/core/modes/rpc_server.js +15 -325
  45. package/dist/core/modes/rpc_server.js.map +1 -1
  46. package/dist/core/modes/websocket_server.js +181 -0
  47. package/dist/core/modes/websocket_server.js.map +1 -0
  48. package/dist/core/personas.js +11 -1
  49. package/dist/core/personas.js.map +1 -1
  50. package/dist/core/runtime/chat_runtime.js +19 -12
  51. package/dist/core/runtime/chat_runtime.js.map +1 -1
  52. package/dist/core/runtime/conversation_turn_runtime.js +16 -1
  53. package/dist/core/runtime/conversation_turn_runtime.js.map +1 -1
  54. package/dist/core/runtime/runtime_bootstrap.js +326 -0
  55. package/dist/core/runtime/runtime_bootstrap.js.map +1 -1
  56. package/dist/core/runtime/steering.js +6 -0
  57. package/dist/core/runtime/steering.js.map +1 -0
  58. package/dist/core/session/compaction.js +225 -22
  59. package/dist/core/session/compaction.js.map +1 -1
  60. package/dist/core/session/core_session.js +9 -0
  61. package/dist/core/session/core_session.js.map +1 -1
  62. package/dist/core/session/direct_bash.js +34 -0
  63. package/dist/core/session/direct_bash.js.map +1 -0
  64. package/dist/core/session/pruning.js +595 -0
  65. package/dist/core/session/pruning.js.map +1 -0
  66. package/dist/core/session/runner.js +47 -8
  67. package/dist/core/session/runner.js.map +1 -1
  68. package/dist/core/session/session_engine.js +128 -55
  69. package/dist/core/session/session_engine.js.map +1 -1
  70. package/dist/core/static/prompts/diff-review-wrapper.md +1 -1
  71. package/dist/core/subagents/subagent_engine.js +19 -27
  72. package/dist/core/subagents/subagent_engine.js.map +1 -1
  73. package/dist/core/tools/catalog.js.map +1 -1
  74. package/dist/core/tools/diff_review.js +12 -12
  75. package/dist/core/tools/diff_review.js.map +1 -1
  76. package/dist/core/tools/execution_backend.js +9 -2
  77. package/dist/core/tools/execution_backend.js.map +1 -1
  78. package/dist/core/tools/registry.js.map +1 -1
  79. package/dist/core/usage/logs.js.map +1 -1
  80. package/dist/core/utils/compact.js +3 -1
  81. package/dist/core/utils/compact.js.map +1 -1
  82. package/dist/core/utils/context.js +1 -1
  83. package/dist/core/utils/context.js.map +1 -1
  84. package/dist/core/utils/context_builder.js +1 -18
  85. package/dist/core/utils/context_builder.js.map +1 -1
  86. package/dist/core/utils/gemini_speech.js +1 -1
  87. package/dist/core/utils/gemini_speech.js.map +1 -1
  88. package/dist/core/utils/model_stream.js +105 -14
  89. package/dist/core/utils/model_stream.js.map +1 -1
  90. package/dist/core/utils/project_files.js +11 -16
  91. package/dist/core/utils/project_files.js.map +1 -1
  92. package/dist/core/utils/spawn_capture.js +2 -2
  93. package/dist/core/utils/spawn_capture.js.map +1 -1
  94. package/dist/core/utils/user_metadata.js +35 -2
  95. package/dist/core/utils/user_metadata.js.map +1 -1
  96. package/dist/core/version.js +1 -1
  97. package/dist/core/version.js.map +1 -1
  98. package/dist/diff_tool/app/dist/assets/{index-jn1I_CPZ.js → index-ivRn2dP2.js} +34 -34
  99. package/dist/diff_tool/app/dist/index.html +1 -1
  100. package/dist/execution/cloudflare_sandbox_execution_environment.js +400 -0
  101. package/dist/execution/cloudflare_sandbox_execution_environment.js.map +1 -0
  102. package/dist/execution/execution_environment.js +24 -0
  103. package/dist/execution/execution_environment.js.map +1 -0
  104. package/dist/execution/fly_sprite_execution_environment.js +559 -0
  105. package/dist/execution/fly_sprite_execution_environment.js.map +1 -0
  106. package/dist/execution/local_execution_environment.js +93 -0
  107. package/dist/execution/local_execution_environment.js.map +1 -0
  108. package/dist/execution/runtime_config_snapshot.js +209 -0
  109. package/dist/execution/runtime_config_snapshot.js.map +1 -0
  110. package/dist/execution/sandbox_tool_helpers.js +55 -0
  111. package/dist/execution/sandbox_tool_helpers.js.map +1 -0
  112. package/dist/execution/tool_backend_execution_environment.js +55 -0
  113. package/dist/execution/tool_backend_execution_environment.js.map +1 -0
  114. package/dist/host/hosted_ephemeral_agent_session.js +286 -0
  115. package/dist/host/hosted_ephemeral_agent_session.js.map +1 -0
  116. package/dist/host/index.js +3 -0
  117. package/dist/host/index.js.map +1 -0
  118. package/dist/host/local_session_host.js +1464 -0
  119. package/dist/host/local_session_host.js.map +1 -0
  120. package/dist/host/session_host.js +2 -0
  121. package/dist/host/session_host.js.map +1 -0
  122. package/dist/host/session_protocol_handler.js +873 -0
  123. package/dist/host/session_protocol_handler.js.map +1 -0
  124. package/dist/main.js +537 -77
  125. package/dist/main.js.map +1 -1
  126. package/dist/protocol/index.d.ts +2 -0
  127. package/dist/protocol/index.js +2 -0
  128. package/dist/protocol/index.js.map +1 -0
  129. package/dist/protocol/session_protocol.d.ts +691 -0
  130. package/dist/protocol/session_protocol.js +2117 -0
  131. package/dist/protocol/session_protocol.js.map +1 -0
  132. package/dist/sdk/client.d.ts +2 -1
  133. package/dist/sdk/client.js +136 -392
  134. package/dist/sdk/client.js.map +1 -1
  135. package/dist/sdk/index.d.ts +7 -4
  136. package/dist/sdk/index.js +4 -2
  137. package/dist/sdk/index.js.map +1 -1
  138. package/dist/sdk/session.d.ts +5 -0
  139. package/dist/sdk/session.js +406 -0
  140. package/dist/sdk/session.js.map +1 -0
  141. package/dist/sdk/types.d.ts +97 -78
  142. package/dist/store/file_session_store.js +157 -0
  143. package/dist/store/file_session_store.js.map +1 -0
  144. package/dist/store/memory_session_store.js +24 -0
  145. package/dist/store/memory_session_store.js.map +1 -0
  146. package/dist/store/session_store.js +32 -0
  147. package/dist/store/session_store.js.map +1 -0
  148. package/dist/transport/errors.d.ts +29 -0
  149. package/dist/{sdk → transport}/errors.js +5 -5
  150. package/dist/transport/errors.js.map +1 -0
  151. package/dist/transport/in_process_session_transport.js +102 -0
  152. package/dist/transport/in_process_session_transport.js.map +1 -0
  153. package/dist/transport/index.d.ts +7 -0
  154. package/dist/transport/index.js +4 -0
  155. package/dist/transport/index.js.map +1 -0
  156. package/dist/transport/pending_session_protocol_requests.js +67 -0
  157. package/dist/transport/pending_session_protocol_requests.js.map +1 -0
  158. package/dist/transport/session_protocol_transport_helpers.js +98 -0
  159. package/dist/transport/session_protocol_transport_helpers.js.map +1 -0
  160. package/dist/transport/session_transport.d.ts +11 -0
  161. package/dist/transport/session_transport.js +2 -0
  162. package/dist/transport/session_transport.js.map +1 -0
  163. package/dist/transport/stdio_session_transport.d.ts +38 -0
  164. package/dist/transport/stdio_session_transport.js +243 -0
  165. package/dist/transport/stdio_session_transport.js.map +1 -0
  166. package/dist/transport/websocket_session_transport.d.ts +52 -0
  167. package/dist/transport/websocket_session_transport.js +235 -0
  168. package/dist/transport/websocket_session_transport.js.map +1 -0
  169. package/dist/tui/chat_controller/assistant_clipboard.js +39 -0
  170. package/dist/tui/chat_controller/assistant_clipboard.js.map +1 -0
  171. package/dist/tui/chat_controller/command_hints.js +43 -0
  172. package/dist/tui/chat_controller/command_hints.js.map +1 -0
  173. package/dist/tui/chat_controller/diff_review_service.js +9 -9
  174. package/dist/tui/chat_controller/diff_review_service.js.map +1 -1
  175. package/dist/tui/chat_controller/diff_review_user_message.js +17 -0
  176. package/dist/tui/chat_controller/diff_review_user_message.js.map +1 -0
  177. package/dist/tui/chat_controller/history_labels.js +8 -0
  178. package/dist/tui/chat_controller/history_labels.js.map +1 -0
  179. package/dist/tui/chat_controller/history_message_model.js +36 -0
  180. package/dist/tui/chat_controller/history_message_model.js.map +1 -0
  181. package/dist/tui/chat_controller/queued_user_messages.js +18 -1
  182. package/dist/tui/chat_controller/queued_user_messages.js.map +1 -1
  183. package/dist/tui/chat_controller/status_format.js +22 -0
  184. package/dist/tui/chat_controller/status_format.js.map +1 -0
  185. package/dist/tui/chat_view.js +3 -1
  186. package/dist/tui/chat_view.js.map +1 -1
  187. package/dist/tui/index.js +1 -1
  188. package/dist/tui/index.js.map +1 -1
  189. package/dist/tui/listen_capture.js +87 -0
  190. package/dist/tui/listen_capture.js.map +1 -0
  191. package/dist/tui/memory_mode.js +23 -0
  192. package/dist/tui/memory_mode.js.map +1 -0
  193. package/dist/tui/session_chat_app.js +227 -0
  194. package/dist/tui/session_chat_app.js.map +1 -0
  195. package/dist/tui/session_chat_controller.js +2167 -0
  196. package/dist/tui/session_chat_controller.js.map +1 -0
  197. package/dist/tui/session_tool_execution_backend.js +170 -0
  198. package/dist/tui/session_tool_execution_backend.js.map +1 -0
  199. package/dist/tui/speech_playback.js +107 -0
  200. package/dist/tui/speech_playback.js.map +1 -0
  201. package/dist/tui/ui/assistant_message.js +27 -21
  202. package/dist/tui/ui/assistant_message.js.map +1 -1
  203. package/dist/tui/ui/components/editor.js +17 -13
  204. package/dist/tui/ui/components/editor.js.map +1 -1
  205. package/dist/tui/ui/custom_editor.js +25 -5
  206. package/dist/tui/ui/custom_editor.js.map +1 -1
  207. package/dist/tui/ui/queued_messages.js +1 -1
  208. package/dist/tui/ui/queued_messages.js.map +1 -1
  209. package/dist/tui/ui/slash_autocomplete.js +14 -36
  210. package/dist/tui/ui/slash_autocomplete.js.map +1 -1
  211. package/dist/tui/ui/tool_ui_registry.js +21 -0
  212. package/dist/tui/ui/tool_ui_registry.js.map +1 -1
  213. package/package.json +14 -11
  214. package/dist/core/auth/credential_resolver.js +0 -36
  215. package/dist/core/auth/credential_resolver.js.map +0 -1
  216. package/dist/core/config/bash_commands.js +0 -44
  217. package/dist/core/config/bash_commands.js.map +0 -1
  218. package/dist/core/diff_review/session.js.map +0 -1
  219. package/dist/core/modes/rpc_adapter.js +0 -17
  220. package/dist/core/modes/rpc_adapter.js.map +0 -1
  221. package/dist/core/modes/rpc_protocol.js +0 -500
  222. package/dist/core/modes/rpc_protocol.js.map +0 -1
  223. package/dist/core/session/checkpoint.js +0 -34
  224. package/dist/core/session/checkpoint.js.map +0 -1
  225. package/dist/sdk/errors.d.ts +0 -33
  226. package/dist/sdk/errors.js.map +0 -1
  227. package/dist/tui/app.js +0 -64
  228. package/dist/tui/app.js.map +0 -1
  229. package/dist/tui/chat_controller/session_maintenance_service.js +0 -634
  230. package/dist/tui/chat_controller/session_maintenance_service.js.map +0 -1
  231. package/dist/tui/chat_controller.js +0 -2532
  232. package/dist/tui/chat_controller.js.map +0 -1
@@ -0,0 +1,2117 @@
1
+ import { z } from "zod";
2
+ export const SESSION_PROTOCOL_VERSION = 1;
3
+ export const SESSION_PROTOCOL_METHODS = [
4
+ "initialize",
5
+ "session.create",
6
+ "session.list",
7
+ "session.observe",
8
+ "session.unobserve",
9
+ "session.record",
10
+ "session.submit",
11
+ "session.queue",
12
+ "session.steer",
13
+ "session.retry",
14
+ "session.exec",
15
+ "session.interrupt",
16
+ "session.snapshot",
17
+ "session.setRisk",
18
+ "session.setReasoning",
19
+ "session.setPersona",
20
+ "session.resolvePrompt",
21
+ "session.autocompletePaths",
22
+ "session.reload",
23
+ "session.compact",
24
+ "session.prune",
25
+ "session.rewind",
26
+ "session.terminateSubagent",
27
+ "session.ephemeral.create",
28
+ "session.ephemeral.submit",
29
+ "session.ephemeral.close",
30
+ ];
31
+ const SESSION_PROTOCOL_METHOD_SET = new Set(SESSION_PROTOCOL_METHODS);
32
+ function formatZodError(error) {
33
+ return error.issues
34
+ .map((issue) => {
35
+ const path = issue.path.length > 0 ? issue.path.join(".") : undefined;
36
+ return path ? `${path}: ${issue.message}` : issue.message;
37
+ })
38
+ .join("; ");
39
+ }
40
+ export const SESSION_PROTOCOL_ERROR_CODES = {
41
+ parseError: "parse_error",
42
+ invalidRequest: "invalid_request",
43
+ methodNotFound: "method_not_found",
44
+ invalidParams: "invalid_params",
45
+ notFound: "not_found",
46
+ busy: "busy",
47
+ internalError: "internal_error",
48
+ };
49
+ const SESSION_PROTOCOL_ERROR_CODE_VALUES = [
50
+ SESSION_PROTOCOL_ERROR_CODES.parseError,
51
+ SESSION_PROTOCOL_ERROR_CODES.invalidRequest,
52
+ SESSION_PROTOCOL_ERROR_CODES.methodNotFound,
53
+ SESSION_PROTOCOL_ERROR_CODES.invalidParams,
54
+ SESSION_PROTOCOL_ERROR_CODES.notFound,
55
+ SESSION_PROTOCOL_ERROR_CODES.busy,
56
+ SESSION_PROTOCOL_ERROR_CODES.internalError,
57
+ ];
58
+ const sessionProtocolMethodSchema = z.enum(SESSION_PROTOCOL_METHODS);
59
+ const sessionProtocolMethodListSchema = z
60
+ .array(sessionProtocolMethodSchema)
61
+ .superRefine((methods, ctx) => {
62
+ const seen = new Set();
63
+ for (const method of methods) {
64
+ if (seen.has(method)) {
65
+ ctx.addIssue({
66
+ code: "custom",
67
+ message: `duplicate session protocol method '${method}'`,
68
+ });
69
+ }
70
+ seen.add(method);
71
+ }
72
+ });
73
+ const sessionProtocolSessionLifecycleSchema = z.enum(["idle", "running"]);
74
+ const sessionProtocolErrorCodeSchema = z.enum(SESSION_PROTOCOL_ERROR_CODE_VALUES);
75
+ const nonEmptyStringSchema = z
76
+ .string()
77
+ .min(1)
78
+ .refine((value) => value.trim().length > 0);
79
+ const sessionProtocolRequestIdSchema = nonEmptyStringSchema;
80
+ const nullableSessionProtocolRequestIdSchema = sessionProtocolRequestIdSchema.nullable();
81
+ const messageSchema = z.custom(isMessage);
82
+ const sessionProtocolReadyMessageSchema = z
83
+ .object({
84
+ version: z.literal(SESSION_PROTOCOL_VERSION),
85
+ type: z.literal("ready"),
86
+ methods: sessionProtocolMethodListSchema,
87
+ })
88
+ .strict();
89
+ const sessionProtocolRequestEnvelopeSchema = z
90
+ .object({
91
+ version: z.literal(SESSION_PROTOCOL_VERSION),
92
+ type: z.literal("request"),
93
+ id: sessionProtocolRequestIdSchema,
94
+ method: z.string(),
95
+ params: z.unknown(),
96
+ })
97
+ .strict();
98
+ const sessionProtocolOutgoingRoutingSchema = z
99
+ .object({
100
+ version: z.literal(SESSION_PROTOCOL_VERSION),
101
+ type: z.enum(["ready", "session.delta", "session.ephemeral", "response"]),
102
+ })
103
+ .passthrough();
104
+ const sessionProtocolIdFieldSchema = z.object({ id: z.unknown() }).passthrough();
105
+ const sessionProtocolOkFieldSchema = z.object({ ok: z.unknown() }).passthrough();
106
+ const sessionProtocolVersionFieldSchema = z.object({ version: z.unknown() }).passthrough();
107
+ const sessionProtocolTypeFieldSchema = z.object({ type: z.unknown() }).passthrough();
108
+ const sessionProtocolResponseSuccessSchema = z
109
+ .object({
110
+ version: z.literal(SESSION_PROTOCOL_VERSION),
111
+ type: z.literal("response"),
112
+ id: sessionProtocolRequestIdSchema,
113
+ ok: z.literal(true),
114
+ result: z.unknown(),
115
+ })
116
+ .strict();
117
+ const sessionProtocolResponseErrorSchema = z
118
+ .object({
119
+ version: z.literal(SESSION_PROTOCOL_VERSION),
120
+ type: z.literal("response"),
121
+ id: nullableSessionProtocolRequestIdSchema,
122
+ ok: z.literal(false),
123
+ error: z
124
+ .object({
125
+ code: sessionProtocolErrorCodeSchema,
126
+ message: z.string(),
127
+ data: z.unknown().optional(),
128
+ })
129
+ .strict(),
130
+ })
131
+ .strict();
132
+ const sessionProtocolInitializeParamsSchema = z
133
+ .object({
134
+ client: z
135
+ .object({
136
+ name: nonEmptyStringSchema,
137
+ version: nonEmptyStringSchema,
138
+ })
139
+ .strict(),
140
+ })
141
+ .strict();
142
+ const sessionProtocolUserMessageParamsSchema = z
143
+ .object({
144
+ sessionId: nonEmptyStringSchema,
145
+ text: z.string(),
146
+ historyEntryId: nonEmptyStringSchema.optional(),
147
+ })
148
+ .strict();
149
+ const sessionProtocolRecordParamsSchema = sessionProtocolUserMessageParamsSchema;
150
+ const sessionProtocolExecParamsSchema = z
151
+ .object({
152
+ sessionId: nonEmptyStringSchema,
153
+ command: nonEmptyStringSchema,
154
+ cwd: nonEmptyStringSchema.optional(),
155
+ timeoutMs: z.number().int().positive().optional(),
156
+ })
157
+ .strict();
158
+ const sessionProtocolSessionIdParamsSchema = z
159
+ .object({
160
+ sessionId: nonEmptyStringSchema,
161
+ })
162
+ .strict();
163
+ const sessionProtocolSetRiskParamsSchema = z
164
+ .object({
165
+ sessionId: nonEmptyStringSchema,
166
+ riskLevel: z.enum(["read-only", "read-write"]),
167
+ })
168
+ .strict();
169
+ const sessionProtocolReasoningEffortSchema = z.enum([
170
+ "none",
171
+ "minimal",
172
+ "low",
173
+ "medium",
174
+ "high",
175
+ "xhigh",
176
+ ]);
177
+ const sessionProtocolSetReasoningParamsSchema = z
178
+ .object({
179
+ sessionId: nonEmptyStringSchema,
180
+ reasoning: sessionProtocolReasoningEffortSchema,
181
+ })
182
+ .strict();
183
+ const sessionProtocolSetPersonaParamsSchema = z
184
+ .object({
185
+ sessionId: nonEmptyStringSchema,
186
+ personaId: nonEmptyStringSchema,
187
+ })
188
+ .strict();
189
+ const sessionProtocolResolvePromptParamsSchema = z
190
+ .object({
191
+ sessionId: nonEmptyStringSchema,
192
+ promptId: nonEmptyStringSchema,
193
+ })
194
+ .strict();
195
+ const sessionProtocolAutocompletePathsParamsSchema = z
196
+ .object({
197
+ sessionId: nonEmptyStringSchema,
198
+ query: z.string(),
199
+ limit: z.number().int().positive().max(100),
200
+ })
201
+ .strict();
202
+ const sessionProtocolCompactParamsSchema = z
203
+ .object({
204
+ sessionId: nonEmptyStringSchema,
205
+ mode: z.enum(["summary-only", "summary-and-last"]),
206
+ guidance: z.string().optional(),
207
+ })
208
+ .strict();
209
+ const sessionProtocolPruneParamsSchema = z
210
+ .object({
211
+ sessionId: nonEmptyStringSchema,
212
+ strategy: z.enum(["earliest", "largest", "smart"]),
213
+ fraction: z.number().min(0).max(1),
214
+ guidance: z.string().optional(),
215
+ })
216
+ .strict();
217
+ const sessionProtocolRewindParamsSchema = z
218
+ .object({
219
+ sessionId: nonEmptyStringSchema,
220
+ historyEntryId: nonEmptyStringSchema,
221
+ })
222
+ .strict();
223
+ const sessionProtocolTerminateSubagentParamsSchema = z
224
+ .object({
225
+ sessionId: nonEmptyStringSchema,
226
+ subagentId: nonEmptyStringSchema,
227
+ })
228
+ .strict();
229
+ const sessionProtocolEphemeralAgentToolSchema = z.enum([
230
+ "bash",
231
+ "write",
232
+ "edit",
233
+ "view_image",
234
+ "web_search",
235
+ "web_fetch",
236
+ ]);
237
+ const sessionProtocolEphemeralCreateParamsSchema = z
238
+ .object({
239
+ sessionId: nonEmptyStringSchema,
240
+ instructions: nonEmptyStringSchema,
241
+ tools: z.array(sessionProtocolEphemeralAgentToolSchema),
242
+ riskLevel: z.enum(["read-only", "read-write"]),
243
+ })
244
+ .strict();
245
+ const sessionProtocolEphemeralSubmitParamsSchema = z
246
+ .object({
247
+ sessionId: nonEmptyStringSchema,
248
+ contextId: nonEmptyStringSchema,
249
+ threadId: nonEmptyStringSchema,
250
+ forkFromThreadId: nonEmptyStringSchema.optional(),
251
+ message: nonEmptyStringSchema,
252
+ })
253
+ .strict();
254
+ const sessionProtocolEphemeralCloseParamsSchema = z
255
+ .object({
256
+ sessionId: nonEmptyStringSchema,
257
+ contextId: nonEmptyStringSchema,
258
+ })
259
+ .strict();
260
+ const absolutePathSchema = nonEmptyStringSchema.refine((value) => value.startsWith("/"));
261
+ const sessionProtocolLocalExecutionEnvironmentInputSchema = z
262
+ .object({
263
+ kind: z.literal("local"),
264
+ cwd: absolutePathSchema,
265
+ })
266
+ .strict();
267
+ const sessionProtocolCloudflareSandboxExecutionEnvironmentInputSchema = z
268
+ .object({
269
+ kind: z.literal("cloudflare-sandbox"),
270
+ bridgeId: nonEmptyStringSchema,
271
+ sandboxId: nonEmptyStringSchema,
272
+ cwd: absolutePathSchema,
273
+ })
274
+ .strict();
275
+ const sessionProtocolFlySpriteExecutionEnvironmentInputSchema = z
276
+ .object({
277
+ kind: z.literal("fly-sprite"),
278
+ apiId: nonEmptyStringSchema,
279
+ spriteName: nonEmptyStringSchema,
280
+ cwd: absolutePathSchema,
281
+ })
282
+ .strict();
283
+ const sessionProtocolExecutionEnvironmentInputSchema = z.discriminatedUnion("kind", [
284
+ sessionProtocolLocalExecutionEnvironmentInputSchema,
285
+ sessionProtocolCloudflareSandboxExecutionEnvironmentInputSchema,
286
+ sessionProtocolFlySpriteExecutionEnvironmentInputSchema,
287
+ ]);
288
+ const sessionProtocolCreateParamsSchema = z
289
+ .object({
290
+ executionEnvironment: sessionProtocolExecutionEnvironmentInputSchema,
291
+ personaId: nonEmptyStringSchema.optional(),
292
+ riskLevel: z.enum(["read-only", "read-write"]).optional(),
293
+ reasoning: sessionProtocolReasoningEffortSchema.optional(),
294
+ })
295
+ .strict();
296
+ const sessionProtocolEmptyParamsSchema = z.object({}).strict();
297
+ const sessionProtocolSessionSummarySchema = z
298
+ .object({
299
+ sessionId: nonEmptyStringSchema,
300
+ lifecycle: sessionProtocolSessionLifecycleSchema,
301
+ })
302
+ .strict();
303
+ const sessionProtocolServiceTierSchema = z.enum(["priority", "flex"]);
304
+ const sessionProtocolModelSnapshotSchema = z
305
+ .object({
306
+ id: nonEmptyStringSchema,
307
+ name: nonEmptyStringSchema,
308
+ api: nonEmptyStringSchema,
309
+ provider: nonEmptyStringSchema,
310
+ baseUrl: z.string(),
311
+ reasoning: z.boolean(),
312
+ thinkingLevelMap: z
313
+ .partialRecord(z.enum(["off", "minimal", "low", "medium", "high", "xhigh"]), z.string().nullable())
314
+ .optional(),
315
+ input: z.array(z.enum(["text", "image"])),
316
+ cost: z
317
+ .object({
318
+ input: z.number().nonnegative(),
319
+ output: z.number().nonnegative(),
320
+ cacheRead: z.number().nonnegative(),
321
+ cacheWrite: z.number().nonnegative(),
322
+ })
323
+ .strict(),
324
+ contextWindow: z.number().int().positive(),
325
+ maxTokens: z.number().int().positive(),
326
+ compat: z.unknown().optional(),
327
+ })
328
+ .strict();
329
+ const sessionProtocolPersonaSettingsSnapshotSchema = z
330
+ .object({
331
+ reasoning: sessionProtocolReasoningEffortSchema.optional(),
332
+ interleavedThinking: z.boolean().optional(),
333
+ serviceTier: sessionProtocolServiceTierSchema.optional(),
334
+ })
335
+ .strict();
336
+ const sessionProtocolSubagentSnapshotSchema = z
337
+ .object({
338
+ description: z.string().optional(),
339
+ tools: z.array(nonEmptyStringSchema).optional(),
340
+ riskLevel: z.enum(["read-only", "read-write"]).optional(),
341
+ launchModels: z.array(nonEmptyStringSchema).optional(),
342
+ })
343
+ .strict();
344
+ const sessionProtocolPersonaSnapshotSchema = z
345
+ .object({
346
+ id: nonEmptyStringSchema,
347
+ label: nonEmptyStringSchema,
348
+ description: z.string().optional(),
349
+ allowedReasoningLevels: z.array(sessionProtocolReasoningEffortSchema).optional(),
350
+ subagents: z.record(nonEmptyStringSchema, sessionProtocolSubagentSnapshotSchema).optional(),
351
+ tools: z.array(nonEmptyStringSchema).optional(),
352
+ skills: z.union([z.literal("*"), z.array(nonEmptyStringSchema)]),
353
+ source: z.enum(["builtin", "user", "project"]),
354
+ })
355
+ .strict();
356
+ const sessionProtocolPromptTemplateSnapshotSchema = z
357
+ .object({
358
+ id: nonEmptyStringSchema,
359
+ label: z.string().optional(),
360
+ description: z.string().optional(),
361
+ })
362
+ .strict();
363
+ const sessionProtocolSkillSnapshotSchema = z
364
+ .object({
365
+ name: nonEmptyStringSchema,
366
+ description: nonEmptyStringSchema,
367
+ path: nonEmptyStringSchema,
368
+ })
369
+ .strict();
370
+ const sessionProtocolContentCatalogSnapshotSchema = z
371
+ .object({
372
+ personas: z.array(sessionProtocolPersonaSnapshotSchema),
373
+ prompts: z.array(sessionProtocolPromptTemplateSnapshotSchema),
374
+ skills: z.array(sessionProtocolSkillSnapshotSchema),
375
+ })
376
+ .strict();
377
+ const sessionProtocolSettingsSnapshotSchema = z
378
+ .object({
379
+ personaId: nonEmptyStringSchema,
380
+ riskLevel: z.enum(["read-only", "read-write"]),
381
+ reasoning: sessionProtocolReasoningEffortSchema.optional(),
382
+ serviceTier: sessionProtocolServiceTierSchema.optional(),
383
+ })
384
+ .strict();
385
+ const sessionProtocolBootstrapSnapshotSchema = z
386
+ .object({
387
+ model: sessionProtocolModelSnapshotSchema,
388
+ prompt: z
389
+ .object({
390
+ environmentTag: nonEmptyStringSchema,
391
+ subagentPrompts: z.record(z.string(), z.string()),
392
+ })
393
+ .strict(),
394
+ })
395
+ .strict();
396
+ const sessionProtocolLocalExecutionEnvironmentSnapshotSchema = z
397
+ .object({
398
+ kind: z.literal("local"),
399
+ cwd: nonEmptyStringSchema,
400
+ home: nonEmptyStringSchema,
401
+ })
402
+ .strict();
403
+ const sessionProtocolCloudflareSandboxExecutionEnvironmentSnapshotSchema = z
404
+ .object({
405
+ kind: z.literal("cloudflare-sandbox"),
406
+ bridgeId: nonEmptyStringSchema,
407
+ sandboxId: nonEmptyStringSchema,
408
+ cwd: nonEmptyStringSchema,
409
+ home: nonEmptyStringSchema,
410
+ })
411
+ .strict();
412
+ const sessionProtocolFlySpriteExecutionEnvironmentSnapshotSchema = z
413
+ .object({
414
+ kind: z.literal("fly-sprite"),
415
+ apiId: nonEmptyStringSchema,
416
+ spriteName: nonEmptyStringSchema,
417
+ cwd: nonEmptyStringSchema,
418
+ home: nonEmptyStringSchema,
419
+ })
420
+ .strict();
421
+ const sessionProtocolExecutionEnvironmentSnapshotSchema = z.discriminatedUnion("kind", [
422
+ sessionProtocolLocalExecutionEnvironmentSnapshotSchema,
423
+ sessionProtocolCloudflareSandboxExecutionEnvironmentSnapshotSchema,
424
+ sessionProtocolFlySpriteExecutionEnvironmentSnapshotSchema,
425
+ ]);
426
+ const sessionProtocolSystemMessageSchema = z
427
+ .object({
428
+ role: z.literal("system"),
429
+ content: z.string(),
430
+ timestamp: z.number().finite(),
431
+ })
432
+ .strict();
433
+ const sessionProtocolDraftAssistantMessageSchema = z
434
+ .object({
435
+ role: z.literal("assistant"),
436
+ content: z.array(z.unknown()),
437
+ timestamp: z.number().finite(),
438
+ })
439
+ .strict();
440
+ const sessionProtocolMessagePayloadSchema = z.union([
441
+ sessionProtocolSystemMessageSchema,
442
+ messageSchema,
443
+ sessionProtocolDraftAssistantMessageSchema,
444
+ ]);
445
+ const sessionProtocolMessageSchema = z
446
+ .object({
447
+ id: nonEmptyStringSchema,
448
+ state: z.enum(["draft", "committed", "interrupted", "discarded"]),
449
+ modelVisible: z.boolean(),
450
+ message: sessionProtocolMessagePayloadSchema,
451
+ })
452
+ .strict();
453
+ const sessionProtocolNoticeSchema = z
454
+ .object({
455
+ severity: z.enum(["info", "warn", "error"]),
456
+ text: z.string(),
457
+ timestamp: z.number().finite(),
458
+ })
459
+ .strict();
460
+ const sessionProtocolOperationSchema = z
461
+ .object({
462
+ kind: z.enum(["auto-compaction", "manual-compaction", "prune", "reload", "rewind"]),
463
+ status: z.enum(["running", "succeeded", "failed", "cancelled", "skipped"]),
464
+ startedAt: z.number().finite(),
465
+ finishedAt: z.number().finite().optional(),
466
+ summary: z.string().optional(),
467
+ error: z.string().optional(),
468
+ data: z.record(z.string(), z.unknown()).optional(),
469
+ })
470
+ .strict();
471
+ const sessionProtocolTimelineItemSchema = z.discriminatedUnion("type", [
472
+ z
473
+ .object({
474
+ type: z.literal("message"),
475
+ id: nonEmptyStringSchema,
476
+ messageId: nonEmptyStringSchema,
477
+ })
478
+ .strict(),
479
+ z
480
+ .object({
481
+ type: z.literal("notice"),
482
+ id: nonEmptyStringSchema,
483
+ notice: sessionProtocolNoticeSchema,
484
+ })
485
+ .strict(),
486
+ z
487
+ .object({
488
+ type: z.literal("operation"),
489
+ id: nonEmptyStringSchema,
490
+ operation: sessionProtocolOperationSchema,
491
+ })
492
+ .strict(),
493
+ ]);
494
+ const sessionProtocolToolRunSchema = z
495
+ .object({
496
+ id: nonEmptyStringSchema,
497
+ toolCallId: nonEmptyStringSchema,
498
+ toolName: nonEmptyStringSchema,
499
+ call: z
500
+ .object({
501
+ messageId: nonEmptyStringSchema,
502
+ contentIndex: z.number().int().nonnegative(),
503
+ })
504
+ .strict(),
505
+ status: z.enum(["queued", "running", "succeeded", "failed", "blocked", "cancelled"]),
506
+ startedAt: z.number().finite().optional(),
507
+ finishedAt: z.number().finite().optional(),
508
+ resultMessageId: nonEmptyStringSchema.optional(),
509
+ summary: z.string().optional(),
510
+ error: z.string().optional(),
511
+ facetIds: z.array(nonEmptyStringSchema),
512
+ })
513
+ .strict();
514
+ const sessionProtocolAgentUsageSchema = z
515
+ .object({
516
+ input: z.number().finite(),
517
+ output: z.number().finite(),
518
+ cacheRead: z.number().finite(),
519
+ cacheWrite: z.number().finite(),
520
+ contextWindowUsageTokens: z.number().finite(),
521
+ contextWindow: z.number().finite(),
522
+ })
523
+ .strict();
524
+ const sessionProtocolAgentRunSchema = z
525
+ .object({
526
+ id: nonEmptyStringSchema,
527
+ name: nonEmptyStringSchema,
528
+ title: nonEmptyStringSchema,
529
+ status: z.enum(["running", "succeeded", "failed", "cancelled"]),
530
+ originMessageId: nonEmptyStringSchema,
531
+ modelLabel: z.string().optional(),
532
+ costTotal: z.number().finite(),
533
+ turns: z.number().finite(),
534
+ toolCalls: z.number().finite(),
535
+ usage: sessionProtocolAgentUsageSchema,
536
+ startedAt: z.number().finite(),
537
+ finishedAt: z.number().finite().optional(),
538
+ abortRequested: z.boolean(),
539
+ progress: z.string().optional(),
540
+ finalText: z.string().optional(),
541
+ error: z.string().optional(),
542
+ })
543
+ .strict();
544
+ const sessionProtocolFacetSubjectSchema = z.discriminatedUnion("type", [
545
+ z.object({ type: z.literal("session") }).strict(),
546
+ z.object({ type: z.literal("message"), id: nonEmptyStringSchema }).strict(),
547
+ z.object({ type: z.literal("tool"), id: nonEmptyStringSchema }).strict(),
548
+ z.object({ type: z.literal("agent"), id: nonEmptyStringSchema }).strict(),
549
+ z.object({ type: z.literal("operation"), id: nonEmptyStringSchema }).strict(),
550
+ ]);
551
+ const sessionProtocolFacetSchema = z
552
+ .object({
553
+ id: nonEmptyStringSchema,
554
+ subject: sessionProtocolFacetSubjectSchema,
555
+ kind: nonEmptyStringSchema,
556
+ version: z.number().int().positive(),
557
+ data: z.record(z.string(), z.unknown()),
558
+ })
559
+ .strict();
560
+ const sessionProtocolSnapshotSchema = z
561
+ .object({
562
+ sessionId: nonEmptyStringSchema,
563
+ revision: z.number().int().positive(),
564
+ lifecycle: sessionProtocolSessionLifecycleSchema,
565
+ settings: sessionProtocolSettingsSnapshotSchema,
566
+ bootstrap: sessionProtocolBootstrapSnapshotSchema,
567
+ catalog: sessionProtocolContentCatalogSnapshotSchema,
568
+ executionEnvironment: sessionProtocolExecutionEnvironmentSnapshotSchema,
569
+ messages: z.array(sessionProtocolMessageSchema),
570
+ timeline: z.array(sessionProtocolTimelineItemSchema),
571
+ tools: z.record(nonEmptyStringSchema, sessionProtocolToolRunSchema),
572
+ agents: z.record(nonEmptyStringSchema, sessionProtocolAgentRunSchema),
573
+ facets: z.record(nonEmptyStringSchema, sessionProtocolFacetSchema),
574
+ })
575
+ .strict()
576
+ .superRefine((snapshot, ctx) => {
577
+ const messageIds = new Set();
578
+ for (const message of snapshot.messages) {
579
+ if (messageIds.has(message.id)) {
580
+ ctx.addIssue({
581
+ code: "custom",
582
+ path: ["messages"],
583
+ message: `duplicate message id '${message.id}'`,
584
+ });
585
+ }
586
+ messageIds.add(message.id);
587
+ }
588
+ const timelineIds = new Set();
589
+ for (const item of snapshot.timeline) {
590
+ if (timelineIds.has(item.id)) {
591
+ ctx.addIssue({
592
+ code: "custom",
593
+ path: ["timeline"],
594
+ message: `duplicate timeline item id '${item.id}'`,
595
+ });
596
+ }
597
+ timelineIds.add(item.id);
598
+ if (item.type === "message" && !messageIds.has(item.messageId)) {
599
+ ctx.addIssue({
600
+ code: "custom",
601
+ path: ["timeline"],
602
+ message: `timeline message item '${item.id}' references unknown message '${item.messageId}'`,
603
+ });
604
+ }
605
+ }
606
+ });
607
+ const sessionProtocolDeltaReasonSchema = z.enum([
608
+ "user-message",
609
+ "assistant-stream",
610
+ "assistant-message",
611
+ "tool-run",
612
+ "tool-result",
613
+ "notice",
614
+ "agent-run",
615
+ "maintenance",
616
+ "configuration",
617
+ "recovery",
618
+ ]);
619
+ const sessionProtocolChangeSchema = z.discriminatedUnion("type", [
620
+ z
621
+ .object({
622
+ type: z.literal("lifecycle.set"),
623
+ lifecycle: sessionProtocolSessionLifecycleSchema,
624
+ })
625
+ .strict(),
626
+ z
627
+ .object({
628
+ type: z.literal("message.append"),
629
+ message: sessionProtocolMessageSchema,
630
+ timelineItem: sessionProtocolTimelineItemSchema.optional(),
631
+ })
632
+ .strict(),
633
+ z
634
+ .object({
635
+ type: z.literal("message.replace"),
636
+ message: sessionProtocolMessageSchema,
637
+ })
638
+ .strict(),
639
+ z
640
+ .object({
641
+ type: z.literal("message.content.append"),
642
+ messageId: nonEmptyStringSchema,
643
+ text: z.string().optional(),
644
+ thinking: z.string().optional(),
645
+ timestamp: z.number().finite(),
646
+ })
647
+ .strict(),
648
+ z
649
+ .object({
650
+ type: z.literal("timeline.append"),
651
+ item: sessionProtocolTimelineItemSchema,
652
+ })
653
+ .strict(),
654
+ z
655
+ .object({
656
+ type: z.literal("timeline.replace"),
657
+ item: sessionProtocolTimelineItemSchema,
658
+ })
659
+ .strict(),
660
+ z
661
+ .object({
662
+ type: z.literal("timeline.remove"),
663
+ id: nonEmptyStringSchema,
664
+ })
665
+ .strict(),
666
+ z
667
+ .object({
668
+ type: z.literal("tool.set"),
669
+ tool: sessionProtocolToolRunSchema,
670
+ })
671
+ .strict(),
672
+ z
673
+ .object({
674
+ type: z.literal("tool.remove"),
675
+ id: nonEmptyStringSchema,
676
+ })
677
+ .strict(),
678
+ z
679
+ .object({
680
+ type: z.literal("agent.set"),
681
+ agent: sessionProtocolAgentRunSchema,
682
+ })
683
+ .strict(),
684
+ z
685
+ .object({
686
+ type: z.literal("agent.remove"),
687
+ id: nonEmptyStringSchema,
688
+ })
689
+ .strict(),
690
+ z
691
+ .object({
692
+ type: z.literal("facet.set"),
693
+ facet: sessionProtocolFacetSchema,
694
+ })
695
+ .strict(),
696
+ z
697
+ .object({
698
+ type: z.literal("facet.remove"),
699
+ id: nonEmptyStringSchema,
700
+ })
701
+ .strict(),
702
+ ]);
703
+ const sessionProtocolDeltaSchema = z.discriminatedUnion("type", [
704
+ z
705
+ .object({
706
+ type: z.literal("snapshot.patch"),
707
+ changes: z.array(sessionProtocolChangeSchema),
708
+ })
709
+ .strict(),
710
+ z
711
+ .object({
712
+ type: z.literal("snapshot.reset"),
713
+ snapshot: sessionProtocolSnapshotSchema,
714
+ })
715
+ .strict(),
716
+ ]);
717
+ const sessionProtocolDeltaMessageSchema = z
718
+ .object({
719
+ version: z.literal(SESSION_PROTOCOL_VERSION),
720
+ type: z.literal("session.delta"),
721
+ sessionId: nonEmptyStringSchema,
722
+ fromRevision: z.number().int().positive().nullable(),
723
+ toRevision: z.number().int().positive(),
724
+ reason: sessionProtocolDeltaReasonSchema,
725
+ delta: sessionProtocolDeltaSchema,
726
+ })
727
+ .strict()
728
+ .superRefine((message, ctx) => {
729
+ if (message.delta.type === "snapshot.patch" && message.fromRevision === null) {
730
+ ctx.addIssue({
731
+ code: "custom",
732
+ path: ["fromRevision"],
733
+ message: "snapshot.patch delta requires fromRevision",
734
+ });
735
+ }
736
+ if (message.delta.type === "snapshot.patch" &&
737
+ message.fromRevision !== null &&
738
+ message.toRevision <= message.fromRevision) {
739
+ ctx.addIssue({
740
+ code: "custom",
741
+ path: ["toRevision"],
742
+ message: "snapshot.patch toRevision must be greater than fromRevision",
743
+ });
744
+ }
745
+ if (message.delta.type === "snapshot.patch") {
746
+ message.delta.changes.forEach((change, index) => {
747
+ if (change.type === "message.content.append" &&
748
+ (change.text === undefined || change.text.length === 0) &&
749
+ (change.thinking === undefined || change.thinking.length === 0)) {
750
+ ctx.addIssue({
751
+ code: "custom",
752
+ path: ["delta", "changes", index],
753
+ message: "message.content.append requires text or thinking",
754
+ });
755
+ }
756
+ });
757
+ }
758
+ if (message.delta.type === "snapshot.reset" &&
759
+ message.delta.snapshot.revision !== message.toRevision) {
760
+ ctx.addIssue({
761
+ code: "custom",
762
+ path: ["delta", "snapshot", "revision"],
763
+ message: "snapshot.reset revision must equal toRevision",
764
+ });
765
+ }
766
+ });
767
+ const sessionProtocolEphemeralAgentThreadUpdateEventSchema = z
768
+ .object({
769
+ type: z.literal("ephemeral-agent.thread-update"),
770
+ contextId: nonEmptyStringSchema,
771
+ threadId: nonEmptyStringSchema,
772
+ update: z
773
+ .object({
774
+ costTotal: z.number().finite(),
775
+ usage: sessionProtocolAgentUsageSchema,
776
+ lastActivityText: z.string().optional(),
777
+ })
778
+ .strict(),
779
+ })
780
+ .strict();
781
+ const sessionProtocolEphemeralEventSchema = sessionProtocolEphemeralAgentThreadUpdateEventSchema;
782
+ const sessionProtocolEphemeralMessageSchema = z
783
+ .object({
784
+ version: z.literal(SESSION_PROTOCOL_VERSION),
785
+ type: z.literal("session.ephemeral"),
786
+ sessionId: nonEmptyStringSchema,
787
+ event: sessionProtocolEphemeralEventSchema,
788
+ })
789
+ .strict();
790
+ const sessionProtocolInitializeResultSchema = z
791
+ .object({
792
+ protocolVersion: z.literal(SESSION_PROTOCOL_VERSION),
793
+ methods: sessionProtocolMethodListSchema,
794
+ alreadyInitialized: z.boolean(),
795
+ })
796
+ .strict();
797
+ const sessionProtocolListResultSchema = z
798
+ .object({
799
+ sessions: z.array(sessionProtocolSessionSummarySchema),
800
+ })
801
+ .strict();
802
+ const sessionProtocolSubmitResultSchema = z
803
+ .object({
804
+ turn: z
805
+ .object({
806
+ aborted: z.boolean(),
807
+ blocked: z
808
+ .object({
809
+ reason: z.literal("auto-compaction-failed"),
810
+ message: z.string(),
811
+ })
812
+ .strict()
813
+ .optional(),
814
+ })
815
+ .strict(),
816
+ })
817
+ .strict();
818
+ const sessionProtocolTurnResultSchema = sessionProtocolSubmitResultSchema;
819
+ const sessionProtocolRetryResultSchema = sessionProtocolTurnResultSchema;
820
+ const sessionProtocolSubmitWithUserResultSchema = sessionProtocolTurnResultSchema
821
+ .extend({
822
+ userHistoryEntryId: nonEmptyStringSchema,
823
+ })
824
+ .strict();
825
+ const sessionProtocolRecordResultSchema = z
826
+ .object({
827
+ snapshot: sessionProtocolSnapshotSchema,
828
+ userHistoryEntryId: nonEmptyStringSchema,
829
+ })
830
+ .strict();
831
+ const sessionProtocolExecResultSchema = z
832
+ .object({
833
+ output: z.string(),
834
+ stdout: z.string(),
835
+ stderr: z.string(),
836
+ exitCode: z.number().int().nullable(),
837
+ truncated: z.boolean(),
838
+ })
839
+ .strict();
840
+ const sessionProtocolInterruptResultSchema = z
841
+ .object({
842
+ interrupted: z.boolean(),
843
+ isTurnRunning: z.boolean(),
844
+ })
845
+ .strict();
846
+ const sessionProtocolCompactResultSchema = z
847
+ .object({
848
+ snapshot: sessionProtocolSnapshotSchema,
849
+ compactionMessage: nonEmptyStringSchema,
850
+ includedLastAssistant: z.boolean(),
851
+ })
852
+ .strict();
853
+ const sessionProtocolPruneResultSchema = z
854
+ .object({
855
+ snapshot: sessionProtocolSnapshotSchema,
856
+ message: nonEmptyStringSchema,
857
+ noop: z.boolean(),
858
+ bashResultsPruned: z.number().int().nonnegative(),
859
+ editCallsPruned: z.number().int().nonnegative(),
860
+ editResultsPruned: z.number().int().nonnegative(),
861
+ bytesPruned: z.number().int().nonnegative(),
862
+ })
863
+ .strict();
864
+ const sessionProtocolRewindResultSchema = z
865
+ .object({
866
+ snapshot: sessionProtocolSnapshotSchema,
867
+ historyEntryId: nonEmptyStringSchema,
868
+ text: z.string(),
869
+ removedEntryIds: z.array(nonEmptyStringSchema),
870
+ })
871
+ .strict();
872
+ const sessionProtocolReloadResultSchema = z
873
+ .object({
874
+ snapshot: sessionProtocolSnapshotSchema,
875
+ warnings: z.array(z.string()),
876
+ counts: z
877
+ .object({
878
+ personas: z.number().int().nonnegative(),
879
+ prompts: z.number().int().nonnegative(),
880
+ skills: z.number().int().nonnegative(),
881
+ })
882
+ .strict(),
883
+ })
884
+ .strict();
885
+ const sessionProtocolResolvePromptResultSchema = z
886
+ .object({
887
+ promptId: nonEmptyStringSchema,
888
+ text: z.string(),
889
+ })
890
+ .strict();
891
+ const sessionProtocolAutocompletePathsResultSchema = z
892
+ .object({
893
+ paths: z.array(z.string()),
894
+ })
895
+ .strict();
896
+ const sessionProtocolUnobserveResultSchema = z
897
+ .object({
898
+ unobserved: z.literal(true),
899
+ })
900
+ .strict();
901
+ const sessionProtocolTerminateSubagentResultSchema = z
902
+ .object({
903
+ found: z.boolean(),
904
+ })
905
+ .strict();
906
+ const sessionProtocolEphemeralCreateResultSchema = z
907
+ .object({
908
+ contextId: nonEmptyStringSchema,
909
+ })
910
+ .strict();
911
+ const sessionProtocolEphemeralSubmitResultSchema = z
912
+ .object({
913
+ threadId: nonEmptyStringSchema,
914
+ response: z.string(),
915
+ })
916
+ .strict();
917
+ const sessionProtocolEphemeralCloseResultSchema = z
918
+ .object({
919
+ closed: z.boolean(),
920
+ })
921
+ .strict();
922
+ export function isSessionProtocolMethod(value) {
923
+ return typeof value === "string" && SESSION_PROTOCOL_METHOD_SET.has(value);
924
+ }
925
+ export function createSessionProtocolError(code, message, data) {
926
+ return data === undefined ? { code, message } : { code, message, data };
927
+ }
928
+ export function createSessionProtocolSuccessResponse(id, method, result) {
929
+ const parsed = validateSessionProtocolResult(method, result);
930
+ if (!parsed.ok) {
931
+ throw new Error(parsed.error.message);
932
+ }
933
+ const response = {
934
+ version: SESSION_PROTOCOL_VERSION,
935
+ type: "response",
936
+ id,
937
+ ok: true,
938
+ result: parsed.value,
939
+ };
940
+ const parsedResponse = sessionProtocolResponseSuccessSchema.safeParse(response);
941
+ if (!parsedResponse.success) {
942
+ throw new Error(`session protocol success response is invalid: ${formatZodError(parsedResponse.error)}`);
943
+ }
944
+ return parsedResponse.data;
945
+ }
946
+ export function createSessionProtocolErrorResponse(id, code, message, data) {
947
+ const response = {
948
+ version: SESSION_PROTOCOL_VERSION,
949
+ type: "response",
950
+ id,
951
+ ok: false,
952
+ error: createSessionProtocolError(code, message, data),
953
+ };
954
+ const parsed = sessionProtocolResponseErrorSchema.safeParse(response);
955
+ if (!parsed.success) {
956
+ throw new Error(`session protocol error response is invalid: ${formatZodError(parsed.error)}`);
957
+ }
958
+ return parsed.data;
959
+ }
960
+ export function createSessionProtocolDeltaMessage(options) {
961
+ const message = {
962
+ version: SESSION_PROTOCOL_VERSION,
963
+ type: "session.delta",
964
+ sessionId: options.sessionId,
965
+ fromRevision: options.fromRevision,
966
+ toRevision: options.toRevision,
967
+ reason: options.reason,
968
+ delta: options.delta,
969
+ };
970
+ const parsedMessage = sessionProtocolDeltaMessageSchema.safeParse(message);
971
+ if (!parsedMessage.success) {
972
+ throw new Error(`session protocol delta message is invalid: ${formatZodError(parsedMessage.error)}`);
973
+ }
974
+ return parsedMessage.data;
975
+ }
976
+ export function createSessionProtocolEphemeralMessage(options) {
977
+ const message = {
978
+ version: SESSION_PROTOCOL_VERSION,
979
+ type: "session.ephemeral",
980
+ sessionId: options.sessionId,
981
+ event: options.event,
982
+ };
983
+ const parsedMessage = sessionProtocolEphemeralMessageSchema.safeParse(message);
984
+ if (!parsedMessage.success) {
985
+ throw new Error(`session protocol ephemeral message is invalid: ${formatZodError(parsedMessage.error)}`);
986
+ }
987
+ return parsedMessage.data;
988
+ }
989
+ export function applySessionProtocolDelta(snapshot, message) {
990
+ if (message.sessionId !== snapshot.sessionId) {
991
+ throw new Error(`session delta targets '${message.sessionId}' but current snapshot is '${snapshot.sessionId}'`);
992
+ }
993
+ if (message.delta.type === "snapshot.reset") {
994
+ return structuredClone(message.delta.snapshot);
995
+ }
996
+ if (message.fromRevision !== snapshot.revision) {
997
+ throw new Error(`session delta revision mismatch: expected ${snapshot.revision}, got ${message.fromRevision}`);
998
+ }
999
+ const contentAppendSnapshot = applyContentAppendDelta(snapshot, message);
1000
+ if (contentAppendSnapshot) {
1001
+ return contentAppendSnapshot;
1002
+ }
1003
+ const keyedPatchSnapshot = applyKeyedRecordDelta(snapshot, message);
1004
+ if (keyedPatchSnapshot) {
1005
+ return keyedPatchSnapshot;
1006
+ }
1007
+ const next = structuredClone(snapshot);
1008
+ next.revision = message.toRevision;
1009
+ for (const change of message.delta.changes) {
1010
+ switch (change.type) {
1011
+ case "lifecycle.set":
1012
+ next.lifecycle = change.lifecycle;
1013
+ break;
1014
+ case "message.append":
1015
+ next.messages.push(structuredClone(change.message));
1016
+ if (change.timelineItem) {
1017
+ next.timeline.push(structuredClone(change.timelineItem));
1018
+ }
1019
+ break;
1020
+ case "message.replace": {
1021
+ const index = next.messages.findIndex((entry) => entry.id === change.message.id);
1022
+ if (index === -1) {
1023
+ next.messages.push(structuredClone(change.message));
1024
+ }
1025
+ else {
1026
+ next.messages[index] = structuredClone(change.message);
1027
+ }
1028
+ break;
1029
+ }
1030
+ case "message.content.append": {
1031
+ appendMessageContent(next, change);
1032
+ break;
1033
+ }
1034
+ case "timeline.append":
1035
+ next.timeline.push(structuredClone(change.item));
1036
+ break;
1037
+ case "timeline.replace": {
1038
+ const index = next.timeline.findIndex((item) => item.id === change.item.id);
1039
+ if (index === -1) {
1040
+ next.timeline.push(structuredClone(change.item));
1041
+ }
1042
+ else {
1043
+ next.timeline[index] = structuredClone(change.item);
1044
+ }
1045
+ break;
1046
+ }
1047
+ case "timeline.remove":
1048
+ next.timeline = next.timeline.filter((item) => item.id !== change.id);
1049
+ break;
1050
+ case "tool.set":
1051
+ next.tools[change.tool.id] = structuredClone(change.tool);
1052
+ break;
1053
+ case "tool.remove":
1054
+ delete next.tools[change.id];
1055
+ break;
1056
+ case "agent.set":
1057
+ next.agents[change.agent.id] = structuredClone(change.agent);
1058
+ break;
1059
+ case "agent.remove":
1060
+ delete next.agents[change.id];
1061
+ break;
1062
+ case "facet.set":
1063
+ next.facets[change.facet.id] = structuredClone(change.facet);
1064
+ break;
1065
+ case "facet.remove":
1066
+ delete next.facets[change.id];
1067
+ break;
1068
+ }
1069
+ }
1070
+ return next;
1071
+ }
1072
+ function applyKeyedRecordDelta(snapshot, message) {
1073
+ if (message.delta.type !== "snapshot.patch") {
1074
+ return undefined;
1075
+ }
1076
+ let nextTools;
1077
+ let nextAgents;
1078
+ let nextFacets;
1079
+ const cloneTools = () => {
1080
+ nextTools ??= { ...snapshot.tools };
1081
+ return nextTools;
1082
+ };
1083
+ const cloneAgents = () => {
1084
+ nextAgents ??= { ...snapshot.agents };
1085
+ return nextAgents;
1086
+ };
1087
+ const cloneFacets = () => {
1088
+ nextFacets ??= { ...snapshot.facets };
1089
+ return nextFacets;
1090
+ };
1091
+ for (const change of message.delta.changes) {
1092
+ switch (change.type) {
1093
+ case "tool.set":
1094
+ cloneTools()[change.tool.id] = structuredClone(change.tool);
1095
+ break;
1096
+ case "tool.remove":
1097
+ delete cloneTools()[change.id];
1098
+ break;
1099
+ case "agent.set":
1100
+ cloneAgents()[change.agent.id] = structuredClone(change.agent);
1101
+ break;
1102
+ case "agent.remove":
1103
+ delete cloneAgents()[change.id];
1104
+ break;
1105
+ case "facet.set":
1106
+ cloneFacets()[change.facet.id] = structuredClone(change.facet);
1107
+ break;
1108
+ case "facet.remove":
1109
+ delete cloneFacets()[change.id];
1110
+ break;
1111
+ default:
1112
+ return undefined;
1113
+ }
1114
+ }
1115
+ return {
1116
+ ...snapshot,
1117
+ revision: message.toRevision,
1118
+ ...(nextTools ? { tools: nextTools } : {}),
1119
+ ...(nextAgents ? { agents: nextAgents } : {}),
1120
+ ...(nextFacets ? { facets: nextFacets } : {}),
1121
+ };
1122
+ }
1123
+ function applyContentAppendDelta(snapshot, message) {
1124
+ if (message.delta.type !== "snapshot.patch" ||
1125
+ message.delta.changes.length !== 1 ||
1126
+ message.delta.changes[0]?.type !== "message.content.append") {
1127
+ return undefined;
1128
+ }
1129
+ const change = message.delta.changes[0];
1130
+ const messageIndex = snapshot.messages.findIndex((entry) => entry.id === change.messageId);
1131
+ if (messageIndex === -1) {
1132
+ throw new Error(`message.content.append targets unknown message '${change.messageId}'`);
1133
+ }
1134
+ const target = snapshot.messages[messageIndex];
1135
+ if (target.message.role !== "assistant" || !Array.isArray(target.message.content)) {
1136
+ throw new Error(`message.content.append targets non-assistant message '${change.messageId}'`);
1137
+ }
1138
+ if (target.state !== "draft") {
1139
+ throw new Error(`message.content.append targets non-draft message '${change.messageId}'`);
1140
+ }
1141
+ const nextMessages = [...snapshot.messages];
1142
+ const nextTarget = {
1143
+ ...target,
1144
+ message: {
1145
+ ...target.message,
1146
+ content: target.message.content.map((item) => ({ ...item })),
1147
+ },
1148
+ };
1149
+ nextMessages[messageIndex] = nextTarget;
1150
+ const next = {
1151
+ ...snapshot,
1152
+ revision: message.toRevision,
1153
+ messages: nextMessages,
1154
+ };
1155
+ appendMessageContent(next, change);
1156
+ return next;
1157
+ }
1158
+ function appendMessageContent(snapshot, change) {
1159
+ const entry = snapshot.messages.find((message) => message.id === change.messageId);
1160
+ if (!entry) {
1161
+ throw new Error(`message.content.append targets unknown message '${change.messageId}'`);
1162
+ }
1163
+ const message = entry.message;
1164
+ if (message.role !== "assistant" || !Array.isArray(message.content)) {
1165
+ throw new Error(`message.content.append targets non-assistant message '${change.messageId}'`);
1166
+ }
1167
+ if (entry.state !== "draft") {
1168
+ throw new Error(`message.content.append targets non-draft message '${change.messageId}'`);
1169
+ }
1170
+ if (change.thinking) {
1171
+ appendAssistantTextBlock(message.content, "thinking", change.thinking);
1172
+ }
1173
+ if (change.text) {
1174
+ appendAssistantTextBlock(message.content, "text", change.text);
1175
+ }
1176
+ message.timestamp = change.timestamp;
1177
+ }
1178
+ function appendAssistantTextBlock(content, type, value) {
1179
+ if (type === "text") {
1180
+ const existing = content.find((item) => item.type === "text");
1181
+ if (existing) {
1182
+ existing.text += value;
1183
+ return;
1184
+ }
1185
+ content.push({ type: "text", text: value });
1186
+ return;
1187
+ }
1188
+ const existing = content.find((item) => item.type === "thinking");
1189
+ if (existing) {
1190
+ existing.thinking += value;
1191
+ return;
1192
+ }
1193
+ const textIndex = content.findIndex((item) => item.type === "text");
1194
+ if (textIndex === -1) {
1195
+ content.push({ type: "thinking", thinking: value });
1196
+ return;
1197
+ }
1198
+ content.splice(textIndex, 0, { type: "thinking", thinking: value });
1199
+ }
1200
+ export function createSessionProtocolReadyMessage() {
1201
+ return {
1202
+ version: SESSION_PROTOCOL_VERSION,
1203
+ type: "ready",
1204
+ methods: [...SESSION_PROTOCOL_METHODS],
1205
+ };
1206
+ }
1207
+ export function serializeSessionProtocolMessage(message) {
1208
+ return JSON.stringify(message);
1209
+ }
1210
+ export function parseSessionProtocolRequestLine(line) {
1211
+ const trimmed = line.trim();
1212
+ if (!trimmed) {
1213
+ return {
1214
+ ok: false,
1215
+ id: null,
1216
+ error: createSessionProtocolError(SESSION_PROTOCOL_ERROR_CODES.invalidRequest, "request line cannot be empty"),
1217
+ };
1218
+ }
1219
+ let parsed;
1220
+ try {
1221
+ parsed = JSON.parse(trimmed);
1222
+ }
1223
+ catch (error) {
1224
+ return {
1225
+ ok: false,
1226
+ id: null,
1227
+ error: createSessionProtocolError(SESSION_PROTOCOL_ERROR_CODES.parseError, "failed to parse JSON request line", {
1228
+ cause: error instanceof Error ? error.message : String(error),
1229
+ }),
1230
+ };
1231
+ }
1232
+ const parsedIdField = sessionProtocolIdFieldSchema.safeParse(parsed);
1233
+ const requestIdCandidate = parsedIdField.success
1234
+ ? parseNullableRequestId(parsedIdField.data.id)
1235
+ : null;
1236
+ const requestId = requestIdCandidate?.ok ? requestIdCandidate.id : null;
1237
+ const requestEnvelope = sessionProtocolRequestEnvelopeSchema.safeParse(parsed);
1238
+ if (!requestEnvelope.success) {
1239
+ if (hasIssue(requestEnvelope.error, [], "invalid_type")) {
1240
+ return {
1241
+ ok: false,
1242
+ id: null,
1243
+ error: createSessionProtocolError(SESSION_PROTOCOL_ERROR_CODES.invalidRequest, "request must be a JSON object"),
1244
+ };
1245
+ }
1246
+ if (hasIssue(requestEnvelope.error, ["id"])) {
1247
+ return {
1248
+ ok: false,
1249
+ id: null,
1250
+ error: createSessionProtocolError(SESSION_PROTOCOL_ERROR_CODES.invalidRequest, "request id must be a non-empty string"),
1251
+ };
1252
+ }
1253
+ if (hasIssue(requestEnvelope.error, [], "unrecognized_keys")) {
1254
+ return {
1255
+ ok: false,
1256
+ id: requestId,
1257
+ error: createSessionProtocolError(SESSION_PROTOCOL_ERROR_CODES.invalidRequest, "request contains unsupported top-level fields"),
1258
+ };
1259
+ }
1260
+ if (hasIssue(requestEnvelope.error, ["version"])) {
1261
+ const parsedVersionField = sessionProtocolVersionFieldSchema.safeParse(parsed);
1262
+ const version = parsedVersionField.success ? parsedVersionField.data.version : undefined;
1263
+ return {
1264
+ ok: false,
1265
+ id: requestId,
1266
+ error: createSessionProtocolError(SESSION_PROTOCOL_ERROR_CODES.invalidRequest, `unsupported session protocol version: ${String(version)}`),
1267
+ };
1268
+ }
1269
+ if (hasIssue(requestEnvelope.error, ["type"])) {
1270
+ return {
1271
+ ok: false,
1272
+ id: requestId,
1273
+ error: createSessionProtocolError(SESSION_PROTOCOL_ERROR_CODES.invalidRequest, 'request.type must be "request"'),
1274
+ };
1275
+ }
1276
+ if (hasIssue(requestEnvelope.error, ["method"])) {
1277
+ return {
1278
+ ok: false,
1279
+ id: requestId,
1280
+ error: createSessionProtocolError(SESSION_PROTOCOL_ERROR_CODES.invalidRequest, "request.method must be a string"),
1281
+ };
1282
+ }
1283
+ if (hasIssue(requestEnvelope.error, ["params"])) {
1284
+ return {
1285
+ ok: false,
1286
+ id: requestId,
1287
+ error: createSessionProtocolError(SESSION_PROTOCOL_ERROR_CODES.invalidRequest, "request.params is required"),
1288
+ };
1289
+ }
1290
+ return {
1291
+ ok: false,
1292
+ id: requestId,
1293
+ error: createSessionProtocolError(SESSION_PROTOCOL_ERROR_CODES.invalidRequest, `request is invalid: ${formatZodError(requestEnvelope.error)}`),
1294
+ };
1295
+ }
1296
+ const method = requestEnvelope.data.method;
1297
+ if (!isSessionProtocolMethod(method)) {
1298
+ return {
1299
+ ok: false,
1300
+ id: requestEnvelope.data.id,
1301
+ error: createSessionProtocolError(SESSION_PROTOCOL_ERROR_CODES.methodNotFound, `unsupported method: ${method}`),
1302
+ };
1303
+ }
1304
+ const request = createSessionProtocolRequest(requestEnvelope.data.id, method, requestEnvelope.data.params);
1305
+ if (!request.ok) {
1306
+ return {
1307
+ ok: false,
1308
+ id: requestEnvelope.data.id,
1309
+ error: request.error,
1310
+ };
1311
+ }
1312
+ return {
1313
+ ok: true,
1314
+ request: request.value,
1315
+ };
1316
+ }
1317
+ export function createSessionProtocolRequest(id, method, params) {
1318
+ const parsedId = sessionProtocolRequestIdSchema.safeParse(id);
1319
+ if (!parsedId.success) {
1320
+ return {
1321
+ ok: false,
1322
+ error: createSessionProtocolError(SESSION_PROTOCOL_ERROR_CODES.invalidRequest, "request id must be a non-empty string"),
1323
+ };
1324
+ }
1325
+ const parsed = validateSessionProtocolParams(method, params);
1326
+ if (!parsed.ok) {
1327
+ return parsed;
1328
+ }
1329
+ return {
1330
+ ok: true,
1331
+ value: {
1332
+ ...requestEnvelope(parsedId.data),
1333
+ method,
1334
+ params: parsed.value,
1335
+ },
1336
+ };
1337
+ }
1338
+ function requestEnvelope(id) {
1339
+ return {
1340
+ version: SESSION_PROTOCOL_VERSION,
1341
+ type: "request",
1342
+ id,
1343
+ };
1344
+ }
1345
+ export function parseSessionProtocolOutgoingLine(line) {
1346
+ const trimmed = line.trim();
1347
+ if (!trimmed) {
1348
+ return outgoingParseFailure(null, null, SESSION_PROTOCOL_ERROR_CODES.invalidRequest, "session protocol line cannot be empty", undefined, "empty_line");
1349
+ }
1350
+ let parsed;
1351
+ try {
1352
+ parsed = JSON.parse(trimmed);
1353
+ }
1354
+ catch (error) {
1355
+ return outgoingParseFailure(null, null, SESSION_PROTOCOL_ERROR_CODES.parseError, "failed to parse JSON session protocol line", {
1356
+ cause: error instanceof Error ? error.message : String(error),
1357
+ }, "parse_error");
1358
+ }
1359
+ const routing = sessionProtocolOutgoingRoutingSchema.safeParse(parsed);
1360
+ if (!routing.success) {
1361
+ if (hasIssue(routing.error, [], "invalid_type")) {
1362
+ return outgoingParseFailure(null, null, SESSION_PROTOCOL_ERROR_CODES.invalidRequest, "session protocol payload must be a JSON object");
1363
+ }
1364
+ if (hasIssue(routing.error, ["version"])) {
1365
+ const parsedVersionField = sessionProtocolVersionFieldSchema.safeParse(parsed);
1366
+ const version = parsedVersionField.success ? parsedVersionField.data.version : undefined;
1367
+ return outgoingParseFailure(null, null, SESSION_PROTOCOL_ERROR_CODES.invalidRequest, `unsupported session protocol version: ${String(version)}`, undefined, "unsupported_version");
1368
+ }
1369
+ const parsedTypeField = sessionProtocolTypeFieldSchema.safeParse(parsed);
1370
+ const messageType = parsedTypeField.success ? parsedTypeField.data.type : undefined;
1371
+ return outgoingParseFailure(null, null, SESSION_PROTOCOL_ERROR_CODES.invalidRequest, `unsupported session protocol message type: ${String(messageType)}`, undefined, "unsupported_message_type");
1372
+ }
1373
+ if (routing.data.type === "ready") {
1374
+ return parseSessionProtocolReadyMessage(parsed);
1375
+ }
1376
+ if (routing.data.type === "session.delta") {
1377
+ return parseSessionProtocolDeltaMessage(parsed);
1378
+ }
1379
+ if (routing.data.type === "session.ephemeral") {
1380
+ return parseSessionProtocolEphemeralMessage(parsed);
1381
+ }
1382
+ return parseSessionProtocolResponseMessage(parsed);
1383
+ }
1384
+ export function validateSessionProtocolParams(method, params) {
1385
+ switch (method) {
1386
+ case "initialize":
1387
+ return validateInitializeParams(params);
1388
+ case "session.create":
1389
+ return validateCreateParams(params);
1390
+ case "session.observe":
1391
+ return validateSessionIdParams("session.observe", params);
1392
+ case "session.unobserve":
1393
+ return validateSessionIdParams("session.unobserve", params);
1394
+ case "session.record":
1395
+ return validateRecordParams(params);
1396
+ case "session.submit":
1397
+ case "session.queue":
1398
+ case "session.steer":
1399
+ return validateUserMessageParams(method, params);
1400
+ case "session.exec":
1401
+ return validateExecParams(params);
1402
+ case "session.list":
1403
+ return validateNoParams(method, params);
1404
+ case "session.retry":
1405
+ case "session.interrupt":
1406
+ case "session.snapshot":
1407
+ case "session.reload":
1408
+ return validateSessionIdParams(method, params);
1409
+ case "session.setRisk":
1410
+ return validateSetRiskParams(params);
1411
+ case "session.setReasoning":
1412
+ return validateSetReasoningParams(params);
1413
+ case "session.setPersona":
1414
+ return validateSetPersonaParams(params);
1415
+ case "session.resolvePrompt":
1416
+ return validateResolvePromptParams(params);
1417
+ case "session.autocompletePaths":
1418
+ return validateAutocompletePathsParams(params);
1419
+ case "session.compact":
1420
+ return validateCompactParams(params);
1421
+ case "session.prune":
1422
+ return validatePruneParams(params);
1423
+ case "session.rewind":
1424
+ return validateRewindParams(params);
1425
+ case "session.terminateSubagent":
1426
+ return validateTerminateSubagentParams(params);
1427
+ case "session.ephemeral.create":
1428
+ return validateEphemeralCreateParams(params);
1429
+ case "session.ephemeral.submit":
1430
+ return validateEphemeralSubmitParams(params);
1431
+ case "session.ephemeral.close":
1432
+ return validateEphemeralCloseParams(params);
1433
+ }
1434
+ }
1435
+ export function validateSessionProtocolResult(method, result) {
1436
+ switch (method) {
1437
+ case "initialize":
1438
+ return validateResult(method, result, sessionProtocolInitializeResultSchema);
1439
+ case "session.create":
1440
+ case "session.observe":
1441
+ case "session.snapshot":
1442
+ case "session.setRisk":
1443
+ case "session.setReasoning":
1444
+ case "session.setPersona":
1445
+ return validateResult(method, result, sessionProtocolSnapshotSchema);
1446
+ case "session.resolvePrompt":
1447
+ return validateResult(method, result, sessionProtocolResolvePromptResultSchema);
1448
+ case "session.autocompletePaths":
1449
+ return validateResult(method, result, sessionProtocolAutocompletePathsResultSchema);
1450
+ case "session.unobserve":
1451
+ return validateResult(method, result, sessionProtocolUnobserveResultSchema);
1452
+ case "session.reload":
1453
+ return validateResult(method, result, sessionProtocolReloadResultSchema);
1454
+ case "session.compact":
1455
+ return validateResult(method, result, sessionProtocolCompactResultSchema);
1456
+ case "session.prune":
1457
+ return validateResult(method, result, sessionProtocolPruneResultSchema);
1458
+ case "session.rewind":
1459
+ return validateResult(method, result, sessionProtocolRewindResultSchema);
1460
+ case "session.terminateSubagent":
1461
+ return validateResult(method, result, sessionProtocolTerminateSubagentResultSchema);
1462
+ case "session.ephemeral.create":
1463
+ return validateResult(method, result, sessionProtocolEphemeralCreateResultSchema);
1464
+ case "session.ephemeral.submit":
1465
+ return validateResult(method, result, sessionProtocolEphemeralSubmitResultSchema);
1466
+ case "session.ephemeral.close":
1467
+ return validateResult(method, result, sessionProtocolEphemeralCloseResultSchema);
1468
+ case "session.list":
1469
+ return validateResult(method, result, sessionProtocolListResultSchema);
1470
+ case "session.submit":
1471
+ case "session.queue":
1472
+ case "session.steer":
1473
+ return validateResult(method, result, sessionProtocolSubmitWithUserResultSchema);
1474
+ case "session.record":
1475
+ return validateResult(method, result, sessionProtocolRecordResultSchema);
1476
+ case "session.retry":
1477
+ return validateResult(method, result, sessionProtocolRetryResultSchema);
1478
+ case "session.exec":
1479
+ return validateResult(method, result, sessionProtocolExecResultSchema);
1480
+ case "session.interrupt":
1481
+ return validateResult(method, result, sessionProtocolInterruptResultSchema);
1482
+ }
1483
+ }
1484
+ function validateSessionIdParams(method, params) {
1485
+ const parsed = sessionProtocolSessionIdParamsSchema.safeParse(params);
1486
+ if (!parsed.success) {
1487
+ const message = hasIssue(parsed.error, [], "invalid_type")
1488
+ ? `${method} params must be an object`
1489
+ : hasIssue(parsed.error, [], "unrecognized_keys")
1490
+ ? `${method} params only support sessionId`
1491
+ : hasIssue(parsed.error, ["sessionId"])
1492
+ ? `${method} params.sessionId must be a non-empty string`
1493
+ : `${method} params are invalid: ${formatZodError(parsed.error)}`;
1494
+ return invalidParams(message);
1495
+ }
1496
+ return {
1497
+ ok: true,
1498
+ value: {
1499
+ sessionId: parsed.data.sessionId,
1500
+ },
1501
+ };
1502
+ }
1503
+ function validateInitializeParams(params) {
1504
+ const parsed = sessionProtocolInitializeParamsSchema.safeParse(params);
1505
+ if (!parsed.success) {
1506
+ const message = hasIssue(parsed.error, [], "invalid_type")
1507
+ ? "initialize params must be an object with client metadata"
1508
+ : hasIssue(parsed.error, ["client"]) || hasIssue(parsed.error, [], "unrecognized_keys")
1509
+ ? "initialize.client must be an object with name/version strings"
1510
+ : hasIssue(parsed.error, ["client", "name"])
1511
+ ? "initialize.client.name must be a non-empty string"
1512
+ : hasIssue(parsed.error, ["client", "version"])
1513
+ ? "initialize.client.version must be a non-empty string"
1514
+ : `initialize params are invalid: ${formatZodError(parsed.error)}`;
1515
+ return invalidParams(message);
1516
+ }
1517
+ return {
1518
+ ok: true,
1519
+ value: {
1520
+ client: {
1521
+ name: parsed.data.client.name,
1522
+ version: parsed.data.client.version,
1523
+ },
1524
+ },
1525
+ };
1526
+ }
1527
+ function validateUserMessageParams(method, params) {
1528
+ const parsed = sessionProtocolUserMessageParamsSchema.safeParse(params);
1529
+ if (!parsed.success) {
1530
+ const message = hasIssue(parsed.error, [], "invalid_type")
1531
+ ? `${method} params must be an object`
1532
+ : hasIssue(parsed.error, [], "unrecognized_keys")
1533
+ ? `${method} params only support sessionId, text, and optional historyEntryId`
1534
+ : hasIssue(parsed.error, ["sessionId"])
1535
+ ? `${method} params.sessionId must be a non-empty string`
1536
+ : hasIssue(parsed.error, ["text"])
1537
+ ? `${method} params.text must be a string`
1538
+ : hasIssue(parsed.error, ["historyEntryId"])
1539
+ ? `${method} params.historyEntryId must be a non-empty string when provided`
1540
+ : `${method} params are invalid: ${formatZodError(parsed.error)}`;
1541
+ return invalidParams(message);
1542
+ }
1543
+ return {
1544
+ ok: true,
1545
+ value: {
1546
+ sessionId: parsed.data.sessionId,
1547
+ text: parsed.data.text,
1548
+ ...(parsed.data.historyEntryId !== undefined
1549
+ ? { historyEntryId: parsed.data.historyEntryId }
1550
+ : {}),
1551
+ },
1552
+ };
1553
+ }
1554
+ function validateRecordParams(params) {
1555
+ const parsed = sessionProtocolRecordParamsSchema.safeParse(params);
1556
+ if (!parsed.success) {
1557
+ const message = hasIssue(parsed.error, [], "invalid_type")
1558
+ ? "session.record params must be an object"
1559
+ : hasIssue(parsed.error, [], "unrecognized_keys")
1560
+ ? "session.record params only support sessionId, text, and optional historyEntryId"
1561
+ : hasIssue(parsed.error, ["sessionId"])
1562
+ ? "session.record params.sessionId must be a non-empty string"
1563
+ : hasIssue(parsed.error, ["text"])
1564
+ ? "session.record params.text must be a string"
1565
+ : hasIssue(parsed.error, ["historyEntryId"])
1566
+ ? "session.record params.historyEntryId must be a non-empty string when provided"
1567
+ : `session.record params are invalid: ${formatZodError(parsed.error)}`;
1568
+ return invalidParams(message);
1569
+ }
1570
+ return {
1571
+ ok: true,
1572
+ value: {
1573
+ sessionId: parsed.data.sessionId,
1574
+ text: parsed.data.text,
1575
+ ...(parsed.data.historyEntryId !== undefined
1576
+ ? { historyEntryId: parsed.data.historyEntryId }
1577
+ : {}),
1578
+ },
1579
+ };
1580
+ }
1581
+ function validateExecParams(params) {
1582
+ const parsed = sessionProtocolExecParamsSchema.safeParse(params);
1583
+ if (!parsed.success) {
1584
+ const message = hasIssue(parsed.error, [], "invalid_type")
1585
+ ? "session.exec params must be an object"
1586
+ : hasIssue(parsed.error, [], "unrecognized_keys")
1587
+ ? "session.exec params only support sessionId, command, optional cwd, and optional timeoutMs"
1588
+ : hasIssue(parsed.error, ["sessionId"])
1589
+ ? "session.exec params.sessionId must be a non-empty string"
1590
+ : hasIssue(parsed.error, ["command"])
1591
+ ? "session.exec params.command must be a non-empty string"
1592
+ : hasIssue(parsed.error, ["cwd"])
1593
+ ? "session.exec params.cwd must be a non-empty string when provided"
1594
+ : hasIssue(parsed.error, ["timeoutMs"])
1595
+ ? "session.exec params.timeoutMs must be a positive integer when provided"
1596
+ : `session.exec params are invalid: ${formatZodError(parsed.error)}`;
1597
+ return invalidParams(message);
1598
+ }
1599
+ return {
1600
+ ok: true,
1601
+ value: {
1602
+ sessionId: parsed.data.sessionId,
1603
+ command: parsed.data.command,
1604
+ ...(parsed.data.cwd !== undefined ? { cwd: parsed.data.cwd } : {}),
1605
+ ...(parsed.data.timeoutMs !== undefined ? { timeoutMs: parsed.data.timeoutMs } : {}),
1606
+ },
1607
+ };
1608
+ }
1609
+ function validateSetRiskParams(params) {
1610
+ const parsed = sessionProtocolSetRiskParamsSchema.safeParse(params);
1611
+ if (!parsed.success) {
1612
+ const message = hasIssue(parsed.error, [], "invalid_type")
1613
+ ? "session.setRisk params must be an object"
1614
+ : hasIssue(parsed.error, [], "unrecognized_keys")
1615
+ ? "session.setRisk params only support sessionId and riskLevel"
1616
+ : hasIssue(parsed.error, ["sessionId"])
1617
+ ? "session.setRisk params.sessionId must be a non-empty string"
1618
+ : hasIssue(parsed.error, ["riskLevel"])
1619
+ ? "session.setRisk params.riskLevel must be 'read-only' or 'read-write'"
1620
+ : `session.setRisk params are invalid: ${formatZodError(parsed.error)}`;
1621
+ return invalidParams(message);
1622
+ }
1623
+ return {
1624
+ ok: true,
1625
+ value: {
1626
+ sessionId: parsed.data.sessionId,
1627
+ riskLevel: parsed.data.riskLevel,
1628
+ },
1629
+ };
1630
+ }
1631
+ function validateSetReasoningParams(params) {
1632
+ const parsed = sessionProtocolSetReasoningParamsSchema.safeParse(params);
1633
+ if (!parsed.success) {
1634
+ const message = hasIssue(parsed.error, [], "invalid_type")
1635
+ ? "session.setReasoning params must be an object"
1636
+ : hasIssue(parsed.error, [], "unrecognized_keys")
1637
+ ? "session.setReasoning params only support sessionId and reasoning"
1638
+ : hasIssue(parsed.error, ["sessionId"])
1639
+ ? "session.setReasoning params.sessionId must be a non-empty string"
1640
+ : hasIssue(parsed.error, ["reasoning"])
1641
+ ? "session.setReasoning params.reasoning must be one of none, minimal, low, medium, high, or xhigh"
1642
+ : `session.setReasoning params are invalid: ${formatZodError(parsed.error)}`;
1643
+ return invalidParams(message);
1644
+ }
1645
+ return {
1646
+ ok: true,
1647
+ value: {
1648
+ sessionId: parsed.data.sessionId,
1649
+ reasoning: parsed.data.reasoning,
1650
+ },
1651
+ };
1652
+ }
1653
+ function validateSetPersonaParams(params) {
1654
+ const parsed = sessionProtocolSetPersonaParamsSchema.safeParse(params);
1655
+ if (!parsed.success) {
1656
+ const message = hasIssue(parsed.error, [], "invalid_type")
1657
+ ? "session.setPersona params must be an object"
1658
+ : hasIssue(parsed.error, [], "unrecognized_keys")
1659
+ ? "session.setPersona params only support sessionId and personaId"
1660
+ : hasIssue(parsed.error, ["sessionId"])
1661
+ ? "session.setPersona params.sessionId must be a non-empty string"
1662
+ : hasIssue(parsed.error, ["personaId"])
1663
+ ? "session.setPersona params.personaId must be a non-empty string"
1664
+ : `session.setPersona params are invalid: ${formatZodError(parsed.error)}`;
1665
+ return invalidParams(message);
1666
+ }
1667
+ return {
1668
+ ok: true,
1669
+ value: {
1670
+ sessionId: parsed.data.sessionId,
1671
+ personaId: parsed.data.personaId,
1672
+ },
1673
+ };
1674
+ }
1675
+ function validateResolvePromptParams(params) {
1676
+ const parsed = sessionProtocolResolvePromptParamsSchema.safeParse(params);
1677
+ if (!parsed.success) {
1678
+ const message = hasIssue(parsed.error, [], "invalid_type")
1679
+ ? "session.resolvePrompt params must be an object"
1680
+ : hasIssue(parsed.error, [], "unrecognized_keys")
1681
+ ? "session.resolvePrompt params only support sessionId and promptId"
1682
+ : hasIssue(parsed.error, ["sessionId"])
1683
+ ? "session.resolvePrompt params.sessionId must be a non-empty string"
1684
+ : hasIssue(parsed.error, ["promptId"])
1685
+ ? "session.resolvePrompt params.promptId must be a non-empty string"
1686
+ : `session.resolvePrompt params are invalid: ${formatZodError(parsed.error)}`;
1687
+ return invalidParams(message);
1688
+ }
1689
+ return {
1690
+ ok: true,
1691
+ value: {
1692
+ sessionId: parsed.data.sessionId,
1693
+ promptId: parsed.data.promptId,
1694
+ },
1695
+ };
1696
+ }
1697
+ function validateAutocompletePathsParams(params) {
1698
+ const parsed = sessionProtocolAutocompletePathsParamsSchema.safeParse(params);
1699
+ if (!parsed.success) {
1700
+ const message = hasIssue(parsed.error, [], "invalid_type")
1701
+ ? "session.autocompletePaths params must be an object"
1702
+ : hasIssue(parsed.error, [], "unrecognized_keys")
1703
+ ? "session.autocompletePaths params only support sessionId, query, and limit"
1704
+ : hasIssue(parsed.error, ["sessionId"])
1705
+ ? "session.autocompletePaths params.sessionId must be a non-empty string"
1706
+ : hasIssue(parsed.error, ["query"])
1707
+ ? "session.autocompletePaths params.query must be a string"
1708
+ : hasIssue(parsed.error, ["limit"])
1709
+ ? "session.autocompletePaths params.limit must be a positive integer up to 100"
1710
+ : `session.autocompletePaths params are invalid: ${formatZodError(parsed.error)}`;
1711
+ return invalidParams(message);
1712
+ }
1713
+ return {
1714
+ ok: true,
1715
+ value: {
1716
+ sessionId: parsed.data.sessionId,
1717
+ query: parsed.data.query,
1718
+ limit: parsed.data.limit,
1719
+ },
1720
+ };
1721
+ }
1722
+ function validateCompactParams(params) {
1723
+ const parsed = sessionProtocolCompactParamsSchema.safeParse(params);
1724
+ if (!parsed.success) {
1725
+ const message = hasIssue(parsed.error, [], "invalid_type")
1726
+ ? "session.compact params must be an object"
1727
+ : hasIssue(parsed.error, [], "unrecognized_keys")
1728
+ ? "session.compact params only support sessionId, mode, and optional guidance"
1729
+ : hasIssue(parsed.error, ["sessionId"])
1730
+ ? "session.compact params.sessionId must be a non-empty string"
1731
+ : hasIssue(parsed.error, ["mode"])
1732
+ ? "session.compact params.mode must be 'summary-only' or 'summary-and-last'"
1733
+ : hasIssue(parsed.error, ["guidance"])
1734
+ ? "session.compact params.guidance must be a string when provided"
1735
+ : `session.compact params are invalid: ${formatZodError(parsed.error)}`;
1736
+ return invalidParams(message);
1737
+ }
1738
+ return {
1739
+ ok: true,
1740
+ value: {
1741
+ sessionId: parsed.data.sessionId,
1742
+ mode: parsed.data.mode,
1743
+ ...(parsed.data.guidance !== undefined ? { guidance: parsed.data.guidance } : {}),
1744
+ },
1745
+ };
1746
+ }
1747
+ function validatePruneParams(params) {
1748
+ const parsed = sessionProtocolPruneParamsSchema.safeParse(params);
1749
+ if (!parsed.success) {
1750
+ const message = hasIssue(parsed.error, [], "invalid_type")
1751
+ ? "session.prune params must be an object"
1752
+ : hasIssue(parsed.error, [], "unrecognized_keys")
1753
+ ? "session.prune params only support sessionId, strategy, fraction, and optional guidance"
1754
+ : hasIssue(parsed.error, ["sessionId"])
1755
+ ? "session.prune params.sessionId must be a non-empty string"
1756
+ : hasIssue(parsed.error, ["strategy"])
1757
+ ? "session.prune params.strategy must be 'earliest', 'largest', or 'smart'"
1758
+ : hasIssue(parsed.error, ["fraction"])
1759
+ ? "session.prune params.fraction must be a number between 0 and 1"
1760
+ : hasIssue(parsed.error, ["guidance"])
1761
+ ? "session.prune params.guidance must be a string when provided"
1762
+ : `session.prune params are invalid: ${formatZodError(parsed.error)}`;
1763
+ return invalidParams(message);
1764
+ }
1765
+ return {
1766
+ ok: true,
1767
+ value: {
1768
+ sessionId: parsed.data.sessionId,
1769
+ strategy: parsed.data.strategy,
1770
+ fraction: parsed.data.fraction,
1771
+ ...(parsed.data.guidance !== undefined ? { guidance: parsed.data.guidance } : {}),
1772
+ },
1773
+ };
1774
+ }
1775
+ function validateRewindParams(params) {
1776
+ const parsed = sessionProtocolRewindParamsSchema.safeParse(params);
1777
+ if (!parsed.success) {
1778
+ const message = hasIssue(parsed.error, [], "invalid_type")
1779
+ ? "session.rewind params must be an object"
1780
+ : hasIssue(parsed.error, [], "unrecognized_keys")
1781
+ ? "session.rewind params only support sessionId and historyEntryId"
1782
+ : hasIssue(parsed.error, ["sessionId"])
1783
+ ? "session.rewind params.sessionId must be a non-empty string"
1784
+ : hasIssue(parsed.error, ["historyEntryId"])
1785
+ ? "session.rewind params.historyEntryId must be a non-empty string"
1786
+ : `session.rewind params are invalid: ${formatZodError(parsed.error)}`;
1787
+ return invalidParams(message);
1788
+ }
1789
+ return {
1790
+ ok: true,
1791
+ value: {
1792
+ sessionId: parsed.data.sessionId,
1793
+ historyEntryId: parsed.data.historyEntryId,
1794
+ },
1795
+ };
1796
+ }
1797
+ function validateTerminateSubagentParams(params) {
1798
+ const parsed = sessionProtocolTerminateSubagentParamsSchema.safeParse(params);
1799
+ if (!parsed.success) {
1800
+ const message = hasIssue(parsed.error, [], "invalid_type")
1801
+ ? "session.terminateSubagent params must be an object"
1802
+ : hasIssue(parsed.error, [], "unrecognized_keys")
1803
+ ? "session.terminateSubagent params only support sessionId and subagentId"
1804
+ : hasIssue(parsed.error, ["sessionId"])
1805
+ ? "session.terminateSubagent params.sessionId must be a non-empty string"
1806
+ : hasIssue(parsed.error, ["subagentId"])
1807
+ ? "session.terminateSubagent params.subagentId must be a non-empty string"
1808
+ : `session.terminateSubagent params are invalid: ${formatZodError(parsed.error)}`;
1809
+ return invalidParams(message);
1810
+ }
1811
+ return {
1812
+ ok: true,
1813
+ value: {
1814
+ sessionId: parsed.data.sessionId,
1815
+ subagentId: parsed.data.subagentId,
1816
+ },
1817
+ };
1818
+ }
1819
+ function validateEphemeralCreateParams(params) {
1820
+ const parsed = sessionProtocolEphemeralCreateParamsSchema.safeParse(params);
1821
+ if (!parsed.success) {
1822
+ const message = hasIssue(parsed.error, [], "invalid_type")
1823
+ ? "session.ephemeral.create params must be an object"
1824
+ : hasIssue(parsed.error, [], "unrecognized_keys")
1825
+ ? "session.ephemeral.create params only support sessionId, instructions, tools, and riskLevel"
1826
+ : hasIssue(parsed.error, ["sessionId"])
1827
+ ? "session.ephemeral.create params.sessionId must be a non-empty string"
1828
+ : hasIssue(parsed.error, ["instructions"])
1829
+ ? "session.ephemeral.create params.instructions must be a non-empty string"
1830
+ : hasIssue(parsed.error, ["tools"])
1831
+ ? "session.ephemeral.create params.tools are invalid"
1832
+ : hasIssue(parsed.error, ["riskLevel"])
1833
+ ? "session.ephemeral.create params.riskLevel must be read-only or read-write"
1834
+ : `session.ephemeral.create params are invalid: ${formatZodError(parsed.error)}`;
1835
+ return invalidParams(message);
1836
+ }
1837
+ return { ok: true, value: parsed.data };
1838
+ }
1839
+ function validateEphemeralSubmitParams(params) {
1840
+ const parsed = sessionProtocolEphemeralSubmitParamsSchema.safeParse(params);
1841
+ if (!parsed.success) {
1842
+ const message = hasIssue(parsed.error, [], "invalid_type")
1843
+ ? "session.ephemeral.submit params must be an object"
1844
+ : hasIssue(parsed.error, [], "unrecognized_keys")
1845
+ ? "session.ephemeral.submit params only support sessionId, contextId, threadId, optional forkFromThreadId, and message"
1846
+ : hasIssue(parsed.error, ["sessionId"])
1847
+ ? "session.ephemeral.submit params.sessionId must be a non-empty string"
1848
+ : hasIssue(parsed.error, ["contextId"])
1849
+ ? "session.ephemeral.submit params.contextId must be a non-empty string"
1850
+ : hasIssue(parsed.error, ["threadId"])
1851
+ ? "session.ephemeral.submit params.threadId must be a non-empty string"
1852
+ : hasIssue(parsed.error, ["forkFromThreadId"])
1853
+ ? "session.ephemeral.submit params.forkFromThreadId must be a non-empty string when provided"
1854
+ : hasIssue(parsed.error, ["message"])
1855
+ ? "session.ephemeral.submit params.message must be a non-empty string"
1856
+ : `session.ephemeral.submit params are invalid: ${formatZodError(parsed.error)}`;
1857
+ return invalidParams(message);
1858
+ }
1859
+ return {
1860
+ ok: true,
1861
+ value: {
1862
+ sessionId: parsed.data.sessionId,
1863
+ contextId: parsed.data.contextId,
1864
+ threadId: parsed.data.threadId,
1865
+ ...(parsed.data.forkFromThreadId !== undefined
1866
+ ? { forkFromThreadId: parsed.data.forkFromThreadId }
1867
+ : {}),
1868
+ message: parsed.data.message,
1869
+ },
1870
+ };
1871
+ }
1872
+ function validateEphemeralCloseParams(params) {
1873
+ const parsed = sessionProtocolEphemeralCloseParamsSchema.safeParse(params);
1874
+ if (!parsed.success) {
1875
+ const message = hasIssue(parsed.error, [], "invalid_type")
1876
+ ? "session.ephemeral.close params must be an object"
1877
+ : hasIssue(parsed.error, [], "unrecognized_keys")
1878
+ ? "session.ephemeral.close params only support sessionId and contextId"
1879
+ : hasIssue(parsed.error, ["sessionId"])
1880
+ ? "session.ephemeral.close params.sessionId must be a non-empty string"
1881
+ : hasIssue(parsed.error, ["contextId"])
1882
+ ? "session.ephemeral.close params.contextId must be a non-empty string"
1883
+ : `session.ephemeral.close params are invalid: ${formatZodError(parsed.error)}`;
1884
+ return invalidParams(message);
1885
+ }
1886
+ return { ok: true, value: parsed.data };
1887
+ }
1888
+ function validateCreateParams(params) {
1889
+ const parsed = sessionProtocolCreateParamsSchema.safeParse(params);
1890
+ if (!parsed.success) {
1891
+ const message = hasIssue(parsed.error, [], "invalid_type")
1892
+ ? "session.create params must be an object"
1893
+ : hasIssue(parsed.error, [], "unrecognized_keys")
1894
+ ? "session.create params only support executionEnvironment, personaId, riskLevel, and reasoning"
1895
+ : hasIssue(parsed.error, ["executionEnvironment"])
1896
+ ? "session.create params.executionEnvironment must be an object"
1897
+ : hasIssue(parsed.error, ["executionEnvironment", "kind"])
1898
+ ? "session.create params.executionEnvironment.kind must be 'local', 'cloudflare-sandbox', or 'fly-sprite'"
1899
+ : hasIssue(parsed.error, ["executionEnvironment", "cwd"])
1900
+ ? "session.create params.executionEnvironment.cwd must be an absolute path"
1901
+ : hasIssue(parsed.error, ["personaId"])
1902
+ ? "session.create params.personaId must be a non-empty string"
1903
+ : hasIssue(parsed.error, ["riskLevel"])
1904
+ ? "session.create params.riskLevel must be 'read-only' or 'read-write'"
1905
+ : hasIssue(parsed.error, ["reasoning"])
1906
+ ? "session.create params.reasoning must be one of none, minimal, low, medium, high, or xhigh"
1907
+ : `session.create params are invalid: ${formatZodError(parsed.error)}`;
1908
+ return invalidParams(message);
1909
+ }
1910
+ return {
1911
+ ok: true,
1912
+ value: parsed.data,
1913
+ };
1914
+ }
1915
+ function validateNoParams(method, params) {
1916
+ const parsed = sessionProtocolEmptyParamsSchema.safeParse(params);
1917
+ if (!parsed.success) {
1918
+ return invalidParams(`${method} params must be an empty object`);
1919
+ }
1920
+ return { ok: true, value: {} };
1921
+ }
1922
+ function validateResult(method, result, schema) {
1923
+ const parsed = schema.safeParse(result);
1924
+ if (!parsed.success) {
1925
+ return {
1926
+ ok: false,
1927
+ error: createSessionProtocolError(SESSION_PROTOCOL_ERROR_CODES.invalidRequest, `${method} result is invalid: ${formatZodError(parsed.error)}`),
1928
+ };
1929
+ }
1930
+ return {
1931
+ ok: true,
1932
+ value: parsed.data,
1933
+ };
1934
+ }
1935
+ function parseSessionProtocolReadyMessage(payload) {
1936
+ const ready = sessionProtocolReadyMessageSchema.safeParse(payload);
1937
+ if (!ready.success) {
1938
+ return outgoingParseFailure("ready", null, SESSION_PROTOCOL_ERROR_CODES.invalidRequest, `invalid ready message: ${formatZodError(ready.error)}`);
1939
+ }
1940
+ return {
1941
+ ok: true,
1942
+ message: {
1943
+ version: SESSION_PROTOCOL_VERSION,
1944
+ type: "ready",
1945
+ methods: [...ready.data.methods],
1946
+ },
1947
+ };
1948
+ }
1949
+ function parseSessionProtocolDeltaMessage(payload) {
1950
+ const fail = (message) => outgoingParseFailure("session.delta", null, SESSION_PROTOCOL_ERROR_CODES.invalidRequest, message);
1951
+ const deltaMessage = sessionProtocolDeltaMessageSchema.safeParse(payload);
1952
+ if (!deltaMessage.success) {
1953
+ if (hasIssue(deltaMessage.error, [], "unrecognized_keys")) {
1954
+ return fail("session.delta message contains unsupported fields");
1955
+ }
1956
+ if (hasIssue(deltaMessage.error, ["sessionId"])) {
1957
+ return fail("session.delta.sessionId must be a non-empty string");
1958
+ }
1959
+ if (hasIssue(deltaMessage.error, ["fromRevision"])) {
1960
+ return fail("session.delta.fromRevision must be a positive integer or null");
1961
+ }
1962
+ if (hasIssue(deltaMessage.error, ["toRevision"])) {
1963
+ return fail("session.delta.toRevision must be a positive integer");
1964
+ }
1965
+ if (hasIssue(deltaMessage.error, ["reason"])) {
1966
+ return fail("session.delta.reason is invalid");
1967
+ }
1968
+ if (hasIssue(deltaMessage.error, ["delta"])) {
1969
+ return fail("session.delta.delta is invalid");
1970
+ }
1971
+ return fail(`invalid session.delta message: ${formatZodError(deltaMessage.error)}`);
1972
+ }
1973
+ return {
1974
+ ok: true,
1975
+ message: {
1976
+ version: SESSION_PROTOCOL_VERSION,
1977
+ type: "session.delta",
1978
+ sessionId: deltaMessage.data.sessionId,
1979
+ fromRevision: deltaMessage.data.fromRevision,
1980
+ toRevision: deltaMessage.data.toRevision,
1981
+ reason: deltaMessage.data.reason,
1982
+ delta: deltaMessage.data.delta,
1983
+ },
1984
+ };
1985
+ }
1986
+ function parseSessionProtocolEphemeralMessage(payload) {
1987
+ const fail = (message) => outgoingParseFailure("session.ephemeral", null, SESSION_PROTOCOL_ERROR_CODES.invalidRequest, message);
1988
+ const ephemeralMessage = sessionProtocolEphemeralMessageSchema.safeParse(payload);
1989
+ if (!ephemeralMessage.success) {
1990
+ if (hasIssue(ephemeralMessage.error, [], "unrecognized_keys")) {
1991
+ return fail("session.ephemeral message contains unsupported fields");
1992
+ }
1993
+ if (hasIssue(ephemeralMessage.error, ["sessionId"])) {
1994
+ return fail("session.ephemeral.sessionId must be a non-empty string");
1995
+ }
1996
+ if (hasIssue(ephemeralMessage.error, ["event"])) {
1997
+ return fail("session.ephemeral.event is invalid");
1998
+ }
1999
+ return fail(`invalid session.ephemeral message: ${formatZodError(ephemeralMessage.error)}`);
2000
+ }
2001
+ return {
2002
+ ok: true,
2003
+ message: ephemeralMessage.data,
2004
+ };
2005
+ }
2006
+ function parseSessionProtocolResponseMessage(payload) {
2007
+ const parsedIdField = sessionProtocolIdFieldSchema.safeParse(payload);
2008
+ const responseId = parseNullableRequestId(parsedIdField.success ? parsedIdField.data.id : undefined);
2009
+ const requestId = responseId.ok ? responseId.id : null;
2010
+ const fail = (message, reason = "invalid_payload", id = requestId) => outgoingParseFailure("response", id, SESSION_PROTOCOL_ERROR_CODES.invalidRequest, message, undefined, reason);
2011
+ if (!responseId.ok) {
2012
+ return fail("response.id must be a non-empty string or null", "response_invalid_id", null);
2013
+ }
2014
+ const parsedOkField = sessionProtocolOkFieldSchema.safeParse(payload);
2015
+ const ok = parsedOkField.success ? parsedOkField.data.ok : undefined;
2016
+ if (ok === true) {
2017
+ const successResponse = sessionProtocolResponseSuccessSchema.safeParse(payload);
2018
+ if (!successResponse.success) {
2019
+ if (hasIssue(successResponse.error, [], "unrecognized_keys")) {
2020
+ return fail("successful response must only include result payload");
2021
+ }
2022
+ if (hasIssue(successResponse.error, ["result"], "invalid_type")) {
2023
+ return fail("successful response must include result");
2024
+ }
2025
+ if (hasIssue(successResponse.error, ["id"])) {
2026
+ return fail("successful response.id must be a non-empty string", "response_invalid_id");
2027
+ }
2028
+ return fail(`invalid successful response: ${formatZodError(successResponse.error)}`);
2029
+ }
2030
+ return {
2031
+ ok: true,
2032
+ message: {
2033
+ version: SESSION_PROTOCOL_VERSION,
2034
+ type: "response",
2035
+ id: successResponse.data.id,
2036
+ ok: true,
2037
+ result: successResponse.data.result,
2038
+ },
2039
+ };
2040
+ }
2041
+ if (ok !== false) {
2042
+ return fail("response.ok must be true or false");
2043
+ }
2044
+ const errorResponse = sessionProtocolResponseErrorSchema.safeParse(payload);
2045
+ if (!errorResponse.success) {
2046
+ if (hasIssue(errorResponse.error, [], "unrecognized_keys")) {
2047
+ return fail("error response must only include error payload");
2048
+ }
2049
+ if (hasIssue(errorResponse.error, ["error"])) {
2050
+ return fail("error response.error must be an object");
2051
+ }
2052
+ if (hasIssue(errorResponse.error, ["error", "code"]) ||
2053
+ hasIssue(errorResponse.error, ["error", "message"])) {
2054
+ return fail("error response.error must include a valid code and string message");
2055
+ }
2056
+ return fail(`invalid error response: ${formatZodError(errorResponse.error)}`);
2057
+ }
2058
+ return {
2059
+ ok: true,
2060
+ message: {
2061
+ version: SESSION_PROTOCOL_VERSION,
2062
+ type: "response",
2063
+ id: errorResponse.data.id,
2064
+ ok: false,
2065
+ error: errorResponse.data.error,
2066
+ },
2067
+ };
2068
+ }
2069
+ function parseNullableRequestId(value) {
2070
+ if (value === null) {
2071
+ return { ok: true, id: null };
2072
+ }
2073
+ const parsed = sessionProtocolRequestIdSchema.safeParse(value);
2074
+ return parsed.success ? { ok: true, id: parsed.data } : { ok: false };
2075
+ }
2076
+ function outgoingParseFailure(messageType, id, code, message, data, reason = "invalid_payload") {
2077
+ return {
2078
+ ok: false,
2079
+ reason,
2080
+ messageType,
2081
+ id,
2082
+ error: createSessionProtocolError(code, message, data),
2083
+ };
2084
+ }
2085
+ function hasIssue(error, path = [], code) {
2086
+ return error.issues.some((issue) => (code === undefined || issue.code === code) &&
2087
+ issue.path.length === path.length &&
2088
+ issue.path.every((segment, i) => segment === path[i]));
2089
+ }
2090
+ function invalidParams(message) {
2091
+ return {
2092
+ ok: false,
2093
+ error: createSessionProtocolError(SESSION_PROTOCOL_ERROR_CODES.invalidParams, message),
2094
+ };
2095
+ }
2096
+ function isMessage(value) {
2097
+ if (!isRecord(value)) {
2098
+ return false;
2099
+ }
2100
+ switch (value.role) {
2101
+ case "user":
2102
+ return typeof value.content === "string" || Array.isArray(value.content);
2103
+ case "assistant":
2104
+ return Array.isArray(value.content);
2105
+ case "toolResult":
2106
+ return (typeof value.toolCallId === "string" &&
2107
+ typeof value.toolName === "string" &&
2108
+ typeof value.isError === "boolean" &&
2109
+ Array.isArray(value.content));
2110
+ default:
2111
+ return false;
2112
+ }
2113
+ }
2114
+ function isRecord(value) {
2115
+ return typeof value === "object" && value !== null && !Array.isArray(value);
2116
+ }
2117
+ //# sourceMappingURL=session_protocol.js.map