brickflow 0.0.1 → 0.0.2

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,496 @@
1
+ import { P } from 'ts-pattern';
2
+ export { P } from 'ts-pattern';
3
+
4
+ interface SignalDefinition<Request = unknown, Response = unknown> {
5
+ readonly request: Request;
6
+ readonly response: Response;
7
+ }
8
+ type SignalDefinitions = Readonly<Record<string, SignalDefinition>>;
9
+ type SignalRequest<Definition> = Definition extends SignalDefinition<infer Request, unknown> ? Request : never;
10
+ type SignalResponse<Definition> = Definition extends SignalDefinition<unknown, infer Response> ? Response : never;
11
+ type ValidSignalDefinition<Definition extends SignalDefinition> = undefined extends SignalResponse<Definition> ? never : Definition;
12
+ type SignalFunction<Definition extends SignalDefinition> = Definition extends ValidSignalDefinition<Definition> ? (request: SignalRequest<Definition>) => Promise<SignalResponse<Definition>> : never;
13
+ type SignalFunctions<Definitions extends SignalDefinitions> = {
14
+ readonly [Name in keyof Definitions]: SignalFunction<Definitions[Name]>;
15
+ };
16
+ type InternalSignalHandler<Definition extends SignalDefinition> = (request: SignalRequest<Definition>) => SignalResponse<Definition> | undefined | Promise<SignalResponse<Definition> | undefined>;
17
+ type BoundarySignalHandler<Definition extends SignalDefinition> = (request: SignalRequest<Definition>) => SignalResponse<Definition> | Promise<SignalResponse<Definition>>;
18
+ type InternalSignalHandlers<Definitions extends SignalDefinitions> = {
19
+ readonly [Name in keyof Definitions]?: InternalSignalHandler<Definitions[Name]>;
20
+ };
21
+ type BoundarySignalHandlers<Definitions extends SignalDefinitions> = {
22
+ readonly [Name in keyof Definitions]-?: BoundarySignalHandler<Definitions[Name]>;
23
+ };
24
+ type UnknownSignalHandler = (request: unknown) => unknown | Promise<unknown>;
25
+ type UnknownSignalHandlers = Readonly<Record<string, UnknownSignalHandler | undefined>>;
26
+ interface SignalHandlerChain {
27
+ readonly handlers: UnknownSignalHandlers;
28
+ readonly parent?: SignalHandlerChain;
29
+ readonly boundary: boolean;
30
+ }
31
+ interface SignalCallMetadata {
32
+ readonly durableName: string;
33
+ readonly signalName: string;
34
+ readonly layerPath: readonly string[];
35
+ readonly brickPath: readonly string[];
36
+ readonly callId: string;
37
+ readonly occurrence: number;
38
+ }
39
+
40
+ type ValidPathSegment<Value extends string> = Value extends '' ? never : Value extends `${string}.${string}` ? never : Value;
41
+ type ValidatePathSegmentKeys<Values extends object> = {
42
+ readonly [Key in keyof Values]: Key extends string ? ValidPathSegment<Key> extends never ? never : Values[Key] : never;
43
+ };
44
+ type HasValidPathSegmentKeys<Values extends object> = Values extends ValidatePathSegmentKeys<Values> ? true : false;
45
+
46
+ interface ExecutionContextOptions {
47
+ readonly layerPath?: readonly string[];
48
+ readonly brickPath?: readonly string[];
49
+ readonly callId: string;
50
+ readonly providers?: Readonly<Record<string, unknown>>;
51
+ readonly signalHandlers?: SignalHandlerChain;
52
+ }
53
+ declare class ExecutionContext {
54
+ #private;
55
+ readonly layerPath: readonly string[];
56
+ readonly brickPath: readonly string[];
57
+ readonly callId: string;
58
+ readonly providers: Readonly<Record<string, unknown>>;
59
+ readonly signalHandlers: SignalHandlerChain | undefined;
60
+ constructor(options: ExecutionContextOptions);
61
+ childLayer(segment: string): ExecutionContext;
62
+ childBrick(segment: string, callId: string): ExecutionContext;
63
+ withSignalHandlers(signalHandlers: SignalHandlerChain): ExecutionContext;
64
+ nextSignalMetadata(signalName: string): SignalCallMetadata;
65
+ }
66
+
67
+ type EngineStatus = 'queued' | 'running' | 'completed' | 'failed' | 'cancelled';
68
+ interface EngineSignalRequest {
69
+ readonly name: string;
70
+ readonly request: unknown;
71
+ }
72
+ type EngineExecutionResult<Result, Error> = {
73
+ readonly ok: true;
74
+ readonly value: Result;
75
+ } | {
76
+ readonly ok: false;
77
+ readonly error: Error;
78
+ };
79
+ interface EngineExecutionRequest<_Result = unknown, _Error = unknown> {
80
+ readonly id: string;
81
+ readonly brickId?: string;
82
+ readonly params: unknown;
83
+ readonly metadata?: Readonly<Record<string, unknown>>;
84
+ readonly context: ExecutionContext;
85
+ readonly execute: () => Promise<EngineExecutionResult<_Result, _Error>>;
86
+ readonly signal: (signal: EngineSignalRequest) => Promise<unknown>;
87
+ }
88
+ interface EngineExecutionHandle<Result = unknown, Error = unknown> {
89
+ readonly id: string;
90
+ readonly result: Promise<EngineExecutionResult<Result, Error>>;
91
+ readonly status: () => Promise<EngineStatus>;
92
+ readonly cancel: (reason?: string) => Promise<void>;
93
+ readonly signal: (signal: EngineSignalRequest) => Promise<unknown>;
94
+ }
95
+
96
+ interface Worker {
97
+ start<Result, Failure>(request: EngineExecutionRequest<Result, Failure>): EngineExecutionHandle<Result, Failure>;
98
+ }
99
+
100
+ type Providers = Readonly<Record<string, unknown>>;
101
+ interface AnyLayer {
102
+ readonly id: string;
103
+ readonly entries: Readonly<Record<string, unknown>>;
104
+ readonly providers: Readonly<Record<string, unknown>>;
105
+ provide?(values: Readonly<Record<string, unknown>>): AnyLayer;
106
+ override?(values: Readonly<Record<string, unknown>>): AnyLayer;
107
+ }
108
+ type LayerEntry = BrickImplementation<any> | AnyLayer;
109
+ type LayerEntries = Readonly<Record<string, LayerEntry>>;
110
+ declare const requirementConflictBrand: unique symbol;
111
+ type RequirementConflict<Key extends PropertyKey, Left = unknown, Right = unknown> = {
112
+ readonly [requirementConflictBrand]: Key;
113
+ readonly left: Left;
114
+ readonly right: Right;
115
+ };
116
+ type EntryRequirements<Entry> = Entry extends BrickImplementation<infer Spec extends Brick> ? RequirementsOf<Spec> : Entry extends {
117
+ readonly entries: infer Entries extends LayerEntries;
118
+ } ? RequirementsFromEntries<Entries> : Record<never, never>;
119
+ type RequirementUnion<Entries extends LayerEntries> = EntryRequirements<Entries[keyof Entries]>;
120
+ type KeysOfUnion<Value> = Value extends Value ? keyof Value : never;
121
+ type ValuesForKey<Value, Key extends PropertyKey> = Value extends Value ? Key extends keyof Value ? Value[Key] : never : never;
122
+ type RequirementsWithKey<Value, Key extends PropertyKey> = Value extends Value ? Key extends keyof Value ? Value : never : never;
123
+ type AreMutuallyAssignable<Left, Right> = [Left] extends [Right] ? [Right] extends [Left] ? false : true : true;
124
+ type HasIncompatibleRequirement<Requirements, Key extends PropertyKey, Left = RequirementsWithKey<Requirements, Key>, Right = RequirementsWithKey<Requirements, Key>> = Left extends Record<Key, unknown> ? Right extends Record<Key, unknown> ? AreMutuallyAssignable<Left[Key], Right[Key]> : never : never;
125
+ type ResolveRequirement<Key extends PropertyKey, Requirements> = true extends HasIncompatibleRequirement<Requirements, Key> ? RequirementConflict<Key, ValuesForKey<Requirements, Key>, ValuesForKey<Requirements, Key>> : ValuesForKey<Requirements, Key>;
126
+ type RequirementsFromEntries<Entries extends LayerEntries> = {
127
+ readonly [Key in KeysOfUnion<RequirementUnion<Entries>>]: ResolveRequirement<Key, RequirementUnion<Entries>>;
128
+ };
129
+ type EffectiveRequirementUnion<Entries extends LayerEntries, Depth extends readonly unknown[] = []> = {
130
+ [Key in keyof Entries]: Entries[Key] extends BrickImplementation<infer F extends Brick> ? EffectiveRequirementsOf<F> : Entries[Key] extends {
131
+ readonly entries: infer Nested extends LayerEntries;
132
+ } ? Depth['length'] extends 16 ? Readonly<Record<string, never>> : EffectiveRequirementUnion<Nested, [...Depth, unknown]> : never;
133
+ }[keyof Entries];
134
+ type EffectiveRequirementsFromEntries<Entries extends LayerEntries> = {
135
+ readonly [Key in KeysOfUnion<EffectiveRequirementUnion<Entries>>]: ResolveRequirement<Key, EffectiveRequirementUnion<Entries>>;
136
+ };
137
+ type BrickOfEntry<Entry> = Entry extends BrickImplementation<infer F extends Brick> ? F : never;
138
+ type FlattenedBrickEntryForAlias<Entries extends LayerEntries, Alias extends PropertyKey, Path extends readonly PropertyKey[] = readonly []> = {
139
+ [Key in keyof Entries]: Entries[Key] extends BrickImplementation<infer _F extends Brick> ? Key extends Alias ? {
140
+ readonly path: readonly [...Path, Key];
141
+ readonly implementation: Entries[Key];
142
+ readonly scope: Entries;
143
+ } : never : Entries[Key] extends {
144
+ readonly id: infer Id extends PropertyKey;
145
+ readonly entries: infer Nested extends LayerEntries;
146
+ } ? FlattenedBrickEntryForAlias<Nested, Alias, readonly [...Path, Id]> : never;
147
+ }[keyof Entries];
148
+ type IsUnion<Value, Whole = Value> = Value extends Value ? [Whole] extends [Value] ? false : true : never;
149
+ type UniqueGlobalBrickEntryForAlias<RootEntries extends LayerEntries, Alias extends PropertyKey, Match = FlattenedBrickEntryForAlias<RootEntries, Alias>> = [Match] extends [never] ? never : true extends IsUnion<Match> ? never : Match;
150
+ type ScopedBrickEntryForAlias<RootEntries extends LayerEntries, ScopeEntries extends LayerEntries, Alias extends PropertyKey, Match = FlattenedBrickEntryForAlias<RootEntries, Alias>> = Match extends {
151
+ readonly scope: infer CandidateScope extends LayerEntries;
152
+ } ? [CandidateScope] extends [ScopeEntries] ? [ScopeEntries] extends [CandidateScope] ? Match : never : never : never;
153
+ type ResolvedBrickEntry<RootEntries extends LayerEntries, ScopeEntries extends LayerEntries, Alias extends PropertyKey, Direct = ScopedBrickEntryForAlias<RootEntries, ScopeEntries, Alias>> = [Direct] extends [never] ? UniqueGlobalBrickEntryForAlias<RootEntries, Alias> : Direct;
154
+ type ResolvedBrickEntryForSignals<RootEntries extends LayerEntries, ScopeEntries extends LayerEntries, Alias extends PropertyKey> = ResolvedBrickEntry<RootEntries, ScopeEntries, Alias>;
155
+ type OwnSignalHandlers<F extends Brick> = SignalsOf<F> extends SignalDefinitions ? keyof SignalsOf<F> extends never ? Record<never, never> : BoundarySignalHandlers<SignalsOf<F>> : Record<never, never>;
156
+ type NamespacedSignalHandlers<Path extends readonly PropertyKey[], Handlers> = keyof Handlers extends never ? Record<never, never> : Path extends readonly [
157
+ infer Head extends PropertyKey,
158
+ ...infer Tail extends readonly PropertyKey[]
159
+ ] ? {
160
+ readonly [Key in Head]: NamespacedSignalHandlers<Tail, Handlers>;
161
+ } : Handlers;
162
+ type ResolvedSignalHandlers<RootEntries extends LayerEntries, Alias extends PropertyKey, Resolved, Depth extends readonly unknown[] = []> = Resolved extends {
163
+ readonly path: infer Path extends readonly PropertyKey[];
164
+ readonly implementation: BrickImplementation<infer ResolvedBrick extends Brick>;
165
+ readonly scope: infer ResolvedScope extends LayerEntries;
166
+ } ? NamespacedSignalHandlers<Path, OwnSignalHandlers<ResolvedBrick>> & OwnSelectedSignalHandlers<RootEntries, ResolvedScope, ResolvedBrick, Depth> : Resolved extends {
167
+ readonly implementation: BrickImplementation<infer ResolvedBrick extends Brick>;
168
+ readonly scope: infer ResolvedScope extends LayerEntries;
169
+ } ? NamespacedSignalHandlers<readonly [Alias], OwnSignalHandlers<ResolvedBrick>> & OwnSelectedSignalHandlers<RootEntries, ResolvedScope, ResolvedBrick, Depth> : Record<never, never>;
170
+ type OwnSelectedSignalHandlers<RootEntries extends LayerEntries, ScopeEntries extends LayerEntries, F extends Brick, Depth extends readonly unknown[] = []> = Depth['length'] extends 16 ? keyof DependenciesOf<F> extends never ? Record<never, never> : never : UnionToIntersection$1<{
171
+ readonly [Alias in keyof DependenciesOf<F>]: ResolvedBrickEntryForSignals<RootEntries, ScopeEntries, Alias> extends infer Resolved ? ResolvedSignalHandlers<RootEntries, Alias, Resolved, [...Depth, unknown]> : Record<never, never>;
172
+ }[keyof DependenciesOf<F>]>;
173
+ type HasIncompatibleDependencyAlias<RootEntries extends LayerEntries, ScopeEntries extends LayerEntries, F extends Brick> = true extends {
174
+ readonly [Alias in keyof DependenciesOf<F>]: [
175
+ ResolvedBrickEntry<RootEntries, ScopeEntries, Alias>
176
+ ] extends [never] ? false : ResolvedBrickEntry<RootEntries, ScopeEntries, Alias> extends {
177
+ readonly implementation: infer Implementation;
178
+ } ? BrickOfEntry<Implementation> extends DependenciesOf<F>[Alias] ? false : true : false;
179
+ }[keyof DependenciesOf<F>] ? true : false;
180
+ type ValidateDependencyAliases<RootEntries extends LayerEntries, Entries extends LayerEntries = RootEntries> = {
181
+ readonly [Key in keyof Entries]: Entries[Key] extends BrickImplementation<infer F extends Brick> ? HasIncompatibleDependencyAlias<RootEntries, Entries, F> extends true ? never : Entries[Key] : Entries[Key] extends {
182
+ readonly entries: infer Nested extends LayerEntries;
183
+ } ? Entries[Key] & {
184
+ readonly entries: ValidateDependencyAliases<RootEntries, Nested>;
185
+ } : Entries[Key];
186
+ };
187
+ type ProviderUnion<Entries extends LayerEntries> = {
188
+ readonly [Key in keyof Entries]: Entries[Key] extends Layer$1<string, infer NestedEntries, infer NestedProvided> ? EffectiveLayerProviders<NestedEntries, NestedProvided> : Record<never, never>;
189
+ }[keyof Entries];
190
+ type UnionToIntersection$1<Value> = (Value extends Value ? (value: Value) => void : never) extends (value: infer Intersection) => void ? Intersection : never;
191
+ type EffectiveLayerProviders<Entries extends LayerEntries, Provided extends Providers> = Provided & Omit<UnionToIntersection$1<ProviderUnion<Entries>>, keyof Provided>;
192
+ type ExactKeys<Values, Allowed> = Values & Record<Exclude<keyof Values, keyof Allowed>, never>;
193
+ type ProvideValues<Entries extends LayerEntries, Provided extends Providers> = Partial<Omit<EffectiveRequirementsFromEntries<Entries>, keyof EffectiveLayerProviders<Entries, Provided>>>;
194
+ type OverrideValues<Entries extends LayerEntries, Provided extends Providers> = Partial<Pick<EffectiveRequirementsFromEntries<Entries>, keyof EffectiveLayerProviders<Entries, Provided> & keyof EffectiveRequirementsFromEntries<Entries>>>;
195
+ type DependencyBrick$1<Value> = Value extends Brick ? Value : never;
196
+ type SuppliedDependencyNode<RootEntries extends LayerEntries, ScopeEntries extends LayerEntries, F extends Brick, Depth extends readonly unknown[]> = {
197
+ readonly brick: BrickImplementation<F>;
198
+ } & (keyof ScopedUnresolvedDependencies<RootEntries, ScopeEntries, F, Depth> extends never ? {
199
+ readonly dependencies?: never;
200
+ } : {
201
+ readonly dependencies: ScopedUnresolvedDependencies<RootEntries, ScopeEntries, F, Depth>;
202
+ });
203
+ type UnresolvedDirectDependency<RootEntries extends LayerEntries, ScopeEntries extends LayerEntries, F extends Brick, Alias extends keyof DependenciesOf<F>, Depth extends readonly unknown[]> = {
204
+ readonly [Key in Alias]: SuppliedDependencyNode<RootEntries, ScopeEntries, DependencyBrick$1<DependenciesOf<F>[Alias]>, [
205
+ ...Depth,
206
+ unknown
207
+ ]>;
208
+ };
209
+ type UnresolvedDependencyBranch<RootEntries extends LayerEntries, ScopeEntries extends LayerEntries, F extends Brick, Alias extends keyof DependenciesOf<F>, Depth extends readonly unknown[]> = ResolvedBrickEntry<RootEntries, ScopeEntries, Alias> extends infer Resolved ? [Resolved] extends [never] ? UnresolvedDirectDependency<RootEntries, ScopeEntries, F, Alias, Depth> : Resolved extends {
210
+ readonly implementation: BrickImplementation<infer ResolvedBrick extends Brick>;
211
+ readonly scope: infer ResolvedScope extends LayerEntries;
212
+ } ? ScopedUnresolvedDependencies<RootEntries, ResolvedScope, ResolvedBrick, [
213
+ ...Depth,
214
+ unknown
215
+ ]> extends infer Children ? keyof Children extends never ? Record<never, never> : string extends keyof Children ? Children : {
216
+ readonly [Key in Alias]: {
217
+ readonly dependencies: Children;
218
+ };
219
+ } : Record<never, never> : UnresolvedDirectDependency<RootEntries, ScopeEntries, F, Alias, Depth> : UnresolvedDirectDependency<RootEntries, ScopeEntries, F, Alias, Depth>;
220
+ type ScopedUnresolvedDependencies<RootEntries extends LayerEntries, ScopeEntries extends LayerEntries, F extends Brick, Depth extends readonly unknown[] = []> = Depth['length'] extends 16 ? {
221
+ readonly [Alias in keyof DependenciesOf<F>]: {
222
+ readonly brick: AnyBrickImplementation;
223
+ readonly dependencies: Readonly<Record<string, unknown>>;
224
+ };
225
+ } : UnionToIntersection$1<{
226
+ readonly [Alias in keyof DependenciesOf<F>]: UnresolvedDependencyBranch<RootEntries, ScopeEntries, F, Alias, Depth>;
227
+ }[keyof DependenciesOf<F>]>;
228
+ type UnresolvedDependencies<RootEntries extends LayerEntries, ScopeEntries extends LayerEntries, F extends Brick> = ScopedUnresolvedDependencies<RootEntries, ScopeEntries, F>;
229
+ type SuppliedNodeSignalHandlers<Node> = Node extends {
230
+ readonly brick: BrickImplementation<infer F extends Brick>;
231
+ readonly dependencies?: infer Dependencies;
232
+ } ? OwnSignalHandlers<F> & SuppliedDependencySignalHandlers<Dependencies> : Node extends {
233
+ readonly dependencies: infer Dependencies;
234
+ } ? SuppliedDependencySignalHandlers<Dependencies> : Record<never, never>;
235
+ type LayerSignalHandlersForDependencies<RootEntries extends LayerEntries, ScopeEntries extends LayerEntries, F extends Brick, Deps> = UnionToIntersection$1<{
236
+ readonly [Alias in keyof DependenciesOf<F>]: Alias extends keyof Deps ? Deps[Alias] extends {
237
+ readonly brick: BrickImplementation<infer SuppliedBrick extends Brick>;
238
+ } ? LayerSignalHandlersForDependencies<RootEntries, ScopeEntries, SuppliedBrick, Deps[Alias] extends {
239
+ readonly dependencies: infer SuppliedDependencies;
240
+ } ? SuppliedDependencies : Record<never, never>> : ResolvedSignalHandlers<RootEntries, Alias, ResolvedBrickEntry<RootEntries, ScopeEntries, Alias>> : ResolvedSignalHandlers<RootEntries, Alias, ResolvedBrickEntry<RootEntries, ScopeEntries, Alias>> extends infer Handlers ? Handlers : Record<never, never>;
241
+ }[keyof DependenciesOf<F>]>;
242
+ type SuppliedDependencySignalHandlers<Deps> = string extends keyof Deps ? Record<never, never> : {
243
+ readonly [Alias in keyof Deps as keyof SuppliedNodeSignalHandlers<Deps[Alias]> extends never ? never : Alias]: SuppliedNodeSignalHandlers<Deps[Alias]>;
244
+ };
245
+ type BoundBrickRunOptions<F extends Brick, RootId extends string, RootEntries extends LayerEntries, ScopeEntries extends LayerEntries, Provided extends Providers, BrickPath extends readonly PropertyKey[]> = Omit<BrickRunOptions<F>, 'requirements' | 'dependencies' | 'signals'> & (keyof Omit<EffectiveRequirementsOf<F>, keyof Provided> extends never ? {
246
+ readonly requirements?: never;
247
+ } : {
248
+ readonly requirements: Omit<EffectiveRequirementsOf<F>, keyof Provided>;
249
+ }) & (keyof UnresolvedDependencies<RootEntries, ScopeEntries, F> extends never ? {
250
+ readonly dependencies?: never;
251
+ } : {
252
+ readonly dependencies: UnresolvedDependencies<RootEntries, ScopeEntries, F>;
253
+ }) & (keyof (OwnSignalHandlers<F> & LayerSignalHandlersForDependencies<RootEntries, ScopeEntries, F, UnresolvedDependencies<RootEntries, ScopeEntries, F>> & SuppliedDependencySignalHandlers<UnresolvedDependencies<RootEntries, ScopeEntries, F>>) extends never ? {
254
+ readonly signals?: never;
255
+ } : {
256
+ readonly signals: NamespacedSignalHandlers<BrickPath, OwnSignalHandlers<F>> & NamespacedSignalHandlers<readonly [RootId], LayerSignalHandlersForDependencies<RootEntries, ScopeEntries, F, UnresolvedDependencies<RootEntries, ScopeEntries, F>>> & SuppliedDependencySignalHandlers<UnresolvedDependencies<RootEntries, ScopeEntries, F>>;
257
+ });
258
+ type BoundBrickRunOptionArgs<F extends Brick, RootId extends string, RootEntries extends LayerEntries, ScopeEntries extends LayerEntries, Provided extends Providers, BrickPath extends readonly PropertyKey[]> = keyof Omit<EffectiveRequirementsOf<F>, keyof Provided> extends never ? keyof UnresolvedDependencies<RootEntries, ScopeEntries, F> extends never ? keyof (OwnSignalHandlers<F> & LayerSignalHandlersForDependencies<RootEntries, ScopeEntries, F, UnresolvedDependencies<RootEntries, ScopeEntries, F>> & SuppliedDependencySignalHandlers<UnresolvedDependencies<RootEntries, ScopeEntries, F>>) extends never ? readonly [
259
+ options?: BoundBrickRunOptions<F, RootId, RootEntries, ScopeEntries, Provided, BrickPath>
260
+ ] : readonly [
261
+ options: BoundBrickRunOptions<F, RootId, RootEntries, ScopeEntries, Provided, BrickPath>
262
+ ] : readonly [
263
+ options: BoundBrickRunOptions<F, RootId, RootEntries, ScopeEntries, Provided, BrickPath>
264
+ ] : readonly [
265
+ options: BoundBrickRunOptions<F, RootId, RootEntries, ScopeEntries, Provided, BrickPath>
266
+ ];
267
+ type BoundBrick<F extends Brick, RootId extends string, RootEntries extends LayerEntries, ScopeEntries extends LayerEntries, Provided extends Providers, BrickPath extends readonly PropertyKey[]> = {
268
+ readonly handler: BrickImplementation<F>['handler'];
269
+ run(params: ParamsOf<F>, ...options: BoundBrickRunOptionArgs<F, RootId, RootEntries, ScopeEntries, Provided, BrickPath>): BrickRun<EffectiveErrorsOf<F>, ResultOf<F>>;
270
+ };
271
+ type BoundEntries<RootId extends string, RootEntries extends LayerEntries, Entries extends LayerEntries, EffectiveProvided extends Providers, LayerPath extends readonly PropertyKey[]> = {
272
+ readonly [Key in keyof Entries]: Entries[Key] extends BrickImplementation<infer F extends Brick> ? BoundBrick<F, RootId, RootEntries, Entries, EffectiveProvided, readonly [...LayerPath, Key]> : Entries[Key] extends Layer$1<infer Id, infer Nested, infer NestedProvided> ? BoundLayer<Id, Nested, NestedProvided, RootEntries, RootId, EffectiveProvided, readonly [...LayerPath, Id]> : never;
273
+ };
274
+ type BoundLayer<Id extends string, Entries extends LayerEntries, Provided extends Providers, RootEntries extends LayerEntries = Entries, RootId extends string = Id, EffectiveProvided extends Providers = EffectiveLayerProviders<Entries, Provided>, LayerPath extends readonly PropertyKey[] = readonly [Id]> = LayerState<Id, Entries, Provided> & BoundEntries<RootId, RootEntries, Entries, EffectiveProvided, LayerPath>;
275
+ interface LayerState<Id extends string = string, Entries extends LayerEntries = LayerEntries, Provided extends Providers = Providers> {
276
+ readonly id: Id;
277
+ readonly entries: Readonly<Entries>;
278
+ readonly providers: Readonly<Provided>;
279
+ provide<const Values extends ProvideValues<Entries, Provided>>(values: ExactKeys<Values, ProvideValues<Entries, Provided>>): BoundLayer<Id, Entries, Provided & Values>;
280
+ override<const Values extends OverrideValues<Entries, Provided>>(values: ExactKeys<Values, OverrideValues<Entries, Provided>>): BoundLayer<Id, Entries, Omit<Provided, keyof Values> & Values>;
281
+ }
282
+ type Layer$1<Id extends string = string, Entries extends LayerEntries = LayerEntries, Provided extends Providers = Record<never, never>> = BoundLayer<Id, Entries, Provided>;
283
+ interface LayerConstructor {
284
+ new <const Id extends string, const Entries extends LayerEntries>(id: Id & ValidPathSegment<Id>, entries: Entries & ValidateDependencyAliases<Entries> & ValidatePathSegmentKeys<Entries> & Record<Extract<keyof Entries, ReservedLayerEntryName>, never>): Layer$1<Id, Entries>;
285
+ }
286
+ type ReservedLayerEntryName = 'id' | 'entries' | 'providers' | 'provide' | 'override';
287
+ type LayerEntriesOf<Value> = Value extends {
288
+ readonly entries: infer Entries extends LayerEntries;
289
+ } ? Entries : never;
290
+ type LayerProvidersOf<Value> = Value extends {
291
+ readonly providers: infer Provided extends Providers;
292
+ } ? Provided : never;
293
+ type LayerRequirementsOf<Value> = Value extends {
294
+ readonly entries: infer Entries extends LayerEntries;
295
+ } ? RequirementsFromEntries<Entries> : never;
296
+ type LayerUnprovidedRequirementsOf<Value> = Value extends {
297
+ readonly entries: infer Entries extends LayerEntries;
298
+ readonly providers: infer Provided extends Providers;
299
+ } ? Omit<EffectiveRequirementsFromEntries<Entries>, keyof EffectiveLayerProviders<Entries, Provided>> : never;
300
+ interface FlattenedLayerEntry {
301
+ readonly id: string;
302
+ readonly key: string;
303
+ readonly layerPath: readonly string[];
304
+ readonly implementation: BrickImplementation<any>;
305
+ }
306
+
307
+ type MatchingOutcome<Success, Error> = {
308
+ readonly ok: true;
309
+ readonly value: Success;
310
+ } | {
311
+ readonly ok: false;
312
+ readonly error: Error;
313
+ };
314
+ type MatchingThunk<Success, Error> = () => MatchingOutcome<Success, Error> | Promise<MatchingOutcome<Success, Error>>;
315
+ type SupportedPattern<Input> = P.Pattern<Input>;
316
+ type MatchedError<Error, Pattern extends SupportedPattern<Error>> = P.narrow<Error, Pattern>;
317
+ type RecoveryValue<Handler> = Exclude<Awaited<Handler>, undefined>;
318
+ type IsEqual<Left, Right> = (<Value>() => Value extends Left ? 1 : 2) extends <Value>() => Value extends Right ? 1 : 2 ? (<Value>() => Value extends Right ? 1 : 2) extends <Value>() => Value extends Left ? 1 : 2 ? true : false : false;
319
+ type CoveredError<Error, Pattern extends SupportedPattern<Error>> = IsEqual<MatchedError<Error, Pattern>, Error> extends true ? Error : Pattern extends string | number | boolean | bigint | symbol | null | undefined ? Extract<Error, Pattern> : Pattern extends {
320
+ readonly type: infer Type;
321
+ } ? Exclude<keyof Pattern, 'type'> extends never ? Extract<Error, {
322
+ readonly type: Type;
323
+ }> : never : never;
324
+ type RemainingErrors<Error, Pattern extends SupportedPattern<Error>, HandlerResult> = undefined extends Awaited<HandlerResult> ? Error : Exclude<Error, CoveredError<Error, Pattern>>;
325
+ interface MatchingBuilder<Error, InitialSuccess, LocalResult = InitialSuccess, RemainingError = Error> extends PromiseLike<MatchingOutcome<LocalResult, RemainingError>> {
326
+ with<const Pattern extends SupportedPattern<RemainingError>, HandlerResult>(pattern: Pattern extends readonly unknown[] ? never : Pattern, handler: (error: MatchedError<RemainingError, Pattern>) => HandlerResult | Promise<HandlerResult>): MatchingBuilder<Error, InitialSuccess, LocalResult | RecoveryValue<HandlerResult>, RemainingErrors<RemainingError, Pattern, HandlerResult>>;
327
+ }
328
+
329
+ type RunMetadata = Readonly<Record<string, unknown>>;
330
+ interface BrickRunControls {
331
+ readonly id: string;
332
+ status(): Promise<EngineStatus>;
333
+ cancel(reason?: string): Promise<void>;
334
+ }
335
+ interface IncompleteBrickRun<Error, InitialSuccess, LocalResult = InitialSuccess, RemainingError = Error> extends BrickRunControls {
336
+ readonly unhandledErrors: RemainingError;
337
+ readonly then: (invalidOnFulfilled: never) => never;
338
+ with<const Pattern extends SupportedPattern<RemainingError>, HandlerResult>(pattern: Pattern extends readonly unknown[] ? never : Pattern, handler: (error: MatchedError<RemainingError, Pattern>) => HandlerResult | Promise<HandlerResult>): BrickRun<Error, InitialSuccess, LocalResult | RecoveryValue<HandlerResult>, RemainingErrors<RemainingError, Pattern, HandlerResult>>;
339
+ }
340
+ interface CompleteBrickRun<Error, InitialSuccess, LocalResult = InitialSuccess> extends BrickRunControls, PromiseLike<LocalResult> {
341
+ with<const Pattern extends SupportedPattern<never>, HandlerResult>(pattern: Pattern extends readonly unknown[] ? never : Pattern, handler: (error: MatchedError<never, Pattern>) => HandlerResult | Promise<HandlerResult>): BrickRun<Error, InitialSuccess, LocalResult | RecoveryValue<HandlerResult>, never>;
342
+ }
343
+ type BrickRun<Error, InitialSuccess, LocalResult = InitialSuccess, RemainingError = Error> = [RemainingError] extends [never] ? CompleteBrickRun<Error, InitialSuccess, LocalResult> : IncompleteBrickRun<Error, InitialSuccess, LocalResult, RemainingError>;
344
+
345
+ type Empty = Record<never, never>;
346
+ type DeclaredProperty<F, Key extends PropertyKey, Default> = F extends Record<Key, infer Value> ? Value : Default;
347
+ type ParamsOf<F extends Brick> = F['params'];
348
+ type ResultOf<F extends Brick> = F['result'];
349
+ type ErrorsOf<F extends Brick> = DeclaredProperty<F, 'errors', never>;
350
+ type RequirementsOf<F extends Brick> = DeclaredProperty<F, 'requires', Empty> extends object ? DeclaredProperty<F, 'requires', Empty> : Empty;
351
+ type DependenciesOf<F extends Brick> = DeclaredProperty<F, 'depends', Empty> extends object ? DeclaredProperty<F, 'depends', Empty> : Empty;
352
+ type SignalsOf<F extends Brick> = DeclaredProperty<F, 'signals', Empty> extends object ? DeclaredProperty<F, 'signals', Empty> : Empty;
353
+ type ValidBrick<F extends Brick> = HasValidPathSegmentKeys<DependenciesOf<F>> extends true ? HasValidPathSegmentKeys<SignalsOf<F>> extends true ? F : never : never;
354
+ type BrickOf<Implementation> = Implementation extends BrickImplementation<infer F> ? F : never;
355
+ type AnyBrickImplementation = BrickImplementation<any>;
356
+ type DependencyBrick<Value> = Value extends Brick ? Value : never;
357
+ type UnionToIntersection<Value> = (Value extends Value ? (value: Value) => void : never) extends (value: infer Intersection) => void ? Intersection : never;
358
+ type EffectiveErrorsFromDependencies<F extends Brick, Depth extends readonly unknown[]> = {
359
+ [Key in keyof DependenciesOf<F>]: EffectiveErrorsOf<DependencyBrick<DependenciesOf<F>[Key]>, Depth>;
360
+ }[keyof DependenciesOf<F>];
361
+ type EffectiveRequirementsFromDependencies<F extends Brick, Depth extends readonly unknown[]> = UnionToIntersection<{
362
+ [Key in keyof DependenciesOf<F>]: EffectiveRequirementsOf<DependencyBrick<DependenciesOf<F>[Key]>, Depth>;
363
+ }[keyof DependenciesOf<F>]>;
364
+ type EffectiveDependenciesFromDependencies<F extends Brick, Depth extends readonly unknown[]> = UnionToIntersection<{
365
+ [Key in keyof DependenciesOf<F>]: EffectiveDependenciesOf<DependencyBrick<DependenciesOf<F>[Key]>, Depth>;
366
+ }[keyof DependenciesOf<F>]>;
367
+ type EffectiveSignalsFromDependencies<F extends Brick, Depth extends readonly unknown[]> = UnionToIntersection<{
368
+ [Key in keyof DependenciesOf<F>]: EffectiveSignalsOf<DependencyBrick<DependenciesOf<F>[Key]>, Depth>;
369
+ }[keyof DependenciesOf<F>]>;
370
+ type EffectiveErrorsOf<F extends Brick, Depth extends readonly unknown[] = []> = Depth['length'] extends 16 ? ErrorsOf<F> : ErrorsOf<F> | EffectiveErrorsFromDependencies<F, [...Depth, unknown]>;
371
+ type EffectiveRequirementsOf<F extends Brick, Depth extends readonly unknown[] = []> = RequirementsOf<F> & (Depth['length'] extends 16 ? Empty : EffectiveRequirementsFromDependencies<F, [...Depth, unknown]>);
372
+ type EffectiveDependenciesOf<F extends Brick, Depth extends readonly unknown[] = []> = {
373
+ readonly [Key in keyof DependenciesOf<F>]: BrickImplementation<DependencyBrick<DependenciesOf<F>[Key]>>;
374
+ } & (Depth['length'] extends 16 ? Empty : EffectiveDependenciesFromDependencies<F, [...Depth, unknown]>);
375
+ type EffectiveSignalsOf<F extends Brick, Depth extends readonly unknown[] = []> = SignalsOf<F> & (Depth['length'] extends 16 ? Empty : EffectiveSignalsFromDependencies<F, [...Depth, unknown]>);
376
+ type DependencyNodes<F extends Brick, Depth extends readonly unknown[] = []> = {
377
+ readonly [Alias in keyof DependenciesOf<F>]: DependencyNode<DependencyBrick<DependenciesOf<F>[Alias]>, Depth>;
378
+ };
379
+ type DependencyNode<F extends Brick, Depth extends readonly unknown[] = []> = Depth['length'] extends 16 ? {
380
+ readonly brick: BrickImplementation<F>;
381
+ } & (keyof DependenciesOf<F> extends never ? {
382
+ readonly dependencies?: never;
383
+ } : {
384
+ readonly dependencies: {
385
+ readonly [Alias in keyof DependenciesOf<F>]: {
386
+ readonly brick: AnyBrickImplementation;
387
+ readonly dependencies: Readonly<Record<string, unknown>>;
388
+ };
389
+ };
390
+ }) : {
391
+ readonly brick: BrickImplementation<F>;
392
+ } & (keyof DependenciesOf<F> extends never ? {
393
+ readonly dependencies?: never;
394
+ } : {
395
+ readonly dependencies: DependencyNodes<F, [...Depth, unknown]>;
396
+ });
397
+ type DependencySignalHandlers<F extends Brick, Depth extends readonly unknown[] = []> = {
398
+ readonly [Alias in keyof DependenciesOf<F> as keyof BrickSignalHandlers<DependencyBrick<DependenciesOf<F>[Alias]>, [
399
+ ...Depth,
400
+ unknown
401
+ ]> extends never ? never : Alias]: BrickSignalHandlers<DependencyBrick<DependenciesOf<F>[Alias]>, [...Depth, unknown]>;
402
+ };
403
+ type DepthFallbackSignalHandlers<F extends Brick> = keyof DependenciesOf<F> extends never ? Empty : {
404
+ readonly [Alias in keyof DependenciesOf<F>]: Readonly<Record<string, unknown>>;
405
+ };
406
+ type BrickSignalHandlers<F extends Brick, Depth extends readonly unknown[] = []> = (SignalsOf<F> extends SignalDefinitions ? keyof SignalsOf<F> extends never ? Empty : BoundarySignalHandlers<SignalsOf<F>> : Empty) & (Depth['length'] extends 16 ? DepthFallbackSignalHandlers<F> : DependencySignalHandlers<F, Depth>);
407
+ type DependencyCallOptions<F extends Brick> = SignalsOf<F> extends SignalDefinitions ? keyof SignalsOf<F> extends never ? {
408
+ readonly signals?: never;
409
+ } : {
410
+ readonly signals?: InternalSignalHandlers<SignalsOf<F>>;
411
+ } : {
412
+ readonly signals?: never;
413
+ };
414
+ type DependencyFunctions<F extends Brick> = {
415
+ readonly [Key in keyof DependenciesOf<F>]: (params: ParamsOf<DependencyBrick<DependenciesOf<F>[Key]>>, options?: DependencyCallOptions<DependencyBrick<DependenciesOf<F>[Key]>>) => Promise<ResultOf<DependencyBrick<DependenciesOf<F>[Key]>>>;
416
+ };
417
+ interface BrickTools<F extends Brick> {
418
+ readonly fail: (error: ErrorsOf<F>) => never;
419
+ readonly signals: SignalsOf<F> extends SignalDefinitions ? SignalFunctions<SignalsOf<F>> : never;
420
+ }
421
+ type BrickHandler<F extends Brick> = (params: ParamsOf<F>, requirements: RequirementsOf<F>, dependencies: DependencyFunctions<F>, tools: BrickTools<F>) => ResultOf<F> | Promise<ResultOf<F>>;
422
+ type RequiredSection<Key extends PropertyKey, Value> = [Key] extends [never] ? {
423
+ readonly [Property in never]?: never;
424
+ } : Value;
425
+ type RequirementsOption<F extends Brick> = RequiredSection<keyof EffectiveRequirementsOf<F>, {
426
+ readonly requirements: EffectiveRequirementsOf<F>;
427
+ }>;
428
+ type DependenciesOption<F extends Brick> = RequiredSection<keyof DependenciesOf<F>, {
429
+ readonly dependencies: DependencyNodes<F>;
430
+ }>;
431
+ type SignalsOption<F extends Brick> = keyof BrickSignalHandlers<F> extends never ? {
432
+ readonly signals?: never;
433
+ } : {
434
+ readonly signals: BrickSignalHandlers<F>;
435
+ };
436
+ type BrickRunOptions<F extends Brick> = {
437
+ readonly worker?: Worker;
438
+ readonly id?: string;
439
+ readonly metadata?: RunMetadata;
440
+ } & RequirementsOption<F> & DependenciesOption<F> & SignalsOption<F>;
441
+ type BrickRunOptionArgs<F extends Brick> = keyof EffectiveRequirementsOf<F> extends never ? keyof DependenciesOf<F> extends never ? keyof BrickSignalHandlers<F> extends never ? readonly [options?: BrickRunOptions<F>] : readonly [options: BrickRunOptions<F>] : readonly [options: BrickRunOptions<F>] : readonly [options: BrickRunOptions<F>];
442
+ interface BrickImplementation<F extends Brick = Brick> {
443
+ readonly handler: BrickHandler<F>;
444
+ run(params: ParamsOf<F>, ...options: BrickRunOptionArgs<F>): BrickRun<EffectiveErrorsOf<F>, ResultOf<F>>;
445
+ }
446
+ type BrickExecutionResult<F extends Brick> = {
447
+ readonly ok: true;
448
+ readonly value: ResultOf<F>;
449
+ } | {
450
+ readonly ok: false;
451
+ readonly error: ErrorsOf<F>;
452
+ };
453
+
454
+ interface BrickConfig {
455
+ params: unknown;
456
+ result: unknown;
457
+ errors?: unknown;
458
+ requires?: object;
459
+ depends?: Readonly<Record<string, Brick>>;
460
+ signals?: SignalDefinitions;
461
+ }
462
+ type Brick<Config extends BrickConfig = BrickConfig> = Config;
463
+ declare function brick<F extends Brick>(handler: F extends ValidBrick<F> ? BrickHandler<F> : never): BrickImplementation<F>;
464
+
465
+ declare const Layer: LayerConstructor;
466
+
467
+ declare class NonBoundarySignalHandlerChainError extends Error {
468
+ readonly signalName: string;
469
+ constructor(signalName: string);
470
+ }
471
+ declare class MissingSignalHandlerError extends Error {
472
+ readonly signalName: string;
473
+ constructor(signalName: string);
474
+ }
475
+
476
+ declare class LocalRunCancelledError extends Error {
477
+ readonly runId: string;
478
+ readonly reason: string | undefined;
479
+ constructor(runId: string, reason?: string);
480
+ }
481
+ declare class DuplicateLocalRunIdError extends Error {
482
+ readonly runId: string;
483
+ constructor(runId: string);
484
+ }
485
+ declare class LocalWorker implements Worker {
486
+ private readonly runIds;
487
+ start<Result, Failure>(request: EngineExecutionRequest<Result, Failure>): EngineExecutionHandle<Result, Failure>;
488
+ }
489
+ declare const localWorker: Worker;
490
+
491
+ declare class UnhandledBrickFailureError extends Error {
492
+ readonly failure: unknown;
493
+ constructor(failure: unknown);
494
+ }
495
+
496
+ export { type AnyLayer, type BoundarySignalHandler, type BoundarySignalHandlers, type Brick, type BrickExecutionResult, type BrickHandler, type BrickImplementation, type BrickOf, type BrickRun, type BrickRunControls, type BrickRunOptionArgs, type BrickRunOptions, type BrickTools, type CompleteBrickRun, type DependenciesOf, type DependencyFunctions, DuplicateLocalRunIdError, type EffectiveDependenciesOf, type EffectiveErrorsOf, type EffectiveRequirementsOf, type EffectiveSignalsOf, type EngineExecutionHandle, type EngineExecutionRequest, type EngineExecutionResult, type EngineSignalRequest, type EngineStatus, type ErrorsOf, ExecutionContext, type ExecutionContextOptions, type FlattenedLayerEntry, type IncompleteBrickRun, type InternalSignalHandler, type InternalSignalHandlers, Layer, type LayerEntries, type LayerEntriesOf, type LayerEntry, type LayerProvidersOf, type LayerRequirementsOf, type LayerUnprovidedRequirementsOf, LocalRunCancelledError, LocalWorker, type MatchedError, type MatchingBuilder, type MatchingOutcome, type MatchingThunk, MissingSignalHandlerError, NonBoundarySignalHandlerChainError, type ParamsOf, type RecoveryValue, type RemainingErrors, type RequirementConflict, type RequirementsOf, type ResultOf, type RunMetadata, type SignalCallMetadata, type SignalDefinition, type SignalDefinitions, type SignalFunction, type SignalFunctions, type SignalHandlerChain, type SignalRequest, type SignalResponse, type SignalsOf, type SupportedPattern, UnhandledBrickFailureError, type Worker, brick, localWorker };