@sparkwing/sdk 0.0.0-stage → 0.68.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/README.md +183 -2
  2. package/dist/command.js +272 -0
  3. package/dist/command.js.map +1 -0
  4. package/dist/context.js +69 -0
  5. package/dist/context.js.map +1 -0
  6. package/dist/describe.js +70 -0
  7. package/dist/describe.js.map +1 -0
  8. package/dist/errors.js +88 -0
  9. package/dist/errors.js.map +1 -0
  10. package/dist/helpers/docker.js +267 -0
  11. package/dist/helpers/docker.js.map +1 -0
  12. package/dist/helpers/files.js +141 -0
  13. package/dist/helpers/files.js.map +1 -0
  14. package/dist/helpers/git.js +263 -0
  15. package/dist/helpers/git.js.map +1 -0
  16. package/dist/helpers/memo.js +29 -0
  17. package/dist/helpers/memo.js.map +1 -0
  18. package/dist/helpers/services.js +160 -0
  19. package/dist/helpers/services.js.map +1 -0
  20. package/dist/index.js +10 -0
  21. package/dist/index.js.map +1 -0
  22. package/dist/json.js +27 -0
  23. package/dist/json.js.map +1 -0
  24. package/dist/log.js +42 -0
  25. package/dist/log.js.map +1 -0
  26. package/dist/main.js +68 -0
  27. package/dist/main.js.map +1 -0
  28. package/dist/plan-wire.js +2 -0
  29. package/dist/plan-wire.js.map +1 -0
  30. package/dist/plan.js +811 -0
  31. package/dist/plan.js.map +1 -0
  32. package/dist/protocol.js +209 -0
  33. package/dist/protocol.js.map +1 -0
  34. package/dist/routes.js +185 -0
  35. package/dist/routes.js.map +1 -0
  36. package/dist/runner.js +380 -0
  37. package/dist/runner.js.map +1 -0
  38. package/dist/scope.js +27 -0
  39. package/dist/scope.js.map +1 -0
  40. package/dist/step-state.js +53 -0
  41. package/dist/step-state.js.map +1 -0
  42. package/dist/transport.js +50 -0
  43. package/dist/transport.js.map +1 -0
  44. package/index.d.ts +390 -0
  45. package/native/win32-arm64/protocol.node +0 -0
  46. package/native/win32-arm64/verification.json +1 -0
  47. package/native/win32-x64/protocol.node +0 -0
  48. package/native/win32-x64/verification.json +1 -0
  49. package/package.json +47 -4
