effective-progress 0.11.0 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -6,6 +6,8 @@
6
6
  > Pre-`1.0.0`, breaking changes may happen in any minor release. SemVer guarantees will begin at `1.0.0`.
7
7
  > I recommend using only the `Progress.all` and `Progress.forEach` APIs for now, as they will likely change the least. The lower-level APIs for manual progress bar control are more likely to see breaking changes as I iterate on the design.
8
8
  >
9
+ > I am currently waiting on https://github.com/anomalyco/opentui/issues/204 to swap the renderer to opentui.
10
+ >
9
11
  > Please open an issue or reach out if you have any questions or want to contribute!
10
12
  > Feedback and contributions are very welcome!
11
13
 
@@ -15,14 +17,14 @@
15
17
 
16
18
  - multiple nested tree-like progress bars
17
19
  - spinner support for “we have no idea how long this takes” work
18
- - keep using `Console.log` / `Effect.logInfo` while progress rendering is active
20
+ - keep using Effect v4 `Effect.log*` / `Logger` and `Console.log` while progress rendering is active
19
21
  - familiar `.all` and `.forEach` APIs — swap `Effect` for `Progress`, get progress bars basically for free
20
22
  - flicker-free rendering with [Ink](https://github.com/vadimdemedes/ink)
21
23
 
22
24
  ## Install
23
25
 
24
26
  ```bash
25
- bun add effective-progress
27
+ bun add effective-progress effect@^4.0.0-beta.100
26
28
  ```
27
29
 
28
30
  ## Usage
@@ -30,14 +32,14 @@ bun add effective-progress
30
32
  Iterate items with a single progress bar.
31
33
 
32
34
  ```ts
33
- import { Console, Effect } from "effect";
35
+ import { Effect } from "effect";
34
36
  import * as Progress from "effective-progress";
35
37
 
36
38
  const program = Progress.all(
37
39
  Array.from({ length: 5 }).map((_, i) =>
38
40
  Effect.gen(function* () {
39
41
  yield* Effect.sleep("1 second");
40
- yield* Console.log(`Completed task ${i + 1}`);
42
+ yield* Effect.logInfo(`Completed task ${i + 1}`);
41
43
  }),
42
44
  ),
43
45
  { description: "Running tasks in parallel", concurrency: 2 },
@@ -73,16 +75,16 @@ Effect.runPromise(program);
73
75
 
74
76
  <img alt="Nested example output" src="docs/images/nesting.gif" width="600" />
75
77
 
76
- ### Effect.all modes
78
+ ### Effect.all result mode
77
79
 
78
- Support for `either`/`validate` modes of `Effect.all` and render the amount of successes/failures.
80
+ `Progress.all` mirrors Effect v4's fail-fast default and `mode: "result"`, rendering the amount of successes and failures as work completes.
79
81
 
80
82
  <img alt="Mixed outcomes modes output" src="docs/images/mixedOutcomes.gif" width="600" />
81
83
 
82
84
  - `Progress.all` in default mode (`mode: "default"`) remains fail-fast.
83
85
  - In fail-fast runs, unresolved units remain unprocessed.
84
- - `mode: "either"` and `mode: "validate"` run all effects and keep mixed outcomes in the task counters.
85
- - Mixed outcomes can finalize as `done` when all units are accounted for.
86
+ - `mode: "result"` runs every effect and returns a `Result` for each outcome while keeping mixed outcomes in the task counters.
87
+ - Result-mode tasks finalize as `done` when all units are accounted for.
86
88
  - Empty collections are valid inputs for `Progress.all` / `Progress.forEach` and render as `0/0` instead of failing.
87
89
 
88
90
  ### Single task with a typed handle
@@ -90,13 +92,13 @@ Support for `either`/`validate` modes of `Effect.all` and render the amount of s
90
92
  Use `Progress.task(...)` when you want one progress bar around a custom effect. The callback form gives you a task-local handle, so you can update counts, descriptions, and metadata without fetching the current task ID first.
91
93
 
92
94
  ```ts
93
- import { Console, Effect } from "effect";
95
+ import { Effect } from "effect";
94
96
  import * as Progress from "effective-progress";
95
97
 
96
98
  const program = Progress.task(
97
99
  (task) =>
98
100
  Effect.gen(function* () {
99
- yield* Console.log("Starting deployment");
101
+ yield* Effect.logInfo("Starting deployment");
100
102
  yield* task.incrementSucceeded();
101
103
  yield* task.update({
102
104
  description: "Uploading release bundle",
@@ -123,7 +125,7 @@ Effect.runPromise(program);
123
125
  - `examples/advancedExample.ts` - mixed high-level and low-level Progress service usage
124
126
  - `examples/basic.ts` - minimal `Progress.all` usage
125
127
  - `examples/nesting.ts` - nested tree rendering with parent and child tasks
126
- - `examples/mixedOutcomes.ts` - fail-fast vs `either`/`validate` with mixed success/failure counters
128
+ - `examples/mixedOutcomes.ts` - fail-fast vs `result` mode with mixed success/failure counters
127
129
  - `examples/cliProgressSemantics.ts` - zero totals, negative totals clearing to unknown totals, overflow counts, and empty `all` / `forEach`
128
130
  - `examples/unknownTotalCounting.ts` - count successes/failures without a known total and render `processed/?`
129
131
  - `examples/typedMetadata.ts` - typed task metadata rendered through custom columns
@@ -136,17 +138,29 @@ Effect.runPromise(program);
136
138
 
137
139
  ## Configuration
138
140
 
139
- ### Console behavior
141
+ ### Logging behavior
140
142
 
141
143
  - The Ink renderer runs with `patchConsole: true`, so console output is patched by Ink while the app is mounted.
142
- - `Progress.task`, `Progress.all`, and `Progress.forEach` write through the currently provided Effect `Console` implementation.
143
- - Formatting is controlled by the API consumer's logger/console implementation.
144
+ - `Effect.log*` uses the active Effect v4 `Logger` set, including custom loggers installed with `Logger.layer(...)`.
145
+ - The low-level `progress.log(...)` method emits through `Effect.log`, so it honors the current log level, logger set, annotations, and spans.
146
+ - Direct `Console` calls still use the currently provided Effect `Console` reference.
147
+ - Formatting and routing remain controlled by the consumer's logger and console configuration.
148
+
149
+ For example, install the v4 pretty console logger around a program with:
150
+
151
+ ```ts
152
+ import { Effect, Logger } from "effect";
153
+
154
+ Effect.runPromise(program.pipe(Effect.provide(Logger.layer([Logger.consolePretty()]))));
155
+ ```
144
156
 
145
157
  ### Ink renderer behavior
146
158
 
147
159
  - Rendering is powered by [Ink](https://github.com/vadimdemedes/ink).
148
- - Built-in columns are exposed as `Progress.Columns.description()`, `bar()`, `amount()`, `elapsed()`, `eta()`, `spacer()`, and `defaults()`.
160
+ - Built-in columns are exposed as `Progress.Columns.description()`, `bar()`, `amount()`, `elapsedEta()`, `elapsed()`, `eta()`, `spacer()`, and `defaults()`.
161
+ - `elapsedEta()` renders a compact clock-style column as `elapsed<eta` using the shape `00:00<00:00`; `defaults()` now uses that combined column.
149
162
  - Determinate bars are segmented by outcome: succeeded (green), failed (red), and remaining (neutral).
163
+ - `bar()` defaults to a fixed width of `30`; pass `bar({ size: "fullwidth" })` to consume remaining row width or `bar({ size: 12 })` for an explicit width.
150
164
  - Determinate amount text shows counters without prefixes: `<succeeded> <failed> <processed>/<total>`.
151
165
  - Counts can exceed `total`; the amount text keeps those raw values (for example `12/10`) while the bar stays visually clamped at full.
152
166
  - `total: 0` is valid for determinate tasks and renders as a full bar by default.
@@ -173,17 +187,19 @@ The handle exposes:
173
187
 
174
188
  When you need lower-level control, the `Progress` service is available inside the effect and exposes APIs like `addTask`, `updateTask`, `incrementSucceeded(taskId, amount)`, and `completeTask(taskId)`.
175
189
 
190
+ The primary v4-style service layers are exposed as `Progress.layer` and `ProgressStdio.layer`.
191
+
176
192
  Example using the lower-level service API:
177
193
 
178
194
  ```ts
179
- import { Console, Effect } from "effect";
195
+ import { Effect } from "effect";
180
196
  import * as Progress from "effective-progress";
181
197
 
182
198
  const program = Progress.task(
183
199
  Effect.gen(function* () {
184
200
  const progress = yield* Progress.Progress;
185
201
  const currentTask = yield* Progress.Task;
186
- yield* Console.log("This log is handled by the outer Console", { taskId: currentTask });
202
+ yield* Effect.logInfo("Updating the current task", { taskId: currentTask });
187
203
 
188
204
  // Manual determinate updates:
189
205
  yield* progress.incrementSucceeded(currentTask, 3);
@@ -254,6 +270,6 @@ const program = Progress.task(
254
270
 
255
271
  If a task does not provide `columns`, the renderer falls back to `Progress.Columns.defaults()`.
256
272
 
257
- ## Notes
273
+ ## Effect compatibility
258
274
 
259
- - As Effect 4.0 is around the corner with some changes to logging, there may be some adjustments needed to align with the new Effect APIs.
275
+ This release targets Effect `4.0.0-beta.100` or newer compatible v4 prereleases. Effect v4 is still in beta, so its APIs may change between beta releases.
package/dist/index.d.mts CHANGED
@@ -6,12 +6,12 @@ import { Concurrency } from "effect/Types";
6
6
  import * as effect_SchemaAST0 from "effect/SchemaAST";
7
7
 
8
8
  //#region src/types.d.ts
9
- declare const TaskIdSchema: Schema.brand<typeof Schema.Number, "TaskId">;
9
+ declare const TaskIdSchema: Schema.brand<Schema.Number, "TaskId">;
10
10
  type TaskId = typeof TaskIdSchema.Type;
11
- declare const TaskId: Brand.Brand.Constructor<number & Brand.Brand<"TaskId">>;
12
- declare const TaskStatusSchema: Schema.Literal<["running", "done", "failed"]>;
11
+ declare const TaskId: Brand.Constructor<number & Brand.Brand<"TaskId">>;
12
+ declare const TaskStatusSchema: Schema.Literals<readonly ["running", "done", "failed"]>;
13
13
  type TaskStatus = typeof TaskStatusSchema.Type;
14
- declare const TaskCountDisplaySchema: Schema.Literal<["processedOnly", "detailed"]>;
14
+ declare const TaskCountDisplaySchema: Schema.Literals<readonly ["processedOnly", "detailed"]>;
15
15
  type TaskCountDisplay = typeof TaskCountDisplaySchema.Type;
16
16
  type ColumnAlign = "left" | "center" | "right";
17
17
  interface TaskTreeInfo {
@@ -102,28 +102,37 @@ interface UpdateTaskOptions {
102
102
  }
103
103
  type TrackOptions = Omit<AddTaskOptions, "parentId">;
104
104
  declare const TaskUnitsSchema: Schema.Struct<{
105
- succeeded: typeof Schema.Number;
106
- failed: typeof Schema.Number;
107
- processed: typeof Schema.Number;
108
- total: Schema.optional<typeof Schema.Number>;
105
+ readonly succeeded: Schema.Number;
106
+ readonly failed: Schema.Number;
107
+ readonly processed: Schema.Number;
108
+ readonly total: Schema.optional<Schema.Number>;
109
109
  }>;
110
110
  type TaskUnits = typeof TaskUnitsSchema.Type;
111
+ declare const TaskProgressSampleSchema: Schema.Struct<{
112
+ readonly timestamp: Schema.Number;
113
+ readonly processed: Schema.Number;
114
+ }>;
115
+ type TaskProgressSample = typeof TaskProgressSampleSchema.Type;
111
116
  declare const TaskSnapshotSchema: Schema.Struct<{
112
- id: Schema.brand<typeof Schema.Number, "TaskId">;
113
- parentId: Schema.NullOr<Schema.brand<typeof Schema.Number, "TaskId">>;
114
- description: typeof Schema.String;
115
- status: Schema.Literal<["running", "done", "failed"]>;
116
- countDisplay: Schema.Literal<["processedOnly", "detailed"]>;
117
- transient: typeof Schema.Boolean;
118
- units: Schema.Struct<{
119
- succeeded: typeof Schema.Number;
120
- failed: typeof Schema.Number;
121
- processed: typeof Schema.Number;
122
- total: Schema.optional<typeof Schema.Number>;
117
+ readonly id: Schema.brand<Schema.Number, "TaskId">;
118
+ readonly parentId: Schema.NullOr<Schema.brand<Schema.Number, "TaskId">>;
119
+ readonly description: Schema.String;
120
+ readonly status: Schema.Literals<readonly ["running", "done", "failed"]>;
121
+ readonly countDisplay: Schema.Literals<readonly ["processedOnly", "detailed"]>;
122
+ readonly transient: Schema.Boolean;
123
+ readonly units: Schema.Struct<{
124
+ readonly succeeded: Schema.Number;
125
+ readonly failed: Schema.Number;
126
+ readonly processed: Schema.Number;
127
+ readonly total: Schema.optional<Schema.Number>;
123
128
  }>;
124
- startedAt: typeof Schema.Number;
125
- completedAt: Schema.NullOr<typeof Schema.Number>;
126
- metadata: typeof Schema.Unknown;
129
+ readonly startedAt: Schema.Number;
130
+ readonly completedAt: Schema.NullOr<Schema.Number>;
131
+ readonly progressSamples: Schema.$Array<Schema.Struct<{
132
+ readonly timestamp: Schema.Number;
133
+ readonly processed: Schema.Number;
134
+ }>>;
135
+ readonly metadata: Schema.Unknown;
127
136
  }>;
128
137
  type TaskSnapshot = typeof TaskSnapshotSchema.Type;
129
138
  declare const TaskSnapshot: (snapshot: TaskSnapshot) => TaskSnapshot;
@@ -136,7 +145,7 @@ interface TaskStore {
136
145
  readonly renderOrder: ReadonlyArray<RenderRow>;
137
146
  readonly columns: Map<TaskId, ReadonlyArray<ColumnDef<any, any>>>;
138
147
  }
139
- interface ProgressService {
148
+ interface ProgressShape {
140
149
  readonly addTask: (options: AddTaskOptions<any>) => Effect.Effect<TaskId>;
141
150
  readonly updateTask: (taskId: TaskId, options: UpdateTaskOptions) => Effect.Effect<void>;
142
151
  readonly incrementSucceeded: (taskId: TaskId, amount?: number) => Effect.Effect<void>;
@@ -166,66 +175,54 @@ interface ProgressService {
166
175
  }): Effect.Effect<A, E, Exclude<R, Task>>;
167
176
  };
168
177
  }
169
- declare const Task_base: Context.TagClass<Task, "stromseng.dev/effective-progress/Task", number & Brand.Brand<"TaskId">>;
178
+ declare const Task_base: Context.ServiceClass<Task, "stromseng.dev/effective-progress/Task", number & Brand.Brand<"TaskId">>;
170
179
  declare class Task extends Task_base {}
171
- declare const TaskAddedEvent_base: Schema.TaggedClass<TaskAddedEvent, "TaskAdded", {
172
- readonly _tag: Schema.tag<"TaskAdded">;
173
- } & {
174
- taskId: Schema.brand<typeof Schema.Number, "TaskId">;
175
- parentId: Schema.NullOr<Schema.brand<typeof Schema.Number, "TaskId">>;
176
- description: typeof Schema.String;
177
- total: Schema.optional<typeof Schema.Number>;
178
- transient: typeof Schema.Boolean;
179
- countDisplay: Schema.Literal<["processedOnly", "detailed"]>;
180
- }>;
180
+ declare const TaskAddedEvent_base: Schema.Class<TaskAddedEvent, Schema.TaggedStruct<"TaskAdded", {
181
+ readonly taskId: Schema.brand<Schema.Number, "TaskId">;
182
+ readonly parentId: Schema.NullOr<Schema.brand<Schema.Number, "TaskId">>;
183
+ readonly description: Schema.String;
184
+ readonly total: Schema.optional<Schema.Number>;
185
+ readonly transient: Schema.Boolean;
186
+ readonly countDisplay: Schema.Literals<readonly ["processedOnly", "detailed"]>;
187
+ }>, {}>;
181
188
  declare class TaskAddedEvent extends TaskAddedEvent_base {}
182
- declare const TaskUpdatedEvent_base: Schema.TaggedClass<TaskUpdatedEvent, "TaskUpdated", {
183
- readonly _tag: Schema.tag<"TaskUpdated">;
184
- } & {
185
- taskId: Schema.brand<typeof Schema.Number, "TaskId">;
186
- description: Schema.optional<typeof Schema.String>;
187
- succeeded: Schema.optional<typeof Schema.Number>;
188
- failed: Schema.optional<typeof Schema.Number>;
189
- processed: Schema.optional<typeof Schema.Number>;
190
- total: Schema.optional<typeof Schema.Number>;
191
- transient: Schema.optional<typeof Schema.Boolean>;
192
- countDisplay: Schema.optional<Schema.Literal<["processedOnly", "detailed"]>>;
193
- }>;
189
+ declare const TaskUpdatedEvent_base: Schema.Class<TaskUpdatedEvent, Schema.TaggedStruct<"TaskUpdated", {
190
+ readonly taskId: Schema.brand<Schema.Number, "TaskId">;
191
+ readonly description: Schema.optional<Schema.String>;
192
+ readonly succeeded: Schema.optional<Schema.Number>;
193
+ readonly failed: Schema.optional<Schema.Number>;
194
+ readonly processed: Schema.optional<Schema.Number>;
195
+ readonly total: Schema.optional<Schema.Number>;
196
+ readonly transient: Schema.optional<Schema.Boolean>;
197
+ readonly countDisplay: Schema.optional<Schema.Literals<readonly ["processedOnly", "detailed"]>>;
198
+ }>, {}>;
194
199
  declare class TaskUpdatedEvent extends TaskUpdatedEvent_base {}
195
- declare const TaskAdvancedEvent_base: Schema.TaggedClass<TaskAdvancedEvent, "TaskAdvanced", {
196
- readonly _tag: Schema.tag<"TaskAdvanced">;
197
- } & {
198
- taskId: Schema.brand<typeof Schema.Number, "TaskId">;
199
- amount: typeof Schema.Number;
200
- kind: Schema.Literal<["succeeded", "failed"]>;
201
- }>;
200
+ declare const TaskAdvancedEvent_base: Schema.Class<TaskAdvancedEvent, Schema.TaggedStruct<"TaskAdvanced", {
201
+ readonly taskId: Schema.brand<Schema.Number, "TaskId">;
202
+ readonly amount: Schema.Number;
203
+ readonly kind: Schema.Literals<readonly ["succeeded", "failed"]>;
204
+ }>, {}>;
202
205
  declare class TaskAdvancedEvent extends TaskAdvancedEvent_base {}
203
- declare const TaskCompletedEvent_base: Schema.TaggedClass<TaskCompletedEvent, "TaskCompleted", {
204
- readonly _tag: Schema.tag<"TaskCompleted">;
205
- } & {
206
- taskId: Schema.brand<typeof Schema.Number, "TaskId">;
207
- }>;
206
+ declare const TaskCompletedEvent_base: Schema.Class<TaskCompletedEvent, Schema.TaggedStruct<"TaskCompleted", {
207
+ readonly taskId: Schema.brand<Schema.Number, "TaskId">;
208
+ }>, {}>;
208
209
  declare class TaskCompletedEvent extends TaskCompletedEvent_base {}
209
- declare const TaskFailedEvent_base: Schema.TaggedClass<TaskFailedEvent, "TaskFailed", {
210
- readonly _tag: Schema.tag<"TaskFailed">;
211
- } & {
212
- taskId: Schema.brand<typeof Schema.Number, "TaskId">;
213
- }>;
210
+ declare const TaskFailedEvent_base: Schema.Class<TaskFailedEvent, Schema.TaggedStruct<"TaskFailed", {
211
+ readonly taskId: Schema.brand<Schema.Number, "TaskId">;
212
+ }>, {}>;
214
213
  declare class TaskFailedEvent extends TaskFailedEvent_base {}
215
- declare const TaskRemovedEvent_base: Schema.TaggedClass<TaskRemovedEvent, "TaskRemoved", {
216
- readonly _tag: Schema.tag<"TaskRemoved">;
217
- } & {
218
- taskId: Schema.brand<typeof Schema.Number, "TaskId">;
219
- }>;
214
+ declare const TaskRemovedEvent_base: Schema.Class<TaskRemovedEvent, Schema.TaggedStruct<"TaskRemoved", {
215
+ readonly taskId: Schema.brand<Schema.Number, "TaskId">;
216
+ }>, {}>;
220
217
  declare class TaskRemovedEvent extends TaskRemovedEvent_base {}
221
- declare const ProgressTaskEventSchema: Schema.Union<[typeof TaskAddedEvent, typeof TaskUpdatedEvent, typeof TaskAdvancedEvent, typeof TaskCompletedEvent, typeof TaskFailedEvent, typeof TaskRemovedEvent]>;
218
+ declare const ProgressTaskEventSchema: Schema.Union<readonly [typeof TaskAddedEvent, typeof TaskUpdatedEvent, typeof TaskAdvancedEvent, typeof TaskCompletedEvent, typeof TaskFailedEvent, typeof TaskRemovedEvent]>;
222
219
  type ProgressTaskEvent = typeof ProgressTaskEventSchema.Type;
223
- declare const decodeProgressTaskEvent: (u: unknown, overrideOptions?: effect_SchemaAST0.ParseOptions) => TaskAddedEvent | TaskUpdatedEvent | TaskAdvancedEvent | TaskCompletedEvent | TaskFailedEvent | TaskRemovedEvent;
220
+ declare const decodeProgressTaskEvent: (input: unknown, options?: effect_SchemaAST0.ParseOptions) => TaskAddedEvent | TaskUpdatedEvent | TaskAdvancedEvent | TaskCompletedEvent | TaskFailedEvent | TaskRemovedEvent;
224
221
  //#endregion
225
222
  //#region src/services/progress.d.ts
226
- declare const Progress_base: Context.TagClass<Progress, "stromseng.dev/effective-progress/Progress", ProgressService>;
223
+ declare const Progress_base: Context.ServiceClass<Progress, "stromseng.dev/effective-progress/Progress", ProgressShape>;
227
224
  declare class Progress extends Progress_base {
228
- static readonly Default: Layer.Layer<Progress, never, never>;
225
+ static readonly layer: Layer.Layer<Progress, never, never>;
229
226
  }
230
227
  //#endregion
231
228
  //#region src/api.d.ts
@@ -239,15 +236,13 @@ interface PublicTaskApi {
239
236
  }
240
237
  interface EffectExecutionOptions {
241
238
  readonly concurrency?: Concurrency;
242
- readonly batching?: boolean | "inherit";
243
- readonly concurrentFinalizers?: boolean;
244
239
  }
245
240
  interface EffectAllExecutionOptions extends EffectExecutionOptions {
246
241
  readonly discard?: boolean;
247
- readonly mode?: "default" | "validate" | "either";
242
+ readonly mode?: "default" | "result";
248
243
  }
249
244
  type AllOptions = Omit<TrackOptions, "total" | "countDisplay"> & EffectAllExecutionOptions;
250
- type AllReturn<Arg extends ReadonlyArray<Effect.Effect<any, any, any>> | Record<string, Effect.Effect<any, any, any>>, O extends EffectAllExecutionOptions> = [[Arg] extends [ReadonlyArray<Effect.Effect<any, any, any>>] ? Effect.All.ReturnTuple<Arg, Effect.All.IsDiscard<O>, Effect.All.ExtractMode<O>> : [Arg] extends [Record<string, Effect.Effect<any, any, any>>] ? Effect.All.ReturnObject<Arg, Effect.All.IsDiscard<O>, Effect.All.ExtractMode<O>> : never] extends [Effect.Effect<infer A, infer E, infer R>] ? Effect.Effect<A, E, Exclude<R, Progress | Task>> : never;
245
+ type AllReturn<Arg extends ReadonlyArray<Effect.Effect<any, any, any>> | Record<string, Effect.Effect<any, any, any>>, O extends EffectAllExecutionOptions> = [[Arg] extends [ReadonlyArray<Effect.Effect<any, any, any>>] ? Effect.All.ReturnTuple<Arg, Effect.All.IsDiscard<O>, Effect.All.IsResult<O>> : [Arg] extends [Record<string, Effect.Effect<any, any, any>>] ? Effect.All.ReturnObject<Arg, Effect.All.IsDiscard<O>, Effect.All.IsResult<O>> : never] extends [Effect.Effect<infer A, infer E, infer R>] ? Effect.Effect<A, E, Exclude<R, Progress | Task>> : never;
251
246
  interface ForEachExecutionOptions extends EffectExecutionOptions {
252
247
  readonly discard?: false | undefined;
253
248
  }
@@ -279,7 +274,7 @@ declare const forEach: {
279
274
  <A, B, E, R>(f: (item: A, index: number) => Effect.Effect<B, E, R>, options: ForEachOptions): (iterable: Iterable<A>) => Effect.Effect<ReadonlyArray<B>, E, Exclude<R, Progress | Task>>;
280
275
  };
281
276
  //#endregion
282
- //#region src/renderer/columns/amount-column.d.ts
277
+ //#region src/services/renderer/columns/amount-column.d.ts
283
278
  interface AmountLayout {
284
279
  readonly hasDetailedRows: boolean;
285
280
  readonly countWidth: number;
@@ -288,17 +283,18 @@ interface AmountLayout {
288
283
  readonly preferredWidth: number;
289
284
  }
290
285
  //#endregion
291
- //#region src/renderer/columns/bar-column.d.ts
286
+ //#region src/services/renderer/columns/bar-column.d.ts
292
287
  interface BarPrepared {
293
288
  readonly hasDeterminateRows: boolean;
294
289
  }
295
290
  //#endregion
296
- //#region src/renderer/columns/description-column.d.ts
291
+ //#region src/services/renderer/columns/description-column.d.ts
297
292
  interface DescriptionPrepared {
298
293
  readonly minTreeWidth: number;
294
+ readonly preferredWidth: number;
299
295
  }
300
296
  declare namespace columns_d_exports {
301
- export { AmountLayout, BarPrepared, DescriptionPrepared, SpacerOptions, amount, bar, defaults, description, elapsed, eta, resolveColumnSizeValue, spacer };
297
+ export { AmountLayout, BarOptions, BarPrepared, DescriptionPrepared, SpacerOptions, amount, bar, defaults, description, elapsed, elapsedEta, eta, resolveColumnSizeValue, spacer };
302
298
  }
303
299
  interface SpacerOptions {
304
300
  readonly flexGrow?: number;
@@ -306,6 +302,9 @@ interface SpacerOptions {
306
302
  readonly flexBasis?: number;
307
303
  readonly minWidth?: number;
308
304
  }
305
+ interface BarOptions {
306
+ readonly size?: number | "fullwidth";
307
+ }
309
308
  declare const spacer: <M = unknown>({
310
309
  flexGrow,
311
310
  flexShrink,
@@ -313,21 +312,24 @@ declare const spacer: <M = unknown>({
313
312
  minWidth
314
313
  }?: SpacerOptions) => ColumnDef<M>;
315
314
  declare const description: () => ColumnDef<any, DescriptionPrepared>;
316
- declare const bar: () => ColumnDef<any, BarPrepared>;
315
+ declare const bar: ({
316
+ size
317
+ }?: BarOptions) => ColumnDef<any, BarPrepared>;
317
318
  declare const amount: () => ColumnDef<any, AmountLayout>;
318
319
  declare const elapsed: () => ColumnDef<any>;
320
+ declare const elapsedEta: () => ColumnDef<any>;
319
321
  declare const eta: () => ColumnDef<any>;
320
322
  declare const defaults: () => ReadonlyArray<ColumnDef<any, any>>;
321
323
  declare const resolveColumnSizeValue: <P>(value: ColumnSizeValue<P> | undefined, prepared: P) => number | undefined;
322
324
  //#endregion
323
325
  //#region src/services/stdio.d.ts
324
- interface ProgressStdioService {
326
+ interface ProgressStdioShape {
325
327
  readonly stdout: NodeJS.WriteStream;
326
328
  readonly stderr: NodeJS.WriteStream;
327
329
  }
328
- declare const ProgressStdio_base: Context.TagClass<ProgressStdio, "stromseng.dev/effective-progress/ProgressStdio", ProgressStdioService>;
330
+ declare const ProgressStdio_base: Context.ServiceClass<ProgressStdio, "stromseng.dev/effective-progress/ProgressStdio", ProgressStdioShape>;
329
331
  declare class ProgressStdio extends ProgressStdio_base {
330
- static readonly Default: Layer.Layer<ProgressStdio, never, never>;
332
+ static readonly layer: Layer.Layer<ProgressStdio, never, never>;
331
333
  }
332
334
  //#endregion
333
- export { AddTaskOptions, AllOptions, AllReturn, CellInfo, ColumnAlign, ColumnDef, ColumnRenderContext, ColumnSizeValue, columns_d_exports as Columns, EffectAllExecutionOptions, EffectExecutionOptions, ForEachExecutionOptions, ForEachOptions, Progress, ProgressService, ProgressStdio, ProgressStdioService, ProgressTaskEvent, ProgressTaskEventSchema, RenderRow, Task, TaskAddedEvent, TaskAdvancedEvent, TaskCompletedEvent, TaskCountDisplay, TaskCountDisplaySchema, TaskFailedEvent, TaskHandle, TaskId, TaskOptions, TaskRemovedEvent, TaskRowDerived, TaskSnapshot, TaskSnapshotSchema, TaskStatus, TaskStatusSchema, TaskStore, TaskTreeInfo, TaskUnits, TaskUnitsSchema, TaskUpdatedEvent, TrackOptions, UpdateTaskOptions, all, decodeProgressTaskEvent, forEach, task$1 as task };
335
+ export { AddTaskOptions, AllOptions, AllReturn, CellInfo, ColumnAlign, ColumnDef, ColumnRenderContext, ColumnSizeValue, columns_d_exports as Columns, EffectAllExecutionOptions, EffectExecutionOptions, ForEachExecutionOptions, ForEachOptions, Progress, ProgressShape, ProgressStdio, ProgressStdioShape, ProgressTaskEvent, ProgressTaskEventSchema, RenderRow, Task, TaskAddedEvent, TaskAdvancedEvent, TaskCompletedEvent, TaskCountDisplay, TaskCountDisplaySchema, TaskFailedEvent, TaskHandle, TaskId, TaskOptions, TaskProgressSample, TaskProgressSampleSchema, TaskRemovedEvent, TaskRowDerived, TaskSnapshot, TaskSnapshotSchema, TaskStatus, TaskStatusSchema, TaskStore, TaskTreeInfo, TaskUnits, TaskUnitsSchema, TaskUpdatedEvent, TrackOptions, UpdateTaskOptions, all, decodeProgressTaskEvent, forEach, task$1 as task };