@h-rig/contracts 0.0.6-alpha.90 → 0.0.6-alpha.92

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 (42) hide show
  1. package/dist/index.cjs +563 -2
  2. package/dist/index.mjs +565 -2
  3. package/dist/src/artifact.js +3 -0
  4. package/dist/src/baseSchemas.d.ts +6 -0
  5. package/dist/src/baseSchemas.js +6 -0
  6. package/dist/src/cli-output.d.ts +90 -0
  7. package/dist/src/cli-output.js +38 -2
  8. package/dist/src/conversation.js +3 -0
  9. package/dist/src/editor.js +3 -0
  10. package/dist/src/engine.js +3 -0
  11. package/dist/src/git.js +3 -0
  12. package/dist/src/graph.js +3 -0
  13. package/dist/src/help-catalog.d.ts +30 -0
  14. package/dist/src/help-catalog.js +351 -0
  15. package/dist/src/index.d.ts +4 -0
  16. package/dist/src/index.js +565 -2
  17. package/dist/src/ipc.d.ts +2 -1
  18. package/dist/src/keybindings.js +3 -0
  19. package/dist/src/orchestration.js +3 -0
  20. package/dist/src/policy.js +3 -0
  21. package/dist/src/project.js +3 -0
  22. package/dist/src/provider.js +3 -0
  23. package/dist/src/providerRuntime.js +3 -0
  24. package/dist/src/remote.js +3 -0
  25. package/dist/src/review.js +3 -0
  26. package/dist/src/rig.d.ts +30 -0
  27. package/dist/src/rig.js +26 -0
  28. package/dist/src/run-journal.d.ts +4 -4
  29. package/dist/src/run-journal.js +3 -0
  30. package/dist/src/run-session-journal.d.ts +53 -0
  31. package/dist/src/run-session-journal.js +1582 -0
  32. package/dist/src/run-status.d.ts +12 -0
  33. package/dist/src/run-status.js +38 -0
  34. package/dist/src/runtime.js +3 -0
  35. package/dist/src/server.js +3 -0
  36. package/dist/src/serviceFabric.js +3 -0
  37. package/dist/src/terminal.js +3 -0
  38. package/dist/src/validation.js +3 -0
  39. package/dist/src/workspace.js +3 -0
  40. package/dist/src/ws.d.ts +14 -0
  41. package/dist/src/ws.js +25 -0
  42. package/package.json +1 -1
