@h-rig/contracts 0.0.6-alpha.131 → 0.0.6-alpha.133

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.
@@ -0,0 +1,238 @@
1
+ import { Schema } from "effect";
2
+ import { ResolvedPipeline, StageContext, StageDescriptor, StageMutation, StageResult, StageRunOutcome } from "./stage";
3
+ export declare const CapabilityTag: Schema.Literals<readonly ["kernel", "journal", "stage-runner", "transport", "loader-policy"]>;
4
+ export type CapabilityTag = typeof CapabilityTag.Type;
5
+ export declare const CapabilityProviderRef: Schema.Struct<{
6
+ readonly capability: Schema.Literals<readonly ["kernel", "journal", "stage-runner", "transport", "loader-policy"]>;
7
+ readonly pluginId: Schema.Trim;
8
+ }>;
9
+ export type CapabilityProviderRef = typeof CapabilityProviderRef.Type;
10
+ export declare const CapabilityReplacement: Schema.Struct<{
11
+ readonly capability: Schema.Literals<readonly ["kernel", "journal", "stage-runner", "transport", "loader-policy"]>;
12
+ readonly providerPluginId: Schema.Trim;
13
+ }>;
14
+ export type CapabilityReplacement = typeof CapabilityReplacement.Type;
15
+ export declare const CapabilityReplacementSpec: Schema.Union<readonly [Schema.Struct<{
16
+ readonly capability: Schema.Literals<readonly ["kernel", "journal", "stage-runner", "transport", "loader-policy"]>;
17
+ readonly providerPluginId: Schema.Trim;
18
+ }>, Schema.Trim]>;
19
+ export type CapabilityReplacementSpec = typeof CapabilityReplacementSpec.Type;
20
+ export declare const PluginMeta: Schema.Struct<{
21
+ readonly id: Schema.Trim;
22
+ readonly version: Schema.Trim;
23
+ readonly provides: Schema.$Array<Schema.Literals<readonly ["kernel", "journal", "stage-runner", "transport", "loader-policy"]>>;
24
+ readonly requires: Schema.optional<Schema.$Array<Schema.Literals<readonly ["kernel", "journal", "stage-runner", "transport", "loader-policy"]>>>;
25
+ readonly replaces: Schema.optional<Schema.$Array<Schema.Union<readonly [Schema.Struct<{
26
+ readonly capability: Schema.Literals<readonly ["kernel", "journal", "stage-runner", "transport", "loader-policy"]>;
27
+ readonly providerPluginId: Schema.Trim;
28
+ }>, Schema.Trim]>>>;
29
+ }>;
30
+ export type PluginMeta = typeof PluginMeta.Type;
31
+ export declare const LoadedPluginDescriptor: Schema.Struct<{
32
+ readonly meta: Schema.Struct<{
33
+ readonly id: Schema.Trim;
34
+ readonly version: Schema.Trim;
35
+ readonly provides: Schema.$Array<Schema.Literals<readonly ["kernel", "journal", "stage-runner", "transport", "loader-policy"]>>;
36
+ readonly requires: Schema.optional<Schema.$Array<Schema.Literals<readonly ["kernel", "journal", "stage-runner", "transport", "loader-policy"]>>>;
37
+ readonly replaces: Schema.optional<Schema.$Array<Schema.Union<readonly [Schema.Struct<{
38
+ readonly capability: Schema.Literals<readonly ["kernel", "journal", "stage-runner", "transport", "loader-policy"]>;
39
+ readonly providerPluginId: Schema.Trim;
40
+ }>, Schema.Trim]>>>;
41
+ }>;
42
+ readonly provides: Schema.$Array<Schema.Literals<readonly ["kernel", "journal", "stage-runner", "transport", "loader-policy"]>>;
43
+ readonly contributes: Schema.Unknown;
44
+ readonly runtime: Schema.Unknown;
45
+ }>;
46
+ export type LoadedPluginDescriptor = typeof LoadedPluginDescriptor.Type;
47
+ export declare const ProtectedStageGrant: Schema.Struct<{
48
+ readonly stageId: Schema.Trim;
49
+ readonly pluginId: Schema.Trim;
50
+ readonly operations: Schema.$Array<Schema.Literals<readonly ["remove", "replace"]>>;
51
+ readonly grantedBy: Schema.optional<Schema.Trim>;
52
+ readonly reason: Schema.optional<Schema.String>;
53
+ }>;
54
+ export type ProtectedStageGrant = typeof ProtectedStageGrant.Type;
55
+ export declare const KernelReplacementGrant: Schema.Struct<{
56
+ readonly pluginId: Schema.Trim;
57
+ readonly grantedBy: Schema.optional<Schema.Trim>;
58
+ readonly reason: Schema.optional<Schema.String>;
59
+ }>;
60
+ export type KernelReplacementGrant = typeof KernelReplacementGrant.Type;
61
+ export declare const CapabilityGrants: Schema.Struct<{
62
+ readonly capabilityPrecedence: Schema.optional<Schema.$Record<Schema.String, Schema.$Array<Schema.Trim>>>;
63
+ readonly protectedStageGrants: Schema.optional<Schema.$Array<Schema.Struct<{
64
+ readonly stageId: Schema.Trim;
65
+ readonly pluginId: Schema.Trim;
66
+ readonly operations: Schema.$Array<Schema.Literals<readonly ["remove", "replace"]>>;
67
+ readonly grantedBy: Schema.optional<Schema.Trim>;
68
+ readonly reason: Schema.optional<Schema.String>;
69
+ }>>>;
70
+ readonly kernelReplacementGrants: Schema.optional<Schema.$Array<Schema.Struct<{
71
+ readonly pluginId: Schema.Trim;
72
+ readonly grantedBy: Schema.optional<Schema.Trim>;
73
+ readonly reason: Schema.optional<Schema.String>;
74
+ }>>>;
75
+ }>;
76
+ export type CapabilityGrants = typeof CapabilityGrants.Type;
77
+ export declare const KernelBootErrorCode: Schema.Literals<readonly ["BootIncoherent", "AmbiguousCapability", "MissingCapability", "ProtectedStageViolation", "KernelReplacementDenied", "PipelineUnresolvable"]>;
78
+ export type KernelBootErrorCode = typeof KernelBootErrorCode.Type;
79
+ export declare const KernelBootError: Schema.Struct<{
80
+ readonly code: Schema.Literals<readonly ["BootIncoherent", "AmbiguousCapability", "MissingCapability", "ProtectedStageViolation", "KernelReplacementDenied", "PipelineUnresolvable"]>;
81
+ readonly message: Schema.Trim;
82
+ readonly capability: Schema.optional<Schema.Literals<readonly ["kernel", "journal", "stage-runner", "transport", "loader-policy"]>>;
83
+ readonly stageId: Schema.optional<Schema.Trim>;
84
+ readonly pluginIds: Schema.optional<Schema.$Array<Schema.Trim>>;
85
+ }>;
86
+ export type KernelBootError = typeof KernelBootError.Type;
87
+ export declare class BootIncoherent extends Error {
88
+ readonly code = "BootIncoherent";
89
+ }
90
+ export declare class AmbiguousCapability extends Error {
91
+ readonly code = "AmbiguousCapability";
92
+ }
93
+ export declare class MissingCapability extends Error {
94
+ readonly code = "MissingCapability";
95
+ }
96
+ export declare class ProtectedStageViolation extends Error {
97
+ readonly code = "ProtectedStageViolation";
98
+ }
99
+ export declare class KernelReplacementDenied extends Error {
100
+ readonly code = "KernelReplacementDenied";
101
+ }
102
+ export declare class PipelineUnresolvable extends Error {
103
+ readonly code = "PipelineUnresolvable";
104
+ }
105
+ export declare const CapabilityResolutionStatus: Schema.Literals<readonly ["resolved", "ambiguous", "missing", "replaced"]>;
106
+ export type CapabilityResolutionStatus = typeof CapabilityResolutionStatus.Type;
107
+ export declare const CapabilityResolutionRecord: Schema.Struct<{
108
+ readonly capability: Schema.Literals<readonly ["kernel", "journal", "stage-runner", "transport", "loader-policy"]>;
109
+ readonly status: Schema.Literals<readonly ["resolved", "ambiguous", "missing", "replaced"]>;
110
+ readonly selectedPluginId: Schema.NullOr<Schema.Trim>;
111
+ readonly candidatePluginIds: Schema.$Array<Schema.Trim>;
112
+ readonly precedenceUsed: Schema.Boolean;
113
+ readonly replacementUsed: Schema.optional<Schema.Struct<{
114
+ readonly capability: Schema.Literals<readonly ["kernel", "journal", "stage-runner", "transport", "loader-policy"]>;
115
+ readonly providerPluginId: Schema.Trim;
116
+ }>>;
117
+ readonly error: Schema.optional<Schema.String>;
118
+ }>;
119
+ export type CapabilityResolutionRecord = typeof CapabilityResolutionRecord.Type;
120
+ export declare const KernelResolutionRecord: Schema.Struct<{
121
+ readonly resolvedAt: Schema.String;
122
+ readonly capabilities: Schema.$Array<Schema.Struct<{
123
+ readonly capability: Schema.Literals<readonly ["kernel", "journal", "stage-runner", "transport", "loader-policy"]>;
124
+ readonly status: Schema.Literals<readonly ["resolved", "ambiguous", "missing", "replaced"]>;
125
+ readonly selectedPluginId: Schema.NullOr<Schema.Trim>;
126
+ readonly candidatePluginIds: Schema.$Array<Schema.Trim>;
127
+ readonly precedenceUsed: Schema.Boolean;
128
+ readonly replacementUsed: Schema.optional<Schema.Struct<{
129
+ readonly capability: Schema.Literals<readonly ["kernel", "journal", "stage-runner", "transport", "loader-policy"]>;
130
+ readonly providerPluginId: Schema.Trim;
131
+ }>>;
132
+ readonly error: Schema.optional<Schema.String>;
133
+ }>>;
134
+ readonly pipeline: Schema.optional<Schema.Struct<{
135
+ readonly runId: Schema.optional<Schema.brand<Schema.Trim, "RunId">>;
136
+ readonly order: Schema.$Array<Schema.brand<Schema.Trim, "StageId">>;
137
+ readonly record: Schema.$Array<Schema.Struct<{
138
+ readonly stageId: Schema.brand<Schema.Trim, "StageId">;
139
+ readonly contributedBy: Schema.Trim;
140
+ readonly removedBy: Schema.optional<Schema.Trim>;
141
+ readonly replacedBy: Schema.optional<Schema.Trim>;
142
+ readonly wrappedBy: Schema.optional<Schema.$Array<Schema.Trim>>;
143
+ readonly droppedAnchors: Schema.optional<Schema.$Array<Schema.brand<Schema.Trim, "StageId">>>;
144
+ readonly isProtected: Schema.Boolean;
145
+ }>>;
146
+ readonly cycles: Schema.$Array<Schema.$Array<Schema.brand<Schema.Trim, "StageId">>>;
147
+ readonly grantUses: Schema.optional<Schema.$Array<Schema.Struct<{
148
+ readonly kind: Schema.Literals<readonly ["protected-stage", "kernel-replacement"]>;
149
+ readonly target: Schema.Trim;
150
+ readonly pluginId: Schema.Trim;
151
+ }>>>;
152
+ readonly resolvedAt: Schema.optional<Schema.String>;
153
+ }>>;
154
+ }>;
155
+ export type KernelResolutionRecord = typeof KernelResolutionRecord.Type;
156
+ export declare const BootResultDescriptor: Schema.Struct<{
157
+ readonly kernelPluginId: Schema.Trim;
158
+ readonly pluginIds: Schema.$Array<Schema.Trim>;
159
+ readonly resolution: Schema.Struct<{
160
+ readonly resolvedAt: Schema.String;
161
+ readonly capabilities: Schema.$Array<Schema.Struct<{
162
+ readonly capability: Schema.Literals<readonly ["kernel", "journal", "stage-runner", "transport", "loader-policy"]>;
163
+ readonly status: Schema.Literals<readonly ["resolved", "ambiguous", "missing", "replaced"]>;
164
+ readonly selectedPluginId: Schema.NullOr<Schema.Trim>;
165
+ readonly candidatePluginIds: Schema.$Array<Schema.Trim>;
166
+ readonly precedenceUsed: Schema.Boolean;
167
+ readonly replacementUsed: Schema.optional<Schema.Struct<{
168
+ readonly capability: Schema.Literals<readonly ["kernel", "journal", "stage-runner", "transport", "loader-policy"]>;
169
+ readonly providerPluginId: Schema.Trim;
170
+ }>>;
171
+ readonly error: Schema.optional<Schema.String>;
172
+ }>>;
173
+ readonly pipeline: Schema.optional<Schema.Struct<{
174
+ readonly runId: Schema.optional<Schema.brand<Schema.Trim, "RunId">>;
175
+ readonly order: Schema.$Array<Schema.brand<Schema.Trim, "StageId">>;
176
+ readonly record: Schema.$Array<Schema.Struct<{
177
+ readonly stageId: Schema.brand<Schema.Trim, "StageId">;
178
+ readonly contributedBy: Schema.Trim;
179
+ readonly removedBy: Schema.optional<Schema.Trim>;
180
+ readonly replacedBy: Schema.optional<Schema.Trim>;
181
+ readonly wrappedBy: Schema.optional<Schema.$Array<Schema.Trim>>;
182
+ readonly droppedAnchors: Schema.optional<Schema.$Array<Schema.brand<Schema.Trim, "StageId">>>;
183
+ readonly isProtected: Schema.Boolean;
184
+ }>>;
185
+ readonly cycles: Schema.$Array<Schema.$Array<Schema.brand<Schema.Trim, "StageId">>>;
186
+ readonly grantUses: Schema.optional<Schema.$Array<Schema.Struct<{
187
+ readonly kind: Schema.Literals<readonly ["protected-stage", "kernel-replacement"]>;
188
+ readonly target: Schema.Trim;
189
+ readonly pluginId: Schema.Trim;
190
+ }>>>;
191
+ readonly resolvedAt: Schema.optional<Schema.String>;
192
+ }>>;
193
+ }>;
194
+ }>;
195
+ export type BootResultDescriptor = typeof BootResultDescriptor.Type;
196
+ export declare const JournalEvent: Schema.Struct<{
197
+ readonly type: Schema.Trim;
198
+ readonly runId: Schema.optional<Schema.brand<Schema.Trim, "RunId">>;
199
+ readonly at: Schema.String;
200
+ readonly payload: Schema.Unknown;
201
+ }>;
202
+ export type JournalEvent = typeof JournalEvent.Type;
203
+ export interface LoadedPlugin {
204
+ meta: PluginMeta;
205
+ provides: ReadonlySet<CapabilityTag>;
206
+ contributes: unknown;
207
+ runtime: unknown;
208
+ }
209
+ export interface JournalCapability {
210
+ append(event: unknown): Promise<void>;
211
+ recordPipeline(runId: string, pipeline: ResolvedPipeline): Promise<void>;
212
+ recordStageOutcome?(runId: string, outcome: StageRunOutcome): Promise<void>;
213
+ read(runId: string): Promise<readonly unknown[]>;
214
+ }
215
+ export interface StageRunnerCapability {
216
+ resolve(defaultStages: readonly StageDescriptor[], mutations: readonly StageMutation[], grants?: CapabilityGrants): ResolvedPipeline;
217
+ runPipeline(runId: string, resolved: ResolvedPipeline, ctx: StageContext): Promise<readonly StageRunOutcome[]>;
218
+ }
219
+ export interface TransportCapability {
220
+ dispatch(task: unknown, options?: unknown): Promise<string>;
221
+ attach?(runId: string): Promise<unknown>;
222
+ serve?(): Promise<void>;
223
+ }
224
+ export interface LoaderPolicyCapability {
225
+ resolveCapability(plugins: readonly PluginMeta[], capability: CapabilityTag, grants?: CapabilityGrants): CapabilityResolutionRecord;
226
+ }
227
+ export interface KernelCapability {
228
+ journal: JournalCapability;
229
+ stageRunner: StageRunnerCapability;
230
+ transport: TransportCapability;
231
+ loaderPolicy: LoaderPolicyCapability;
232
+ start(plugins: readonly unknown[]): Promise<void>;
233
+ }
234
+ export interface BootResult {
235
+ kernel: KernelCapability;
236
+ plugins: readonly LoadedPlugin[];
237
+ }
238
+ export type StageExecutor = (ctx: StageContext) => Promise<StageResult> | StageResult;
@@ -0,0 +1,284 @@
1
+ // @bun
2
+ // packages/contracts/src/kernel.ts
3
+ import { Schema as Schema3 } 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/stage.ts
43
+ import { Schema as Schema2 } from "effect";
44
+ var StageKind = Schema2.Literals(["transform", "gate", "observe"]);
45
+ var StageId = TrimmedNonEmptyString.pipe(Schema2.brand("StageId"));
46
+ var StageContext = Schema2.Struct({
47
+ runId: RunId,
48
+ taskId: Schema2.optional(Schema2.NullOr(TaskId)),
49
+ state: Schema2.Unknown,
50
+ metadata: Schema2.optional(Schema2.Record(Schema2.String, Schema2.Unknown))
51
+ });
52
+ var StageDescriptor = Schema2.Struct({
53
+ id: StageId,
54
+ kind: StageKind,
55
+ before: Schema2.optional(Schema2.Array(StageId)),
56
+ after: Schema2.optional(Schema2.Array(StageId)),
57
+ priority: Schema2.Number.pipe(Schema2.withDecodingDefault(() => 0)),
58
+ protected: Schema2.Boolean.pipe(Schema2.withDecodingDefault(() => false))
59
+ });
60
+ var StageContinueResult = Schema2.Struct({
61
+ kind: Schema2.Literal("continue"),
62
+ ctx: StageContext
63
+ });
64
+ var StageAllowResult = Schema2.Struct({
65
+ kind: Schema2.Literal("allow")
66
+ });
67
+ var StageBlockResult = Schema2.Struct({
68
+ kind: Schema2.Literal("block"),
69
+ reason: TrimmedNonEmptyString
70
+ });
71
+ var StageResult = Schema2.Union([
72
+ StageContinueResult,
73
+ StageAllowResult,
74
+ StageBlockResult
75
+ ]);
76
+ var StageWrapperDescriptor = Schema2.Struct({
77
+ id: TrimmedNonEmptyString,
78
+ priority: Schema2.Number.pipe(Schema2.withDecodingDefault(() => 0))
79
+ });
80
+ var StageMutationOp = Schema2.Literals(["insert", "remove", "replace", "wrap", "reorder"]);
81
+ var InsertStageMutation = Schema2.Struct({
82
+ op: Schema2.Literal("insert"),
83
+ stage: StageDescriptor,
84
+ contributedBy: Schema2.optional(TrimmedNonEmptyString)
85
+ });
86
+ var RemoveStageMutation = Schema2.Struct({
87
+ op: Schema2.Literal("remove"),
88
+ id: StageId,
89
+ contributedBy: Schema2.optional(TrimmedNonEmptyString)
90
+ });
91
+ var ReplaceStageMutation = Schema2.Struct({
92
+ op: Schema2.Literal("replace"),
93
+ id: StageId,
94
+ stage: StageDescriptor,
95
+ contributedBy: Schema2.optional(TrimmedNonEmptyString)
96
+ });
97
+ var WrapStageMutation = Schema2.Struct({
98
+ op: Schema2.Literal("wrap"),
99
+ id: StageId,
100
+ around: StageWrapperDescriptor,
101
+ contributedBy: Schema2.optional(TrimmedNonEmptyString)
102
+ });
103
+ var ReorderStageMutation = Schema2.Struct({
104
+ op: Schema2.Literal("reorder"),
105
+ id: StageId,
106
+ before: Schema2.optional(Schema2.Array(StageId)),
107
+ after: Schema2.optional(Schema2.Array(StageId)),
108
+ contributedBy: Schema2.optional(TrimmedNonEmptyString)
109
+ });
110
+ var StageMutation = Schema2.Union([
111
+ InsertStageMutation,
112
+ RemoveStageMutation,
113
+ ReplaceStageMutation,
114
+ WrapStageMutation,
115
+ ReorderStageMutation
116
+ ]);
117
+ var ResolutionGrantUse = Schema2.Struct({
118
+ kind: Schema2.Literals(["protected-stage", "kernel-replacement"]),
119
+ target: TrimmedNonEmptyString,
120
+ pluginId: TrimmedNonEmptyString
121
+ });
122
+ var ResolutionRecordEntry = Schema2.Struct({
123
+ stageId: StageId,
124
+ contributedBy: TrimmedNonEmptyString,
125
+ removedBy: Schema2.optional(TrimmedNonEmptyString),
126
+ replacedBy: Schema2.optional(TrimmedNonEmptyString),
127
+ wrappedBy: Schema2.optional(Schema2.Array(TrimmedNonEmptyString)),
128
+ droppedAnchors: Schema2.optional(Schema2.Array(StageId)),
129
+ isProtected: Schema2.Boolean
130
+ });
131
+ var ResolvedPipeline = Schema2.Struct({
132
+ runId: Schema2.optional(RunId),
133
+ order: Schema2.Array(StageId),
134
+ record: Schema2.Array(ResolutionRecordEntry),
135
+ cycles: Schema2.Array(Schema2.Array(StageId)),
136
+ grantUses: Schema2.optional(Schema2.Array(ResolutionGrantUse)),
137
+ resolvedAt: Schema2.optional(IsoDateTime)
138
+ });
139
+ var StageRunOutcome = Schema2.Struct({
140
+ stageId: StageId,
141
+ result: StageResult,
142
+ startedAt: IsoDateTime,
143
+ finishedAt: IsoDateTime
144
+ });
145
+
146
+ // packages/contracts/src/kernel.ts
147
+ var CapabilityTag = Schema3.Literals([
148
+ "kernel",
149
+ "journal",
150
+ "stage-runner",
151
+ "transport",
152
+ "loader-policy"
153
+ ]);
154
+ var CapabilityProviderRef = Schema3.Struct({
155
+ capability: CapabilityTag,
156
+ pluginId: TrimmedNonEmptyString
157
+ });
158
+ var CapabilityReplacement = Schema3.Struct({
159
+ capability: CapabilityTag,
160
+ providerPluginId: TrimmedNonEmptyString
161
+ });
162
+ var CapabilityReplacementSpec = Schema3.Union([
163
+ CapabilityReplacement,
164
+ TrimmedNonEmptyString
165
+ ]);
166
+ var PluginMeta = Schema3.Struct({
167
+ id: TrimmedNonEmptyString,
168
+ version: TrimmedNonEmptyString,
169
+ provides: Schema3.Array(CapabilityTag),
170
+ requires: Schema3.optional(Schema3.Array(CapabilityTag)),
171
+ replaces: Schema3.optional(Schema3.Array(CapabilityReplacementSpec))
172
+ });
173
+ var LoadedPluginDescriptor = Schema3.Struct({
174
+ meta: PluginMeta,
175
+ provides: Schema3.Array(CapabilityTag),
176
+ contributes: Schema3.Unknown,
177
+ runtime: Schema3.Unknown
178
+ });
179
+ var ProtectedStageGrant = Schema3.Struct({
180
+ stageId: TrimmedNonEmptyString,
181
+ pluginId: TrimmedNonEmptyString,
182
+ operations: Schema3.Array(Schema3.Literals(["remove", "replace"])),
183
+ grantedBy: Schema3.optional(TrimmedNonEmptyString),
184
+ reason: Schema3.optional(Schema3.String)
185
+ });
186
+ var KernelReplacementGrant = Schema3.Struct({
187
+ pluginId: TrimmedNonEmptyString,
188
+ grantedBy: Schema3.optional(TrimmedNonEmptyString),
189
+ reason: Schema3.optional(Schema3.String)
190
+ });
191
+ var CapabilityGrants = Schema3.Struct({
192
+ capabilityPrecedence: Schema3.optional(Schema3.Record(Schema3.String, Schema3.Array(TrimmedNonEmptyString))),
193
+ protectedStageGrants: Schema3.optional(Schema3.Array(ProtectedStageGrant)),
194
+ kernelReplacementGrants: Schema3.optional(Schema3.Array(KernelReplacementGrant))
195
+ });
196
+ var KernelBootErrorCode = Schema3.Literals([
197
+ "BootIncoherent",
198
+ "AmbiguousCapability",
199
+ "MissingCapability",
200
+ "ProtectedStageViolation",
201
+ "KernelReplacementDenied",
202
+ "PipelineUnresolvable"
203
+ ]);
204
+ var KernelBootError = Schema3.Struct({
205
+ code: KernelBootErrorCode,
206
+ message: TrimmedNonEmptyString,
207
+ capability: Schema3.optional(CapabilityTag),
208
+ stageId: Schema3.optional(TrimmedNonEmptyString),
209
+ pluginIds: Schema3.optional(Schema3.Array(TrimmedNonEmptyString))
210
+ });
211
+
212
+ class BootIncoherent extends Error {
213
+ code = "BootIncoherent";
214
+ }
215
+
216
+ class AmbiguousCapability extends Error {
217
+ code = "AmbiguousCapability";
218
+ }
219
+
220
+ class MissingCapability extends Error {
221
+ code = "MissingCapability";
222
+ }
223
+
224
+ class ProtectedStageViolation extends Error {
225
+ code = "ProtectedStageViolation";
226
+ }
227
+
228
+ class KernelReplacementDenied extends Error {
229
+ code = "KernelReplacementDenied";
230
+ }
231
+
232
+ class PipelineUnresolvable extends Error {
233
+ code = "PipelineUnresolvable";
234
+ }
235
+ var CapabilityResolutionStatus = Schema3.Literals(["resolved", "ambiguous", "missing", "replaced"]);
236
+ var CapabilityResolutionRecord = Schema3.Struct({
237
+ capability: CapabilityTag,
238
+ status: CapabilityResolutionStatus,
239
+ selectedPluginId: Schema3.NullOr(TrimmedNonEmptyString),
240
+ candidatePluginIds: Schema3.Array(TrimmedNonEmptyString),
241
+ precedenceUsed: Schema3.Boolean,
242
+ replacementUsed: Schema3.optional(CapabilityReplacement),
243
+ error: Schema3.optional(Schema3.String)
244
+ });
245
+ var KernelResolutionRecord = Schema3.Struct({
246
+ resolvedAt: IsoDateTime,
247
+ capabilities: Schema3.Array(CapabilityResolutionRecord),
248
+ pipeline: Schema3.optional(ResolvedPipeline)
249
+ });
250
+ var BootResultDescriptor = Schema3.Struct({
251
+ kernelPluginId: TrimmedNonEmptyString,
252
+ pluginIds: Schema3.Array(TrimmedNonEmptyString),
253
+ resolution: KernelResolutionRecord
254
+ });
255
+ var JournalEvent = Schema3.Struct({
256
+ type: TrimmedNonEmptyString,
257
+ runId: Schema3.optional(RunId),
258
+ at: IsoDateTime,
259
+ payload: Schema3.Unknown
260
+ });
261
+ export {
262
+ ProtectedStageViolation,
263
+ ProtectedStageGrant,
264
+ PluginMeta,
265
+ PipelineUnresolvable,
266
+ MissingCapability,
267
+ LoadedPluginDescriptor,
268
+ KernelResolutionRecord,
269
+ KernelReplacementGrant,
270
+ KernelReplacementDenied,
271
+ KernelBootErrorCode,
272
+ KernelBootError,
273
+ JournalEvent,
274
+ CapabilityTag,
275
+ CapabilityResolutionStatus,
276
+ CapabilityResolutionRecord,
277
+ CapabilityReplacementSpec,
278
+ CapabilityReplacement,
279
+ CapabilityProviderRef,
280
+ CapabilityGrants,
281
+ BootResultDescriptor,
282
+ BootIncoherent,
283
+ AmbiguousCapability
284
+ };
@@ -0,0 +1,64 @@
1
+ import { Schema } from "effect";
2
+ export declare const ClarificationStatus: Schema.Literals<readonly ["open", "resolved-from-code", "resolved-by-human", "deferred"]>;
3
+ export type ClarificationStatus = typeof ClarificationStatus.Type;
4
+ export declare const OpenQuestion: Schema.Struct<{
5
+ readonly id: Schema.Trim;
6
+ readonly question: Schema.Trim;
7
+ readonly status: Schema.Literals<readonly ["open", "resolved-from-code", "resolved-by-human", "deferred"]>;
8
+ readonly resolution: Schema.NullOr<Schema.String>;
9
+ }>;
10
+ export type OpenQuestion = typeof OpenQuestion.Type;
11
+ export declare const UserStory: Schema.Struct<{
12
+ readonly id: Schema.Trim;
13
+ readonly title: Schema.Trim;
14
+ readonly priority: Schema.Int;
15
+ }>;
16
+ export type UserStory = typeof UserStory.Type;
17
+ export declare const FunctionalRequirement: Schema.Struct<{
18
+ readonly id: Schema.Trim;
19
+ readonly text: Schema.Trim;
20
+ }>;
21
+ export type FunctionalRequirement = typeof FunctionalRequirement.Type;
22
+ export declare const PlanTask: Schema.Struct<{
23
+ readonly localId: Schema.Trim;
24
+ readonly title: Schema.Trim;
25
+ readonly description: Schema.String;
26
+ readonly acceptance: Schema.$Array<Schema.String>;
27
+ readonly scope: Schema.$Array<Schema.Trim>;
28
+ readonly validationKeys: Schema.$Array<Schema.Trim>;
29
+ readonly dependsOn: Schema.$Array<Schema.Trim>;
30
+ readonly parent: Schema.NullOr<Schema.Trim>;
31
+ readonly parallelizable: Schema.Boolean;
32
+ }>;
33
+ export type PlanTask = typeof PlanTask.Type;
34
+ export declare const PlanSpec: Schema.Struct<{
35
+ readonly prdTitle: Schema.Trim;
36
+ readonly userStories: Schema.$Array<Schema.Struct<{
37
+ readonly id: Schema.Trim;
38
+ readonly title: Schema.Trim;
39
+ readonly priority: Schema.Int;
40
+ }>>;
41
+ readonly functionalRequirements: Schema.$Array<Schema.Struct<{
42
+ readonly id: Schema.Trim;
43
+ readonly text: Schema.Trim;
44
+ }>>;
45
+ readonly openQuestions: Schema.$Array<Schema.Struct<{
46
+ readonly id: Schema.Trim;
47
+ readonly question: Schema.Trim;
48
+ readonly status: Schema.Literals<readonly ["open", "resolved-from-code", "resolved-by-human", "deferred"]>;
49
+ readonly resolution: Schema.NullOr<Schema.String>;
50
+ }>>;
51
+ readonly tasks: Schema.$Array<Schema.Struct<{
52
+ readonly localId: Schema.Trim;
53
+ readonly title: Schema.Trim;
54
+ readonly description: Schema.String;
55
+ readonly acceptance: Schema.$Array<Schema.String>;
56
+ readonly scope: Schema.$Array<Schema.Trim>;
57
+ readonly validationKeys: Schema.$Array<Schema.Trim>;
58
+ readonly dependsOn: Schema.$Array<Schema.Trim>;
59
+ readonly parent: Schema.NullOr<Schema.Trim>;
60
+ readonly parallelizable: Schema.Boolean;
61
+ }>>;
62
+ readonly generatedAt: Schema.String;
63
+ }>;
64
+ export type PlanSpec = typeof PlanSpec.Type;
@@ -0,0 +1,90 @@
1
+ // @bun
2
+ // packages/contracts/src/planning.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/planning.ts
43
+ var ClarificationStatus = Schema2.Literals([
44
+ "open",
45
+ "resolved-from-code",
46
+ "resolved-by-human",
47
+ "deferred"
48
+ ]);
49
+ var OpenQuestion = Schema2.Struct({
50
+ id: TrimmedNonEmptyString,
51
+ question: TrimmedNonEmptyString,
52
+ status: ClarificationStatus,
53
+ resolution: Schema2.NullOr(Schema2.String)
54
+ });
55
+ var UserStory = Schema2.Struct({
56
+ id: TrimmedNonEmptyString,
57
+ title: TrimmedNonEmptyString,
58
+ priority: PositiveInt
59
+ });
60
+ var FunctionalRequirement = Schema2.Struct({
61
+ id: TrimmedNonEmptyString,
62
+ text: TrimmedNonEmptyString
63
+ });
64
+ var PlanTask = Schema2.Struct({
65
+ localId: TrimmedNonEmptyString,
66
+ title: TrimmedNonEmptyString,
67
+ description: Schema2.String,
68
+ acceptance: Schema2.Array(Schema2.String),
69
+ scope: Schema2.Array(TrimmedNonEmptyString),
70
+ validationKeys: Schema2.Array(TrimmedNonEmptyString),
71
+ dependsOn: Schema2.Array(TrimmedNonEmptyString),
72
+ parent: Schema2.NullOr(TrimmedNonEmptyString),
73
+ parallelizable: Schema2.Boolean
74
+ });
75
+ var PlanSpec = Schema2.Struct({
76
+ prdTitle: TrimmedNonEmptyString,
77
+ userStories: Schema2.Array(UserStory),
78
+ functionalRequirements: Schema2.Array(FunctionalRequirement),
79
+ openQuestions: Schema2.Array(OpenQuestion),
80
+ tasks: Schema2.Array(PlanTask),
81
+ generatedAt: IsoDateTime
82
+ });
83
+ export {
84
+ UserStory,
85
+ PlanTask,
86
+ PlanSpec,
87
+ OpenQuestion,
88
+ FunctionalRequirement,
89
+ ClarificationStatus
90
+ };