@effected/github-actions 0.19.0 → 0.20.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/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { AnnotationProperties, AnnotationProperties as AnnotationProperties$1, WorkflowCommand } from "@effected/github-commands";
1
2
  import { NodeServices } from "@effect/platform-node";
2
3
  import { Cause, Config, ConfigProvider, Context, Duration, Effect, FileSystem, Layer, Logger, Option, Path, Redacted, Result, Schema } from "effect";
3
4
  import { HttpClient } from "effect/http";
@@ -7,6 +8,7 @@ import { BotIdentity, GitHubApp, GitHubClient, InstallationToken, PermissionLeve
7
8
  import { IntegrityHashBrand, PackageManagerPin } from "@effected/npm";
8
9
  //#region src/ActionEnvironment.d.ts
9
10
  declare const ActionEnvironmentError_base: Schema.Class<ActionEnvironmentError, Schema.TaggedStruct<"ActionEnvironmentError", {
11
+ /** `missing` — absent or empty; `malformed` — present but unusable. */
10
12
  readonly reason: Schema.Literals<readonly ["missing", "malformed"]>;
11
13
  /** The environment variable involved. */
12
14
  readonly name: Schema.String;
@@ -31,6 +33,7 @@ export declare class ActionEnvironmentError extends ActionEnvironmentError_base
31
33
  declare const GitHubContext_base: Schema.Class<GitHubContext, Schema.Struct<{
32
34
  /** `owner/repo`. */
33
35
  readonly repository: Schema.String;
36
+ /** The repository owner's login. */
34
37
  readonly repositoryOwner: Schema.String;
35
38
  /** The full ref, e.g. `refs/heads/main`. */
36
39
  readonly ref: Schema.String;
@@ -52,16 +55,27 @@ declare const GitHubContext_base: Schema.Class<GitHubContext, Schema.Struct<{
52
55
  * an encoded context stays plain JSON.
53
56
  */
54
57
  readonly headRef: Schema.OptionFromNullOr<Schema.String>;
58
+ /** The commit SHA that triggered the workflow. */
55
59
  readonly sha: Schema.String;
60
+ /** The workflow's name. */
56
61
  readonly workflow: Schema.String;
62
+ /** The current job's id. */
57
63
  readonly job: Schema.String;
64
+ /** The run's unique number, decoded from `GITHUB_RUN_ID`. */
58
65
  readonly runId: Schema.Number;
66
+ /** The attempt number of this run, starting at 1. */
59
67
  readonly runAttempt: Schema.Number;
68
+ /** The name of the event that triggered the workflow, e.g. `push`. */
60
69
  readonly eventName: Schema.String;
70
+ /** The login of the user that triggered the run. */
61
71
  readonly actor: Schema.String;
72
+ /** The GitHub server URL, e.g. `https://github.com`. */
62
73
  readonly serverUrl: Schema.String;
74
+ /** The REST API URL, e.g. `https://api.github.com`. */
63
75
  readonly apiUrl: Schema.String;
76
+ /** The GraphQL API URL. */
64
77
  readonly graphqlUrl: Schema.String;
78
+ /** The default working directory on the runner for steps. */
65
79
  readonly workspace: Schema.String;
66
80
  }>, {}>;
67
81
  /**
@@ -84,8 +98,11 @@ export declare class GitHubContext extends GitHubContext_base {
84
98
  get branch(): string;
85
99
  }
86
100
  declare const RunnerContext_base: Schema.Class<RunnerContext, Schema.Struct<{
101
+ /** The runner's operating system: `Linux`, `Windows` or `macOS`. */
87
102
  readonly os: Schema.String;
103
+ /** The runner's architecture, e.g. `X64` or `ARM64`. */
88
104
  readonly arch: Schema.String;
105
+ /** The runner's name. */
89
106
  readonly name: Schema.String;
90
107
  /** A scratch directory emptied between jobs. */
91
108
  readonly temp: Schema.String;
@@ -99,7 +116,8 @@ declare const RunnerContext_base: Schema.Class<RunnerContext, Schema.Struct<{
99
116
  */
100
117
  export declare class RunnerContext extends RunnerContext_base {}
101
118
  /**
102
- * The {@link ActionEnvironment} service shape.
119
+ * The members of the {@link ActionEnvironment} service: variable lookup, the
120
+ * `GITHUB_*` and `RUNNER_*` contexts, the event payload and scoped overrides.
103
121
  *
104
122
  * @public
105
123
  */
@@ -179,10 +197,10 @@ export declare class ActionEnvironment extends ActionEnvironment_base {
179
197
  * @remarks
180
198
  * **A recorded exception to the die-on-unstubbed rule.** Every other service
181
199
  * in this package dies when a suite calls something it did not stub, because
182
- * a plausible default hides a real gap. Here the opposite is true: the twelve
183
- * context variables have one obviously-correct shape, and requiring each
184
- * suite to restate them produced a byte-identical block duplicated six times
185
- * across the consumers. Overrides merge on top.
200
+ * a plausible default hides a real gap. Here the opposite is true: the context
201
+ * variables have one obviously-correct shape, and requiring each suite to
202
+ * restate them would duplicate a byte-identical block in every suite.
203
+ * Overrides merge on top.
186
204
  *
187
205
  * The optional second argument serves {@link ActionEnvironmentShape.payload}
188
206
  * **directly**, replacing the `GITHUB_EVENT_PATH` read rather than seeding a
@@ -242,84 +260,6 @@ export declare class ActionEnvironment extends ActionEnvironment_base {
242
260
  static readonly layerTest: (overrides?: Readonly<Record<string, string>>, payload?: unknown) => Layer.Layer<ActionEnvironment>;
243
261
  }
244
262
  //#endregion
245
- //#region src/WorkflowCommand.d.ts
246
- /**
247
- * Where an annotation points in the repository.
248
- *
249
- * @remarks
250
- * The field names here are the readable ones; GitHub's wire protocol uses
251
- * abbreviations (`line`, `col`) that this module maps on the way out, so a
252
- * caller never has to remember which of the six is abbreviated.
253
- *
254
- * @public
255
- */
256
- interface AnnotationProperties {
257
- /** A short title shown above the annotation. */
258
- readonly title?: string;
259
- /** Repository-relative path of the annotated file. */
260
- readonly file?: string;
261
- /** First annotated line, 1-based. */
262
- readonly startLine?: number;
263
- /** Last annotated line, 1-based. */
264
- readonly endLine?: number;
265
- /** First annotated column, 1-based. */
266
- readonly startColumn?: number;
267
- /** Last annotated column, 1-based. */
268
- readonly endColumn?: number;
269
- }
270
- /**
271
- * The GitHub Actions workflow-command wire protocol: `::name key=value::message`.
272
- *
273
- * @remarks
274
- * **Pure.** This module renders strings and nothing else — it performs no IO
275
- * and holds no service — which is what makes the escaping rules testable
276
- * without a runner, and what lets a non-Actions consumer reuse the protocol.
277
- * Writing a rendered command to stdout is {@link ActionOutputs}'s job.
278
- *
279
- * The escaping is the whole point of the module. A message carrying a raw
280
- * newline does not merely render oddly: the runner reads the text after it as
281
- * a **new command**, so an unescaped log line is a command-injection vector.
282
- *
283
- * @example
284
- * ```ts
285
- * import { WorkflowCommand } from "@effected/github-actions";
286
- *
287
- * WorkflowCommand.error("build failed", { file: "src/main.ts", startLine: 12 });
288
- * // "::error file=src/main.ts,line=12::build failed"
289
- * ```
290
- *
291
- * @public
292
- */
293
- export declare class WorkflowCommand {
294
- private constructor();
295
- /**
296
- * Render an arbitrary command. The primitive every other member uses.
297
- *
298
- * @remarks
299
- * The property type is written out structurally rather than as the module's
300
- * `CommandProperties` alias: an internal named type on a `@public` signature
301
- * fails the API Extractor gate, and neither an `@internal` tag nor a second
302
- * alias helps — only inlining does.
303
- */
304
- static render(name: string, properties: Readonly<Record<string, string | number | boolean | undefined>>, message: string): string;
305
- /** `::debug::` — shown only when `ACTIONS_STEP_DEBUG` is enabled. */
306
- static debug(message: string): string;
307
- /** `::notice::` with optional source annotation. */
308
- static notice(message: string, properties?: AnnotationProperties): string;
309
- /** `::warning::` with optional source annotation. */
310
- static warning(message: string, properties?: AnnotationProperties): string;
311
- /** `::error::` with optional source annotation. */
312
- static error(message: string, properties?: AnnotationProperties): string;
313
- /** `::group::` — opens a collapsible section in the runner log. */
314
- static group(name: string): string;
315
- /** `::endgroup::` — closes the innermost open group. */
316
- static endGroup(): string;
317
- /** `::add-mask::` — registers a value for redaction in the runner log. */
318
- static addMask(value: string): string;
319
- /** Map readable annotation fields onto GitHub's abbreviated wire names. */
320
- private static annotation;
321
- }
322
- //#endregion
323
263
  //#region src/ActionLogger.d.ts
324
264
  /**
325
265
  * Options for {@link ActionLoggerShape.withBuffer}.
@@ -355,7 +295,8 @@ interface WithStepOptions {
355
295
  readonly summary?: string;
356
296
  }
357
297
  /**
358
- * The {@link ActionLogger} service shape.
298
+ * The members of the {@link ActionLogger} service: log groups, buffered steps,
299
+ * notices and source annotations.
359
300
  *
360
301
  * @public
361
302
  */
@@ -408,10 +349,9 @@ interface ActionLoggerShape {
408
349
  * test.
409
350
  *
410
351
  * The header and the summary are the whole difference from `withBuffer`, and
411
- * they are why this is a member rather than a documented recipe: the recipe
412
- * was independently derived wrong three times by careful readers during one
413
- * port, because `group` + `withBuffer` looks like complete parity until you
414
- * notice nothing emits the success line.
352
+ * they are why this is a member rather than a documented recipe: `group` +
353
+ * `withBuffer` looks like complete parity until you notice nothing emits the
354
+ * success line.
415
355
  *
416
356
  * The summary survives step debugging. Buffering is skipped when the runner
417
357
  * asks for verbose output, but the line naming what succeeded is still the
@@ -425,16 +365,16 @@ interface ActionLoggerShape {
425
365
  * A dedicated member rather than a log level, because Effect has no level
426
366
  * between `Info` and `Warn` to map onto notices.
427
367
  */
428
- readonly notice: (message: string, properties?: AnnotationProperties) => Effect.Effect<void>;
368
+ readonly notice: (message: string, properties?: AnnotationProperties$1) => Effect.Effect<void>;
429
369
  /**
430
370
  * Attach source annotations to every `Effect.log*` inside an effect.
431
371
  *
432
372
  * @remarks
433
373
  * The point is that a caller never spells an annotation key: the fields go in
434
- * as {@link AnnotationProperties} and come out as `file=`/`line=` on the
374
+ * as `AnnotationProperties` (from `@effected/github-commands`) and come out as `file=`/`line=` on the
435
375
  * rendered command.
436
376
  */
437
- readonly annotated: <A, E, R>(properties: AnnotationProperties, effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>;
377
+ readonly annotated: <A, E, R>(properties: AnnotationProperties$1, effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>;
438
378
  }
439
379
  declare const ActionLogger_base: Context.ServiceClass<ActionLogger, "@effected/github-actions/ActionLogger", ActionLoggerShape>;
440
380
  /**
@@ -461,6 +401,14 @@ declare const ActionLogger_base: Context.ServiceClass<ActionLogger, "@effected/g
461
401
  * @public
462
402
  */
463
403
  export declare class ActionLogger extends ActionLogger_base {
404
+ /**
405
+ * The service: groups, the buffered step renderer, notices and annotations.
406
+ *
407
+ * @remarks
408
+ * This installs no `Logger`. Without {@link ActionLogger.layerLogger} (or `Action.run`, which installs it) Effect's
409
+ * default logger writes `Effect.log*` text raw, so a message carrying `::add-mask::` or `##[` is a workflow command
410
+ * to the runner. Install both: the service for its structure, the logger for its neutralizing of every log line.
411
+ */
464
412
  static readonly layer: Layer.Layer<ActionLogger, never, ActionEnvironment>;
465
413
  /**
466
414
  * The `Logger` that maps Effect log levels onto workflow commands.
@@ -474,7 +422,13 @@ export declare class ActionLogger extends ActionLogger_base {
474
422
  * observable in a test without a runner.
475
423
  */
476
424
  static readonly logger: Logger.Logger<unknown, void>;
477
- /** {@link ActionLogger.logger} installed as the only logger. */
425
+ /**
426
+ * {@link ActionLogger.logger} installed as the only logger.
427
+ *
428
+ * @remarks
429
+ * Bound to a constant so every composition site shares one layer;
430
+ * `ActionRuntime.layer` already includes it.
431
+ */
478
432
  static readonly layerLogger: Layer.Layer<never>;
479
433
  /**
480
434
  * A silent double.
@@ -493,10 +447,9 @@ export declare class ActionLogger extends ActionLogger_base {
493
447
  * A silent service **and** a silent `Effect.log*`.
494
448
  *
495
449
  * @remarks
496
- * This one layer replaces the bare `Effect.provide(Logger.layer([]))` that
497
- * appeared thirteen times in one consuming action and twenty-three in
498
- * another, purely to keep test output quiet. Bound to a constant rather than
499
- * exposed as a factory, so composing it twice is free.
450
+ * This one layer stands in for a bare `Effect.provide(Logger.layer([]))`
451
+ * repeated in every suite just to keep test output quiet. Bound to a
452
+ * constant rather than exposed as a factory, so composing it twice is free.
500
453
  */
501
454
  static readonly layerSilent: Layer.Layer<ActionLogger>;
502
455
  }
@@ -630,7 +583,9 @@ interface RecordingOutputs {
630
583
  readonly entries: () => ReadonlyArray<RecordedOutput>;
631
584
  }
632
585
  /**
633
- * The {@link ActionOutputs} service shape.
586
+ * The members of the {@link ActionOutputs} service: step outputs, exported
587
+ * variables, `PATH` additions, the job summary, masking and failure
588
+ * annotations.
634
589
  *
635
590
  * @public
636
591
  */
@@ -674,9 +629,30 @@ declare const ActionOutputs_base: Context.ServiceClass<ActionOutputs, "@effected
674
629
  * — that is `Action.run`'s job, so that an action which reports a failure and
675
630
  * then recovers is not silently doomed by a side effect it cannot undo.
676
631
  *
632
+ * Members that write a runner file fail with {@link ActionOutputError}.
633
+ *
634
+ * @example
635
+ * ```ts
636
+ * import { ActionOutputs } from "@effected/github-actions";
637
+ * import { Effect, Schema } from "effect";
638
+ *
639
+ * const program = Effect.gen(function* () {
640
+ * const outputs = yield* ActionOutputs;
641
+ * yield* outputs.set("version", "1.2.3");
642
+ * yield* outputs.setJson("packages", ["a", "b"], Schema.Array(Schema.String));
643
+ * });
644
+ * ```
645
+ *
677
646
  * @public
678
647
  */
679
648
  export declare class ActionOutputs extends ActionOutputs_base {
649
+ /**
650
+ * The live service, appending to the runner's `GITHUB_OUTPUT`, `GITHUB_ENV`,
651
+ * `GITHUB_PATH` and `GITHUB_STEP_SUMMARY` files.
652
+ *
653
+ * @remarks
654
+ * `ActionRuntime.layer` already provides every requirement.
655
+ */
680
656
  static readonly layer: Layer.Layer<ActionOutputs, never, ActionEnvironment | FileSystem.FileSystem>;
681
657
  /**
682
658
  * The outputs surface that is correct inside a **detached worker**.
@@ -686,10 +662,8 @@ export declare class ActionOutputs extends ActionOutputs_base {
686
662
  * stdout is a **log file no runner parses**, so under the real layer
687
663
  * `setSecret` emits `::add-mask::<plaintext>` into that file — a command
688
664
  * that is simultaneously **inert** (nothing reads it, so nothing is masked)
689
- * and a **secret leak** (the plaintext is now sitting verbatim in a log). A
690
- * production action shipped exactly that for one round: an S3 secret and
691
- * session token written into a worker's log by the masking call itself.
692
- * This layer is the worker-side fix; the parent-side rule is that every
665
+ * and a **secret leak** (the plaintext is now sitting verbatim in a log).
666
+ * This layer is the worker-side guard; the parent-side rule is that every
693
667
  * secret a worker will hold is masked **before** the spawn, by
694
668
  * `Secret.forChildEnv` under the real layer.
695
669
  *
@@ -702,7 +676,7 @@ export declare class ActionOutputs extends ActionOutputs_base {
702
676
  * spelling of it in the log IS the leak. Masking is the parent's job,
703
677
  * before the worker exists.
704
678
  * - **`set`, `setJson`, `exportVariable`, `addPath`, `summary` — fail
705
- * typed** (`reason: "detached"`, naming the file). Each writes a runner
679
+ * typed** with {@link DetachedOutputError}, naming the file. Each writes a runner
706
680
  * file that configures the parent job's *later steps* — `GITHUB_OUTPUT`,
707
681
  * `GITHUB_ENV`, `GITHUB_PATH` — or is collected when the step completes
708
682
  * (`GITHUB_STEP_SUMMARY`). A detached worker has no later steps, may
@@ -742,7 +716,7 @@ export declare class ActionOutputs extends ActionOutputs_base {
742
716
  * @remarks
743
717
  * This is the double most tests of an action want — "what did it publish?"
744
718
  * — shipped so that nobody hand-writes a `setJson` override that drops the
745
- * schema encode (the trap `makeTest` now closes too). `setJson` encodes
719
+ * schema encode (a trap `makeTest` closes too). `setJson` encodes
746
720
  * through its schema exactly as the real layer does, failing typed with
747
721
  * {@link OutputEncodeError} and recording nothing on a drift, and records
748
722
  * the **encoded JSON text** — what the runner would have read — not the
@@ -774,11 +748,14 @@ declare const ActionStateError_base: Schema.Class<ActionStateError, Schema.Tagge
774
748
  * appended to.
775
749
  */
776
750
  readonly reason: Schema.Literals<readonly ["missing", "malformed", "notPlainJson", "writeFailed"]>;
751
+ /** The state key that was being saved or read. */
777
752
  readonly key: Schema.String;
753
+ /** The underlying failure, preserved structurally. */
778
754
  readonly cause: Schema.optionalKey<Schema.Defect>;
779
755
  }>, import("effect/Cause").YieldableError>;
780
756
  /**
781
- * Raised when state cannot cross the phase boundary.
757
+ * Raised when action state cannot be saved, read or decoded across the phase
758
+ * boundary.
782
759
  *
783
760
  * @public
784
761
  */
@@ -786,7 +763,8 @@ export declare class ActionStateError extends ActionStateError_base {
786
763
  get message(): string;
787
764
  }
788
765
  /**
789
- * The {@link ActionState} service shape.
766
+ * The members of the {@link ActionState} service: save and read values, and
767
+ * persist secrets, across the `pre` → `main` → `post` boundary.
790
768
  *
791
769
  * @public
792
770
  */
@@ -833,11 +811,37 @@ declare const ActionState_base: Context.ServiceClass<ActionState, "@effected/git
833
811
  * write-only file (`GITHUB_STATE`) whose entries the runner republishes to the
834
812
  * next phase as `STATE_<key>` environment variables — so saving and reading go
835
813
  * through different mechanisms, which is why this is a service rather than a
836
- * pair of helpers.
814
+ * pair of helpers. Every member fails with {@link ActionStateError}.
815
+ *
816
+ * @example
817
+ * ```ts
818
+ * import { ActionState } from "@effected/github-actions";
819
+ * import { Effect, Schema } from "effect";
820
+ *
821
+ * // in `pre`
822
+ * const pre = Effect.gen(function* () {
823
+ * const state = yield* ActionState;
824
+ * yield* state.save("server-pid", 4242, Schema.Number);
825
+ * });
826
+ *
827
+ * // in `post`
828
+ * const post = Effect.gen(function* () {
829
+ * const state = yield* ActionState;
830
+ * const pid = yield* state.get("server-pid", Schema.Number);
831
+ * return pid;
832
+ * });
833
+ * ```
837
834
  *
838
835
  * @public
839
836
  */
840
837
  export declare class ActionState extends ActionState_base {
838
+ /**
839
+ * The live service, writing to the runner's `GITHUB_STATE` file and reading
840
+ * the `STATE_<key>` variables it republishes.
841
+ *
842
+ * @remarks
843
+ * `ActionRuntime.layer` already provides every requirement.
844
+ */
841
845
  static readonly layer: Layer.Layer<ActionState, never, ActionEnvironment | FileSystem.FileSystem | ActionOutputs>;
842
846
  /** A test double. Unstubbed members die rather than answering wrongly. */
843
847
  static readonly makeTest: (overrides?: Partial<ActionStateShape>) => ActionStateShape;
@@ -924,7 +928,7 @@ interface ActionRunOptions<R> {
924
928
  * A readable one-line summary of why an action failed.
925
929
  *
926
930
  * @remarks
927
- * `[Tag] message` because a workflow log is read by a human scanning for the
931
+ * `[Tag]: message` because a workflow log is read by a human scanning for the
928
932
  * first red line, and every error in this kit carries both. The `_tag` is what
929
933
  * makes two failures with the same wording distinguishable, and the `message`
930
934
  * getter is what makes the line worth reading.
@@ -955,11 +959,11 @@ export declare const describeCause: (cause: Cause.Cause<unknown>) => string;
955
959
  *
956
960
  * Two things it deliberately does **not** do:
957
961
  *
958
- * - **It does not wrap the program in a log buffer.** The package this replaces
959
- * did, and an unhandled defect inside the buffer swallowed the entire
960
- * transcript — the run failed and printed nothing. `ActionLogger.withBuffer`
961
- * is opt-in and flushes on every exit path including a defect, so the
962
- * buffering is where the caller can see it.
962
+ * - **It does not wrap the program in a log buffer.** A buffer that swallowed
963
+ * the transcript on an unhandled defect would leave a run that failed and
964
+ * printed nothing. `ActionLogger.withBuffer` is opt-in and flushes on every
965
+ * exit path including a defect, so the buffering is where the caller can
966
+ * see it.
963
967
  * - **It does not throw.** The returned promise always resolves; the failure is
964
968
  * in `process.exitCode`, which is what the runner reads. An action entry
965
969
  * point that rejected would produce an unhandled rejection *and* a failed
@@ -968,9 +972,9 @@ export declare const describeCause: (cause: Cause.Cause<unknown>) => string;
968
972
  * The rendering depth is deliberate too: one `::error::` line carrying
969
973
  * `[Tag]: message`, and the fiddly diagnostics — the full `Cause.pretty` render
970
974
  * with its span trace and stack — behind `::debug::`, which the runner shows
971
- * only when someone turns step debugging on. The package this replaces spliced
972
- * a JS stack into the visible error, which in a bundled action points at one
973
- * line of `dist/main.js`.
975
+ * only when someone turns step debugging on. No JS stack is spliced into the
976
+ * visible error, because in a bundled action it points at one line of
977
+ * `dist/main.js`.
974
978
  *
975
979
  * @example
976
980
  * ```ts
@@ -989,8 +993,9 @@ export declare class Action {
989
993
  * Run an action program to completion.
990
994
  *
991
995
  * @remarks
992
- * Resolves whether the program succeeded or not; read `process.exitCode` for
993
- * the verdict.
996
+ * Never rejects: the promise resolves whether the program succeeded or not,
997
+ * so read `process.exitCode` for the verdict. Requirements beyond
998
+ * {@link ActionServices} come from `options.layer`.
994
999
  */
995
1000
  static readonly run: <E, R = never>(program: Effect.Effect<void, E, ActionServices | R>, options?: ActionRunOptions<R>) => Promise<void>;
996
1001
  }
@@ -1191,13 +1196,12 @@ export declare class CacheKey extends CacheKey_base {
1191
1196
  * A copy of this key that restores from its **exact key only** — no ladder.
1192
1197
  *
1193
1198
  * @remarks
1194
- * The third point in the policy space, and the one the typed key had no
1195
- * spelling for: absence of a policy means the default every-prefix ladder,
1196
- * so exact-match-only restores (a cache-bust mode, where a stale partial
1197
- * hit is worse than a cold start) previously forced the caller back to the
1198
- * string form. This is the same `restoreDepths` field carrying **zero
1199
- * rungs** — an honest value, not a sentinel: `ActionCache.restore` sends no
1200
- * `restore_keys` at all, so the backend answers this key or a miss.
1199
+ * The third point in the policy space: absence of a policy means the default
1200
+ * every-prefix ladder, so exact-match-only restores (a cache-bust mode, where
1201
+ * a stale partial hit is worse than a cold start) need their own spelling.
1202
+ * This is the same `restoreDepths` field carrying **zero rungs** — an honest
1203
+ * value, not a sentinel: `ActionCache.restore` sends no `restore_keys` at
1204
+ * all, so the backend answers this key or a miss.
1201
1205
  *
1202
1206
  * @example
1203
1207
  * ```ts
@@ -1437,7 +1441,8 @@ export declare class ActionCacheError extends ActionCacheError_base {
1437
1441
  get message(): string;
1438
1442
  }
1439
1443
  /**
1440
- * The {@link ActionCache} service shape.
1444
+ * The members of the {@link ActionCache} service: `save` a set of paths under a
1445
+ * key and `restore` them in a later job.
1441
1446
  *
1442
1447
  * @public
1443
1448
  */
@@ -1566,19 +1571,12 @@ interface PairsOptions {
1566
1571
  * @remarks
1567
1572
  * Inputs are **never** read from `process.env` directly. Every accessor names
1568
1573
  * the input the way the workflow author wrote it and lets this module derive
1569
- * the runner's variable name — see `inputVariable` for why that matters. (A
1570
- * `{@link}` cannot reach it: it is internal, so it is not exported from the
1571
- * entrypoint and the reference would not resolve.)
1572
- *
1573
- * `lines`, `list` and `pairs` exist because the `@actions/core`-faithful
1574
- * newline split was not enough for real consumers: two of them reinvented
1575
- * richer parsing independently, one parsing JSON arrays and bullet lists, the
1576
- * other stripping comments and reading `key=value` pairs. Those are now one
1577
- * implementation with one set of tests instead of two divergent ones with
1578
- * none.
1574
+ * the runner's variable name — see `ActionInput.variable` for why that
1575
+ * matters.
1579
1576
  *
1580
- * These are grouped statics over one concept reaching nothing but `Config` —
1581
- * not a namespace object over engines.
1577
+ * `lines` is the `@actions/core`-faithful newline split; `list` and `pairs`
1578
+ * read the richer shapes workflow authors write — JSON arrays, bullet lists,
1579
+ * comments and `key=value` pairs.
1582
1580
  *
1583
1581
  * **The absence contract, shared by every accessor:** the runner writes `""`
1584
1582
  * for an input the workflow left out, and the provider reads an empty string
@@ -1633,10 +1631,9 @@ export declare class ActionInput {
1633
1631
  * **An input whose documented meaning is "set it empty to disable this"
1634
1632
  * cannot be read with `Config.withDefault`.** Empty is classified as missing
1635
1633
  * *before* the default is consulted, so the default substitutes and the
1636
- * documented behavior can never happen. A live action shipped exactly that
1637
- * for its whole lifetime: `action.yml` promised `release-prefix: ""` would
1638
- * disable retry, and it never could. `Config.option` is the shape that
1639
- * distinguishes the states:
1634
+ * documented behavior can never happen: if `action.yml` promises
1635
+ * `release-prefix: ""` disables retry, a `withDefault` read makes that
1636
+ * impossible. `Config.option` is the shape that distinguishes the states:
1640
1637
  *
1641
1638
  * ```ts
1642
1639
  * Config.option(ActionInput.string("release-prefix"))
@@ -1652,8 +1649,7 @@ export declare class ActionInput {
1652
1649
  * no-default case, and it is the manifest default — when there is one — that
1653
1650
  * makes the unsupplied and explicitly-empty cases distinguishable at all.
1654
1651
  *
1655
- * Two consequences follow from how the runner actually behaves, both
1656
- * confirmed against `actions/runner` and on a live runner:
1652
+ * Two consequences follow from how the runner actually behaves:
1657
1653
  *
1658
1654
  * - **The runner publishes a variable for every declared input**, so *absent*
1659
1655
  * is a state a runner never produces. The `Some` branch above depends on
@@ -1675,8 +1671,8 @@ export declare class ActionInput {
1675
1671
  * Absent or `""` is **missing data** — wrap with `Config.withDefault` for
1676
1672
  * an optional flag. A **present but malformed** value (`yes`, `on`, `1`) is
1677
1673
  * a different class: it fails carrying its `actual`, deliberately, so a
1678
- * default does NOT swallow it — the shipped defect this guards against was
1679
- * a malformed `dry-run` quietly reading as `false`.
1674
+ * default does NOT swallow it, so a malformed `dry-run` never quietly reads
1675
+ * as `false`.
1680
1676
  */
1681
1677
  static boolean(name: string): Config.Config<boolean>;
1682
1678
  /**
@@ -1743,10 +1739,8 @@ export declare class ActionInput {
1743
1739
  * @remarks
1744
1740
  * A JSON array (`["a","b"]`), a bullet list (`- a` or `* a`), or comma- and
1745
1741
  * newline-separated values, with full-line `#` comments dropped — any
1746
- * combination of these in the same input. Each shape was reinvented
1747
- * independently by a consumer (one a bullet-list-and-JSON parser, the other
1748
- * comment-stripping); accepting the union means a workflow author's first
1749
- * guess works and nothing either prior consumer relied on regresses.
1742
+ * combination of these in the same input — so a workflow author's first
1743
+ * guess works.
1750
1744
  *
1751
1745
  * Parsing order, applied per newline/comma-separated item after trimming:
1752
1746
  *
@@ -1779,9 +1773,9 @@ export declare class ActionInput {
1779
1773
  * Only the **first** `=` splits, so a value may contain one.
1780
1774
  *
1781
1775
  * An **empty key** (`=value`, or a bare `=`) is always rejected: `{ "": v }`
1782
- * cannot be what a workflow meant, and the damage lands far from the typo —
1783
- * an empty key became a repository filter that matched nothing, and the run
1784
- * reported zero results with no indication why. An empty **value** (`key=`)
1776
+ * cannot be what a workflow meant, and the damage would land far from the
1777
+ * typo — an empty key becomes a filter that matches nothing, and the run
1778
+ * reports zero results with no indication why. An empty **value** (`key=`)
1785
1779
  * is accepted by default, because setting a property to the empty string is
1786
1780
  * legitimate; pass `requireValue` to reject it. Every rejection names the
1787
1781
  * offending line.
@@ -1805,9 +1799,8 @@ export declare class ActionInput {
1805
1799
  *
1806
1800
  * There is no `schemaOption`: `ActionInput.schema(name, S).pipe(Config.option)`
1807
1801
  * yields `Config<Option<A>>` with missing → `None` and a malformed value
1808
- * still failing — core's documented `Config.option` behaviour ("validation
1809
- * errors ... still propagate", `Config.ts`), which is exactly the
1810
- * missing-versus-malformed split above.
1802
+ * still failing — core's `Config.option` lets validation errors propagate,
1803
+ * which is exactly the missing-versus-malformed split above.
1811
1804
  */
1812
1805
  static schema<A, I>(name: string, schema: Schema.Codec<A, I>): Config.Config<A>;
1813
1806
  /**
@@ -1817,7 +1810,7 @@ export declare class ActionInput {
1817
1810
  * The record dual-accepts, and the split is the `INPUT_` prefix:
1818
1811
  *
1819
1812
  * - A key already spelled as a runner variable (`INPUT_BIOME-VERSION`,
1820
- * `PLAIN_VAR`) is read verbatim, exactly as before.
1813
+ * `PLAIN_VAR`) is read verbatim.
1821
1814
  * - Any other key is treated as an **input name**, `with:`-block style —
1822
1815
  * `{ "biome-version": "2.3.14" }` — and serves the variable this module
1823
1816
  * derives for it (`ActionInput.variable`). This is the spelling to
@@ -1834,11 +1827,10 @@ export declare class ActionInput {
1834
1827
  * installs ({@link ActionInput.providerOver} via `layerDefault`) — so a
1835
1828
  * bare `Config.String("biome-version")` resolves under this provider
1836
1829
  * exactly as it does inside `Action.run`. Nested and numeric paths pass
1837
- * through as the joined spelling only, as ever.
1830
+ * through as the joined spelling only.
1838
1831
  *
1839
- * The source package's `ActionsConfigProvider` behaviors are otherwise
1840
- * preserved exactly: the path is joined with `_`, spaces become underscores
1841
- * and the whole is uppercased; and an **empty string reads as absent**,
1832
+ * Otherwise the path is joined with `_`, spaces become underscores and the
1833
+ * whole is uppercased; and an **empty string reads as absent**,
1842
1834
  * because the runner sets unsupplied inputs to `""` and treating that as
1843
1835
  * present would make every optional input look supplied. That rule applies
1844
1836
  * to input-name entries too: `{ "flag": "" }` is an unsupplied input.
@@ -1856,9 +1848,7 @@ export declare class ActionInput {
1856
1848
  * `TARGET-BRANCH`, never matches, and the read falls through to whatever
1857
1849
  * default the call site supplies. It **fails green**: nothing errors, the
1858
1850
  * suite passes against the default, and the test's name claims it proved the
1859
- * input was read. A consuming action's integration harness did exactly this
1860
- * and stayed green across several commits while a supplied `target-branch`
1861
- * silently did nothing.
1851
+ * input was read.
1862
1852
  *
1863
1853
  * Runner-variable keys (`INPUT_TARGET-BRANCH`, `PLAIN_VAR`) are unaffected —
1864
1854
  * they are already in the spelling `fromEnv` produces, and they resolve. The
@@ -1871,9 +1861,8 @@ export declare class ActionInput {
1871
1861
  * A layer installing {@link ActionInput.provider}.
1872
1862
  *
1873
1863
  * @remarks
1874
- * `ConfigProvider.ConfigProvider` is a `Context.Reference` in v4, so this is
1875
- * a reference override rather than a service — there is no
1876
- * `Effect.withConfigProvider`.
1864
+ * `ConfigProvider.ConfigProvider` is a `Context.Reference`, so this is a
1865
+ * reference override rather than a service.
1877
1866
  *
1878
1867
  * A parameterized layer factory mints a fresh reference per call; bind it to
1879
1868
  * a `const` rather than calling it at each composition site.
@@ -1891,10 +1880,9 @@ export declare class ActionInput {
1891
1880
  * passed to `ambient` untouched, so no path semantics are invented that the
1892
1881
  * runner does not have.
1893
1882
  *
1894
- * This exists because a live action shipped a **false green**: every bare
1895
- * `Config` read fell back to its `withDefault` because the runner exposes
1896
- * inputs as `INPUT_<MANGLED>` variables and a plain-named lookup finds
1897
- * nothing. Under this provider a bare read resolves through the same
1883
+ * This exists because the runner exposes inputs as `INPUT_<MANGLED>`
1884
+ * variables, so a plain-named lookup finds nothing and a bare `Config` read
1885
+ * would silently fall back to its `withDefault`. Under this provider a bare read resolves through the same
1898
1886
  * derivation `ActionInput.string` uses, so side-stepping the typed accessors
1899
1887
  * degrades to the right answer instead of to the default.
1900
1888
  *
@@ -1945,7 +1933,7 @@ export declare class ActionInput {
1945
1933
  * `ActionInput.provider` dual-accepts both spellings, so neither can miss.
1946
1934
  *
1947
1935
  * When none is installed, a **fresh** `ConfigProvider.fromEnv()`
1948
- * is built rather than reading the reference's default: v4 caches that
1936
+ * is built rather than reading the reference's default: core caches that
1949
1937
  * default once per process, and a snapshot taken before the runner's
1950
1938
  * variables are visible would resurrect exactly the missed-input class this
1951
1939
  * layer exists to kill. An action's environment is fixed before the process
@@ -2024,7 +2012,8 @@ declare const OidcClaims_base: Schema.Class<OidcClaims, Schema.Struct<{
2024
2012
  */
2025
2013
  export declare class OidcClaims extends OidcClaims_base {}
2026
2014
  /**
2027
- * The {@link OidcTokenIssuer} service shape.
2015
+ * The members of the {@link OidcTokenIssuer} service: request an ID `token`
2016
+ * and read its decoded `claims`, both failing with {@link OidcTokenError}.
2028
2017
  *
2029
2018
  * @public
2030
2019
  */
@@ -2060,9 +2049,9 @@ interface OidcTokenIssuerShape {
2060
2049
  *
2061
2050
  * Claims are on the surface rather than left to the call site because that is
2062
2051
  * what makes the provenance path reachable in a test: a double built with
2063
- * {@link OidcTokenIssuer.layerFor} answers with real, decodable claims, where
2064
- * the synthetic non-JWT its predecessor returned made every consumer's
2065
- * `decodeJwtClaims` yield nothing and silently skipped the path under test.
2052
+ * {@link OidcTokenIssuer.layerFor} answers with real, decodable claims, so
2053
+ * a test cannot silently skip the path under test because the double
2054
+ * returned a token that is not a JWT.
2066
2055
  */
2067
2056
  readonly claims: (audience?: string) => Effect.Effect<OidcClaims, OidcTokenError>;
2068
2057
  }
@@ -2091,16 +2080,22 @@ declare const OidcTokenIssuer_base: Context.ServiceClass<OidcTokenIssuer, "@effe
2091
2080
  * @public
2092
2081
  */
2093
2082
  export declare class OidcTokenIssuer extends OidcTokenIssuer_base {
2083
+ /**
2084
+ * The live issuer, requesting tokens from the runner's token service.
2085
+ *
2086
+ * @remarks
2087
+ * Fails with {@link OidcTokenError} (`unavailable`) at use when the workflow
2088
+ * lacks `permissions: id-token: write`.
2089
+ */
2094
2090
  static readonly layer: Layer.Layer<OidcTokenIssuer, never, ActionEnvironment | HttpClient.HttpClient>;
2095
2091
  /**
2096
2092
  * An **unsigned** JWT carrying these claims.
2097
2093
  *
2098
2094
  * @remarks
2099
2095
  * For building test doubles, and nothing else: the signature segment is a
2100
- * placeholder, so this token would fail any verifier. It exists because the
2101
- * alternative — a double returning a synthetic non-JWT — is what made the
2102
- * provenance path structurally unreachable in the source package, drawing
2103
- * four separate apologetic comments from one consumer.
2096
+ * placeholder, so this token would fail any verifier. It exists because a
2097
+ * double returning a synthetic non-JWT would make the provenance path
2098
+ * structurally unreachable in a test.
2104
2099
  */
2105
2100
  static readonly unsignedTokenFor: (claims: OidcClaims) => Redacted.Redacted<string>;
2106
2101
  /** A test double. Unstubbed members die rather than answering with a non-token. */
@@ -2122,7 +2117,8 @@ export declare class OidcTokenIssuer extends OidcTokenIssuer_base {
2122
2117
  //#endregion
2123
2118
  //#region src/ActionsIdentityToken.d.ts
2124
2119
  /**
2125
- * The Actions side of `@effected/sbom`'s inverted OIDC contract.
2120
+ * Serves `@effected/sbom`'s `IdentityToken` contract from the runner's own OIDC
2121
+ * token service, so signing an SBOM inside a workflow needs no further wiring.
2126
2122
  *
2127
2123
  * @remarks
2128
2124
  * `@effected/sbom` declares `IdentityToken` — one method, one audience,
@@ -2174,7 +2170,8 @@ export declare class ActionsIdentityToken {
2174
2170
  //#endregion
2175
2171
  //#region src/ActionsProvenance.d.ts
2176
2172
  /**
2177
- * The Actions side of `@effected/sbom`'s SLSA provenance constructor.
2173
+ * Builds the current run's SLSA provenance from the runner's OIDC claims: the
2174
+ * Actions side of `@effected/sbom`'s `SlsaProvenance.forGitHubWorkflow`.
2178
2175
  *
2179
2176
  * @remarks
2180
2177
  * `SlsaProvenance.forGitHubWorkflow` is total and does the real work, but it
@@ -2279,6 +2276,7 @@ export declare class ArtifactError extends ArtifactError_base {
2279
2276
  interface ArtifactItem {
2280
2277
  /** The database id, which is what `download` takes. */
2281
2278
  readonly id: number;
2279
+ /** The name the artifact was uploaded under. */
2282
2280
  readonly name: string;
2283
2281
  /** The size of the stored zip, in bytes. */
2284
2282
  readonly size: number;
@@ -2317,6 +2315,7 @@ interface UploadOptions {
2317
2315
  * @public
2318
2316
  */
2319
2317
  interface UploadResult {
2318
+ /** The new artifact's database id, which `download` takes. */
2320
2319
  readonly id: number;
2321
2320
  /** The size of the uploaded zip, in bytes. */
2322
2321
  readonly size: number;
@@ -2340,15 +2339,17 @@ interface DownloadResult {
2340
2339
  readonly downloadPath: string;
2341
2340
  }
2342
2341
  /**
2343
- * A reference to an artifact that is no longer there.
2342
+ * The id of an artifact that `delete` removed.
2344
2343
  *
2345
2344
  * @public
2346
2345
  */
2347
2346
  interface ArtifactRef {
2347
+ /** The deleted artifact's database id. */
2348
2348
  readonly id: number;
2349
2349
  }
2350
2350
  /**
2351
- * The {@link Artifact} service shape.
2351
+ * The members of the {@link Artifact} service: upload, list, get, download and
2352
+ * delete, each failing with {@link ArtifactError}.
2352
2353
  *
2353
2354
  * @public
2354
2355
  */
@@ -2387,14 +2388,10 @@ declare const Artifact_base: Context.ServiceClass<Artifact, "@effected/github-ac
2387
2388
  * third thing that can be absent, and it is reported as `misconfigured` for the
2388
2389
  * same reason.
2389
2390
  *
2390
- * **This surface is provisional.** Unlike every other service here it was
2391
- * ported without a call site to shape it against, so it keeps the source's
2392
- * shape rather than a narrower one invented from nothing. The first consumer to
2393
- * adopt it is the one whose feedback reshapes it — the members lost their
2394
- * `Artifact` prefix (`artifact.uploadArtifact(...)` stutters) and the
2395
- * cross-run `findBy` lookup is **not** ported, because every path through it in
2396
- * the source is a typed "not implemented" failure. Adding it later is additive;
2397
- * shipping a parameter that has never had behavior is not.
2391
+ * **This surface is provisional.** It has not yet been shaped by a real call
2392
+ * site, so it may be reworked once a consumer adopts it. It covers the current
2393
+ * run only: there is no cross-run lookup, and adding one later would be
2394
+ * additive.
2398
2395
  *
2399
2396
  * @example
2400
2397
  * ```ts
@@ -2516,33 +2513,59 @@ type BlobEnvelopeError = NotABlobEnvelopeError | TruncatedBlobEnvelopeError | Un
2516
2513
  * [4B magic "EFBS"][1B version][4B metadata length, big-endian][metadata JSON][body]
2517
2514
  * ```
2518
2515
  *
2519
- * Three properties earn the format, and each replaces something a consumer was
2520
- * hand-rolling:
2521
- *
2522
- * - **The magic prefix makes a legacy blob legible.** Raw, unframed bytes
2523
- * decode as `notAnEnvelope` rather than as garbage metadata, so a store
2524
- * holding pre-envelope entries produces a clean miss instead of a corrupt
2525
- * read.
2526
- * - **The version lives in the blob, not in the key.** A consumer previously
2527
- * namespaced keys (`v2/...`) to represent a format change, because there was
2528
- * no in-band version. Here a revision is detected on read and reported
2529
- * typed, so **keys stay stable** and old entries age out naturally.
2516
+ * Three properties earn the format:
2517
+ *
2518
+ * - **The magic prefix makes an unframed blob legible.** Raw, unframed bytes
2519
+ * decode as {@link NotABlobEnvelopeError} rather than as garbage metadata, so
2520
+ * a store holding entries written without an envelope produces a clean miss
2521
+ * instead of a corrupt read.
2522
+ * - **The version lives in the blob, not in the key.** A format revision is
2523
+ * detected on read and reported typed
2524
+ * ({@link UnsupportedBlobEnvelopeVersionError}), so **keys stay stable** and
2525
+ * old entries age out naturally rather than needing a `v2/...` key prefix.
2530
2526
  * - **The metadata is the caller's own schema.** This module owns *framing*;
2531
- * the caller owns *meaning*. Fields like a cache tag or a duration stop
2532
- * being bytes at fixed offsets in a consumer's private codec.
2527
+ * the caller owns *meaning*. Fields like a cache tag or a duration are
2528
+ * schema fields, not bytes at fixed offsets in a private codec.
2533
2529
  *
2534
2530
  * **Pure**: `Result`-returning, no IO, no service — the framing is testable
2535
2531
  * from a byte array, which is the point.
2536
2532
  *
2533
+ * @example
2534
+ * ```ts
2535
+ * import { BlobEnvelope } from "@effected/github-actions";
2536
+ * import { Result, Schema } from "effect";
2537
+ *
2538
+ * const Meta = Schema.Struct({ tag: Schema.String });
2539
+ *
2540
+ * const framed = BlobEnvelope.encodeResult({ tag: "v1" }, new Uint8Array([1, 2, 3]), Meta);
2541
+ * if (Result.isSuccess(framed)) {
2542
+ * const read = BlobEnvelope.decodeResult(framed.success, Meta);
2543
+ * // => Result.succeed({ metadata: { tag: "v1" }, body: Uint8Array [1, 2, 3] })
2544
+ * }
2545
+ * ```
2546
+ *
2537
2547
  * @public
2538
2548
  */
2539
2549
  export declare class BlobEnvelope {
2540
2550
  private constructor();
2541
- /** The version this build writes. */
2551
+ /** The envelope version this build writes and accepts. */
2542
2552
  static readonly version: number;
2543
- /** Frame metadata and a body into a single blob. */
2553
+ /**
2554
+ * Frame metadata and a body into a single blob.
2555
+ *
2556
+ * @returns a `Result` holding the framed bytes, or a
2557
+ * {@link BlobMetadataEncodeError} when `metadata` does not satisfy `schema`
2558
+ */
2544
2559
  static encodeResult<A, I>(metadata: A, body: Uint8Array, schema: Schema.Codec<A, I>): Result.Result<Uint8Array, BlobEnvelopeError>;
2545
- /** Read a framed blob back into its metadata and body. */
2560
+ /**
2561
+ * Read a framed blob back into its metadata and body.
2562
+ *
2563
+ * @returns a `Result` holding the decoded metadata and a copy of the body, or
2564
+ * a {@link BlobEnvelopeError}: {@link NotABlobEnvelopeError} for unframed
2565
+ * bytes, {@link TruncatedBlobEnvelopeError},
2566
+ * {@link UnsupportedBlobEnvelopeVersionError}, or
2567
+ * {@link BlobMetadataDecodeError} when the metadata fails `schema`
2568
+ */
2546
2569
  static decodeResult<A, I>(bytes: Uint8Array, schema: Schema.Codec<A, I>): Result.Result<{
2547
2570
  readonly metadata: A;
2548
2571
  readonly body: Uint8Array;
@@ -2586,12 +2609,19 @@ interface StoredBlob<A> {
2586
2609
  readonly body: Uint8Array;
2587
2610
  }
2588
2611
  /**
2589
- * The {@link BlobStore} service shape.
2612
+ * The members of the {@link BlobStore} service: `get`, `put` and `has` over
2613
+ * blobs that carry the caller's own metadata.
2590
2614
  *
2591
2615
  * @public
2592
2616
  */
2593
2617
  interface BlobStoreShape {
2594
- /** Read a blob, or nothing if the key is absent. */
2618
+ /**
2619
+ * Read a blob, or nothing if the key is absent.
2620
+ *
2621
+ * @remarks
2622
+ * Fails with {@link BlobStoreError}, or a {@link BlobEnvelopeError} when the
2623
+ * stored bytes are not a valid envelope for `schema`.
2624
+ */
2595
2625
  readonly get: <A, I>(key: string, schema: Schema.Codec<A, I>) => Effect.Effect<Option.Option<StoredBlob<A>>, BlobStoreError | BlobEnvelopeError>;
2596
2626
  /** Write a blob. */
2597
2627
  readonly put: <A, I>(key: string, blob: StoredBlob<A>, schema: Schema.Codec<A, I>) => Effect.Effect<void, BlobStoreError | BlobEnvelopeError>;
@@ -2604,7 +2634,9 @@ interface BlobStoreShape {
2604
2634
  * @public
2605
2635
  */
2606
2636
  interface S3Config {
2637
+ /** The bucket name. */
2607
2638
  readonly bucket: string;
2639
+ /** The bucket's region, used for SigV4 signing and the default AWS endpoint. */
2608
2640
  readonly region: string;
2609
2641
  /**
2610
2642
  * A custom endpoint, e.g. `https://<account>.r2.cloudflarestorage.com`.
@@ -2616,7 +2648,9 @@ interface S3Config {
2616
2648
  * DNS that none of them provide the same way.
2617
2649
  */
2618
2650
  readonly endpoint?: string | undefined;
2651
+ /** The access key id. */
2619
2652
  readonly accessKeyId: string;
2653
+ /** The secret access key, declassified once and masked in the runner log. */
2620
2654
  readonly secretAccessKey: Redacted.Redacted<string>;
2621
2655
  /** For temporary credentials. */
2622
2656
  readonly sessionToken?: Redacted.Redacted<string> | undefined;
@@ -2629,14 +2663,15 @@ declare const BlobStore_base: Context.ServiceClass<BlobStore, "@effected/github-
2629
2663
  *
2630
2664
  * @remarks
2631
2665
  * `get`/`put`/`has` over `Uint8Array` **plus the caller's own metadata**, framed
2632
- * by {@link BlobEnvelope}. The metadata channel is the reason this exists: the
2633
- * consumer it was designed against hand-rolled a binary frame
2634
- * (`[4B tagLen][4B durationMs][tag][body]`) and namespaced its keys with a `v2`
2635
- * prefix to represent a format change. Both are framing concerns that had
2636
- * leaked into a consumer, and both are absorbed here.
2666
+ * by {@link BlobEnvelope}. The metadata channel is the reason this exists:
2667
+ * fields like a cache tag or a duration travel as schema-typed metadata, and a
2668
+ * format revision is detected in the blob rather than by prefixing keys.
2669
+ *
2670
+ * Deliberately no `list` and no `delete`: eviction belongs to the backend, and
2671
+ * both backends already have one.
2637
2672
  *
2638
- * Deliberately no `list` and no `delete`: eviction belongs to the backend, both
2639
- * backends already have one, and no consumer asked for either.
2673
+ * Backends: {@link BlobStore.layerS3}, `GitHubCacheBlobStore.layer` and the
2674
+ * in-memory {@link BlobStore.layerMemory}.
2640
2675
  *
2641
2676
  * @example
2642
2677
  * ```ts
@@ -2694,9 +2729,9 @@ export declare class BlobStore extends BlobStore_base {
2694
2729
  * The Actions cache is reachable over a Twirp v2 protocol at
2695
2730
  * `ACTIONS_RESULTS_URL`, which answers a `CreateCacheEntry` /
2696
2731
  * `GetCacheEntryDownloadURL` RPC with a **pre-signed Azure blob url** — which is
2697
- * why this backend lives in its own module rather than beside the S3 one, and
2698
- * why the spec's "Azure is confined to the cache and the artifact service" is
2699
- * three modules rather than two.
2732
+ * why this backend lives in its own module rather than beside the S3 one: it,
2733
+ * `ActionCache` and `Artifact` are the only three modules that import the
2734
+ * Azure client.
2700
2735
  *
2701
2736
  * **Only reachable from a `uses:` step.** The runner injects
2702
2737
  * `ACTIONS_RESULTS_URL` and `ACTIONS_RUNTIME_TOKEN` into action execution
@@ -2721,7 +2756,14 @@ export declare class BlobStore extends BlobStore_base {
2721
2756
  */
2722
2757
  export declare class GitHubCacheBlobStore {
2723
2758
  private constructor();
2724
- /** The backend, over the real Azure client. */
2759
+ /**
2760
+ * The backend, over the real Azure client.
2761
+ *
2762
+ * @remarks
2763
+ * Requires `ActionEnvironment` for `ACTIONS_RESULTS_URL` and
2764
+ * `ACTIONS_RUNTIME_TOKEN`; fails with `BlobStoreError` (`misconfigured`) when
2765
+ * either is absent.
2766
+ */
2725
2767
  static readonly layer: Layer.Layer<BlobStore, never, HttpClient.HttpClient | ActionEnvironment>;
2726
2768
  /**
2727
2769
  * The backend, over a supplied transport.
@@ -2835,8 +2877,7 @@ export declare class CheckDocumentStamp extends CheckDocumentStamp_base {
2835
2877
  * render was byte-identical, so no write was issued. `stale` — the document
2836
2878
  * already carries regions from a more recent run, so the pass was dropped
2837
2879
  * without writing (only possible when {@link CheckDocumentOptions.stamp} is
2838
- * set). A plain literal union: callers that ignored `flush`'s old `void`
2839
- * success stay compile-compatible.
2880
+ * set).
2840
2881
  *
2841
2882
  * @public
2842
2883
  */
@@ -2946,7 +2987,8 @@ interface CheckDocumentOptions {
2946
2987
  readonly sinkTimeout?: Duration.Input | undefined;
2947
2988
  }
2948
2989
  /**
2949
- * The check-run → document reconciler's surface.
2990
+ * The members of the {@link CheckDocument} service: `report` a check's state,
2991
+ * read the `checks` registry and `flush` the document.
2950
2992
  *
2951
2993
  * @public
2952
2994
  */
@@ -2970,8 +3012,7 @@ interface CheckDocumentShape {
2970
3012
  * Rendering unchanged state issues no write. Call it at the end of a run;
2971
3013
  * the layer's finalizer also runs it, so the last burst of reports lands
2972
3014
  * even when the scope closes inside the quiet window. The outcome says
2973
- * what the pass did — `written`, `unchanged` or `stale` — and callers
2974
- * that ignore it stay exactly as they were.
3015
+ * what the pass did — `written`, `unchanged` or `stale`.
2975
3016
  */
2976
3017
  readonly flush: Effect.Effect<CheckFlushOutcome, CheckDocumentError>;
2977
3018
  }
@@ -3154,8 +3195,7 @@ interface PathPrependOptions {
3154
3195
  }
3155
3196
  /**
3156
3197
  * Child-process environment construction: prepending directories to `PATH`
3157
- * without falling into the three traps that each cost a real consumer a
3158
- * cross-OS matrix round.
3198
+ * without falling into three cross-platform traps.
3159
3199
  *
3160
3200
  * @remarks
3161
3201
  * Spawning a child with directories prepended to `PATH` is one tiny concern
@@ -3188,9 +3228,7 @@ interface PathPrependOptions {
3188
3228
  * taken as an argument — which is what makes every platform branch
3189
3229
  * exercisable from a test on any host. The sanctioned exceptions are
3190
3230
  * *defaults a caller can override by passing the value*: `ActionInput.provider`'s
3191
- * `env = process.env` and `DetachedProcess.spawn`'s `base`. A structural test
3192
- * (`__test__/ambientReads.test.ts`) holds the list closed; a new default is
3193
- * added there with its reason, never silently.
3231
+ * `env = process.env` and `DetachedProcess.spawn`'s `base`.
3194
3232
  *
3195
3233
  * @public
3196
3234
  */
@@ -3278,7 +3316,7 @@ declare const DetachedLogUnavailableError_base: Schema.Class<DetachedLogUnavaila
3278
3316
  readonly cause: Schema.optionalKey<Schema.Defect>;
3279
3317
  }>, import("effect/Cause").YieldableError>;
3280
3318
  /**
3281
- * Raised when a detached child cannot be started, waited for, or reaped.
3319
+ * Raised when the log file for a detached child's output cannot be opened.
3282
3320
  *
3283
3321
  * @public
3284
3322
  */
@@ -3530,8 +3568,7 @@ export declare class DetachedProcess {
3530
3568
  * @remarks
3531
3569
  * A domain predicate rather than a sleep: "the server answers" is the thing
3532
3570
  * being waited for, and any fixed delay is simultaneously too long on a fast
3533
- * runner and too short on a slow one. Two consumers hand-rolled this, one of
3534
- * them around an `Effect.suspend` footgun it had to explain in a comment.
3571
+ * runner and too short on a slow one.
3535
3572
  *
3536
3573
  * A probe *failure* is propagated rather than treated as "not ready" — a
3537
3574
  * probe that cannot run is a different situation from a child that is not up
@@ -3545,11 +3582,9 @@ export declare class DetachedProcess {
3545
3582
  * @remarks
3546
3583
  * The probe {@link DetachedProcess.awaitReady} almost always wants: an HTTP
3547
3584
  * `GET` at a port the child is still binding, where connection-refused *is*
3548
- * "not up yet". The consumers that hand-rolled the polling wrote exactly
3549
- * this probe around it, and each had to discover the same subtlety — the
3550
- * probe's error channel must stay empty, because `awaitReady` deliberately
3551
- * propagates probe failures, and a refused connection is not a failure of
3552
- * the probe.
3585
+ * "not up yet". The probe's error channel must stay empty, because
3586
+ * `awaitReady` deliberately propagates probe failures, and a refused
3587
+ * connection is not a failure of the probe.
3553
3588
  *
3554
3589
  * So this probe never fails: a refused connection, any other transport
3555
3590
  * error and a non-2xx answer all collapse to `false`, leaving
@@ -3558,9 +3593,9 @@ export declare class DetachedProcess {
3558
3593
  * only sound because every failure an HTTP readiness check can see means
3559
3594
  * the same thing here. The cost is the documented one: a *misconfigured*
3560
3595
  * probe — a typo'd port, a wrong path — is indistinguishable from a child
3561
- * that never came up, and reports as `notReady` only after the full budget.
3562
- * A probe whose failures are meaningfully distinct should stay a
3563
- * hand-written effect with those failures in `E`.
3596
+ * that never came up, and reports as {@link DetachedNotReadyError} only after
3597
+ * the full budget. A probe whose failures are meaningfully distinct should
3598
+ * stay a hand-written effect with those failures in `E`.
3564
3599
  *
3565
3600
  * The request goes through core's `HttpClient` — `Action.run` provides it
3566
3601
  * ambiently — rather than a bare `fetch`, per the package rule that
@@ -3807,8 +3842,7 @@ interface GitHubSchemaTable<Row> {
3807
3842
  * a backtick gets a wider delimiter; a URL containing spaces or parentheses
3808
3843
  * is angle-bracketed.
3809
3844
  *
3810
- * This module is the package's **only** importer of `@effected/markdown` — a
3811
- * structural test pins that, on the same terms as the Azure confinement — so
3845
+ * This module is the package's **only** importer of `@effected/markdown`, so
3812
3846
  * an action that never renders markdown never links the engine.
3813
3847
  *
3814
3848
  * **Renders cannot fail, so do not `Effect.try`-wrap them.** The serializer's
@@ -3861,8 +3895,8 @@ export declare class GitHubMarkdown {
3861
3895
  * each cell is the field value's **encoded** string form — a branded or
3862
3896
  * typed field projects through its own codec, so the vocabulary lives
3863
3897
  * with the schema instead of being respelled at every call site, and a
3864
- * row can no longer transpose columns because it is a typed object, not
3865
- * a positional array.
3898
+ * row cannot transpose columns because it is a typed object, not a
3899
+ * positional array.
3866
3900
  *
3867
3901
  * A field whose encoded side is not a string has no string projection to
3868
3902
  * borrow; the type of `options` makes its column's `format` — and
@@ -3874,8 +3908,8 @@ export declare class GitHubMarkdown {
3874
3908
  * {@link GitHubMarkdown.table}, so escaping is inherited and identical
3875
3909
  * rows produce identical output. Rows are already-decoded values of the
3876
3910
  * schema's type, so encoding them is total in practice; a value smuggled
3877
- * past the types throws the codec's `SchemaError` as a defect — same
3878
- * posture as the serializer arm above, **not** a silent fallback.
3911
+ * past the types throws the codec's `SchemaError` as a defect, **not** a
3912
+ * silent fallback.
3879
3913
  *
3880
3914
  * This is the **only** member where a throw is reachable at runtime, and
3881
3915
  * neither route is the serializer — see the no-wrapping remark on
@@ -3941,8 +3975,8 @@ export declare class GitHubMarkdown {
3941
3975
  * its fragments as markdown, so `raw` adds no behavior — it adds the
3942
3976
  * *statement* that a value is already rendered. Use it where a fragment
3943
3977
  * from elsewhere enters a composition and a reader would otherwise wonder
3944
- * whether it still needs escaping. It replaces the `Html.make` idiom,
3945
- * which passes markdown through correctly but announces the wrong intent.
3978
+ * whether it still needs escaping. Prefer it to `Html.make`, which passes
3979
+ * markdown through correctly but announces the wrong intent.
3946
3980
  */
3947
3981
  static raw(markdown: string): string;
3948
3982
  }
@@ -4022,9 +4056,8 @@ interface ClientLayerOptions extends ReadOptions {
4022
4056
  * The GitHub App token lifecycle, shaped like a workflow.
4023
4057
  *
4024
4058
  * @remarks
4025
- * One of the two seams between this package and
4026
- * [`@effected/github`](https://npmjs.com) — mint in `pre`, use in `main`,
4027
- * revoke in `post`. The three phases are **three separate processes**, so
4059
+ * One of the two seams between this package and `@effected/github` — mint in
4060
+ * `pre`, use in `main`, revoke in `post`. The three phases are **three separate processes**, so
4028
4061
  * nothing survives between them except what `GITHUB_STATE` carries, which is
4029
4062
  * why this is a persistence problem rather than a `Scope`.
4030
4063
  *
@@ -4036,16 +4069,14 @@ interface ClientLayerOptions extends ReadOptions {
4036
4069
  * **The token lives about an hour, and no later phase can re-mint one.** The
4037
4070
  * credentials that could are the app's private key, and persisting *that*
4038
4071
  * through `GITHUB_STATE` — a plaintext file by GitHub's protocol — would trade
4039
- * a one-hour token for a permanent one. So the v1 contract is stated rather
4040
- * than worked around: {@link GitHubToken.read} fails typed when the persisted
4072
+ * a one-hour token for a permanent one. So the contract is stated rather than
4073
+ * worked around: {@link GitHubToken.read} fails typed when the persisted
4041
4074
  * token is spent, and a phase that can outlive the hour calls
4042
4075
  * {@link GitHubToken.provision} itself.
4043
4076
  *
4044
- * Grouped statics on one module reaching one dependency — the carve-out to the
4045
- * no-namespace-objects rule, not the hazard it names. Every member's `R` says
4046
- * exactly which services it needs, and the members below say which parts of
4047
- * each they touch, so a partial double is built from the documentation rather
4048
- * than from a stack trace:
4077
+ * Every member's `R` says exactly which services it needs, and this table says
4078
+ * which parts of each it touches, so a partial double is built from the
4079
+ * documentation rather than from a stack trace:
4049
4080
  *
4050
4081
  * | Member | `ActionState` | `ActionOutputs` | `GitHubApp` |
4051
4082
  * | --- | --- | --- | --- |
@@ -4094,10 +4125,11 @@ export declare class GitHubToken {
4094
4125
  * The token an earlier phase persisted.
4095
4126
  *
4096
4127
  * @remarks
4097
- * Fails typed when it is spent. The package this replaces persisted the
4098
- * expiry and read it nowhere, so a `main` phase that outlived the hour simply
4099
- * started answering `401` with no explanation — which is the single hardest
4100
- * failure in this whole lifecycle to diagnose from a workflow log.
4128
+ * Fails with {@link GitHubTokenError} when it is spent, and with
4129
+ * {@link ActionStateError} when no token was persisted. Without that check a
4130
+ * `main` phase that outlived the hour would simply start answering `401` with
4131
+ * no explanation — the hardest failure in this lifecycle to diagnose from a
4132
+ * workflow log.
4101
4133
  */
4102
4134
  static readonly read: (options?: ReadOptions | undefined) => Effect.Effect<InstallationToken, ActionStateError | GitHubTokenError, ActionState>;
4103
4135
  /**
@@ -4211,9 +4243,8 @@ declare const ManagedDocument_base: Schema.Class<ManagedDocument, Schema.Struct<
4211
4243
  * region carrying the latest content, which is what makes a check that
4212
4244
  * resolves many times safe to re-render.
4213
4245
  *
4214
- * The region engine is `@effected/templates`' pure `SectionDocument` —
4215
- * reused, not reinvented — fixed to the HTML comment style and a
4216
- * region-specific phrase. Everything here is string → string; the GitHub
4246
+ * The region engine is `@effected/templates`' pure `SectionDocument`, fixed to
4247
+ * the HTML comment style and a region-specific phrase. Everything here is string → string; the GitHub
4217
4248
  * write path composes this with `PullRequestComment` (whose `CommentMarker`
4218
4249
  * renders the *same* sentinel for the same namespace and key) or a PR-body
4219
4250
  * update in `@effected/github`.
@@ -4310,7 +4341,7 @@ export declare class ManagedDocument extends ManagedDocument_base {
4310
4341
  * call keeps its content *and* its metadata untouched — and never
4311
4342
  * participates in region addressability: a region is found by key alone,
4312
4343
  * so changing metadata updates the region in place. A two-element entry
4313
- * behaves exactly as it always has. Names must match
4344
+ * supplies no metadata. Names must match
4314
4345
  * `[A-Za-z][A-Za-z0-9_-]*` and values may not contain `"` or a line
4315
4346
  * break; violations fail typed as `invalidAttribute`.
4316
4347
  *
@@ -4470,7 +4501,9 @@ interface ProvisionedFile {
4470
4501
  readonly binDir: string;
4471
4502
  }
4472
4503
  /**
4473
- * The {@link ToolInstaller} service shape.
4504
+ * The members of the {@link ToolInstaller} service: find, download, extract and
4505
+ * cache tools in the runner's tool cache, each failing with
4506
+ * {@link ToolInstallerError}.
4474
4507
  *
4475
4508
  * @public
4476
4509
  */
@@ -4488,9 +4521,9 @@ interface ToolInstallerShape {
4488
4521
  * location contract ({@link ToolInstaller.cachePath}); the directory's
4489
4522
  * *interior* layout is whatever its writer produced, which is not
4490
4523
  * necessarily what this consumer's own `cacheDir` would have written.
4491
- * Validate the layout of a foreign hit before relying on it — applying an
4524
+ * Validate the layout of a foreign hit before relying on it — an
4492
4525
  * assumption from your own install path (an archive-wrapper subdirectory,
4493
- * say) to a foreign entry is a real shipped bug.
4526
+ * say) may not hold for a foreign entry.
4494
4527
  */
4495
4528
  readonly find: (tool: string, version: string) => Effect.Effect<Option.Option<string>>;
4496
4529
  /**
@@ -4582,6 +4615,13 @@ declare const ToolInstaller_base: Context.ServiceClass<ToolInstaller, "@effected
4582
4615
  * @public
4583
4616
  */
4584
4617
  export declare class ToolInstaller extends ToolInstaller_base {
4618
+ /**
4619
+ * The live installer, over the runner's tool cache, `HttpClient` and `tar`.
4620
+ *
4621
+ * @remarks
4622
+ * The cache root comes from `RUNNER_TOOL_CACHE`, resolved once at layer
4623
+ * construction.
4624
+ */
4585
4625
  static readonly layer: Layer.Layer<ToolInstaller, never, ActionEnvironment | FileSystem.FileSystem | Path.Path | HttpClient.HttpClient | ChildProcessSpawner.ChildProcessSpawner>;
4586
4626
  /**
4587
4627
  * Where a tool lives in the cache.
@@ -4610,9 +4650,8 @@ export declare class ToolInstaller extends ToolInstaller_base {
4610
4650
  * otherwise have to stub it in every test. The default is the static layout
4611
4651
  * over `RUNNER_TOOL_CACHE`, or the same off-runner root `make` resolves
4612
4652
  * (`internal/runner.ts`). **That is a read of the ambient environment**,
4613
- * sanctioned here only because a double has no `ActionEnvironment` to ask —
4614
- * test-double-only, and listed as such in the package's ambient-read
4615
- * allowlist (`__test__/ambientReads.test.ts`).
4653
+ * sanctioned here only because a double has no `ActionEnvironment` to ask,
4654
+ * and limited to the test double.
4616
4655
  */
4617
4656
  static readonly makeTest: (overrides?: Partial<ToolInstallerShape>) => ToolInstallerShape;
4618
4657
  /** {@link ToolInstaller.makeTest} behind `Layer.succeed`. */
@@ -4735,7 +4774,7 @@ interface PackageManagerInstallOptions {
4735
4774
  * carrying no parseable SRI fails with `integrityMismatch` (the
4736
4775
  * could-not-verify arm), and a tarball that hashes to anything else fails
4737
4776
  * with `integrityMismatch` naming the tarball url. Absent, the registry's
4738
- * own `dist.integrity` is the authority, as before. A tool-cache hit is
4777
+ * own `dist.integrity` is the authority. A tool-cache hit is
4739
4778
  * answered without re-verifying, exactly as the pin's own integrity is.
4740
4779
  */
4741
4780
  readonly nativeIntegrity?: Readonly<Record<string, string>> | undefined;
@@ -4842,7 +4881,8 @@ export declare const InstalledPackageManager: Schema.Union<readonly [typeof Ambi
4842
4881
  */
4843
4882
  export type InstalledPackageManager = typeof InstalledPackageManager.Type;
4844
4883
  /**
4845
- * The {@link PackageManagerInstaller} service shape.
4884
+ * The members of the {@link PackageManagerInstaller} service: `install` the
4885
+ * exact package-manager version a pin names.
4846
4886
  *
4847
4887
  * @public
4848
4888
  */
@@ -4905,6 +4945,14 @@ declare const PackageManagerInstaller_base: Context.ServiceClass<PackageManagerI
4905
4945
  * @public
4906
4946
  */
4907
4947
  export declare class PackageManagerInstaller extends PackageManagerInstaller_base {
4948
+ /**
4949
+ * The live installer, caching through {@link ToolInstaller}.
4950
+ *
4951
+ * @remarks
4952
+ * Fails with {@link PackageManagerInstallerError}; requires the runner's
4953
+ * environment, a filesystem, `Path`, a child-process spawner and a
4954
+ * `ToolInstaller`.
4955
+ */
4908
4956
  static readonly layer: Layer.Layer<PackageManagerInstaller, never, ActionEnvironment | FileSystem.FileSystem | Path.Path | ChildProcessSpawner.ChildProcessSpawner | ToolInstaller>;
4909
4957
  /** A test double. The unstubbed member dies rather than reporting an install that did not happen. */
4910
4958
  static readonly makeTest: (overrides?: Partial<PackageManagerInstallerShape>) => PackageManagerInstallerShape;
@@ -4972,8 +5020,7 @@ export declare class Secret {
4972
5020
  * **Detached workers invert the masking model.** Masking works because the
4973
5021
  * runner parses this process's stdout; a *detached* child's stdout is a log
4974
5022
  * file no runner parses, so a mask emitted **inside** the worker is inert
4975
- * and writes the plaintext verbatim into that log — a shipped incident, not
4976
- * a hypothetical. The rule: **the parent masks, before the spawn** — call
5023
+ * and writes the plaintext verbatim into that log. The rule: **the parent masks, before the spawn** — call
4977
5024
  * this member in the parent, where the runner is listening, and hand the
4978
5025
  * already-masked plaintext to the worker's environment. Inside the worker,
4979
5026
  * compose `ActionOutputs.layerDetached`, whose `setSecret` is a documented
@@ -5018,9 +5065,8 @@ export declare class Secret {
5018
5065
  * **In a detached worker, the mask this member emits is a leak.** The
5019
5066
  * `::add-mask::` command only masks when the runner parses this process's
5020
5067
  * stdout; a detached worker's stdout is a log file no runner parses, so
5021
- * there the command masks nothing *and* spells the plaintext into the log
5022
- * — a signing key shipped exactly that way for one round. A worker that
5023
- * signs (an S3-style `BlobStore` is the canonical case) must compose
5068
+ * there the command masks nothing *and* spells the plaintext into the log.
5069
+ * A worker that signs (an S3-style `BlobStore` is the canonical case) must compose
5024
5070
  * `ActionOutputs.layerDetached`, under which this member still returns the
5025
5071
  * raw key for the HMAC but the mask is a documented no-op; the masking
5026
5072
  * itself is the **parent's** job, done before the spawn via
@@ -5040,8 +5086,7 @@ export declare class Secret {
5040
5086
  * secret enters the ambient environment without wading through signing
5041
5087
  * keys and runner files.
5042
5088
  *
5043
- * The ruling on who mutates is unchanged by the name existing: **this
5044
- * package never mutates `process.env`.** Reads are seeded once, at layer
5089
+ * **This package never mutates `process.env`.** Reads are seeded once, at layer
5045
5090
  * construction, through `ActionEnvironment`, and nothing here writes back
5046
5091
  * — a write from inside the kit would be invisible to that seeding and to
5047
5092
  * every consumer's assumptions about when the environment is stable. This
@@ -5063,13 +5108,10 @@ export declare class Secret {
5063
5108
  * Masking without declassification: the value is registered with
5064
5109
  * `::add-mask::` through the same route as every other member, and the
5065
5110
  * success channel is `void`, so a caller cannot come away holding the raw
5066
- * value at all. This is the register-only shape consumers previously spelled
5067
- * as a {@link Secret.forSigning} whose result was discarded — a spelling
5068
- * that lied to the audit vocabulary (a grep for signing found masking),
5069
- * contradicted forSigning's own once-at-construction guidance, and needed a
5070
- * comment to apologize for itself. The names are the vocabulary: a grep for
5071
- * this member finds every register-only site, and a grep for `forSigning`
5072
- * again finds only signing.
5111
+ * value at all. Prefer it to calling {@link Secret.forSigning} and discarding
5112
+ * the result, which would mislabel a masking site as a signing one. The names
5113
+ * are the audit vocabulary: a grep for this member finds every register-only
5114
+ * site, and a grep for `forSigning` finds only signing.
5073
5115
  *
5074
5116
  * The canonical caller masks every supplied credential input
5075
5117
  * unconditionally, before the logic that decides which of them will
@@ -5084,9 +5126,8 @@ export declare class Secret {
5084
5126
  * **In a detached worker, the mask this member emits is a leak.** The
5085
5127
  * `::add-mask::` command only masks when the runner parses this process's
5086
5128
  * stdout; a detached worker's stdout is a log file no runner parses, so
5087
- * there the command masks nothing *and* spells the plaintext into the log
5088
- * — a signing key shipped exactly that way for one round. A worker must
5089
- * compose `ActionOutputs.layerDetached`, under which the mask is a
5129
+ * there the command masks nothing *and* spells the plaintext into the log.
5130
+ * A worker must compose `ActionOutputs.layerDetached`, under which the mask is a
5090
5131
  * documented no-op; the masking itself is the **parent's** job, done
5091
5132
  * before the spawn via {@link Secret.forChildEnv} under the real layer.
5092
5133
  */
@@ -5102,5 +5143,5 @@ export declare class Secret {
5102
5143
  static readonly adopt: (name: string) => Config.Config<Redacted.Redacted<string>>;
5103
5144
  }
5104
5145
  //#endregion
5105
- export type { ActionCacheShape, ActionEnvironmentShape, ActionLoggerShape, ActionOutputError, ActionOutputsShape, ActionRunOptions, ActionServices, ActionStateShape, AnnotationProperties, ArtifactItem, ArtifactRef, ArtifactShape, BlobEnvelopeError, BlobStoreShape, CacheKeyError, CheckDocumentOptions, CheckDocumentShape, CheckDocumentSink, CheckFlushOutcome, CheckRunConclusion, CheckRunProjection, ClientLayerOptions, DataBlobTransfer, DetachedProcessError, DetachedProcessOps, DetachedSpawnOptions, DownloadOptions, DownloadResult, DryRunShape, ExtractOptions, FileBlobTransfer, GitHubHeadingDepth, GitHubListOptions, GitHubRowSchema, GitHubSchemaTable, GitHubSchemaTableColumn, GitHubSchemaTableColumns, GitHubSchemaTableFormatRequiredKeys, GitHubSchemaTableFormattedColumn, GitHubSchemaTableOptions, ManagedDocumentSource, OidcTokenIssuerShape, PackageManagerInstallOptions, PackageManagerInstallerShape, PairsOptions, PathPrependEnv, PathPrependOptions, ProvisionFileOptions, ProvisionOptions, ProvisionedFile, ReadOptions, ReadinessOptions, RecordedOutputMember, RecordingOutputs, S3Config, StoredBlob, ToolDownloadOptions, ToolInstallerShape, UploadOptions, UploadResult, WithBufferOptions, WithStepOptions };
5146
+ export { type ActionCacheShape, type ActionEnvironmentShape, type ActionLoggerShape, type ActionOutputError, type ActionOutputsShape, type ActionRunOptions, type ActionServices, type ActionStateShape, type AnnotationProperties, type ArtifactItem, type ArtifactRef, type ArtifactShape, type BlobEnvelopeError, type BlobStoreShape, type CacheKeyError, type CheckDocumentOptions, type CheckDocumentShape, type CheckDocumentSink, type CheckFlushOutcome, type CheckRunConclusion, type CheckRunProjection, type ClientLayerOptions, type DataBlobTransfer, type DetachedProcessError, type DetachedProcessOps, type DetachedSpawnOptions, type DownloadOptions, type DownloadResult, type DryRunShape, type ExtractOptions, type FileBlobTransfer, type GitHubHeadingDepth, type GitHubListOptions, type GitHubRowSchema, type GitHubSchemaTable, type GitHubSchemaTableColumn, type GitHubSchemaTableColumns, type GitHubSchemaTableFormatRequiredKeys, type GitHubSchemaTableFormattedColumn, type GitHubSchemaTableOptions, type ManagedDocumentSource, type OidcTokenIssuerShape, type PackageManagerInstallOptions, type PackageManagerInstallerShape, type PairsOptions, type PathPrependEnv, type PathPrependOptions, type ProvisionFileOptions, type ProvisionOptions, type ProvisionedFile, type ReadOptions, type ReadinessOptions, type RecordedOutputMember, type RecordingOutputs, type S3Config, type StoredBlob, type ToolDownloadOptions, type ToolInstallerShape, type UploadOptions, type UploadResult, type WithBufferOptions, type WithStepOptions, WorkflowCommand };
5106
5147
  //# sourceMappingURL=index.d.ts.map