@h-rig/contracts 0.0.6-alpha.132 → 0.0.6-alpha.134

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.
@@ -1,7 +1,245 @@
1
1
  // @bun
2
2
  // packages/contracts/src/plugin.ts
3
+ import { Schema as Schema4 } from "effect";
4
+
5
+ // packages/contracts/src/kernel.ts
6
+ import { Schema as Schema3 } from "effect";
7
+
8
+ // packages/contracts/src/baseSchemas.ts
3
9
  import { Schema } from "effect";
4
- var ValidatorCategory = Schema.Literals([
10
+ var TrimmedString = Schema.Trim;
11
+ var TrimmedNonEmptyString = TrimmedString.check(Schema.isNonEmpty());
12
+ var NonNegativeInt = Schema.Int.check(Schema.isGreaterThanOrEqualTo(0));
13
+ var PositiveInt = Schema.Int.check(Schema.isGreaterThanOrEqualTo(1));
14
+ var IsoDateTime = Schema.String;
15
+ var makeEntityId = (brand) => TrimmedNonEmptyString.pipe(Schema.brand(brand));
16
+ var ThreadId = makeEntityId("ThreadId");
17
+ var ProjectId = makeEntityId("ProjectId");
18
+ var WorkspaceId = makeEntityId("WorkspaceId");
19
+ var GraphId = makeEntityId("GraphId");
20
+ var TaskId = makeEntityId("TaskId");
21
+ var RunId = makeEntityId("RunId");
22
+ var SafePathSegment = TrimmedNonEmptyString.check(Schema.isPattern(/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/)).pipe(Schema.brand("SafePathSegment"));
23
+ var SafeRunId = TrimmedNonEmptyString.check(Schema.isPattern(/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/)).pipe(Schema.brand("SafeRunId"));
24
+ var SafeGitRefComponent = TrimmedNonEmptyString.check(Schema.isPattern(/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/)).pipe(Schema.brand("SafeGitRefComponent"));
25
+ var EngineRuntimeId = makeEntityId("EngineRuntimeId");
26
+ var ConversationId = makeEntityId("ConversationId");
27
+ var ActionId = makeEntityId("ActionId");
28
+ var ArtifactId = makeEntityId("ArtifactId");
29
+ var WorktreeId = makeEntityId("WorktreeId");
30
+ var ValidationResultId = makeEntityId("ValidationResultId");
31
+ var ReviewResultId = makeEntityId("ReviewResultId");
32
+ var CommandId = makeEntityId("CommandId");
33
+ var EventId = makeEntityId("EventId");
34
+ var MessageId = makeEntityId("MessageId");
35
+ var TurnId = makeEntityId("TurnId");
36
+ var ProviderItemId = makeEntityId("ProviderItemId");
37
+ var RuntimeSessionId = makeEntityId("RuntimeSessionId");
38
+ var RuntimeItemId = makeEntityId("RuntimeItemId");
39
+ var RuntimeRequestId = makeEntityId("RuntimeRequestId");
40
+ var RuntimeTaskId = makeEntityId("RuntimeTaskId");
41
+ var ApprovalRequestId = makeEntityId("ApprovalRequestId");
42
+ var CheckpointRef = makeEntityId("CheckpointRef");
43
+ var RemoteEndpointId = makeEntityId("RemoteEndpointId");
44
+
45
+ // packages/contracts/src/stage.ts
46
+ import { Schema as Schema2 } from "effect";
47
+ var StageKind = Schema2.Literals(["transform", "gate", "observe"]);
48
+ var StageId = TrimmedNonEmptyString.pipe(Schema2.brand("StageId"));
49
+ var StageContext = Schema2.Struct({
50
+ runId: RunId,
51
+ taskId: Schema2.optional(Schema2.NullOr(TaskId)),
52
+ state: Schema2.Unknown,
53
+ metadata: Schema2.optional(Schema2.Record(Schema2.String, Schema2.Unknown))
54
+ });
55
+ var StageDescriptor = Schema2.Struct({
56
+ id: StageId,
57
+ kind: StageKind,
58
+ before: Schema2.optional(Schema2.Array(StageId)),
59
+ after: Schema2.optional(Schema2.Array(StageId)),
60
+ priority: Schema2.Number.pipe(Schema2.withDecodingDefault(() => 0)),
61
+ protected: Schema2.Boolean.pipe(Schema2.withDecodingDefault(() => false))
62
+ });
63
+ var StageContinueResult = Schema2.Struct({
64
+ kind: Schema2.Literal("continue"),
65
+ ctx: StageContext
66
+ });
67
+ var StageAllowResult = Schema2.Struct({
68
+ kind: Schema2.Literal("allow")
69
+ });
70
+ var StageBlockResult = Schema2.Struct({
71
+ kind: Schema2.Literal("block"),
72
+ reason: TrimmedNonEmptyString
73
+ });
74
+ var StageResult = Schema2.Union([
75
+ StageContinueResult,
76
+ StageAllowResult,
77
+ StageBlockResult
78
+ ]);
79
+ var StageWrapperDescriptor = Schema2.Struct({
80
+ id: TrimmedNonEmptyString,
81
+ priority: Schema2.Number.pipe(Schema2.withDecodingDefault(() => 0))
82
+ });
83
+ var StageMutationOp = Schema2.Literals(["insert", "remove", "replace", "wrap", "reorder"]);
84
+ var InsertStageMutation = Schema2.Struct({
85
+ op: Schema2.Literal("insert"),
86
+ stage: StageDescriptor,
87
+ contributedBy: Schema2.optional(TrimmedNonEmptyString)
88
+ });
89
+ var RemoveStageMutation = Schema2.Struct({
90
+ op: Schema2.Literal("remove"),
91
+ id: StageId,
92
+ contributedBy: Schema2.optional(TrimmedNonEmptyString)
93
+ });
94
+ var ReplaceStageMutation = Schema2.Struct({
95
+ op: Schema2.Literal("replace"),
96
+ id: StageId,
97
+ stage: StageDescriptor,
98
+ contributedBy: Schema2.optional(TrimmedNonEmptyString)
99
+ });
100
+ var WrapStageMutation = Schema2.Struct({
101
+ op: Schema2.Literal("wrap"),
102
+ id: StageId,
103
+ around: StageWrapperDescriptor,
104
+ contributedBy: Schema2.optional(TrimmedNonEmptyString)
105
+ });
106
+ var ReorderStageMutation = Schema2.Struct({
107
+ op: Schema2.Literal("reorder"),
108
+ id: StageId,
109
+ before: Schema2.optional(Schema2.Array(StageId)),
110
+ after: Schema2.optional(Schema2.Array(StageId)),
111
+ contributedBy: Schema2.optional(TrimmedNonEmptyString)
112
+ });
113
+ var StageMutation = Schema2.Union([
114
+ InsertStageMutation,
115
+ RemoveStageMutation,
116
+ ReplaceStageMutation,
117
+ WrapStageMutation,
118
+ ReorderStageMutation
119
+ ]);
120
+ var ResolutionGrantUse = Schema2.Struct({
121
+ kind: Schema2.Literals(["protected-stage", "kernel-replacement"]),
122
+ target: TrimmedNonEmptyString,
123
+ pluginId: TrimmedNonEmptyString
124
+ });
125
+ var ResolutionRecordEntry = Schema2.Struct({
126
+ stageId: StageId,
127
+ contributedBy: TrimmedNonEmptyString,
128
+ removedBy: Schema2.optional(TrimmedNonEmptyString),
129
+ replacedBy: Schema2.optional(TrimmedNonEmptyString),
130
+ wrappedBy: Schema2.optional(Schema2.Array(TrimmedNonEmptyString)),
131
+ droppedAnchors: Schema2.optional(Schema2.Array(StageId)),
132
+ isProtected: Schema2.Boolean
133
+ });
134
+ var ResolvedPipeline = Schema2.Struct({
135
+ runId: Schema2.optional(RunId),
136
+ order: Schema2.Array(StageId),
137
+ record: Schema2.Array(ResolutionRecordEntry),
138
+ cycles: Schema2.Array(Schema2.Array(StageId)),
139
+ grantUses: Schema2.optional(Schema2.Array(ResolutionGrantUse)),
140
+ resolvedAt: Schema2.optional(IsoDateTime)
141
+ });
142
+ var StageRunOutcome = Schema2.Struct({
143
+ stageId: StageId,
144
+ result: StageResult,
145
+ startedAt: IsoDateTime,
146
+ finishedAt: IsoDateTime
147
+ });
148
+
149
+ // packages/contracts/src/kernel.ts
150
+ var CapabilityTag = Schema3.Literals([
151
+ "kernel",
152
+ "journal",
153
+ "stage-runner",
154
+ "transport",
155
+ "loader-policy"
156
+ ]);
157
+ var CapabilityProviderRef = Schema3.Struct({
158
+ capability: CapabilityTag,
159
+ pluginId: TrimmedNonEmptyString
160
+ });
161
+ var CapabilityReplacement = Schema3.Struct({
162
+ capability: CapabilityTag,
163
+ providerPluginId: TrimmedNonEmptyString
164
+ });
165
+ var CapabilityReplacementSpec = Schema3.Union([
166
+ CapabilityReplacement,
167
+ TrimmedNonEmptyString
168
+ ]);
169
+ var PluginMeta = Schema3.Struct({
170
+ id: TrimmedNonEmptyString,
171
+ version: TrimmedNonEmptyString,
172
+ provides: Schema3.Array(CapabilityTag),
173
+ requires: Schema3.optional(Schema3.Array(CapabilityTag)),
174
+ replaces: Schema3.optional(Schema3.Array(CapabilityReplacementSpec))
175
+ });
176
+ var LoadedPluginDescriptor = Schema3.Struct({
177
+ meta: PluginMeta,
178
+ provides: Schema3.Array(CapabilityTag),
179
+ contributes: Schema3.Unknown,
180
+ runtime: Schema3.Unknown
181
+ });
182
+ var ProtectedStageGrant = Schema3.Struct({
183
+ stageId: TrimmedNonEmptyString,
184
+ pluginId: TrimmedNonEmptyString,
185
+ operations: Schema3.Array(Schema3.Literals(["remove", "replace"])),
186
+ grantedBy: Schema3.optional(TrimmedNonEmptyString),
187
+ reason: Schema3.optional(Schema3.String)
188
+ });
189
+ var KernelReplacementGrant = Schema3.Struct({
190
+ pluginId: TrimmedNonEmptyString,
191
+ grantedBy: Schema3.optional(TrimmedNonEmptyString),
192
+ reason: Schema3.optional(Schema3.String)
193
+ });
194
+ var CapabilityGrants = Schema3.Struct({
195
+ capabilityPrecedence: Schema3.optional(Schema3.Record(Schema3.String, Schema3.Array(TrimmedNonEmptyString))),
196
+ protectedStageGrants: Schema3.optional(Schema3.Array(ProtectedStageGrant)),
197
+ kernelReplacementGrants: Schema3.optional(Schema3.Array(KernelReplacementGrant))
198
+ });
199
+ var KernelBootErrorCode = Schema3.Literals([
200
+ "BootIncoherent",
201
+ "AmbiguousCapability",
202
+ "MissingCapability",
203
+ "ProtectedStageViolation",
204
+ "KernelReplacementDenied",
205
+ "PipelineUnresolvable"
206
+ ]);
207
+ var KernelBootError = Schema3.Struct({
208
+ code: KernelBootErrorCode,
209
+ message: TrimmedNonEmptyString,
210
+ capability: Schema3.optional(CapabilityTag),
211
+ stageId: Schema3.optional(TrimmedNonEmptyString),
212
+ pluginIds: Schema3.optional(Schema3.Array(TrimmedNonEmptyString))
213
+ });
214
+ var CapabilityResolutionStatus = Schema3.Literals(["resolved", "ambiguous", "missing", "replaced"]);
215
+ var CapabilityResolutionRecord = Schema3.Struct({
216
+ capability: CapabilityTag,
217
+ status: CapabilityResolutionStatus,
218
+ selectedPluginId: Schema3.NullOr(TrimmedNonEmptyString),
219
+ candidatePluginIds: Schema3.Array(TrimmedNonEmptyString),
220
+ precedenceUsed: Schema3.Boolean,
221
+ replacementUsed: Schema3.optional(CapabilityReplacement),
222
+ error: Schema3.optional(Schema3.String)
223
+ });
224
+ var KernelResolutionRecord = Schema3.Struct({
225
+ resolvedAt: IsoDateTime,
226
+ capabilities: Schema3.Array(CapabilityResolutionRecord),
227
+ pipeline: Schema3.optional(ResolvedPipeline)
228
+ });
229
+ var BootResultDescriptor = Schema3.Struct({
230
+ kernelPluginId: TrimmedNonEmptyString,
231
+ pluginIds: Schema3.Array(TrimmedNonEmptyString),
232
+ resolution: KernelResolutionRecord
233
+ });
234
+ var JournalEvent = Schema3.Struct({
235
+ type: TrimmedNonEmptyString,
236
+ runId: Schema3.optional(RunId),
237
+ at: IsoDateTime,
238
+ payload: Schema3.Unknown
239
+ });
240
+
241
+ // packages/contracts/src/plugin.ts
242
+ var ValidatorCategory = Schema4.Literals([
5
243
  "boundary",
6
244
  "contract",
7
245
  "integration",
@@ -9,12 +247,12 @@ var ValidatorCategory = Schema.Literals([
9
247
  "external",
10
248
  "custom"
11
249
  ]);
12
- var ValidatorRegistration = Schema.Struct({
13
- id: Schema.String,
250
+ var ValidatorRegistration = Schema4.Struct({
251
+ id: Schema4.String,
14
252
  category: ValidatorCategory,
15
- description: Schema.optional(Schema.String)
253
+ description: Schema4.optional(Schema4.String)
16
254
  });
17
- var HookEvent = Schema.Literals([
255
+ var AgentSessionHookEvent = Schema4.Literals([
18
256
  "PreToolUse",
19
257
  "PostToolUse",
20
258
  "UserPromptSubmit",
@@ -22,67 +260,72 @@ var HookEvent = Schema.Literals([
22
260
  "SessionStart",
23
261
  "SessionEnd"
24
262
  ]);
25
- var HookMatcher = Schema.Union([
26
- Schema.Struct({ kind: Schema.Literal("all") }),
27
- Schema.Struct({ kind: Schema.Literal("tool"), name: Schema.String }),
28
- Schema.Struct({ kind: Schema.Literal("glob"), pattern: Schema.String })
263
+ var HookEvent = AgentSessionHookEvent;
264
+ var HookMatcher = Schema4.Union([
265
+ Schema4.Struct({ kind: Schema4.Literal("all") }),
266
+ Schema4.Struct({ kind: Schema4.Literal("tool"), name: Schema4.String }),
267
+ Schema4.Struct({ kind: Schema4.Literal("glob"), pattern: Schema4.String })
29
268
  ]);
30
- var HookRegistration = Schema.Struct({
31
- id: Schema.String,
32
- event: HookEvent,
269
+ var HookRegistration = Schema4.Struct({
270
+ id: Schema4.String,
271
+ event: AgentSessionHookEvent,
33
272
  matcher: HookMatcher,
34
- command: Schema.optional(Schema.String),
35
- description: Schema.optional(Schema.String)
36
- });
37
- var SkillRegistration = Schema.Struct({
38
- id: Schema.String,
39
- path: Schema.String,
40
- description: Schema.optional(Schema.String)
41
- });
42
- var RepoSourceRegistration = Schema.Struct({
43
- id: Schema.String,
44
- url: Schema.String,
45
- defaultPath: Schema.optional(Schema.String),
46
- description: Schema.optional(Schema.String),
47
- defaultBranch: Schema.optional(Schema.String),
48
- remoteEnvVar: Schema.optional(Schema.String),
49
- checkoutEnvVar: Schema.optional(Schema.String)
50
- });
51
- var AgentRoleRegistration = Schema.Struct({
52
- id: Schema.String,
53
- defaultModel: Schema.optional(Schema.String),
54
- description: Schema.optional(Schema.String)
55
- });
56
- var TaskFieldExtension = Schema.Struct({
57
- id: Schema.String,
58
- fieldName: Schema.String,
59
- schemaJson: Schema.String
60
- });
61
- var TaskSourceKind = Schema.String;
62
- var TaskSourceRegistration = Schema.Struct({
63
- id: Schema.String,
64
- kind: Schema.String,
65
- description: Schema.optional(Schema.String)
66
- });
67
- var CliCommandRegistration = Schema.Struct({
68
- id: Schema.String,
69
- command: Schema.String,
70
- description: Schema.optional(Schema.String)
71
- });
72
- var PluginContributes = Schema.Struct({
73
- validators: Schema.optional(Schema.Array(ValidatorRegistration)),
74
- hooks: Schema.optional(Schema.Array(HookRegistration)),
75
- skills: Schema.optional(Schema.Array(SkillRegistration)),
76
- repoSources: Schema.optional(Schema.Array(RepoSourceRegistration)),
77
- agentRoles: Schema.optional(Schema.Array(AgentRoleRegistration)),
78
- taskFieldSchemas: Schema.optional(Schema.Array(TaskFieldExtension)),
79
- taskSources: Schema.optional(Schema.Array(TaskSourceRegistration)),
80
- cliCommands: Schema.optional(Schema.Array(CliCommandRegistration))
81
- });
82
- var RigPlugin = Schema.Struct({
83
- name: Schema.String,
84
- version: Schema.String,
85
- contributes: Schema.optional(PluginContributes)
273
+ command: Schema4.optional(Schema4.String),
274
+ description: Schema4.optional(Schema4.String)
275
+ });
276
+ var SkillRegistration = Schema4.Struct({
277
+ id: Schema4.String,
278
+ path: Schema4.String,
279
+ description: Schema4.optional(Schema4.String)
280
+ });
281
+ var RepoSourceRegistration = Schema4.Struct({
282
+ id: Schema4.String,
283
+ url: Schema4.String,
284
+ defaultPath: Schema4.optional(Schema4.String),
285
+ description: Schema4.optional(Schema4.String),
286
+ defaultBranch: Schema4.optional(Schema4.String),
287
+ remoteEnvVar: Schema4.optional(Schema4.String),
288
+ checkoutEnvVar: Schema4.optional(Schema4.String)
289
+ });
290
+ var AgentRoleRegistration = Schema4.Struct({
291
+ id: Schema4.String,
292
+ defaultModel: Schema4.optional(Schema4.String),
293
+ description: Schema4.optional(Schema4.String)
294
+ });
295
+ var TaskFieldExtension = Schema4.Struct({
296
+ id: Schema4.String,
297
+ fieldName: Schema4.String,
298
+ schemaJson: Schema4.String
299
+ });
300
+ var TaskSourceKind = Schema4.String;
301
+ var TaskSourceRegistration = Schema4.Struct({
302
+ id: Schema4.String,
303
+ kind: Schema4.String,
304
+ description: Schema4.optional(Schema4.String)
305
+ });
306
+ var CliCommandRegistration = Schema4.Struct({
307
+ id: Schema4.String,
308
+ command: Schema4.String,
309
+ description: Schema4.optional(Schema4.String)
310
+ });
311
+ var PluginContributes = Schema4.Struct({
312
+ validators: Schema4.optional(Schema4.Array(ValidatorRegistration)),
313
+ hooks: Schema4.optional(Schema4.Array(HookRegistration)),
314
+ skills: Schema4.optional(Schema4.Array(SkillRegistration)),
315
+ repoSources: Schema4.optional(Schema4.Array(RepoSourceRegistration)),
316
+ agentRoles: Schema4.optional(Schema4.Array(AgentRoleRegistration)),
317
+ taskFieldSchemas: Schema4.optional(Schema4.Array(TaskFieldExtension)),
318
+ taskSources: Schema4.optional(Schema4.Array(TaskSourceRegistration)),
319
+ cliCommands: Schema4.optional(Schema4.Array(CliCommandRegistration)),
320
+ stageMutations: Schema4.optional(Schema4.Array(StageMutation))
321
+ });
322
+ var RigPlugin = Schema4.Struct({
323
+ name: Schema4.String,
324
+ version: Schema4.String,
325
+ provides: Schema4.optional(Schema4.Array(CapabilityTag)),
326
+ requires: Schema4.optional(Schema4.Array(CapabilityTag)),
327
+ replaces: Schema4.optional(Schema4.Array(CapabilityReplacementSpec)),
328
+ contributes: Schema4.optional(PluginContributes)
86
329
  });
87
330
  export {
88
331
  ValidatorRegistration,
@@ -98,5 +341,6 @@ export {
98
341
  HookMatcher,
99
342
  HookEvent,
100
343
  CliCommandRegistration,
344
+ AgentSessionHookEvent,
101
345
  AgentRoleRegistration
102
346
  };
package/dist/src/rig.js CHANGED
@@ -158,6 +158,114 @@ var QueueEntry = Schema4.Struct({
158
158
  unblockCount: NonNegativeInt,
159
159
  position: NonNegativeInt
160
160
  });
161
+ var DependencyEdgeType = Schema4.Literals(["blocks", "parent-child", "related"]);
162
+ var DependencyEdge = Schema4.Struct({
163
+ fromTaskId: TaskId,
164
+ toTaskId: TaskId,
165
+ type: DependencyEdgeType
166
+ });
167
+ var BlockerClass = Schema4.Literals([
168
+ "not-blocked",
169
+ "task-blocked",
170
+ "human-decision",
171
+ "human-approval",
172
+ "external-input",
173
+ "unknown"
174
+ ]);
175
+ var ActionRiskTier = Schema4.Literals(["t1-read", "t2-reversible", "t3-external", "t4-irreversible"]);
176
+ var BlockerClassification = Schema4.Struct({
177
+ taskId: TaskId,
178
+ blockerClass: BlockerClass,
179
+ actionRiskTier: Schema4.NullOr(ActionRiskTier),
180
+ rationale: Schema4.String,
181
+ source: Schema4.Literals(["elimination", "label", "status", "llm"]),
182
+ autoApplied: Schema4.Boolean
183
+ });
184
+ var DependencyNode = Schema4.Struct({
185
+ taskId: TaskId,
186
+ title: TrimmedNonEmptyString,
187
+ status: TaskStatus,
188
+ priority: Schema4.NullOr(PositiveInt),
189
+ assignee: Schema4.NullOr(TrimmedNonEmptyString),
190
+ blockedBy: Schema4.Array(TaskId),
191
+ blocks: Schema4.Array(TaskId),
192
+ blockingDepth: NonNegativeInt,
193
+ blockerClass: Schema4.NullOr(BlockerClass),
194
+ actionRiskTier: Schema4.NullOr(ActionRiskTier),
195
+ epicKey: Schema4.NullOr(TrimmedNonEmptyString),
196
+ groupKey: Schema4.optional(Schema4.NullOr(TrimmedNonEmptyString)),
197
+ externalId: Schema4.optional(Schema4.NullOr(TrimmedNonEmptyString)),
198
+ sourceIssueId: Schema4.optional(Schema4.NullOr(TrimmedNonEmptyString)),
199
+ scope: Schema4.optional(Schema4.Array(TrimmedNonEmptyString)),
200
+ validationKeys: Schema4.optional(Schema4.Array(TrimmedNonEmptyString))
201
+ });
202
+ var TaskGraphLane = Schema4.Struct({
203
+ key: TrimmedNonEmptyString,
204
+ label: TrimmedNonEmptyString,
205
+ rowIndex: NonNegativeInt,
206
+ x: Schema4.Number,
207
+ y: Schema4.Number,
208
+ width: NonNegativeInt,
209
+ height: NonNegativeInt,
210
+ color: Schema4.String,
211
+ taskCount: NonNegativeInt
212
+ });
213
+ var TaskGraphStage = Schema4.Struct({
214
+ index: NonNegativeInt,
215
+ label: TrimmedNonEmptyString,
216
+ x: Schema4.Number,
217
+ width: NonNegativeInt
218
+ });
219
+ var TaskGraphNode = Schema4.Struct({
220
+ id: TrimmedNonEmptyString,
221
+ taskId: TaskId,
222
+ task: Schema4.optional(TaskSummary),
223
+ rowKey: TrimmedNonEmptyString,
224
+ rowLabel: TrimmedNonEmptyString,
225
+ rowIndex: NonNegativeInt,
226
+ stage: NonNegativeInt,
227
+ x: Schema4.Number,
228
+ y: Schema4.Number,
229
+ width: NonNegativeInt,
230
+ height: NonNegativeInt,
231
+ color: Schema4.optional(Schema4.String),
232
+ taskCode: Schema4.optional(Schema4.NullOr(Schema4.String)),
233
+ strippedTitle: Schema4.optional(Schema4.String),
234
+ depsIn: Schema4.optional(NonNegativeInt),
235
+ depsOut: Schema4.optional(NonNegativeInt),
236
+ runCount: Schema4.optional(NonNegativeInt),
237
+ hasApprovals: Schema4.optional(Schema4.Boolean),
238
+ hasPendingUserInput: Schema4.optional(Schema4.Boolean),
239
+ hasRejectedReview: Schema4.optional(Schema4.Boolean),
240
+ hasFailedValidations: Schema4.optional(Schema4.Boolean),
241
+ artifactCount: Schema4.optional(NonNegativeInt)
242
+ });
243
+ var TaskGraphEdge = Schema4.Struct({
244
+ id: TrimmedNonEmptyString,
245
+ sourceId: TrimmedNonEmptyString,
246
+ targetId: TrimmedNonEmptyString,
247
+ color: Schema4.String,
248
+ kind: Schema4.Literals(["blocking", "parent-child"])
249
+ });
250
+ var TaskGraphLayout = Schema4.Struct({
251
+ lanes: Schema4.Array(TaskGraphLane),
252
+ stages: Schema4.Array(TaskGraphStage),
253
+ nodes: Schema4.Array(TaskGraphNode),
254
+ edges: Schema4.Array(TaskGraphEdge),
255
+ totalWidth: NonNegativeInt,
256
+ totalHeight: NonNegativeInt,
257
+ taskCount: NonNegativeInt
258
+ });
259
+ var DependencyGraphModel = Schema4.Struct({
260
+ graphId: GraphId,
261
+ nodes: Schema4.Array(DependencyNode),
262
+ edges: Schema4.Array(DependencyEdge),
263
+ layout: TaskGraphLayout,
264
+ cycles: Schema4.Array(Schema4.Array(TaskId)),
265
+ unresolvedRefs: Schema4.Array(TrimmedNonEmptyString),
266
+ degraded: Schema4.Boolean,
267
+ generatedAt: IsoDateTime
268
+ });
161
269
 
162
270
  // packages/contracts/src/policy.ts
163
271
  import { Schema as Schema5 } from "effect";
@@ -0,0 +1,41 @@
1
+ import { Schema } from "effect";
2
+ export declare const PercentComplete: Schema.Int;
3
+ export type PercentComplete = typeof PercentComplete.Type;
4
+ export declare const EpicRollup: Schema.Struct<{
5
+ readonly epicKey: Schema.Trim;
6
+ readonly total: Schema.Int;
7
+ readonly percentComplete: Schema.Int;
8
+ readonly blockedCount: Schema.Int;
9
+ readonly humanBlockedCount: Schema.Int;
10
+ readonly inFlightCount: Schema.Int;
11
+ readonly byStatus: Schema.$Record<Schema.String, Schema.Int>;
12
+ }>;
13
+ export type EpicRollup = typeof EpicRollup.Type;
14
+ export declare const AssigneeRollup: Schema.Struct<{
15
+ readonly assignee: Schema.Trim;
16
+ readonly openTaskCount: Schema.Int;
17
+ readonly inFlightRunCount: Schema.Int;
18
+ readonly prsAwaitingReview: Schema.Int;
19
+ readonly blockers: Schema.$Array<Schema.brand<Schema.Trim, "TaskId">>;
20
+ }>;
21
+ export type AssigneeRollup = typeof AssigneeRollup.Type;
22
+ export declare const WorkspaceRollups: Schema.Struct<{
23
+ readonly epics: Schema.$Array<Schema.Struct<{
24
+ readonly epicKey: Schema.Trim;
25
+ readonly total: Schema.Int;
26
+ readonly percentComplete: Schema.Int;
27
+ readonly blockedCount: Schema.Int;
28
+ readonly humanBlockedCount: Schema.Int;
29
+ readonly inFlightCount: Schema.Int;
30
+ readonly byStatus: Schema.$Record<Schema.String, Schema.Int>;
31
+ }>>;
32
+ readonly assignees: Schema.$Array<Schema.Struct<{
33
+ readonly assignee: Schema.Trim;
34
+ readonly openTaskCount: Schema.Int;
35
+ readonly inFlightRunCount: Schema.Int;
36
+ readonly prsAwaitingReview: Schema.Int;
37
+ readonly blockers: Schema.$Array<Schema.brand<Schema.Trim, "TaskId">>;
38
+ }>>;
39
+ readonly generatedAt: Schema.String;
40
+ }>;
41
+ export type WorkspaceRollups = typeof WorkspaceRollups.Type;
@@ -0,0 +1,70 @@
1
+ // @bun
2
+ // packages/contracts/src/rollups.ts
3
+ import { Schema as Schema2 } 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/rollups.ts
43
+ var PercentComplete = NonNegativeInt.check(Schema2.isLessThanOrEqualTo(100));
44
+ var EpicRollup = Schema2.Struct({
45
+ epicKey: TrimmedNonEmptyString,
46
+ total: NonNegativeInt,
47
+ percentComplete: PercentComplete,
48
+ blockedCount: NonNegativeInt,
49
+ humanBlockedCount: NonNegativeInt,
50
+ inFlightCount: NonNegativeInt,
51
+ byStatus: Schema2.Record(Schema2.String, NonNegativeInt)
52
+ });
53
+ var AssigneeRollup = Schema2.Struct({
54
+ assignee: TrimmedNonEmptyString,
55
+ openTaskCount: NonNegativeInt,
56
+ inFlightRunCount: NonNegativeInt,
57
+ prsAwaitingReview: NonNegativeInt,
58
+ blockers: Schema2.Array(TaskId)
59
+ });
60
+ var WorkspaceRollups = Schema2.Struct({
61
+ epics: Schema2.Array(EpicRollup),
62
+ assignees: Schema2.Array(AssigneeRollup),
63
+ generatedAt: IsoDateTime
64
+ });
65
+ export {
66
+ WorkspaceRollups,
67
+ PercentComplete,
68
+ EpicRollup,
69
+ AssigneeRollup
70
+ };