@@ -0,0 +1,1582 @@
1
+ // @bun
2
+ // packages/contracts/src/run-journal.ts
3
+ import { Schema as Schema5 } from "effect";
4
+
5
+ // packages/contracts/src/baseSchemas.ts
6
+ import { Schema } from "effect";
7
+ var TrimmedString = Schema.Trim;
8
+ var TrimmedNonEmptyString = TrimmedString.check(Schema.isNonEmpty());
9
+ var NonNegativeInt = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0));
10
+ var PositiveInt = Schema.Int.check(Schema.isGreaterThanOrEqualTo(1));
11
+ var IsoDateTime = Schema.String;
12
+ var makeEntityId = (brand) => TrimmedNonEmptyString.pipe(Schema.brand(brand));
13
+ var ThreadId = makeEntityId("ThreadId");
14
+ var ProjectId = makeEntityId("ProjectId");
15
+ var WorkspaceId = makeEntityId("WorkspaceId");
16
+ var GraphId = makeEntityId("GraphId");
17
+ var TaskId = makeEntityId("TaskId");
18
+ var RunId = makeEntityId("RunId");
19
+ var SafePathSegment = TrimmedNonEmptyString.check(Schema.isPattern(/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/)).pipe(Schema.brand("SafePathSegment"));
20
+ var SafeRunId = TrimmedNonEmptyString.check(Schema.isPattern(/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/)).pipe(Schema.brand("SafeRunId"));
21
+ var SafeGitRefComponent = TrimmedNonEmptyString.check(Schema.isPattern(/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/)).pipe(Schema.brand("SafeGitRefComponent"));
22
+ var EngineRuntimeId = makeEntityId("EngineRuntimeId");
23
+ var ConversationId = makeEntityId("ConversationId");
24
+ var ActionId = makeEntityId("ActionId");
25
+ var ArtifactId = makeEntityId("ArtifactId");
26
+ var WorktreeId = makeEntityId("WorktreeId");
27
+ var ValidationResultId = makeEntityId("ValidationResultId");
28
+ var ReviewResultId = makeEntityId("ReviewResultId");
29
+ var CommandId = makeEntityId("CommandId");
30
+ var EventId = makeEntityId("EventId");
31
+ var MessageId = makeEntityId("MessageId");
32
+ var TurnId = makeEntityId("TurnId");
33
+ var ProviderItemId = makeEntityId("ProviderItemId");
34
+ var RuntimeSessionId = makeEntityId("RuntimeSessionId");
35
+ var RuntimeItemId = makeEntityId("RuntimeItemId");
36
+ var RuntimeRequestId = makeEntityId("RuntimeRequestId");
37
+ var RuntimeTaskId = makeEntityId("RuntimeTaskId");
38
+ var ApprovalRequestId = makeEntityId("ApprovalRequestId");
39
+ var CheckpointRef = makeEntityId("CheckpointRef");
40
+ var RemoteEndpointId = makeEntityId("RemoteEndpointId");
41
+
42
+ // packages/contracts/src/runtime.ts
43
+ import { Schema as Schema4 } from "effect";
44
+
45
+ // packages/contracts/src/orchestration.ts
46
+ import { Option, Schema as Schema3, SchemaIssue, Struct } from "effect";
47
+
48
+ // packages/contracts/src/model.ts
49
+ import { Schema as Schema2 } from "effect";
50
+ var CODEX_REASONING_EFFORT_OPTIONS = ["xhigh", "high", "medium", "low"];
51
+ var CodexModelOptions = Schema2.Struct({
52
+ reasoningEffort: Schema2.optional(Schema2.Literals(CODEX_REASONING_EFFORT_OPTIONS)),
53
+ fastMode: Schema2.optional(Schema2.Boolean)
54
+ });
55
+ var ClaudeModelOptions = Schema2.Struct({});
56
+ var ProviderModelOptions = Schema2.Struct({
57
+ codex: Schema2.optional(CodexModelOptions),
58
+ claude: Schema2.optional(ClaudeModelOptions)
59
+ });
60
+
61
+ // packages/contracts/src/orchestration.ts
62
+ var ProviderKind = Schema3.Literals(["codex", "claude"]);
63
+ var ProviderApprovalPolicy = Schema3.Literals([
64
+ "untrusted",
65
+ "on-failure",
66
+ "on-request",
67
+ "never"
68
+ ]);
69
+ var ProviderSandboxMode = Schema3.Literals([
70
+ "read-only",
71
+ "workspace-write",
72
+ "danger-full-access"
73
+ ]);
74
+ var ProviderServiceTier = Schema3.Literals(["fast", "flex"]);
75
+ var RuntimeMode = Schema3.Literals(["approval-required", "full-access"]);
76
+ var DEFAULT_RUNTIME_MODE = "full-access";
77
+ var ProviderInteractionMode = Schema3.Literals(["default", "plan"]);
78
+ var DEFAULT_PROVIDER_INTERACTION_MODE = "default";
79
+ var ProviderRequestKind = Schema3.Literals(["command", "file-read", "file-change"]);
80
+ var AssistantDeliveryMode = Schema3.Literals(["buffered", "streaming"]);
81
+ var ProviderApprovalDecision = Schema3.Literals([
82
+ "accept",
83
+ "acceptForSession",
84
+ "decline",
85
+ "cancel"
86
+ ]);
87
+ var ProviderUserInputAnswers = Schema3.Record(Schema3.String, Schema3.Unknown);
88
+ var PROVIDER_SEND_TURN_MAX_IMAGE_BYTES = 10 * 1024 * 1024;
89
+ var PROVIDER_SEND_TURN_MAX_IMAGE_DATA_URL_CHARS = 14000000;
90
+ var CHAT_ATTACHMENT_ID_MAX_CHARS = 128;
91
+ var ChatAttachmentId = TrimmedNonEmptyString.check(Schema3.isMaxLength(CHAT_ATTACHMENT_ID_MAX_CHARS), Schema3.isPattern(/^[a-z0-9_-]+$/i));
92
+ var ChatImageAttachment = Schema3.Struct({
93
+ type: Schema3.Literal("image"),
94
+ id: ChatAttachmentId,
95
+ name: TrimmedNonEmptyString.check(Schema3.isMaxLength(255)),
96
+ mimeType: TrimmedNonEmptyString.check(Schema3.isMaxLength(100), Schema3.isPattern(/^image\//i)),
97
+ sizeBytes: NonNegativeInt.check(Schema3.isLessThanOrEqualTo(PROVIDER_SEND_TURN_MAX_IMAGE_BYTES))
98
+ });
99
+ var UploadChatImageAttachment = Schema3.Struct({
100
+ type: Schema3.Literal("image"),
101
+ name: TrimmedNonEmptyString.check(Schema3.isMaxLength(255)),
102
+ mimeType: TrimmedNonEmptyString.check(Schema3.isMaxLength(100), Schema3.isPattern(/^image\//i)),
103
+ sizeBytes: NonNegativeInt.check(Schema3.isLessThanOrEqualTo(PROVIDER_SEND_TURN_MAX_IMAGE_BYTES)),
104
+ dataUrl: TrimmedNonEmptyString.check(Schema3.isMaxLength(PROVIDER_SEND_TURN_MAX_IMAGE_DATA_URL_CHARS))
105
+ });
106
+ var ChatAttachment = Schema3.Union([ChatImageAttachment]);
107
+ var UploadChatAttachment = Schema3.Union([UploadChatImageAttachment]);
108
+ var ProjectScriptIcon = Schema3.Literals([
109
+ "play",
110
+ "test",
111
+ "lint",
112
+ "configure",
113
+ "build",
114
+ "debug"
115
+ ]);
116
+ var ProjectScript = Schema3.Struct({
117
+ id: TrimmedNonEmptyString,
118
+ name: TrimmedNonEmptyString,
119
+ command: TrimmedNonEmptyString,
120
+ icon: ProjectScriptIcon,
121
+ runOnWorktreeCreate: Schema3.Boolean
122
+ });
123
+ var OrchestrationProject = Schema3.Struct({
124
+ id: ProjectId,
125
+ title: TrimmedNonEmptyString,
126
+ workspaceRoot: TrimmedNonEmptyString,
127
+ defaultModel: Schema3.NullOr(TrimmedNonEmptyString),
128
+ scripts: Schema3.Array(ProjectScript),
129
+ createdAt: IsoDateTime,
130
+ updatedAt: IsoDateTime,
131
+ deletedAt: Schema3.NullOr(IsoDateTime)
132
+ });
133
+ var OrchestrationMessageRole = Schema3.Literals(["user", "assistant", "system"]);
134
+ var OrchestrationMessage = Schema3.Struct({
135
+ id: MessageId,
136
+ role: OrchestrationMessageRole,
137
+ text: Schema3.String,
138
+ attachments: Schema3.optional(Schema3.Array(ChatAttachment)),
139
+ turnId: Schema3.NullOr(TurnId),
140
+ streaming: Schema3.Boolean,
141
+ createdAt: IsoDateTime,
142
+ updatedAt: IsoDateTime
143
+ });
144
+ var OrchestrationProposedPlanId = TrimmedNonEmptyString;
145
+ var OrchestrationProposedPlan = Schema3.Struct({
146
+ id: OrchestrationProposedPlanId,
147
+ turnId: Schema3.NullOr(TurnId),
148
+ planMarkdown: TrimmedNonEmptyString,
149
+ createdAt: IsoDateTime,
150
+ updatedAt: IsoDateTime
151
+ });
152
+ var OrchestrationSessionStatus = Schema3.Literals([
153
+ "idle",
154
+ "starting",
155
+ "running",
156
+ "ready",
157
+ "interrupted",
158
+ "stopped",
159
+ "error"
160
+ ]);
161
+ var OrchestrationSession = Schema3.Struct({
162
+ threadId: ThreadId,
163
+ status: OrchestrationSessionStatus,
164
+ providerName: Schema3.NullOr(TrimmedNonEmptyString),
165
+ runtimeMode: RuntimeMode.pipe(Schema3.withDecodingDefault(() => DEFAULT_RUNTIME_MODE)),
166
+ activeTurnId: Schema3.NullOr(TurnId),
167
+ lastError: Schema3.NullOr(TrimmedNonEmptyString),
168
+ updatedAt: IsoDateTime
169
+ });
170
+ var OrchestrationCheckpointFile = Schema3.Struct({
171
+ path: TrimmedNonEmptyString,
172
+ kind: TrimmedNonEmptyString,
173
+ additions: NonNegativeInt,
174
+ deletions: NonNegativeInt
175
+ });
176
+ var OrchestrationCheckpointStatus = Schema3.Literals(["ready", "missing", "error"]);
177
+ var OrchestrationCheckpointSummary = Schema3.Struct({
178
+ turnId: TurnId,
179
+ checkpointTurnCount: NonNegativeInt,
180
+ checkpointRef: CheckpointRef,
181
+ status: OrchestrationCheckpointStatus,
182
+ files: Schema3.Array(OrchestrationCheckpointFile),
183
+ assistantMessageId: Schema3.NullOr(MessageId),
184
+ completedAt: IsoDateTime
185
+ });
186
+ var OrchestrationThreadActivityTone = Schema3.Literals([
187
+ "info",
188
+ "tool",
189
+ "approval",
190
+ "error"
191
+ ]);
192
+ var OrchestrationThreadActivity = Schema3.Struct({
193
+ id: EventId,
194
+ tone: OrchestrationThreadActivityTone,
195
+ kind: TrimmedNonEmptyString,
196
+ summary: TrimmedNonEmptyString,
197
+ payload: Schema3.Unknown,
198
+ turnId: Schema3.NullOr(TurnId),
199
+ sequence: Schema3.optional(NonNegativeInt),
200
+ createdAt: IsoDateTime
201
+ });
202
+ var OrchestrationLatestTurnState = Schema3.Literals([
203
+ "running",
204
+ "interrupted",
205
+ "completed",
206
+ "error"
207
+ ]);
208
+ var OrchestrationLatestTurn = Schema3.Struct({
209
+ turnId: TurnId,
210
+ state: OrchestrationLatestTurnState,
211
+ requestedAt: IsoDateTime,
212
+ startedAt: Schema3.NullOr(IsoDateTime),
213
+ completedAt: Schema3.NullOr(IsoDateTime),
214
+ assistantMessageId: Schema3.NullOr(MessageId)
215
+ });
216
+ var OrchestrationThread = Schema3.Struct({
217
+ id: ThreadId,
218
+ projectId: ProjectId,
219
+ title: TrimmedNonEmptyString,
220
+ model: TrimmedNonEmptyString,
221
+ runtimeMode: RuntimeMode,
222
+ interactionMode: ProviderInteractionMode.pipe(Schema3.withDecodingDefault(() => DEFAULT_PROVIDER_INTERACTION_MODE)),
223
+ branch: Schema3.NullOr(TrimmedNonEmptyString),
224
+ worktreePath: Schema3.NullOr(TrimmedNonEmptyString),
225
+ latestTurn: Schema3.NullOr(OrchestrationLatestTurn),
226
+ createdAt: IsoDateTime,
227
+ updatedAt: IsoDateTime,
228
+ deletedAt: Schema3.NullOr(IsoDateTime),
229
+ messages: Schema3.Array(OrchestrationMessage),
230
+ proposedPlans: Schema3.Array(OrchestrationProposedPlan).pipe(Schema3.withDecodingDefault(() => [])),
231
+ activities: Schema3.Array(OrchestrationThreadActivity),
232
+ checkpoints: Schema3.Array(OrchestrationCheckpointSummary),
233
+ session: Schema3.NullOr(OrchestrationSession)
234
+ });
235
+ var OrchestrationReadModel = Schema3.Struct({
236
+ snapshotSequence: NonNegativeInt,
237
+ projects: Schema3.Array(OrchestrationProject),
238
+ threads: Schema3.Array(OrchestrationThread),
239
+ updatedAt: IsoDateTime
240
+ });
241
+ var ProjectCreateCommand = Schema3.Struct({
242
+ type: Schema3.Literal("project.create"),
243
+ commandId: CommandId,
244
+ projectId: ProjectId,
245
+ title: TrimmedNonEmptyString,
246
+ workspaceRoot: TrimmedNonEmptyString,
247
+ defaultModel: Schema3.optional(TrimmedNonEmptyString),
248
+ createdAt: IsoDateTime
249
+ });
250
+ var ProjectMetaUpdateCommand = Schema3.Struct({
251
+ type: Schema3.Literal("project.meta.update"),
252
+ commandId: CommandId,
253
+ projectId: ProjectId,
254
+ title: Schema3.optional(TrimmedNonEmptyString),
255
+ workspaceRoot: Schema3.optional(TrimmedNonEmptyString),
256
+ defaultModel: Schema3.optional(TrimmedNonEmptyString),
257
+ scripts: Schema3.optional(Schema3.Array(ProjectScript))
258
+ });
259
+ var ProjectDeleteCommand = Schema3.Struct({
260
+ type: Schema3.Literal("project.delete"),
261
+ commandId: CommandId,
262
+ projectId: ProjectId
263
+ });
264
+ var ThreadCreateCommand = Schema3.Struct({
265
+ type: Schema3.Literal("thread.create"),
266
+ commandId: CommandId,
267
+ threadId: ThreadId,
268
+ projectId: ProjectId,
269
+ title: TrimmedNonEmptyString,
270
+ model: TrimmedNonEmptyString,
271
+ runtimeMode: RuntimeMode,
272
+ interactionMode: ProviderInteractionMode.pipe(Schema3.withDecodingDefault(() => DEFAULT_PROVIDER_INTERACTION_MODE)),
273
+ branch: Schema3.NullOr(TrimmedNonEmptyString),
274
+ worktreePath: Schema3.NullOr(TrimmedNonEmptyString),
275
+ createdAt: IsoDateTime
276
+ });
277
+ var ThreadDeleteCommand = Schema3.Struct({
278
+ type: Schema3.Literal("thread.delete"),
279
+ commandId: CommandId,
280
+ threadId: ThreadId
281
+ });
282
+ var ThreadMetaUpdateCommand = Schema3.Struct({
283
+ type: Schema3.Literal("thread.meta.update"),
284
+ commandId: CommandId,
285
+ threadId: ThreadId,
286
+ title: Schema3.optional(TrimmedNonEmptyString),
287
+ model: Schema3.optional(TrimmedNonEmptyString),
288
+ branch: Schema3.optional(Schema3.NullOr(TrimmedNonEmptyString)),
289
+ worktreePath: Schema3.optional(Schema3.NullOr(TrimmedNonEmptyString))
290
+ });
291
+ var ThreadRuntimeModeSetCommand = Schema3.Struct({
292
+ type: Schema3.Literal("thread.runtime-mode.set"),
293
+ commandId: CommandId,
294
+ threadId: ThreadId,
295
+ runtimeMode: RuntimeMode,
296
+ createdAt: IsoDateTime
297
+ });
298
+ var ThreadInteractionModeSetCommand = Schema3.Struct({
299
+ type: Schema3.Literal("thread.interaction-mode.set"),
300
+ commandId: CommandId,
301
+ threadId: ThreadId,
302
+ interactionMode: ProviderInteractionMode,
303
+ createdAt: IsoDateTime
304
+ });
305
+ var ThreadTurnStartCommand = Schema3.Struct({
306
+ type: Schema3.Literal("thread.turn.start"),
307
+ commandId: CommandId,
308
+ threadId: ThreadId,
309
+ message: Schema3.Struct({
310
+ messageId: MessageId,
311
+ role: Schema3.Literal("user"),
312
+ text: Schema3.String,
313
+ attachments: Schema3.Array(ChatAttachment)
314
+ }),
315
+ provider: Schema3.optional(ProviderKind),
316
+ model: Schema3.optional(TrimmedNonEmptyString),
317
+ serviceTier: Schema3.optional(Schema3.NullOr(ProviderServiceTier)),
318
+ modelOptions: Schema3.optional(ProviderModelOptions),
319
+ assistantDeliveryMode: Schema3.optional(AssistantDeliveryMode),
320
+ runtimeMode: RuntimeMode.pipe(Schema3.withDecodingDefault(() => DEFAULT_RUNTIME_MODE)),
321
+ interactionMode: ProviderInteractionMode.pipe(Schema3.withDecodingDefault(() => DEFAULT_PROVIDER_INTERACTION_MODE)),
322
+ createdAt: IsoDateTime
323
+ });
324
+ var ClientThreadTurnStartCommand = Schema3.Struct({
325
+ type: Schema3.Literal("thread.turn.start"),
326
+ commandId: CommandId,
327
+ threadId: ThreadId,
328
+ message: Schema3.Struct({
329
+ messageId: MessageId,
330
+ role: Schema3.Literal("user"),
331
+ text: Schema3.String,
332
+ attachments: Schema3.Array(UploadChatAttachment)
333
+ }),
334
+ provider: Schema3.optional(ProviderKind),
335
+ model: Schema3.optional(TrimmedNonEmptyString),
336
+ serviceTier: Schema3.optional(Schema3.NullOr(ProviderServiceTier)),
337
+ modelOptions: Schema3.optional(ProviderModelOptions),
338
+ assistantDeliveryMode: Schema3.optional(AssistantDeliveryMode),
339
+ runtimeMode: RuntimeMode,
340
+ interactionMode: ProviderInteractionMode,
341
+ createdAt: IsoDateTime
342
+ });
343
+ var ThreadTurnInterruptCommand = Schema3.Struct({
344
+ type: Schema3.Literal("thread.turn.interrupt"),
345
+ commandId: CommandId,
346
+ threadId: ThreadId,
347
+ turnId: Schema3.optional(TurnId),
348
+ createdAt: IsoDateTime
349
+ });
350
+ var ThreadApprovalRespondCommand = Schema3.Struct({
351
+ type: Schema3.Literal("thread.approval.respond"),
352
+ commandId: CommandId,
353
+ threadId: ThreadId,
354
+ requestId: ApprovalRequestId,
355
+ decision: ProviderApprovalDecision,
356
+ createdAt: IsoDateTime
357
+ });
358
+ var ThreadUserInputRespondCommand = Schema3.Struct({
359
+ type: Schema3.Literal("thread.user-input.respond"),
360
+ commandId: CommandId,
361
+ threadId: ThreadId,
362
+ requestId: ApprovalRequestId,
363
+ answers: ProviderUserInputAnswers,
364
+ createdAt: IsoDateTime
365
+ });
366
+ var ThreadCheckpointRevertCommand = Schema3.Struct({
367
+ type: Schema3.Literal("thread.checkpoint.revert"),
368
+ commandId: CommandId,
369
+ threadId: ThreadId,
370
+ turnCount: NonNegativeInt,
371
+ createdAt: IsoDateTime
372
+ });
373
+ var ThreadSessionStopCommand = Schema3.Struct({
374
+ type: Schema3.Literal("thread.session.stop"),
375
+ commandId: CommandId,
376
+ threadId: ThreadId,
377
+ createdAt: IsoDateTime
378
+ });
379
+ var DispatchableClientOrchestrationCommand = Schema3.Union([
380
+ ProjectCreateCommand,
381
+ ProjectMetaUpdateCommand,
382
+ ProjectDeleteCommand,
383
+ ThreadCreateCommand,
384
+ ThreadDeleteCommand,
385
+ ThreadMetaUpdateCommand,
386
+ ThreadRuntimeModeSetCommand,
387
+ ThreadInteractionModeSetCommand,
388
+ ThreadTurnStartCommand,
389
+ ThreadTurnInterruptCommand,
390
+ ThreadApprovalRespondCommand,
391
+ ThreadUserInputRespondCommand,
392
+ ThreadCheckpointRevertCommand,
393
+ ThreadSessionStopCommand
394
+ ]);
395
+ var ClientOrchestrationCommand = Schema3.Union([
396
+ ProjectCreateCommand,
397
+ ProjectMetaUpdateCommand,
398
+ ProjectDeleteCommand,
399
+ ThreadCreateCommand,
400
+ ThreadDeleteCommand,
401
+ ThreadMetaUpdateCommand,
402
+ ThreadRuntimeModeSetCommand,
403
+ ThreadInteractionModeSetCommand,
404
+ ClientThreadTurnStartCommand,
405
+ ThreadTurnInterruptCommand,
406
+ ThreadApprovalRespondCommand,
407
+ ThreadUserInputRespondCommand,
408
+ ThreadCheckpointRevertCommand,
409
+ ThreadSessionStopCommand
410
+ ]);
411
+ var ThreadSessionSetCommand = Schema3.Struct({
412
+ type: Schema3.Literal("thread.session.set"),
413
+ commandId: CommandId,
414
+ threadId: ThreadId,
415
+ session: OrchestrationSession,
416
+ createdAt: IsoDateTime
417
+ });
418
+ var ThreadMessageAssistantDeltaCommand = Schema3.Struct({
419
+ type: Schema3.Literal("thread.message.assistant.delta"),
420
+ commandId: CommandId,
421
+ threadId: ThreadId,
422
+ messageId: MessageId,
423
+ delta: Schema3.String,
424
+ turnId: Schema3.optional(TurnId),
425
+ createdAt: IsoDateTime
426
+ });
427
+ var ThreadMessageAssistantCompleteCommand = Schema3.Struct({
428
+ type: Schema3.Literal("thread.message.assistant.complete"),
429
+ commandId: CommandId,
430
+ threadId: ThreadId,
431
+ messageId: MessageId,
432
+ turnId: Schema3.optional(TurnId),
433
+ createdAt: IsoDateTime
434
+ });
435
+ var ThreadProposedPlanUpsertCommand = Schema3.Struct({
436
+ type: Schema3.Literal("thread.proposed-plan.upsert"),
437
+ commandId: CommandId,
438
+ threadId: ThreadId,
439
+ proposedPlan: OrchestrationProposedPlan,
440
+ createdAt: IsoDateTime
441
+ });
442
+ var ThreadTurnDiffCompleteCommand = Schema3.Struct({
443
+ type: Schema3.Literal("thread.turn.diff.complete"),
444
+ commandId: CommandId,
445
+ threadId: ThreadId,
446
+ turnId: TurnId,
447
+ completedAt: IsoDateTime,
448
+ checkpointRef: CheckpointRef,
449
+ status: OrchestrationCheckpointStatus,
450
+ files: Schema3.Array(OrchestrationCheckpointFile),
451
+ assistantMessageId: Schema3.optional(MessageId),
452
+ checkpointTurnCount: NonNegativeInt,
453
+ createdAt: IsoDateTime
454
+ });
455
+ var ThreadActivityAppendCommand = Schema3.Struct({
456
+ type: Schema3.Literal("thread.activity.append"),
457
+ commandId: CommandId,
458
+ threadId: ThreadId,
459
+ activity: OrchestrationThreadActivity,
460
+ createdAt: IsoDateTime
461
+ });
462
+ var ThreadRevertCompleteCommand = Schema3.Struct({
463
+ type: Schema3.Literal("thread.revert.complete"),
464
+ commandId: CommandId,
465
+ threadId: ThreadId,
466
+ turnCount: NonNegativeInt,
467
+ createdAt: IsoDateTime
468
+ });
469
+ var InternalOrchestrationCommand = Schema3.Union([
470
+ ThreadSessionSetCommand,
471
+ ThreadMessageAssistantDeltaCommand,
472
+ ThreadMessageAssistantCompleteCommand,
473
+ ThreadProposedPlanUpsertCommand,
474
+ ThreadTurnDiffCompleteCommand,
475
+ ThreadActivityAppendCommand,
476
+ ThreadRevertCompleteCommand
477
+ ]);
478
+ var OrchestrationCommand = Schema3.Union([
479
+ DispatchableClientOrchestrationCommand,
480
+ InternalOrchestrationCommand
481
+ ]);
482
+ var OrchestrationEventType = Schema3.Literals([
483
+ "project.created",
484
+ "project.meta-updated",
485
+ "project.deleted",
486
+ "thread.created",
487
+ "thread.deleted",
488
+ "thread.meta-updated",
489
+ "thread.runtime-mode-set",
490
+ "thread.interaction-mode-set",
491
+ "thread.message-sent",
492
+ "thread.turn-start-requested",
493
+ "thread.turn-interrupt-requested",
494
+ "thread.approval-response-requested",
495
+ "thread.user-input-response-requested",
496
+ "thread.checkpoint-revert-requested",
497
+ "thread.reverted",
498
+ "thread.session-stop-requested",
499
+ "thread.session-set",
500
+ "thread.proposed-plan-upserted",
501
+ "thread.turn-diff-completed",
502
+ "thread.activity-appended"
503
+ ]);
504
+ var OrchestrationAggregateKind = Schema3.Literals(["project", "thread"]);
505
+ var OrchestrationActorKind = Schema3.Literals(["client", "server", "provider"]);
506
+ var ProjectCreatedPayload = Schema3.Struct({
507
+ projectId: ProjectId,
508
+ title: TrimmedNonEmptyString,
509
+ workspaceRoot: TrimmedNonEmptyString,
510
+ defaultModel: Schema3.NullOr(TrimmedNonEmptyString),
511
+ scripts: Schema3.Array(ProjectScript),
512
+ createdAt: IsoDateTime,
513
+ updatedAt: IsoDateTime
514
+ });
515
+ var ProjectMetaUpdatedPayload = Schema3.Struct({
516
+ projectId: ProjectId,
517
+ title: Schema3.optional(TrimmedNonEmptyString),
518
+ workspaceRoot: Schema3.optional(TrimmedNonEmptyString),
519
+ defaultModel: Schema3.optional(Schema3.NullOr(TrimmedNonEmptyString)),
520
+ scripts: Schema3.optional(Schema3.Array(ProjectScript)),
521
+ updatedAt: IsoDateTime
522
+ });
523
+ var ProjectDeletedPayload = Schema3.Struct({
524
+ projectId: ProjectId,
525
+ deletedAt: IsoDateTime
526
+ });
527
+ var ThreadCreatedPayload = Schema3.Struct({
528
+ threadId: ThreadId,
529
+ projectId: ProjectId,
530
+ title: TrimmedNonEmptyString,
531
+ model: TrimmedNonEmptyString,
532
+ runtimeMode: RuntimeMode.pipe(Schema3.withDecodingDefault(() => DEFAULT_RUNTIME_MODE)),
533
+ interactionMode: ProviderInteractionMode.pipe(Schema3.withDecodingDefault(() => DEFAULT_PROVIDER_INTERACTION_MODE)),
534
+ branch: Schema3.NullOr(TrimmedNonEmptyString),
535
+ worktreePath: Schema3.NullOr(TrimmedNonEmptyString),
536
+ createdAt: IsoDateTime,
537
+ updatedAt: IsoDateTime
538
+ });
539
+ var ThreadDeletedPayload = Schema3.Struct({
540
+ threadId: ThreadId,
541
+ deletedAt: IsoDateTime
542
+ });
543
+ var ThreadMetaUpdatedPayload = Schema3.Struct({
544
+ threadId: ThreadId,
545
+ title: Schema3.optional(TrimmedNonEmptyString),
546
+ model: Schema3.optional(TrimmedNonEmptyString),
547
+ branch: Schema3.optional(Schema3.NullOr(TrimmedNonEmptyString)),
548
+ worktreePath: Schema3.optional(Schema3.NullOr(TrimmedNonEmptyString)),
549
+ updatedAt: IsoDateTime
550
+ });
551
+ var ThreadRuntimeModeSetPayload = Schema3.Struct({
552
+ threadId: ThreadId,
553
+ runtimeMode: RuntimeMode,
554
+ updatedAt: IsoDateTime
555
+ });
556
+ var ThreadInteractionModeSetPayload = Schema3.Struct({
557
+ threadId: ThreadId,
558
+ interactionMode: ProviderInteractionMode.pipe(Schema3.withDecodingDefault(() => DEFAULT_PROVIDER_INTERACTION_MODE)),
559
+ updatedAt: IsoDateTime
560
+ });
561
+ var ThreadMessageSentPayload = Schema3.Struct({
562
+ threadId: ThreadId,
563
+ messageId: MessageId,
564
+ role: OrchestrationMessageRole,
565
+ text: Schema3.String,
566
+ attachments: Schema3.optional(Schema3.Array(ChatAttachment)),
567
+ turnId: Schema3.NullOr(TurnId),
568
+ streaming: Schema3.Boolean,
569
+ createdAt: IsoDateTime,
570
+ updatedAt: IsoDateTime
571
+ });
572
+ var ThreadTurnStartRequestedPayload = Schema3.Struct({
573
+ threadId: ThreadId,
574
+ messageId: MessageId,
575
+ provider: Schema3.optional(ProviderKind),
576
+ model: Schema3.optional(TrimmedNonEmptyString),
577
+ serviceTier: Schema3.optional(Schema3.NullOr(ProviderServiceTier)),
578
+ modelOptions: Schema3.optional(ProviderModelOptions),
579
+ assistantDeliveryMode: Schema3.optional(AssistantDeliveryMode),
580
+ runtimeMode: RuntimeMode.pipe(Schema3.withDecodingDefault(() => DEFAULT_RUNTIME_MODE)),
581
+ interactionMode: ProviderInteractionMode.pipe(Schema3.withDecodingDefault(() => DEFAULT_PROVIDER_INTERACTION_MODE)),
582
+ createdAt: IsoDateTime
583
+ });
584
+ var ThreadTurnInterruptRequestedPayload = Schema3.Struct({
585
+ threadId: ThreadId,
586
+ turnId: Schema3.optional(TurnId),
587
+ createdAt: IsoDateTime
588
+ });
589
+ var ThreadApprovalResponseRequestedPayload = Schema3.Struct({
590
+ threadId: ThreadId,
591
+ requestId: ApprovalRequestId,
592
+ decision: ProviderApprovalDecision,
593
+ createdAt: IsoDateTime
594
+ });
595
+ var ThreadUserInputResponseRequestedPayload = Schema3.Struct({
596
+ threadId: ThreadId,
597
+ requestId: ApprovalRequestId,
598
+ answers: ProviderUserInputAnswers,
599
+ createdAt: IsoDateTime
600
+ });
601
+ var ThreadCheckpointRevertRequestedPayload = Schema3.Struct({
602
+ threadId: ThreadId,
603
+ turnCount: NonNegativeInt,
604
+ createdAt: IsoDateTime
605
+ });
606
+ var ThreadRevertedPayload = Schema3.Struct({
607
+ threadId: ThreadId,
608
+ turnCount: NonNegativeInt
609
+ });
610
+ var ThreadSessionStopRequestedPayload = Schema3.Struct({
611
+ threadId: ThreadId,
612
+ createdAt: IsoDateTime
613
+ });
614
+ var ThreadSessionSetPayload = Schema3.Struct({
615
+ threadId: ThreadId,
616
+ session: OrchestrationSession
617
+ });
618
+ var ThreadProposedPlanUpsertedPayload = Schema3.Struct({
619
+ threadId: ThreadId,
620
+ proposedPlan: OrchestrationProposedPlan
621
+ });
622
+ var ThreadTurnDiffCompletedPayload = Schema3.Struct({
623
+ threadId: ThreadId,
624
+ turnId: TurnId,
625
+ checkpointTurnCount: NonNegativeInt,
626
+ checkpointRef: CheckpointRef,
627
+ status: OrchestrationCheckpointStatus,
628
+ files: Schema3.Array(OrchestrationCheckpointFile),
629
+ assistantMessageId: Schema3.NullOr(MessageId),
630
+ completedAt: IsoDateTime
631
+ });
632
+ var ThreadActivityAppendedPayload = Schema3.Struct({
633
+ threadId: ThreadId,
634
+ activity: OrchestrationThreadActivity
635
+ });
636
+ var OrchestrationEventMetadata = Schema3.Struct({
637
+ providerTurnId: Schema3.optional(TrimmedNonEmptyString),
638
+ providerItemId: Schema3.optional(ProviderItemId),
639
+ adapterKey: Schema3.optional(TrimmedNonEmptyString),
640
+ requestId: Schema3.optional(ApprovalRequestId),
641
+ ingestedAt: Schema3.optional(IsoDateTime)
642
+ });
643
+ var EventBaseFields = {
644
+ sequence: NonNegativeInt,
645
+ eventId: EventId,
646
+ aggregateKind: OrchestrationAggregateKind,
647
+ aggregateId: Schema3.Union([ProjectId, ThreadId]),
648
+ occurredAt: IsoDateTime,
649
+ commandId: Schema3.NullOr(CommandId),
650
+ causationEventId: Schema3.NullOr(EventId),
651
+ correlationId: Schema3.NullOr(CommandId),
652
+ metadata: OrchestrationEventMetadata
653
+ };
654
+ var PersistedEventBaseFields = {
655
+ sequence: NonNegativeInt,
656
+ eventId: EventId,
657
+ aggregateKind: OrchestrationAggregateKind,
658
+ streamId: Schema3.Union([ProjectId, ThreadId]),
659
+ streamVersion: NonNegativeInt,
660
+ occurredAt: IsoDateTime,
661
+ commandId: Schema3.NullOr(CommandId),
662
+ causationEventId: Schema3.NullOr(EventId),
663
+ correlationId: Schema3.NullOr(CommandId),
664
+ actorKind: OrchestrationActorKind,
665
+ metadata: OrchestrationEventMetadata
666
+ };
667
+ var OrchestrationEvent = Schema3.Union([
668
+ Schema3.Struct({
669
+ ...EventBaseFields,
670
+ type: Schema3.Literal("project.created"),
671
+ payload: ProjectCreatedPayload
672
+ }),
673
+ Schema3.Struct({
674
+ ...EventBaseFields,
675
+ type: Schema3.Literal("project.meta-updated"),
676
+ payload: ProjectMetaUpdatedPayload
677
+ }),
678
+ Schema3.Struct({
679
+ ...EventBaseFields,
680
+ type: Schema3.Literal("project.deleted"),
681
+ payload: ProjectDeletedPayload
682
+ }),
683
+ Schema3.Struct({
684
+ ...EventBaseFields,
685
+ type: Schema3.Literal("thread.created"),
686
+ payload: ThreadCreatedPayload
687
+ }),
688
+ Schema3.Struct({
689
+ ...EventBaseFields,
690
+ type: Schema3.Literal("thread.deleted"),
691
+ payload: ThreadDeletedPayload
692
+ }),
693
+ Schema3.Struct({
694
+ ...EventBaseFields,
695
+ type: Schema3.Literal("thread.meta-updated"),
696
+ payload: ThreadMetaUpdatedPayload
697
+ }),
698
+ Schema3.Struct({
699
+ ...EventBaseFields,
700
+ type: Schema3.Literal("thread.runtime-mode-set"),
701
+ payload: ThreadRuntimeModeSetPayload
702
+ }),
703
+ Schema3.Struct({
704
+ ...EventBaseFields,
705
+ type: Schema3.Literal("thread.interaction-mode-set"),
706
+ payload: ThreadInteractionModeSetPayload
707
+ }),
708
+ Schema3.Struct({
709
+ ...EventBaseFields,
710
+ type: Schema3.Literal("thread.message-sent"),
711
+ payload: ThreadMessageSentPayload
712
+ }),
713
+ Schema3.Struct({
714
+ ...EventBaseFields,
715
+ type: Schema3.Literal("thread.turn-start-requested"),
716
+ payload: ThreadTurnStartRequestedPayload
717
+ }),
718
+ Schema3.Struct({
719
+ ...EventBaseFields,
720
+ type: Schema3.Literal("thread.turn-interrupt-requested"),
721
+ payload: ThreadTurnInterruptRequestedPayload
722
+ }),
723
+ Schema3.Struct({
724
+ ...EventBaseFields,
725
+ type: Schema3.Literal("thread.approval-response-requested"),
726
+ payload: ThreadApprovalResponseRequestedPayload
727
+ }),
728
+ Schema3.Struct({
729
+ ...EventBaseFields,
730
+ type: Schema3.Literal("thread.user-input-response-requested"),
731
+ payload: ThreadUserInputResponseRequestedPayload
732
+ }),
733
+ Schema3.Struct({
734
+ ...EventBaseFields,
735
+ type: Schema3.Literal("thread.checkpoint-revert-requested"),
736
+ payload: ThreadCheckpointRevertRequestedPayload
737
+ }),
738
+ Schema3.Struct({
739
+ ...EventBaseFields,
740
+ type: Schema3.Literal("thread.reverted"),
741
+ payload: ThreadRevertedPayload
742
+ }),
743
+ Schema3.Struct({
744
+ ...EventBaseFields,
745
+ type: Schema3.Literal("thread.session-stop-requested"),
746
+ payload: ThreadSessionStopRequestedPayload
747
+ }),
748
+ Schema3.Struct({
749
+ ...EventBaseFields,
750
+ type: Schema3.Literal("thread.session-set"),
751
+ payload: ThreadSessionSetPayload
752
+ }),
753
+ Schema3.Struct({
754
+ ...EventBaseFields,
755
+ type: Schema3.Literal("thread.proposed-plan-upserted"),
756
+ payload: ThreadProposedPlanUpsertedPayload
757
+ }),
758
+ Schema3.Struct({
759
+ ...EventBaseFields,
760
+ type: Schema3.Literal("thread.turn-diff-completed"),
761
+ payload: ThreadTurnDiffCompletedPayload
762
+ }),
763
+ Schema3.Struct({
764
+ ...EventBaseFields,
765
+ type: Schema3.Literal("thread.activity-appended"),
766
+ payload: ThreadActivityAppendedPayload
767
+ })
768
+ ]);
769
+ var OrchestrationPersistedEvent = Schema3.Union([
770
+ Schema3.Struct({
771
+ ...PersistedEventBaseFields,
772
+ eventType: Schema3.Literal("project.created"),
773
+ payload: ProjectCreatedPayload
774
+ }),
775
+ Schema3.Struct({
776
+ ...PersistedEventBaseFields,
777
+ eventType: Schema3.Literal("project.meta-updated"),
778
+ payload: ProjectMetaUpdatedPayload
779
+ }),
780
+ Schema3.Struct({
781
+ ...PersistedEventBaseFields,
782
+ eventType: Schema3.Literal("project.deleted"),
783
+ payload: ProjectDeletedPayload
784
+ }),
785
+ Schema3.Struct({
786
+ ...PersistedEventBaseFields,
787
+ eventType: Schema3.Literal("thread.created"),
788
+ payload: ThreadCreatedPayload
789
+ }),
790
+ Schema3.Struct({
791
+ ...PersistedEventBaseFields,
792
+ eventType: Schema3.Literal("thread.deleted"),
793
+ payload: ThreadDeletedPayload
794
+ }),
795
+ Schema3.Struct({
796
+ ...PersistedEventBaseFields,
797
+ eventType: Schema3.Literal("thread.meta-updated"),
798
+ payload: ThreadMetaUpdatedPayload
799
+ }),
800
+ Schema3.Struct({
801
+ ...PersistedEventBaseFields,
802
+ eventType: Schema3.Literal("thread.runtime-mode-set"),
803
+ payload: ThreadRuntimeModeSetPayload
804
+ }),
805
+ Schema3.Struct({
806
+ ...PersistedEventBaseFields,
807
+ eventType: Schema3.Literal("thread.interaction-mode-set"),
808
+ payload: ThreadInteractionModeSetPayload
809
+ }),
810
+ Schema3.Struct({
811
+ ...PersistedEventBaseFields,
812
+ eventType: Schema3.Literal("thread.message-sent"),
813
+ payload: ThreadMessageSentPayload
814
+ }),
815
+ Schema3.Struct({
816
+ ...PersistedEventBaseFields,
817
+ eventType: Schema3.Literal("thread.turn-start-requested"),
818
+ payload: ThreadTurnStartRequestedPayload
819
+ }),
820
+ Schema3.Struct({
821
+ ...PersistedEventBaseFields,
822
+ eventType: Schema3.Literal("thread.turn-interrupt-requested"),
823
+ payload: ThreadTurnInterruptRequestedPayload
824
+ }),
825
+ Schema3.Struct({
826
+ ...PersistedEventBaseFields,
827
+ eventType: Schema3.Literal("thread.approval-response-requested"),
828
+ payload: ThreadApprovalResponseRequestedPayload
829
+ }),
830
+ Schema3.Struct({
831
+ ...PersistedEventBaseFields,
832
+ eventType: Schema3.Literal("thread.user-input-response-requested"),
833
+ payload: ThreadUserInputResponseRequestedPayload
834
+ }),
835
+ Schema3.Struct({
836
+ ...PersistedEventBaseFields,
837
+ eventType: Schema3.Literal("thread.checkpoint-revert-requested"),
838
+ payload: ThreadCheckpointRevertRequestedPayload
839
+ }),
840
+ Schema3.Struct({
841
+ ...PersistedEventBaseFields,
842
+ eventType: Schema3.Literal("thread.reverted"),
843
+ payload: ThreadRevertedPayload
844
+ }),
845
+ Schema3.Struct({
846
+ ...PersistedEventBaseFields,
847
+ eventType: Schema3.Literal("thread.session-stop-requested"),
848
+ payload: ThreadSessionStopRequestedPayload
849
+ }),
850
+ Schema3.Struct({
851
+ ...PersistedEventBaseFields,
852
+ eventType: Schema3.Literal("thread.session-set"),
853
+ payload: ThreadSessionSetPayload
854
+ }),
855
+ Schema3.Struct({
856
+ ...PersistedEventBaseFields,
857
+ eventType: Schema3.Literal("thread.proposed-plan-upserted"),
858
+ payload: ThreadProposedPlanUpsertedPayload
859
+ }),
860
+ Schema3.Struct({
861
+ ...PersistedEventBaseFields,
862
+ eventType: Schema3.Literal("thread.turn-diff-completed"),
863
+ payload: ThreadTurnDiffCompletedPayload
864
+ }),
865
+ Schema3.Struct({
866
+ ...PersistedEventBaseFields,
867
+ eventType: Schema3.Literal("thread.activity-appended"),
868
+ payload: ThreadActivityAppendedPayload
869
+ })
870
+ ]);
871
+ var OrchestrationCommandReceiptStatus = Schema3.Literals(["accepted", "rejected"]);
872
+ var TurnCountRange = Schema3.Struct({
873
+ fromTurnCount: NonNegativeInt,
874
+ toTurnCount: NonNegativeInt
875
+ }).check(Schema3.makeFilter((input) => input.fromTurnCount <= input.toTurnCount || new SchemaIssue.InvalidValue(Option.some(input.fromTurnCount), {
876
+ message: "fromTurnCount must be less than or equal to toTurnCount"
877
+ }), { identifier: "OrchestrationTurnDiffRange" }));
878
+ var ThreadTurnDiff = TurnCountRange.mapFields(Struct.assign({
879
+ threadId: ThreadId,
880
+ diff: Schema3.String
881
+ }), { unsafePreserveChecks: true });
882
+ var ProviderSessionRuntimeStatus = Schema3.Literals([
883
+ "starting",
884
+ "running",
885
+ "stopped",
886
+ "error"
887
+ ]);
888
+ var ProjectionThreadTurnStatus = Schema3.Literals([
889
+ "running",
890
+ "completed",
891
+ "interrupted",
892
+ "error"
893
+ ]);
894
+ var ProjectionCheckpointRow = Schema3.Struct({
895
+ threadId: ThreadId,
896
+ turnId: TurnId,
897
+ checkpointTurnCount: NonNegativeInt,
898
+ checkpointRef: CheckpointRef,
899
+ status: OrchestrationCheckpointStatus,
900
+ files: Schema3.Array(OrchestrationCheckpointFile),
901
+ assistantMessageId: Schema3.NullOr(MessageId),
902
+ completedAt: IsoDateTime
903
+ });
904
+ var ProjectionPendingApprovalStatus = Schema3.Literals(["pending", "resolved"]);
905
+ var ProjectionPendingApprovalDecision = Schema3.NullOr(ProviderApprovalDecision);
906
+ var DispatchResult = Schema3.Struct({
907
+ sequence: NonNegativeInt
908
+ });
909
+ var OrchestrationGetSnapshotInput = Schema3.Struct({});
910
+ var OrchestrationGetTurnDiffInput = TurnCountRange.mapFields(Struct.assign({ threadId: ThreadId }), { unsafePreserveChecks: true });
911
+ var OrchestrationGetFullThreadDiffInput = Schema3.Struct({
912
+ threadId: ThreadId,
913
+ toTurnCount: NonNegativeInt
914
+ });
915
+ var OrchestrationReplayEventsInput = Schema3.Struct({
916
+ fromSequenceExclusive: NonNegativeInt
917
+ });
918
+ var OrchestrationReplayEventsResult = Schema3.Array(OrchestrationEvent);
919
+
920
+ // packages/contracts/src/runtime.ts
921
+ var RunKind = Schema4.Literals(["adhoc", "task", "batch", "validation", "review"]);
922
+ var RunMode = Schema4.Literals(["interactive", "autonomous", "supervised"]);
923
+ var RunStatus = Schema4.Literals([
924
+ "created",
925
+ "queued",
926
+ "preparing",
927
+ "running",
928
+ "waiting-approval",
929
+ "waiting-user-input",
930
+ "paused",
931
+ "validating",
932
+ "reviewing",
933
+ "closing-out",
934
+ "needs-attention",
935
+ "completed",
936
+ "failed",
937
+ "stopped"
938
+ ]);
939
+ var EngineSandboxMode = Schema4.Literals([
940
+ "read-only",
941
+ "workspace-write",
942
+ "danger-full-access"
943
+ ]);
944
+ var IsolationMode = Schema4.Literals(["none", "env", "worktree"]);
945
+ var RuntimeStatus = Schema4.Literals([
946
+ "prepared",
947
+ "starting",
948
+ "running",
949
+ "interrupted",
950
+ "exited",
951
+ "failed",
952
+ "destroyed"
953
+ ]);
954
+ var RunExecutionTarget = Schema4.Literals(["local", "remote"]);
955
+ var RunSummary = Schema4.Struct({
956
+ id: RunId,
957
+ workspaceId: WorkspaceId,
958
+ taskId: Schema4.NullOr(TaskId),
959
+ title: TrimmedNonEmptyString,
960
+ runKind: RunKind,
961
+ mode: RunMode,
962
+ runtimeMode: RuntimeMode,
963
+ interactionMode: ProviderInteractionMode,
964
+ status: RunStatus,
965
+ runtimeAdapter: TrimmedNonEmptyString,
966
+ model: Schema4.NullOr(TrimmedNonEmptyString),
967
+ initialPrompt: Schema4.NullOr(Schema4.String),
968
+ executionTarget: Schema4.optional(RunExecutionTarget),
969
+ remoteHostId: Schema4.optional(Schema4.NullOr(TrimmedNonEmptyString)),
970
+ remoteLeaseId: Schema4.optional(Schema4.NullOr(TrimmedNonEmptyString)),
971
+ remoteLeaseClaimedAt: Schema4.optional(Schema4.NullOr(IsoDateTime)),
972
+ activeRuntimeId: Schema4.NullOr(EngineRuntimeId),
973
+ latestMessageId: Schema4.NullOr(TrimmedNonEmptyString),
974
+ pendingApprovalCount: NonNegativeInt,
975
+ pendingUserInputCount: NonNegativeInt,
976
+ branch: Schema4.NullOr(TrimmedNonEmptyString),
977
+ worktreePath: Schema4.NullOr(TrimmedNonEmptyString),
978
+ errorText: Schema4.NullOr(Schema4.String),
979
+ createdAt: IsoDateTime,
980
+ updatedAt: IsoDateTime,
981
+ startedAt: Schema4.NullOr(IsoDateTime),
982
+ completedAt: Schema4.NullOr(IsoDateTime)
983
+ });
984
+ var RuntimeSummary = Schema4.Struct({
985
+ id: EngineRuntimeId,
986
+ workspaceId: WorkspaceId,
987
+ runId: RunId,
988
+ adapterKind: TrimmedNonEmptyString,
989
+ executionTarget: Schema4.optional(RunExecutionTarget),
990
+ remoteHostId: Schema4.optional(Schema4.NullOr(TrimmedNonEmptyString)),
991
+ status: RuntimeStatus,
992
+ sandboxMode: EngineSandboxMode,
993
+ isolationMode: IsolationMode,
994
+ workspaceDir: Schema4.NullOr(TrimmedNonEmptyString),
995
+ homeDir: Schema4.NullOr(TrimmedNonEmptyString),
996
+ tmpDir: Schema4.NullOr(TrimmedNonEmptyString),
997
+ cacheDir: Schema4.NullOr(TrimmedNonEmptyString),
998
+ logsDir: Schema4.NullOr(TrimmedNonEmptyString),
999
+ stateDir: Schema4.NullOr(TrimmedNonEmptyString),
1000
+ sessionDir: Schema4.NullOr(TrimmedNonEmptyString),
1001
+ sessionLogPath: Schema4.NullOr(TrimmedNonEmptyString),
1002
+ pid: Schema4.NullOr(NonNegativeInt),
1003
+ startedAt: Schema4.NullOr(IsoDateTime),
1004
+ updatedAt: IsoDateTime,
1005
+ exitedAt: Schema4.NullOr(IsoDateTime)
1006
+ });
1007
+ var ApprovalStatus = Schema4.Literals(["pending", "resolved"]);
1008
+ var ApprovalSummary = Schema4.Struct({
1009
+ id: TrimmedNonEmptyString,
1010
+ runId: RunId,
1011
+ actionId: Schema4.NullOr(TrimmedNonEmptyString),
1012
+ requestKind: TrimmedNonEmptyString,
1013
+ status: ApprovalStatus,
1014
+ payload: Schema4.Unknown,
1015
+ createdAt: IsoDateTime,
1016
+ resolvedAt: Schema4.NullOr(IsoDateTime)
1017
+ });
1018
+ var UserInputRequestSummary = Schema4.Struct({
1019
+ id: TrimmedNonEmptyString,
1020
+ runId: RunId,
1021
+ status: ApprovalStatus,
1022
+ payload: Schema4.Unknown,
1023
+ createdAt: IsoDateTime,
1024
+ resolvedAt: Schema4.NullOr(IsoDateTime)
1025
+ });
1026
+ var WorktreeSummary = Schema4.Struct({
1027
+ id: WorktreeId,
1028
+ workspaceId: WorkspaceId,
1029
+ runId: RunId,
1030
+ taskId: Schema4.NullOr(TaskId),
1031
+ branchName: TrimmedNonEmptyString,
1032
+ path: TrimmedNonEmptyString,
1033
+ status: TrimmedNonEmptyString,
1034
+ createdAt: IsoDateTime,
1035
+ cleanedAt: Schema4.NullOr(IsoDateTime)
1036
+ });
1037
+
1038
+ // packages/contracts/src/run-journal.ts
1039
+ var RunActor = Schema5.Struct({
1040
+ kind: Schema5.Literals(["operator", "agent", "server", "system"]),
1041
+ id: Schema5.optional(Schema5.NullOr(TrimmedNonEmptyString))
1042
+ });
1043
+ var RunCloseoutPhase = Schema5.Literals([
1044
+ "queued",
1045
+ "commit",
1046
+ "push",
1047
+ "pr-review-merge",
1048
+ "pr-opened",
1049
+ "merge",
1050
+ "close-source",
1051
+ "completed"
1052
+ ]);
1053
+ var RunCloseoutPhaseOutcome = Schema5.Literals(["started", "completed", "failed"]);
1054
+ var RunCloseoutStatus = Schema5.Literals([
1055
+ "pending",
1056
+ "running",
1057
+ "completed",
1058
+ "needs-attention",
1059
+ "failed"
1060
+ ]);
1061
+ var RunCloseoutState = Schema5.Struct({
1062
+ phase: RunCloseoutPhase,
1063
+ status: RunCloseoutStatus,
1064
+ updatedAt: IsoDateTime,
1065
+ taskId: Schema5.optional(Schema5.NullOr(TrimmedNonEmptyString)),
1066
+ runtimeWorkspace: Schema5.optional(Schema5.NullOr(TrimmedNonEmptyString)),
1067
+ branch: Schema5.optional(Schema5.NullOr(TrimmedNonEmptyString)),
1068
+ prUrl: Schema5.optional(Schema5.NullOr(TrimmedNonEmptyString)),
1069
+ artifactRoot: Schema5.optional(Schema5.NullOr(TrimmedNonEmptyString)),
1070
+ iterations: Schema5.optional(Schema5.NullOr(Schema5.Int)),
1071
+ feedback: Schema5.optional(Schema5.Array(Schema5.String)),
1072
+ error: Schema5.optional(Schema5.NullOr(Schema5.String)),
1073
+ reason: Schema5.optional(Schema5.NullOr(Schema5.String)),
1074
+ merged: Schema5.optional(Schema5.Boolean),
1075
+ resumedAt: Schema5.optional(Schema5.NullOr(IsoDateTime)),
1076
+ completedAt: Schema5.optional(Schema5.NullOr(IsoDateTime))
1077
+ });
1078
+ var ApprovalDecision = Schema5.Literals(["approve", "reject"]);
1079
+ var runRecordFields = {
1080
+ runId: TrimmedNonEmptyString,
1081
+ workspaceId: TrimmedNonEmptyString,
1082
+ taskId: Schema5.NullOr(TrimmedNonEmptyString),
1083
+ threadId: Schema5.NullOr(TrimmedNonEmptyString),
1084
+ mode: Schema5.Literals(["local", "remote"]),
1085
+ runtimeAdapter: TrimmedNonEmptyString,
1086
+ createdAt: IsoDateTime,
1087
+ startedAt: Schema5.NullOr(IsoDateTime),
1088
+ completedAt: Schema5.NullOr(IsoDateTime),
1089
+ endpointId: Schema5.NullOr(TrimmedNonEmptyString),
1090
+ hostId: Schema5.NullOr(TrimmedNonEmptyString),
1091
+ worktreePath: Schema5.NullOr(TrimmedNonEmptyString),
1092
+ artifactRoot: Schema5.NullOr(TrimmedNonEmptyString),
1093
+ logRoot: Schema5.NullOr(TrimmedNonEmptyString),
1094
+ sessionPath: Schema5.NullOr(TrimmedNonEmptyString),
1095
+ sessionLogPath: Schema5.NullOr(TrimmedNonEmptyString),
1096
+ pid: Schema5.optional(Schema5.NullOr(Schema5.Int)),
1097
+ piSession: Schema5.optional(Schema5.Unknown),
1098
+ piSessionPrivate: Schema5.optional(Schema5.Unknown),
1099
+ updatedAt: IsoDateTime,
1100
+ title: TrimmedNonEmptyString,
1101
+ projectRoot: Schema5.optional(Schema5.NullOr(TrimmedNonEmptyString)),
1102
+ errorText: Schema5.optional(Schema5.NullOr(Schema5.String)),
1103
+ latestMessageId: Schema5.optional(Schema5.NullOr(TrimmedNonEmptyString)),
1104
+ prUrl: Schema5.optional(Schema5.NullOr(TrimmedNonEmptyString)),
1105
+ leaseId: Schema5.optional(Schema5.NullOr(TrimmedNonEmptyString)),
1106
+ serverCloseout: Schema5.optional(Schema5.NullOr(RunCloseoutState)),
1107
+ model: Schema5.optional(Schema5.NullOr(TrimmedNonEmptyString)),
1108
+ runtimeMode: Schema5.optional(Schema5.NullOr(TrimmedNonEmptyString)),
1109
+ interactionMode: Schema5.optional(Schema5.NullOr(TrimmedNonEmptyString)),
1110
+ runMode: Schema5.optional(Schema5.NullOr(TrimmedNonEmptyString)),
1111
+ initialPrompt: Schema5.optional(Schema5.NullOr(Schema5.String)),
1112
+ baselineMode: Schema5.optional(Schema5.NullOr(TrimmedNonEmptyString)),
1113
+ prMode: Schema5.optional(Schema5.NullOr(Schema5.Literals(["auto", "ask", "off"]))),
1114
+ initiatedBy: Schema5.optional(Schema5.NullOr(TrimmedNonEmptyString)),
1115
+ sourceTask: Schema5.optional(Schema5.Unknown),
1116
+ serverPid: Schema5.optional(Schema5.NullOr(Schema5.Int)),
1117
+ latestSteeringAt: Schema5.optional(Schema5.NullOr(IsoDateTime)),
1118
+ latestSteeringDeliveredAt: Schema5.optional(Schema5.NullOr(IsoDateTime)),
1119
+ statusDetail: Schema5.optional(Schema5.NullOr(Schema5.String)),
1120
+ planning: Schema5.optional(Schema5.Unknown),
1121
+ branch: Schema5.optional(Schema5.NullOr(TrimmedNonEmptyString))
1122
+ };
1123
+ var RunJournalRecord = Schema5.Struct({
1124
+ ...runRecordFields,
1125
+ status: RunStatus
1126
+ });
1127
+ var RunRecordPatch = Schema5.Struct({
1128
+ runId: Schema5.optional(runRecordFields.runId),
1129
+ workspaceId: Schema5.optional(runRecordFields.workspaceId),
1130
+ taskId: Schema5.optional(runRecordFields.taskId),
1131
+ threadId: Schema5.optional(runRecordFields.threadId),
1132
+ mode: Schema5.optional(runRecordFields.mode),
1133
+ runtimeAdapter: Schema5.optional(runRecordFields.runtimeAdapter),
1134
+ createdAt: Schema5.optional(runRecordFields.createdAt),
1135
+ startedAt: Schema5.optional(runRecordFields.startedAt),
1136
+ completedAt: Schema5.optional(runRecordFields.completedAt),
1137
+ endpointId: Schema5.optional(runRecordFields.endpointId),
1138
+ hostId: Schema5.optional(runRecordFields.hostId),
1139
+ worktreePath: Schema5.optional(runRecordFields.worktreePath),
1140
+ artifactRoot: Schema5.optional(runRecordFields.artifactRoot),
1141
+ logRoot: Schema5.optional(runRecordFields.logRoot),
1142
+ sessionPath: Schema5.optional(runRecordFields.sessionPath),
1143
+ sessionLogPath: Schema5.optional(runRecordFields.sessionLogPath),
1144
+ pid: runRecordFields.pid,
1145
+ piSession: runRecordFields.piSession,
1146
+ piSessionPrivate: runRecordFields.piSessionPrivate,
1147
+ updatedAt: Schema5.optional(runRecordFields.updatedAt),
1148
+ title: Schema5.optional(runRecordFields.title),
1149
+ projectRoot: runRecordFields.projectRoot,
1150
+ errorText: runRecordFields.errorText,
1151
+ latestMessageId: runRecordFields.latestMessageId,
1152
+ prUrl: runRecordFields.prUrl,
1153
+ leaseId: runRecordFields.leaseId,
1154
+ serverCloseout: runRecordFields.serverCloseout,
1155
+ model: runRecordFields.model,
1156
+ runtimeMode: runRecordFields.runtimeMode,
1157
+ interactionMode: runRecordFields.interactionMode,
1158
+ runMode: runRecordFields.runMode,
1159
+ initialPrompt: runRecordFields.initialPrompt,
1160
+ baselineMode: runRecordFields.baselineMode,
1161
+ prMode: runRecordFields.prMode,
1162
+ initiatedBy: runRecordFields.initiatedBy,
1163
+ sourceTask: runRecordFields.sourceTask,
1164
+ serverPid: runRecordFields.serverPid,
1165
+ latestSteeringAt: runRecordFields.latestSteeringAt,
1166
+ latestSteeringDeliveredAt: runRecordFields.latestSteeringDeliveredAt,
1167
+ statusDetail: runRecordFields.statusDetail,
1168
+ planning: runRecordFields.planning,
1169
+ branch: runRecordFields.branch
1170
+ });
1171
+ var journalEnvelopeFields = {
1172
+ v: Schema5.Literal(1),
1173
+ seq: PositiveInt,
1174
+ at: IsoDateTime,
1175
+ runId: RunId
1176
+ };
1177
+ var RunStatusChangedEvent = Schema5.Struct({
1178
+ ...journalEnvelopeFields,
1179
+ type: Schema5.Literal("status-changed"),
1180
+ from: Schema5.NullOr(RunStatus),
1181
+ to: RunStatus,
1182
+ reason: Schema5.optional(Schema5.NullOr(Schema5.String)),
1183
+ actor: Schema5.optional(RunActor)
1184
+ });
1185
+ var RunRecordPatchEvent = Schema5.Struct({
1186
+ ...journalEnvelopeFields,
1187
+ type: Schema5.Literal("record-patch"),
1188
+ patch: RunRecordPatch
1189
+ });
1190
+ var RunTimelineEntryEvent = Schema5.Struct({
1191
+ ...journalEnvelopeFields,
1192
+ type: Schema5.Literal("timeline-entry"),
1193
+ payload: Schema5.Unknown
1194
+ });
1195
+ var RunLogEntryEvent = Schema5.Struct({
1196
+ ...journalEnvelopeFields,
1197
+ type: Schema5.Literal("log-entry"),
1198
+ payload: Schema5.Unknown
1199
+ });
1200
+ var RunApprovalRequestedEvent = Schema5.Struct({
1201
+ ...journalEnvelopeFields,
1202
+ type: Schema5.Literal("approval-requested"),
1203
+ requestId: TrimmedNonEmptyString,
1204
+ requestKind: TrimmedNonEmptyString,
1205
+ actionId: Schema5.optional(Schema5.NullOr(TrimmedNonEmptyString)),
1206
+ payload: Schema5.Unknown
1207
+ });
1208
+ var RunApprovalResolvedEvent = Schema5.Struct({
1209
+ ...journalEnvelopeFields,
1210
+ type: Schema5.Literal("approval-resolved"),
1211
+ requestId: TrimmedNonEmptyString,
1212
+ decision: ApprovalDecision,
1213
+ note: Schema5.optional(Schema5.NullOr(Schema5.String)),
1214
+ actor: RunActor
1215
+ });
1216
+ var RunInputRequestedEvent = Schema5.Struct({
1217
+ ...journalEnvelopeFields,
1218
+ type: Schema5.Literal("input-requested"),
1219
+ requestId: TrimmedNonEmptyString,
1220
+ payload: Schema5.Unknown
1221
+ });
1222
+ var RunInputResolvedEvent = Schema5.Struct({
1223
+ ...journalEnvelopeFields,
1224
+ type: Schema5.Literal("input-resolved"),
1225
+ requestId: TrimmedNonEmptyString,
1226
+ answers: Schema5.Record(Schema5.String, Schema5.String),
1227
+ actor: RunActor
1228
+ });
1229
+ var RunSteeringEvent = Schema5.Struct({
1230
+ ...journalEnvelopeFields,
1231
+ type: Schema5.Literal("steering"),
1232
+ actor: RunActor,
1233
+ text: Schema5.String
1234
+ });
1235
+ var RunAdoptedEvent = Schema5.Struct({
1236
+ ...journalEnvelopeFields,
1237
+ type: Schema5.Literal("adopted"),
1238
+ pid: Schema5.NullOr(Schema5.Int),
1239
+ serverPid: Schema5.Int
1240
+ });
1241
+ var RunStallDetectedEvent = Schema5.Struct({
1242
+ ...journalEnvelopeFields,
1243
+ type: Schema5.Literal("stall-detected"),
1244
+ detail: Schema5.String
1245
+ });
1246
+ var RunCloseoutPhaseEvent = Schema5.Struct({
1247
+ ...journalEnvelopeFields,
1248
+ type: Schema5.Literal("closeout-phase"),
1249
+ phase: RunCloseoutPhase,
1250
+ outcome: RunCloseoutPhaseOutcome,
1251
+ detail: Schema5.optional(Schema5.NullOr(Schema5.String))
1252
+ });
1253
+ var RunJournalEvent = Schema5.Union([
1254
+ RunStatusChangedEvent,
1255
+ RunRecordPatchEvent,
1256
+ RunTimelineEntryEvent,
1257
+ RunLogEntryEvent,
1258
+ RunApprovalRequestedEvent,
1259
+ RunApprovalResolvedEvent,
1260
+ RunInputRequestedEvent,
1261
+ RunInputResolvedEvent,
1262
+ RunSteeringEvent,
1263
+ RunAdoptedEvent,
1264
+ RunStallDetectedEvent,
1265
+ RunCloseoutPhaseEvent
1266
+ ]);
1267
+ var decodeRunJournalEvent = Schema5.decodeUnknownSync(RunJournalEvent);
1268
+ var RUN_STATUS_TRANSITIONS = {
1269
+ created: ["queued", "preparing", "running", "failed", "stopped"],
1270
+ queued: ["preparing", "running", "failed", "stopped"],
1271
+ preparing: ["queued", "running", "needs-attention", "failed", "stopped"],
1272
+ running: [
1273
+ "queued",
1274
+ "waiting-approval",
1275
+ "waiting-user-input",
1276
+ "paused",
1277
+ "validating",
1278
+ "reviewing",
1279
+ "closing-out",
1280
+ "needs-attention",
1281
+ "completed",
1282
+ "failed",
1283
+ "stopped"
1284
+ ],
1285
+ "waiting-approval": ["running", "needs-attention", "failed", "stopped"],
1286
+ "waiting-user-input": ["running", "needs-attention", "failed", "stopped"],
1287
+ paused: ["running", "failed", "stopped"],
1288
+ validating: ["running", "reviewing", "closing-out", "needs-attention", "completed", "failed", "stopped"],
1289
+ reviewing: ["running", "validating", "closing-out", "needs-attention", "completed", "failed", "stopped"],
1290
+ "closing-out": ["running", "needs-attention", "completed", "failed", "stopped"],
1291
+ "needs-attention": ["queued", "preparing", "running", "closing-out", "completed", "failed", "stopped"],
1292
+ completed: [],
1293
+ failed: ["queued", "preparing", "running", "closing-out"],
1294
+ stopped: ["queued", "preparing", "running", "closing-out"]
1295
+ };
1296
+ var TERMINAL_RUN_STATUSES = ["completed", "failed", "stopped"];
1297
+ var ACTIVE_RUN_STATUSES = Object.keys(RUN_STATUS_TRANSITIONS).filter((status) => !TERMINAL_RUN_STATUSES.includes(status));
1298
+ function isTerminalRunStatus(status) {
1299
+ return TERMINAL_RUN_STATUSES.includes(status);
1300
+ }
1301
+ function canTransitionRunStatus(from, to) {
1302
+ if (from === null)
1303
+ return true;
1304
+ if (from === to)
1305
+ return true;
1306
+ return RUN_STATUS_TRANSITIONS[from].includes(to);
1307
+ }
1308
+ function reduceRunJournal(events) {
1309
+ let record = {};
1310
+ let status = null;
1311
+ const statusHistory = [];
1312
+ const pendingApprovals = new Map;
1313
+ const resolvedApprovals = [];
1314
+ const pendingUserInputs = new Map;
1315
+ const resolvedUserInputs = [];
1316
+ const closeoutPhases = [];
1317
+ const anomalies = [];
1318
+ let steeringCount = 0;
1319
+ let stallCount = 0;
1320
+ let lastSeq = 0;
1321
+ let lastEventAt = null;
1322
+ for (const event of events) {
1323
+ lastSeq = event.seq;
1324
+ lastEventAt = event.at;
1325
+ switch (event.type) {
1326
+ case "status-changed": {
1327
+ if (!canTransitionRunStatus(status, event.to)) {
1328
+ anomalies.push({
1329
+ seq: event.seq,
1330
+ kind: "illegal-transition",
1331
+ detail: `${status ?? "(none)"} -> ${event.to}`
1332
+ });
1333
+ }
1334
+ statusHistory.push({
1335
+ seq: event.seq,
1336
+ at: event.at,
1337
+ from: status,
1338
+ to: event.to,
1339
+ reason: event.reason ?? null
1340
+ });
1341
+ const wasTerminal = status !== null && isTerminalRunStatus(status);
1342
+ status = event.to;
1343
+ record = { ...record, updatedAt: event.at };
1344
+ if (isTerminalRunStatus(event.to) && !record.completedAt) {
1345
+ record = { ...record, completedAt: event.at };
1346
+ }
1347
+ if (!isTerminalRunStatus(event.to) && wasTerminal) {
1348
+ record = { ...record, completedAt: null };
1349
+ }
1350
+ if (event.to === "running" && !record.startedAt) {
1351
+ record = { ...record, startedAt: event.at };
1352
+ }
1353
+ break;
1354
+ }
1355
+ case "record-patch": {
1356
+ const next = { ...record };
1357
+ for (const [key, value] of Object.entries(event.patch)) {
1358
+ if (value !== undefined) {
1359
+ next[key] = value;
1360
+ }
1361
+ }
1362
+ next.updatedAt = event.patch.updatedAt ?? event.at;
1363
+ record = next;
1364
+ break;
1365
+ }
1366
+ case "approval-requested": {
1367
+ pendingApprovals.set(event.requestId, {
1368
+ requestId: event.requestId,
1369
+ requestKind: event.requestKind,
1370
+ actionId: event.actionId ?? null,
1371
+ payload: event.payload,
1372
+ requestedAt: event.at
1373
+ });
1374
+ break;
1375
+ }
1376
+ case "approval-resolved": {
1377
+ const pending = pendingApprovals.get(event.requestId);
1378
+ if (!pending) {
1379
+ const alreadyResolved = resolvedApprovals.some((entry) => entry.requestId === event.requestId);
1380
+ anomalies.push({
1381
+ seq: event.seq,
1382
+ kind: alreadyResolved ? "duplicate-resolution" : "unknown-request",
1383
+ detail: `approval ${event.requestId}`
1384
+ });
1385
+ break;
1386
+ }
1387
+ pendingApprovals.delete(event.requestId);
1388
+ resolvedApprovals.push({
1389
+ ...pending,
1390
+ decision: event.decision,
1391
+ note: event.note ?? null,
1392
+ actor: event.actor,
1393
+ resolvedAt: event.at
1394
+ });
1395
+ break;
1396
+ }
1397
+ case "input-requested": {
1398
+ pendingUserInputs.set(event.requestId, {
1399
+ requestId: event.requestId,
1400
+ requestKind: "user-input",
1401
+ actionId: null,
1402
+ payload: event.payload,
1403
+ requestedAt: event.at
1404
+ });
1405
+ break;
1406
+ }
1407
+ case "input-resolved": {
1408
+ const pending = pendingUserInputs.get(event.requestId);
1409
+ if (!pending) {
1410
+ const alreadyResolved = resolvedUserInputs.some((entry) => entry.requestId === event.requestId);
1411
+ anomalies.push({
1412
+ seq: event.seq,
1413
+ kind: alreadyResolved ? "duplicate-resolution" : "unknown-request",
1414
+ detail: `user-input ${event.requestId}`
1415
+ });
1416
+ break;
1417
+ }
1418
+ pendingUserInputs.delete(event.requestId);
1419
+ resolvedUserInputs.push({
1420
+ ...pending,
1421
+ answers: event.answers,
1422
+ actor: event.actor,
1423
+ resolvedAt: event.at
1424
+ });
1425
+ break;
1426
+ }
1427
+ case "steering": {
1428
+ steeringCount += 1;
1429
+ break;
1430
+ }
1431
+ case "adopted": {
1432
+ record = { ...record, pid: event.pid, updatedAt: event.at };
1433
+ break;
1434
+ }
1435
+ case "stall-detected": {
1436
+ stallCount += 1;
1437
+ break;
1438
+ }
1439
+ case "closeout-phase": {
1440
+ closeoutPhases.push({
1441
+ seq: event.seq,
1442
+ at: event.at,
1443
+ phase: event.phase,
1444
+ outcome: event.outcome,
1445
+ detail: event.detail ?? null
1446
+ });
1447
+ break;
1448
+ }
1449
+ case "timeline-entry":
1450
+ case "log-entry":
1451
+ break;
1452
+ }
1453
+ }
1454
+ return {
1455
+ record,
1456
+ status,
1457
+ statusHistory,
1458
+ pendingApprovals: [...pendingApprovals.values()],
1459
+ resolvedApprovals,
1460
+ pendingUserInputs: [...pendingUserInputs.values()],
1461
+ resolvedUserInputs,
1462
+ steeringCount,
1463
+ stallCount,
1464
+ closeoutPhases,
1465
+ lastSeq,
1466
+ lastEventAt,
1467
+ anomalies
1468
+ };
1469
+ }
1470
+
1471
+ // packages/contracts/src/run-session-journal.ts
1472
+ var RIG_RUN_STATUS_CHANGED = "rig.run.status-changed";
1473
+ var RIG_RUN_RECORD_PATCH = "rig.run.record-patch";
1474
+ var RIG_RUN_TIMELINE_ENTRY = "rig.run.timeline-entry";
1475
+ var RIG_RUN_LOG_ENTRY = "rig.run.log-entry";
1476
+ var RIG_RUN_APPROVAL_REQUESTED = "rig.run.approval-requested";
1477
+ var RIG_RUN_APPROVAL_RESOLVED = "rig.run.approval-resolved";
1478
+ var RIG_RUN_INPUT_REQUESTED = "rig.run.input-requested";
1479
+ var RIG_RUN_INPUT_RESOLVED = "rig.run.input-resolved";
1480
+ var RIG_RUN_STEERING = "rig.run.steering";
1481
+ var RIG_RUN_ADOPTED = "rig.run.adopted";
1482
+ var RIG_RUN_STALL_DETECTED = "rig.run.stall-detected";
1483
+ var RIG_RUN_CLOSEOUT_PHASE = "rig.run.closeout-phase";
1484
+ var RIG_STOP_SENTINEL = "<<RIG_STOP";
1485
+ var RIG_STOP_SENTINEL_END = ">>";
1486
+ function buildStopSentinel(runId, reason, requestedBy = "rig") {
1487
+ const cleanReason = reason?.replace(/[>\n\r]/g, " ").trim();
1488
+ return `${RIG_STOP_SENTINEL} runId=${runId} requestedBy=${requestedBy}${cleanReason ? ` reason=${cleanReason}` : ""}${RIG_STOP_SENTINEL_END}`;
1489
+ }
1490
+ function parseStopSentinel(text, expectedRunId) {
1491
+ const start = text.indexOf(RIG_STOP_SENTINEL);
1492
+ if (start < 0)
1493
+ return null;
1494
+ const end = text.indexOf(RIG_STOP_SENTINEL_END, start);
1495
+ const body = text.slice(start + RIG_STOP_SENTINEL.length, end >= 0 ? end : undefined).trim();
1496
+ const runId = body.match(/(?:^|\s)runId=([^\s>]+)/)?.[1] ?? "";
1497
+ if (runId && runId !== expectedRunId)
1498
+ return null;
1499
+ const reason = body.match(/(?:^|\s)reason=(.+)$/)?.[1]?.trim() ?? null;
1500
+ return { reason };
1501
+ }
1502
+ function sessionIdFromSessionFile(sessionPath) {
1503
+ if (!sessionPath)
1504
+ return null;
1505
+ const file = sessionPath.split(/[\\/]/).pop() ?? "";
1506
+ const match = file.match(/_([0-9a-fA-F][0-9a-fA-F-]{7,})\.jsonl$/);
1507
+ return match?.[1] ?? null;
1508
+ }
1509
+ var CUSTOM_TYPE_FOR = {
1510
+ "status-changed": RIG_RUN_STATUS_CHANGED,
1511
+ "record-patch": RIG_RUN_RECORD_PATCH,
1512
+ "timeline-entry": RIG_RUN_TIMELINE_ENTRY,
1513
+ "log-entry": RIG_RUN_LOG_ENTRY,
1514
+ "approval-requested": RIG_RUN_APPROVAL_REQUESTED,
1515
+ "approval-resolved": RIG_RUN_APPROVAL_RESOLVED,
1516
+ "input-requested": RIG_RUN_INPUT_REQUESTED,
1517
+ "input-resolved": RIG_RUN_INPUT_RESOLVED,
1518
+ steering: RIG_RUN_STEERING,
1519
+ adopted: RIG_RUN_ADOPTED,
1520
+ "stall-detected": RIG_RUN_STALL_DETECTED,
1521
+ "closeout-phase": RIG_RUN_CLOSEOUT_PHASE
1522
+ };
1523
+ var TYPE_FOR_CUSTOM = {
1524
+ [RIG_RUN_STATUS_CHANGED]: "status-changed",
1525
+ [RIG_RUN_RECORD_PATCH]: "record-patch",
1526
+ [RIG_RUN_TIMELINE_ENTRY]: "timeline-entry",
1527
+ [RIG_RUN_LOG_ENTRY]: "log-entry",
1528
+ [RIG_RUN_APPROVAL_REQUESTED]: "approval-requested",
1529
+ [RIG_RUN_APPROVAL_RESOLVED]: "approval-resolved",
1530
+ [RIG_RUN_INPUT_REQUESTED]: "input-requested",
1531
+ [RIG_RUN_INPUT_RESOLVED]: "input-resolved",
1532
+ [RIG_RUN_STEERING]: "steering",
1533
+ [RIG_RUN_ADOPTED]: "adopted",
1534
+ [RIG_RUN_STALL_DETECTED]: "stall-detected",
1535
+ [RIG_RUN_CLOSEOUT_PHASE]: "closeout-phase"
1536
+ };
1537
+ function isRunSessionCustomType(customType) {
1538
+ return customType !== undefined && Object.hasOwn(TYPE_FOR_CUSTOM, customType);
1539
+ }
1540
+ function foldRunSessionEntries(entries, runId) {
1541
+ const events = [];
1542
+ entries.forEach((entry, index) => {
1543
+ if (entry.type !== "custom" || !isRunSessionCustomType(entry.customType))
1544
+ return;
1545
+ const data = entry.data !== null && typeof entry.data === "object" ? entry.data : {};
1546
+ const stamped = {
1547
+ v: 1,
1548
+ seq: index + 1,
1549
+ at: typeof data.at === "string" ? data.at : new Date(0).toISOString(),
1550
+ runId,
1551
+ ...data,
1552
+ type: TYPE_FOR_CUSTOM[entry.customType]
1553
+ };
1554
+ try {
1555
+ events.push(decodeRunJournalEvent(stamped));
1556
+ } catch {}
1557
+ });
1558
+ return reduceRunJournal(events);
1559
+ }
1560
+ export {
1561
+ sessionIdFromSessionFile,
1562
+ parseStopSentinel,
1563
+ isRunSessionCustomType,
1564
+ foldRunSessionEntries,
1565
+ buildStopSentinel,
1566
+ TYPE_FOR_CUSTOM,
1567
+ RIG_STOP_SENTINEL_END,
1568
+ RIG_STOP_SENTINEL,
1569
+ RIG_RUN_TIMELINE_ENTRY,
1570
+ RIG_RUN_STEERING,
1571
+ RIG_RUN_STATUS_CHANGED,
1572
+ RIG_RUN_STALL_DETECTED,
1573
+ RIG_RUN_RECORD_PATCH,
1574
+ RIG_RUN_LOG_ENTRY,
1575
+ RIG_RUN_INPUT_RESOLVED,
1576
+ RIG_RUN_INPUT_REQUESTED,
1577
+ RIG_RUN_CLOSEOUT_PHASE,
1578
+ RIG_RUN_APPROVAL_RESOLVED,
1579
+ RIG_RUN_APPROVAL_REQUESTED,
1580
+ RIG_RUN_ADOPTED,
1581
+ CUSTOM_TYPE_FOR
1582
+ };