@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/Action.js +13 -12
- package/ActionCache.js +1 -2
- package/ActionEnvironment.js +21 -6
- package/ActionInput.js +37 -55
- package/ActionLogger.js +27 -10
- package/ActionOutputs.js +27 -8
- package/ActionState.js +31 -2
- package/ActionsIdentityToken.js +2 -1
- package/ActionsProvenance.js +2 -1
- package/Artifact.js +4 -8
- package/BlobEnvelope.js +41 -15
- package/BlobStore.githubCache.js +11 -4
- package/BlobStore.js +8 -7
- package/CacheKey.js +6 -7
- package/ChildEnv.js +2 -5
- package/DetachedProcess.js +8 -11
- package/GitHubMarkdown.js +8 -10
- package/GitHubToken.js +12 -14
- package/ManagedDocument.js +3 -4
- package/OidcTokenIssuer.js +11 -7
- package/PackageManagerInstaller.js +10 -3
- package/README.md +4 -4
- package/Secret.js +10 -17
- package/ToolInstaller.js +12 -6
- package/index.d.ts +334 -293
- package/index.js +1 -1
- package/internal/actionsResults.js +0 -12
- package/internal/archiveCommands.js +0 -66
- package/internal/cacheService.js +0 -16
- package/internal/digest.js +0 -13
- package/internal/jwt.js +0 -17
- package/internal/pnpmExe.js +0 -15
- package/internal/runnerFile.js +0 -16
- package/internal/sigv4.js +1 -4
- package/internal/unstubbed.js +0 -12
- package/package.json +12 -11
- package/WorkflowCommand.js +0 -100
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
|
|
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
|
|
183
|
-
*
|
|
184
|
-
*
|
|
185
|
-
*
|
|
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
|
|
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:
|
|
412
|
-
*
|
|
413
|
-
*
|
|
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
|
|
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
|
-
/**
|
|
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
|
|
497
|
-
*
|
|
498
|
-
*
|
|
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
|
|
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).
|
|
690
|
-
*
|
|
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**
|
|
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 (
|
|
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
|
|
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
|
|
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.**
|
|
959
|
-
*
|
|
960
|
-
*
|
|
961
|
-
*
|
|
962
|
-
*
|
|
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.
|
|
972
|
-
*
|
|
973
|
-
*
|
|
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
|
-
*
|
|
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
|
|
1195
|
-
*
|
|
1196
|
-
*
|
|
1197
|
-
*
|
|
1198
|
-
*
|
|
1199
|
-
*
|
|
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
|
|
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 `
|
|
1570
|
-
*
|
|
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
|
-
*
|
|
1581
|
-
*
|
|
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
|
|
1637
|
-
*
|
|
1638
|
-
*
|
|
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
|
|
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
|
|
1679
|
-
*
|
|
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
|
|
1747
|
-
*
|
|
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
|
|
1783
|
-
* an empty key
|
|
1784
|
-
*
|
|
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
|
|
1809
|
-
*
|
|
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
|
|
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
|
|
1830
|
+
* through as the joined spelling only.
|
|
1838
1831
|
*
|
|
1839
|
-
*
|
|
1840
|
-
*
|
|
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.
|
|
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
|
|
1875
|
-
*
|
|
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
|
|
1895
|
-
*
|
|
1896
|
-
*
|
|
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:
|
|
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
|
|
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,
|
|
2064
|
-
*
|
|
2065
|
-
*
|
|
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
|
|
2101
|
-
*
|
|
2102
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
|
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.**
|
|
2391
|
-
*
|
|
2392
|
-
*
|
|
2393
|
-
*
|
|
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
|
|
2520
|
-
*
|
|
2521
|
-
*
|
|
2522
|
-
*
|
|
2523
|
-
*
|
|
2524
|
-
*
|
|
2525
|
-
*
|
|
2526
|
-
*
|
|
2527
|
-
*
|
|
2528
|
-
*
|
|
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
|
|
2532
|
-
*
|
|
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
|
-
/**
|
|
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
|
-
/**
|
|
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
|
|
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
|
-
/**
|
|
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:
|
|
2633
|
-
*
|
|
2634
|
-
*
|
|
2635
|
-
*
|
|
2636
|
-
*
|
|
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
|
-
*
|
|
2639
|
-
*
|
|
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,
|
|
2698
|
-
*
|
|
2699
|
-
*
|
|
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
|
-
/**
|
|
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).
|
|
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
|
|
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
|
|
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
|
|
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`.
|
|
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
|
|
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.
|
|
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
|
|
3549
|
-
*
|
|
3550
|
-
*
|
|
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
|
|
3562
|
-
* A probe whose failures are meaningfully distinct should
|
|
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
|
|
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
|
|
3865
|
-
*
|
|
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
|
|
3878
|
-
*
|
|
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.
|
|
3945
|
-
*
|
|
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
|
-
*
|
|
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
|
|
4040
|
-
*
|
|
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
|
-
*
|
|
4045
|
-
*
|
|
4046
|
-
*
|
|
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
|
|
4098
|
-
*
|
|
4099
|
-
*
|
|
4100
|
-
* failure in this
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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
|
|
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 —
|
|
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)
|
|
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
|
-
*
|
|
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
|
|
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
|
|
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
|
|
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
|
-
*
|
|
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
|
-
*
|
|
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.
|
|
5067
|
-
*
|
|
5068
|
-
*
|
|
5069
|
-
*
|
|
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
|
-
*
|
|
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
|
|
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
|