package/README.md CHANGED
@@ -1,3 +1,184 @@
1
- # Temporary Holding Version
1
+ # @sparkwing/sdk
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ Declare Sparkwing pipelines in TypeScript. The host schedules jobs and owns
4
+ placement, retries, risk authorization, storage and credentials. SDK processes
5
+ build declarations and execute the bodies and closures the host requests.
6
+
7
+ ```ts
8
+ import { definePipeline, main } from "@sparkwing/sdk";
9
+
10
+ definePipeline({
11
+ name: "check",
12
+ args: [{ name: "target", type: "string", default: "all" }],
13
+ secrets: [{ name: "DEPLOY_TOKEN", optional: true }],
14
+ plan(plan, run) {
15
+ const build = plan
16
+ .job("build", async (ctx) => {
17
+ await ctx.exec(["npm", "run", "build"]).run();
18
+ return { target: run.args.target };
19
+ })
20
+ .artifacts("dist/**");
21
+ plan
22
+ .job("report", async (ctx) => {
23
+ const output = await ctx.output(build);
24
+ await ctx.summary(`Built ${output?.target}`);
25
+ })
26
+ .needs(build)
27
+ .consumes(build, { into: "build-output" });
28
+ },
29
+ });
30
+
31
+ await main();
32
+ ```
33
+
34
+ `name` is the registration key. The `entrypoint` of a `sparkwing.yaml`
35
+ pipeline names it, and the run context's `pipeline` carries the invoked name.
36
+
37
+ Declare allowed child runs with `job.startsChildren("deploy")` for the parent
38
+ repository or `job.startsChildrenIn("gh:123", "publish")` for an explicit canonical
39
+ repository key. Calls append targets and can be chained.
40
+
41
+ Use an exact package version in `.sparkwing/package.json`. Its version selects
42
+ the matching engine. The package requires Node.js 22.18 or later. The public
43
+ API is [index.d.ts](index.d.ts).
44
+
45
+ Numeric duration options use milliseconds. Memory uses bytes. Omitted options
46
+ remain unset. Explicit zero remains zero, including an
47
+ indefinite approval timeout. Argument values stay strings, including `int64`.
48
+ The host validates arguments after describe and before planning. Empty defaults
49
+ mean no default. Required arguments with non-empty defaults are refused. NaN and
50
+ infinity are refused. Help and describe inspect declarations without requiring
51
+ invocation values. Errors come from host preparation as `invalid_args`.
52
+ Duration arguments use Go syntax such as `1h30m`, including `0`, `+0` and `-0`.
53
+ String-array arguments use comma splitting, trimming and empty-item removal in
54
+ both the raw argument map and typed values. The host trims enum choices and checks
55
+ each list item. Scalar string values keep their whitespace.
56
+ SDK declarations and direct `toDoc()` calls rely on host validation of argument
57
+ schemas, plan graphs and secret declarations. Generated jobs carry argument
58
+ declarations in their job specification. The host validates and prepares values
59
+ from the accepted run snapshot after generation, then sends them with execution
60
+ requests. Enable `extra` for supplied flags that only a generator declares. Annotation locations are validated
61
+ by the host service; TypeScript retains transport type checks.
62
+ Initial jobs may only use argument declarations discovered by zero-input describe,
63
+ with job IDs allowed to change. The gated expansion path registers secrets for new
64
+ generated declarations before execution.
65
+
66
+ `Context` provides lazy secrets and plain variables, typed outputs, references,
67
+ annotations, summaries, acknowledged masking, OIDC, child runs and cleanup.
68
+ Command, Git, Docker, service and filesystem helpers use the same context
69
+ and cancellation signal. Memo helpers declare input recipes for host evaluation. Plan callbacks declare work; helpers that perform I/O
70
+ refuse calls during planning. Generated jobs reconstruct from recorded source
71
+ output. The host validates the reconstructed declarations against accepted state.
72
+
73
+ Step output reads stay within the current attempt. Before a step condition or
74
+ body runs, the host supplies the terminal predecessor state. A skipped predecessor
75
+ has no local output. A terminal step cannot run again in the same attempt.
76
+ Run facts stay read-only across planning and retries, including trigger details
77
+ and nested pull-request facts.
78
+ Cancellation reaches bodies and every closure kind. A callback that finishes
79
+ after cancellation still reports a failed invocation. The SDK acknowledges
80
+ cancellation after the selected operations finish and receive their own replies.
81
+ Closure evaluations run in request order. Canceling a queued evaluation returns
82
+ without calling its author code or waiting for the running closure. Overlapping
83
+ generator replays return the recorded declaration after the first evaluation.
84
+ Service scopes also reject after cancellation when their callback returns normally.
85
+ They remove their containers before rejecting. If removal fails, host cleanup
86
+ stays registered and the cancellation error is preserved.
87
+
88
+ Git fileset hashes omit files beneath literal directory paths in `.dockerignore`,
89
+ including paths written without a trailing slash. Included file edits still
90
+ change the hash.
91
+
92
+ The host starts `node <entry> --sw-node-protocol`. Protocol 2 begins with hello,
93
+ which supplies granted runner identity and an optional in-memory service binding.
94
+ Requests and frames use private pipes. Standard output and error remain author
95
+ output. No preload or environment bearer is used. The SDK does not filter debug
96
+ logs or assign job identity to log frames.
97
+
98
+ Every encoded frame must fit the 17 MiB wire limit. Oversized logs fail before
99
+ writing. Typed job and step outputs also have a separate 16 MiB limit.
100
+ Generated declarations use the frame budget. The Sparkwing host masks output and
101
+ protocol payloads after receiving them from the SDK. Pipeline code run without a
102
+ Sparkwing host has unmasked logs and errors.
103
+
104
+ Memo helpers declare recipes in the plan. The executing host evaluates them
105
+ against its checkout and effective job environment, under the job admission
106
+ permit. Tracked inputs encode paths, entry types and file bytes or symlink target
107
+ text. Tree inputs include regular files and skip symlinks. Custom callbacks return
108
+ JSON values for host hashing. `memoKey` collects parts and performs no hashing.
109
+
110
+ On Windows, the host supplies decimal handles through
111
+ `--sw-protocol-handles <request>,<frame>`. A packaged native bridge converts them
112
+ to Node descriptors and clears inheritance before SDK tools spawn. Independently
113
+ imported modules may execute before SDK initialization.
114
+
115
+ Build and verify each bridge in its matching native Windows MSVC environment,
116
+ with Node and Go running on that architecture:
117
+
118
+ ```sh
119
+ npm run release:native -- --version <engine-version> --headers <node-headers/include/node> --node-lib <node.lib> --arch x64
120
+ ```
121
+
122
+ Repeat with `--arch arm64` on native Windows arm64. The command stamps both npm
123
+ manifests, builds the bridge and runs `TestNativeProtocol` and
124
+ `TestNativeConformance`. Missing, skipped or failed native tests stop the build.
125
+ Each output directory contains `protocol.node` and a `verification.json` record
126
+ bound to the engine version, bridge bytes and SDK sources.
127
+
128
+ Build both architectures from the same source and version. Transfer their output
129
+ directories to the package checkout, then assemble the package:
130
+
131
+ ```sh
132
+ npm run release:pack -- --version <engine-version> --destination <output-directory>
133
+ ```
134
+
135
+ The release package must contain `native/win32-x64/protocol.node` and
136
+ `native/win32-arm64/protocol.node`. `npm pack` refuses the development version
137
+ and inconsistent lockfile versions. It also checks both bridge files and their
138
+ architecture and DLL headers. Both matching native verification records are
139
+ required because header checks cannot prove that Node can load and use a bridge.
140
+ The bridge source is in [native/protocol.c](native/protocol.c). End users need
141
+ no compiler.
142
+
143
+ ## Local dogfooding
144
+
145
+ On Linux or macOS, build a local package without Windows bridges:
146
+
147
+ ```sh
148
+ npm ci
149
+ npm run pack:local -- --version <engine-version> --destination <output-directory>
150
+ ```
151
+
152
+ This command builds the SDK and stamps a temporary package with the exact engine
153
+ release version. It leaves the source manifests unchanged. The tarball carries
154
+ `private: true`, so npm refuses publication even with `--ignore-scripts`.
155
+ Use `release:pack` with verified Windows bridges for published packages.
156
+ Local packages support Linux and macOS. They cannot run on Windows.
157
+
158
+ In the pipeline's package manifest, pin the tarball with
159
+ `"@sparkwing/sdk": "file:vendor/sparkwing-sdk-<engine-version>.tgz"` and run
160
+ `npm install` to record it in the lockfile. The tarball's package version selects
161
+ the exact engine, including any prerelease suffix. Commit the tarball inside the
162
+ repository if fetched checkouts need it. An editable SDK directory can use
163
+ `file:../sdk` after building and stamping that directory's package version.
164
+
165
+ For development, run `npm ci`, `npm run typecheck`, `npm test` and `npm run build`.
166
+ The build emits ESM into `dist/`; package exports expose only the public root.
167
+ The release process stamps `package.json` and its lockfile with the engine
168
+ release version. Hello reads that package version.
169
+
170
+ Run `npm run test:native` from this directory with the repository's Go toolchain
171
+ installed and `GOWORK=off` when a parent workspace points at another checkout.
172
+ The tests build the SDK and launch public-package fixtures with inherited
173
+ Unix descriptors or Windows argv handles. It exchanges requests and replies
174
+ using the Go contract types and check that a child tool cannot access the
175
+ protocol pipes. A second fixture runs the same v2 corpus as the Go SDK, including
176
+ strict plan validation, generated hashes, replay and canonical error envelopes. Use Node and Go for the same CPU architecture. On Windows,
177
+ build the matching native bridge first. Missing Node, TypeScript dependencies
178
+ or bridge binaries fail the test.
179
+
180
+ The Go acceptance suite also runs SDK boundary tests for the protocol scenarios.
181
+ These tests use native pipes, fake bound services and a temporary Git file remote.
182
+ Run the native pipe test on Windows to verify raw handles there. Controller
183
+ authorization, store transitions, artifact/memo persistence, real DinD and the
184
+ six placement paths require their corresponding integration hosts.
@@ -0,0 +1,272 @@
1
+ import { spawn } from "node:child_process";
2
+ import { randomUUID } from "node:crypto";
3
+ import { isAbsolute, resolve } from "node:path";
4
+ import { assertExecution, projectRoot } from "./scope.js";
5
+ export const exitNotStarted = -1;
6
+ const bindings = new WeakMap();
7
+ export class ExecError extends Error {
8
+ command;
9
+ stdout;
10
+ stderr;
11
+ exitCode;
12
+ terminated;
13
+ constructor(result, terminated = "", cause) {
14
+ let message = terminated
15
+ ? `command terminated by ${terminated}: ${result.command}`
16
+ : result.exitCode === exitNotStarted
17
+ ? `command failed to start: ${result.command}`
18
+ : `command failed (exit ${result.exitCode}): ${result.command}`;
19
+ const output = result.stderr.trim() || result.stdout.trim();
20
+ if (cause instanceof Error && (terminated || result.exitCode === exitNotStarted))
21
+ message += `: ${cause.message}`;
22
+ else if (output)
23
+ message += `\n${output}`;
24
+ super(message, cause === undefined ? undefined : { cause });
25
+ this.name = "ExecError";
26
+ this.command = result.command;
27
+ this.stdout = result.stdout;
28
+ this.stderr = result.stderr;
29
+ this.exitCode = result.exitCode;
30
+ this.terminated = terminated;
31
+ }
32
+ }
33
+ export function registerCommandContext(ctx, emit, env = {}) {
34
+ bindings.set(ctx, { emit, env: { ...env } });
35
+ }
36
+ function binding(ctx) {
37
+ return bindings.get(ctx) ?? { emit: (event, attrs) => ctx.log.info(event, attrs), env: {} };
38
+ }
39
+ function deriveContext(ctx, signal, env) {
40
+ const derived = Object.create(ctx);
41
+ const registered = bindings.has(ctx);
42
+ Object.defineProperties(derived, {
43
+ signal: { value: signal, enumerable: true },
44
+ exec: {
45
+ value: (argv, options) => registered ? createCommand(derived, argv, options) : ctx.exec.call(derived, argv, { ...options, env: { ...env, ...options?.env } }),
46
+ },
47
+ bash: {
48
+ value: (script, options) => registered
49
+ ? createCommand(derived, ["bash", "-c", script], options)
50
+ : ctx.bash.call(derived, script, { ...options, env: { ...env, ...options?.env } }),
51
+ },
52
+ });
53
+ if (registered)
54
+ registerCommandContext(derived, binding(ctx).emit, env);
55
+ return derived;
56
+ }
57
+ export function withCommandEnv(ctx, env) {
58
+ return deriveContext(ctx, ctx.signal, { ...binding(ctx).env, ...env });
59
+ }
60
+ export function withSignal(ctx, signal) {
61
+ return deriveContext(ctx, signal, binding(ctx).env);
62
+ }
63
+ export function cleanupContext(ctx) {
64
+ return withSignal(ctx, new AbortController().signal);
65
+ }
66
+ export function createCommand(ctx, argv, options = {}) {
67
+ let cwd = options.cwd;
68
+ const env = Object.assign(Object.create(null), options.env);
69
+ const args = [argv[0], ...argv.slice(1)];
70
+ const execute = (capture) => runCommand(ctx, args, { ...(cwd === undefined ? {} : { cwd }), env, capture });
71
+ return {
72
+ dir(value) {
73
+ cwd = value;
74
+ return this;
75
+ },
76
+ env(name, value) {
77
+ env[name] = value;
78
+ return this;
79
+ },
80
+ envMap(values) {
81
+ Object.assign(env, values);
82
+ return this;
83
+ },
84
+ run() {
85
+ return execute(false);
86
+ },
87
+ capture() {
88
+ return execute(true);
89
+ },
90
+ async string() {
91
+ return (await execute(true)).stdout.trim();
92
+ },
93
+ async lines() {
94
+ return (await execute(true)).stdout
95
+ .split("\n")
96
+ .map((line) => line.trim())
97
+ .filter(Boolean);
98
+ },
99
+ async json() {
100
+ const result = await execute(true);
101
+ try {
102
+ return JSON.parse(result.stdout);
103
+ }
104
+ catch (cause) {
105
+ throw new Error(`parse JSON from ${result.command}`, { cause });
106
+ }
107
+ },
108
+ async mustBeEmpty(reason) {
109
+ const output = (await execute(true)).stdout.trim();
110
+ if (output)
111
+ throw new Error(`${reason}:\n${output}`);
112
+ },
113
+ };
114
+ }
115
+ const protocolEnv = new Set([
116
+ "SPARKWING_NODE_TOKEN",
117
+ "SPARKWING_AGENT_TOKEN",
118
+ "SPARKWING_CACHE_GRANT",
119
+ "SPARKWING_SOURCE_TOKEN",
120
+ "SPARKWING_API_TOKEN",
121
+ "SPARKWING_LEASE_TOKEN",
122
+ "SPARKWING_SECRETS_KEY",
123
+ "SPARKWING_SECRETS_PREVIOUS_KEY",
124
+ "SPARKWING_RELEASE_SIGNING_KEY",
125
+ "SPARKWING_NODE_URL",
126
+ "SPARKWING_PROTOCOL_HANDLES",
127
+ "SPARKWING_CONTROLLER_URL",
128
+ ]);
129
+ function commandEnv(ctx, options) {
130
+ const env = Object.create(null);
131
+ for (const layer of [process.env, binding(ctx).env, options.env ?? {}]) {
132
+ for (const [name, value] of Object.entries(layer)) {
133
+ const key = process.platform === "win32" ? name.toUpperCase() : name;
134
+ if (!protocolEnv.has(key) && !key.startsWith("SPARKWING_NODE_CLAIM_"))
135
+ env[key] = value;
136
+ }
137
+ }
138
+ return env;
139
+ }
140
+ export function runInput(ctx, argv, input, options = {}) {
141
+ return runCommand(ctx, argv, { ...options, input, capture: true });
142
+ }
143
+ export async function runCommand(ctx, argv, options = {}) {
144
+ assertExecution();
145
+ const command = argv[0] === "bash" && argv[1] === "-c" && argv.length === 3 ? argv[2] : argv.join(" ");
146
+ const emit = binding(ctx).emit;
147
+ const started = performance.now();
148
+ let result = { command, stdout: "", stderr: "", exitCode: exitNotStarted };
149
+ let terminated = "";
150
+ emit("exec_start", { command });
151
+ try {
152
+ if (ctx.signal.aborted)
153
+ throw new ExecError(result, "cancellation", ctx.signal.reason);
154
+ const cwd = options.cwd !== undefined && isAbsolute(options.cwd) ? options.cwd : resolve(projectRoot(), options.cwd ?? "");
155
+ const child = spawn(argv[0], argv.slice(1), {
156
+ cwd,
157
+ env: commandEnv(ctx, options),
158
+ detached: process.platform !== "win32",
159
+ // safety: Only these three handles are inherited; protocol handles never enter a tool.
160
+ stdio: [options.input === undefined ? "ignore" : "pipe", "pipe", "pipe"],
161
+ windowsHide: true,
162
+ });
163
+ const completion = await collectCommand(ctx, child, options, emit);
164
+ result = { command, stdout: completion.stdout, stderr: completion.stderr, exitCode: completion.exitCode };
165
+ terminated = completion.terminated;
166
+ if (completion.cause !== undefined || result.exitCode !== 0 || terminated)
167
+ throw new ExecError(result, terminated, completion.cause);
168
+ return result;
169
+ }
170
+ catch (cause) {
171
+ const error = cause instanceof ExecError ? cause : new ExecError(result, terminated, cause);
172
+ terminated = error.terminated;
173
+ throw error;
174
+ }
175
+ finally {
176
+ emit("exec_end", { command, exit_code: result.exitCode, duration_ms: performance.now() - started, terminated });
177
+ }
178
+ }
179
+ function collectCommand(ctx, child, options, emit) {
180
+ return new Promise((resolveDone) => {
181
+ let cause;
182
+ let cancelled = false;
183
+ const kill = () => {
184
+ try {
185
+ terminate(child, commandEnv(ctx, {}));
186
+ }
187
+ catch (error) {
188
+ cause ??= error;
189
+ }
190
+ };
191
+ const abort = () => {
192
+ cancelled = true;
193
+ kill();
194
+ };
195
+ const onError = (error) => {
196
+ cause ??= error;
197
+ kill();
198
+ };
199
+ const commandID = randomUUID();
200
+ const stdout = collectStream(child.stdout, "stdout", `${commandID}:stdout`, options.stdout, options.capture === true, emit, onError);
201
+ const stderr = collectStream(child.stderr, "stderr", `${commandID}:stderr`, options.stderr, options.capture === true, emit, onError);
202
+ child.on("error", (error) => {
203
+ cause ??= error;
204
+ });
205
+ ctx.signal.addEventListener("abort", abort, { once: true });
206
+ if (ctx.signal.aborted)
207
+ abort();
208
+ child.once("close", (code, signal) => {
209
+ ctx.signal.removeEventListener("abort", abort);
210
+ resolveDone({
211
+ stdout: stdout(),
212
+ stderr: stderr(),
213
+ exitCode: cancelled || code === null || code < 0 ? exitNotStarted : code,
214
+ terminated: cancelled ? "cancellation" : signal ? "signal" : "",
215
+ cause: cancelled ? ctx.signal.reason : (cause ?? (signal ? new Error(`process received ${signal}`) : undefined)),
216
+ });
217
+ });
218
+ if (child.stdin) {
219
+ child.stdin.on("error", onError);
220
+ child.stdin.end(options.input);
221
+ }
222
+ });
223
+ }
224
+ function collectStream(stream, name, streamID, callback, silent, emit, onError) {
225
+ const chunks = [];
226
+ stream?.on("data", (chunk) => {
227
+ chunks.push(Buffer.from(chunk));
228
+ try {
229
+ callback?.(chunk);
230
+ if (!silent)
231
+ emit("exec_chunk", { stream: streamID, source: name, data: chunk.toString("base64") });
232
+ }
233
+ catch (error) {
234
+ onError(error);
235
+ }
236
+ });
237
+ stream?.on("error", onError);
238
+ stream?.once("end", () => {
239
+ if (silent)
240
+ return;
241
+ try {
242
+ emit("exec_chunk", { stream: streamID, source: name, end: true });
243
+ }
244
+ catch (error) {
245
+ onError(error);
246
+ }
247
+ });
248
+ return () => Buffer.concat(chunks).toString("utf8");
249
+ }
250
+ function terminate(child, env) {
251
+ if (child.pid === undefined)
252
+ return;
253
+ if (process.platform === "win32") {
254
+ const killer = spawn("taskkill", ["/pid", String(child.pid), "/T", "/F"], { env, stdio: "ignore", windowsHide: true });
255
+ killer.once("error", () => {
256
+ child.kill("SIGKILL");
257
+ });
258
+ killer.once("exit", (code) => {
259
+ if (code !== 0)
260
+ child.kill("SIGKILL");
261
+ });
262
+ return;
263
+ }
264
+ try {
265
+ process.kill(-child.pid, "SIGKILL");
266
+ }
267
+ catch (error) {
268
+ if (!(error instanceof Error && "code" in error && error.code === "ESRCH"))
269
+ throw error;
270
+ }
271
+ }
272
+ //# sourceMappingURL=command.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"command.js","sourceRoot":"","sources":["../src/command.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import { createCommand, registerCommandContext } from "./command.js";
2
+ import { SDKError, failure } from "./errors.js";
3
+ import { LogWriter } from "./log.js";
4
+ export function makeContext(options) {
5
+ const { run, signal, jobId } = options;
6
+ const log = new LogWriter(options.frames, options.stepId);
7
+ const services = () => {
8
+ signal.throwIfAborted();
9
+ if (!options.services)
10
+ throw failure("unavailable", "this process has no bound host services");
11
+ return options.services;
12
+ };
13
+ const read = async (name, variable) => {
14
+ const declaration = options.definition.secrets?.find((s) => s.name === name && Boolean(s.variable) === variable);
15
+ if (!declaration)
16
+ throw failure("forbidden", "value was not declared by this pipeline", { reason: "secret_undeclared" });
17
+ try {
18
+ return await services().secret(name, signal);
19
+ }
20
+ catch (error) {
21
+ if (declaration.optional && error instanceof SDKError && error.code === "not_found")
22
+ return undefined;
23
+ throw error;
24
+ }
25
+ };
26
+ const ctx = {
27
+ run,
28
+ jobId,
29
+ args: options.args,
30
+ dryRun: run.dryRun,
31
+ runner: run.runner,
32
+ signal,
33
+ log,
34
+ ...(options.stepId === undefined ? {} : { stepId: options.stepId }),
35
+ ...(options.failure === undefined ? {} : { failure: options.failure }),
36
+ secret: (name) => read(name, false),
37
+ variable: (name) => read(name, true),
38
+ output: (job) => services().output(typeof job === "string" ? job : job.id, signal),
39
+ stepOutput: (step) => options.outputs.get(typeof step === "string" ? step : step.id),
40
+ annotate: async (annotation) => {
41
+ checkAnnotation(annotation);
42
+ await services().annotate(annotation, signal, options.stepId);
43
+ },
44
+ summary: async (markdown) => {
45
+ if (typeof markdown !== "string")
46
+ throw failure("bad_request", "summary markdown must be a string");
47
+ await services().summary(markdown, signal, options.stepId);
48
+ },
49
+ mask: (value) => services().mask(value, signal),
50
+ oidcToken: (audience) => services().oidcToken(audience, signal),
51
+ runPipeline: (pipeline, job, child = {}) => services().runPipeline(pipeline, job, child, signal),
52
+ latest: (ref) => services().latest(ref, signal),
53
+ cleanup: (spec) => services().cleanup(spec, signal),
54
+ exec: (argv, opts) => createCommand(ctx, argv, opts),
55
+ bash: (script, opts) => createCommand(ctx, ["bash", "-c", script], opts),
56
+ };
57
+ registerCommandContext(ctx, (event, attrs) => log.event(event, attrs), options.bodyEnv);
58
+ return ctx;
59
+ }
60
+ function checkAnnotation(annotation) {
61
+ if (typeof annotation.message !== "string")
62
+ throw failure("bad_request", "annotation message must be a string");
63
+ if (annotation.level !== undefined && typeof annotation.level !== "string")
64
+ throw failure("bad_request", "annotation level must be a string");
65
+ for (const value of [annotation.line, annotation.endLine, annotation.column])
66
+ if (value !== undefined && !Number.isSafeInteger(value))
67
+ throw failure("bad_request", "annotation location must be an integer");
68
+ }
69
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,70 @@
1
+ import { Plan, pipelines } from "./plan.js";
2
+ import { SDKError, errorFields } from "./errors.js";
3
+ export function argument(spec, jobID) {
4
+ const arg = { name: spec.name, type: spec.type, required: spec.required ?? false };
5
+ if (spec.short !== undefined)
6
+ arg.short = spec.short;
7
+ if (spec.description !== undefined)
8
+ arg.desc = spec.description;
9
+ if (spec.default !== undefined && spec.default !== "")
10
+ arg.default = spec.default;
11
+ if (spec.enum !== undefined)
12
+ arg.enum = [...spec.enum];
13
+ if (spec.secret !== undefined)
14
+ arg.secret = spec.secret;
15
+ if (jobID !== undefined)
16
+ arg.job_id = jobID;
17
+ return arg;
18
+ }
19
+ export async function describe(run) {
20
+ const descriptions = [];
21
+ const definitions = pipelines();
22
+ for (const definition of definitions) {
23
+ const plan = new Plan();
24
+ try {
25
+ const entry = { name: definition.name, args: (definition.args ?? []).map((spec) => argument(spec)) };
26
+ if (definition.short !== undefined)
27
+ entry.short = definition.short;
28
+ const help = definition.help ?? definition.description;
29
+ if (help !== undefined)
30
+ entry.help = help;
31
+ if (definition.extra !== undefined)
32
+ entry.extra = definition.extra;
33
+ if (definition.examples)
34
+ entry.examples = definition.examples.map((example) => ({ command: example.command, comment: example.comment ?? "" }));
35
+ if (definition.envVars)
36
+ entry.env_vars = definition.envVars.map((env) => ({ ...env }));
37
+ if (definition.secrets)
38
+ entry.secrets = definition.secrets.map((secret) => ({
39
+ name: secret.name,
40
+ ...(secret.optional === undefined ? {} : { optional: secret.optional }),
41
+ }));
42
+ const args = {};
43
+ await definition.plan(plan, { ...run, pipeline: definition.name, args });
44
+ const risks = new Set();
45
+ const byStep = [];
46
+ for (const job of plan.jobs()) {
47
+ entry.args.push(...job.argSpecs().map((spec) => argument(spec, job.id)));
48
+ for (const step of job.steps()) {
49
+ const labels = step.toSpec().risks ?? [];
50
+ if (labels.length)
51
+ byStep.push({ job_id: job.id, step_id: step.id, labels });
52
+ for (const label of labels)
53
+ risks.add(label);
54
+ }
55
+ }
56
+ if (risks.size)
57
+ entry.risks = [...risks].sort();
58
+ if (byStep.length)
59
+ entry.risks_by_step = byStep;
60
+ plan.seal();
61
+ descriptions.push(entry);
62
+ }
63
+ catch (error) {
64
+ const message = error instanceof Error ? error.message : String(error);
65
+ descriptions.push({ name: definition.name, args: [], error: errorFields(new SDKError(`describe pipeline ${JSON.stringify(definition.name)}: ${message}`, { code: "plan_failed" })) });
66
+ }
67
+ }
68
+ return { pipelines: descriptions };
69
+ }
70
+ //# sourceMappingURL=describe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"describe.js","sourceRoot":"","sources":["../src/describe.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAoB,MAAM,aAAa,CAAC;AA8BtE,MAAM,UAAU,QAAQ,CAAC,IAAa,EAAE,KAAc;IACpD,MAAM,GAAG,GAAgB,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK,EAAE,CAAC;IAChG,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS;QAAE,GAAG,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;IACrD,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS;QAAE,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;IAChE,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,IAAI,IAAI,CAAC,OAAO,KAAK,EAAE;QAAE,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IAClF,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS;QAAE,GAAG,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC;IACvD,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS;QAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACxD,IAAI,KAAK,KAAK,SAAS;QAAE,GAAG,CAAC,MAAM,GAAG,KAAK,CAAC;IAC5C,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,GAAe;IAC5C,MAAM,YAAY,GAAuB,EAAE,CAAC;IAC5C,MAAM,WAAW,GAAG,SAAS,EAAE,CAAC;IAChC,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;QACrC,MAAM,IAAI,GAAG,IAAI,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC;YACH,MAAM,KAAK,GAAqB,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YACvH,IAAI,UAAU,CAAC,KAAK,KAAK,SAAS;gBAAE,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC;YACnE,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,IAAI,UAAU,CAAC,WAAW,CAAC;YACvD,IAAI,IAAI,KAAK,SAAS;gBAAE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;YAC1C,IAAI,UAAU,CAAC,KAAK,KAAK,SAAS;gBAAE,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC;YACnE,IAAI,UAAU,CAAC,QAAQ;gBACrB,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;YACxH,IAAI,UAAU,CAAC,OAAO;gBAAE,KAAK,CAAC,QAAQ,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;YACvF,IAAI,UAAU,CAAC,OAAO;gBACpB,KAAK,CAAC,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;oBAClD,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,GAAG,CAAC,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC;iBACxE,CAAC,CAAC,CAAC;YACN,MAAM,IAAI,GAAG,EAAE,CAAC;YAChB,MAAM,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,GAAG,GAAG,EAAE,QAAQ,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACzE,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;YAChC,MAAM,MAAM,GAAmD,EAAE,CAAC;YAClE,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;gBAC9B,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;gBACzE,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC;oBAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;oBACzC,IAAI,MAAM,CAAC,MAAM;wBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC;oBAC7E,KAAK,MAAM,KAAK,IAAI,MAAM;wBAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;gBAC/C,CAAC;YACH,CAAC;YACD,IAAI,KAAK,CAAC,IAAI;gBAAE,KAAK,CAAC,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;YAChD,IAAI,MAAM,CAAC,MAAM;gBAAE,KAAK,CAAC,aAAa,GAAG,MAAM,CAAC;YAChD,IAAI,CAAC,IAAI,EAAE,CAAC;YACZ,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;YACvE,YAAY,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,KAAK,EAAE,WAAW,CAAC,IAAI,QAAQ,CAAC,qBAAqB,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;QACxL,CAAC;IACH,CAAC;IACD,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,CAAC;AACrC,CAAC"}