@aldus-runtime/release 0.1.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/dist/bundle.js ADDED
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Release bundles (architecture contract §17).
3
+ *
4
+ * A bundle is a **declaration**, not a record of what happened: contract §17 states that
5
+ * "publishing is a domain, not a single command", and the bundle is the domain's unit of intent.
6
+ * What happened lives in `ReleaseReceipt`s, one per operation, in the Run's `release.json`
7
+ * (§7).
8
+ *
9
+ * There is deliberately no persisted bundle state. Execution state is derived from the receipts
10
+ * on every inspection, for the same reason ADR-0009 derives gate state rather than storing it: a
11
+ * stored "in progress" flag survives a crash that the operation it describes did not, and an
12
+ * operator then reads a status that was true once and is not true now.
13
+ */
14
+ import { createHash } from "node:crypto";
15
+ import { ReleaseErrorCodes, releaseError } from "./errors.js";
16
+ /** Every operation in a bundle, required first, in execution order. */
17
+ export function operationsOf(bundle) {
18
+ return [...bundle.required, ...bundle.bestEffort];
19
+ }
20
+ /**
21
+ * Check a bundle's internal consistency.
22
+ *
23
+ * @throws {AldusError} `ALDUS_RELEASE_EMPTY_BUNDLE` if it declares no operations.
24
+ * @throws {AldusError} `ALDUS_RELEASE_DUPLICATE_OPERATION` if an `operationId` repeats.
25
+ */
26
+ export function assertBundleValid(bundle) {
27
+ const operations = operationsOf(bundle);
28
+ if (operations.length === 0) {
29
+ throw releaseError(ReleaseErrorCodes.EMPTY_BUNDLE, `Release bundle "${bundle.bundleId}" declares no operations, so executing it would report ` +
30
+ "a successful release that published nothing.", { category: "validation", details: { bundleId: bundle.bundleId } });
31
+ }
32
+ const seen = new Set();
33
+ for (const operation of operations) {
34
+ if (seen.has(operation.operationId)) {
35
+ throw releaseError(ReleaseErrorCodes.DUPLICATE_OPERATION, `Release bundle "${bundle.bundleId}" declares "${operation.operationId}" twice. ` +
36
+ "Operation ids match receipts back to operations, so a duplicate would let one " +
37
+ "operation inherit the other's outcome.", {
38
+ category: "validation",
39
+ details: { bundleId: bundle.bundleId, operationId: operation.operationId },
40
+ });
41
+ }
42
+ seen.add(operation.operationId);
43
+ }
44
+ }
45
+ /**
46
+ * Derive the idempotency key for one operation (contract §17, §19.1).
47
+ *
48
+ * §17 requires each operation to be "independently idempotent and resumable where the platform
49
+ * allows it", and `ReleaseReceipt.idempotencyKey` is the mechanism. The key is **derived, not
50
+ * supplied**, from the bundle, the operation, its destination, and the digests of what it
51
+ * releases — so a resumed execution computes the identical key without having to remember one,
52
+ * and a changed input produces a different key rather than silently reusing an old outcome.
53
+ *
54
+ * Input hashes are sorted before digesting: the set of things released is what matters, not the
55
+ * order a caller happened to list them in.
56
+ */
57
+ export function deriveIdempotencyKey(bundleId, operation) {
58
+ const material = JSON.stringify({
59
+ bundleId,
60
+ operationId: operation.operationId,
61
+ kind: operation.kind,
62
+ destination: operation.destination,
63
+ inputHashes: [...operation.inputHashes].sort(),
64
+ });
65
+ return createHash("sha256").update(material, "utf8").digest("hex");
66
+ }
67
+ //# sourceMappingURL=bundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.js","sourceRoot":"","sources":["../src/bundle.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAuB9D,uEAAuE;AACvE,MAAM,UAAU,YAAY,CAAC,MAAqB;IAChD,OAAO,CAAC,GAAG,MAAM,CAAC,QAAQ,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;AACpD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAAqB;IACrD,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACxC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC5B,MAAM,YAAY,CAChB,iBAAiB,CAAC,YAAY,EAC9B,mBAAmB,MAAM,CAAC,QAAQ,yDAAyD;YACzF,8CAA8C,EAChD,EAAE,QAAQ,EAAE,YAAY,EAAE,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,EAAE,CACnE,CAAC;IACJ,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE,CAAC;YACpC,MAAM,YAAY,CAChB,iBAAiB,CAAC,mBAAmB,EACrC,mBAAmB,MAAM,CAAC,QAAQ,eAAe,SAAS,CAAC,WAAW,WAAW;gBAC/E,gFAAgF;gBAChF,wCAAwC,EAC1C;gBACE,QAAQ,EAAE,YAAY;gBACtB,OAAO,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,QAAQ,EAAE,WAAW,EAAE,SAAS,CAAC,WAAW,EAAE;aAC3E,CACF,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;IAClC,CAAC;AACH,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,oBAAoB,CAAC,QAAgB,EAAE,SAA2B;IAChF,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC;QAC9B,QAAQ;QACR,WAAW,EAAE,SAAS,CAAC,WAAW;QAClC,IAAI,EAAE,SAAS,CAAC,IAAI;QACpB,WAAW,EAAE,SAAS,CAAC,WAAW;QAClC,WAAW,EAAE,CAAC,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC,IAAI,EAAE;KAC/C,CAAC,CAAC;IACH,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACrE,CAAC"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Failures specific to release execution.
3
+ *
4
+ * Aldus Core deliberately keeps no central error-code registry, so that a package can name a new
5
+ * failure without forking Core. These codes are this package's contribution; they carry the same
6
+ * `ALDUS_` prefix and `SCREAMING_SNAKE_CASE` shape so production trace (contract §20) stays
7
+ * uniform across packages.
8
+ */
9
+ import { AldusError, type ErrorCategory } from "@aldus-runtime/core";
10
+ /** Error codes raised by the release executor. */
11
+ export declare const ReleaseErrorCodes: {
12
+ /**
13
+ * An operation was attempted that no gate authorizes.
14
+ *
15
+ * Contract §13.4 binds release approval to the final render, captions, metadata, destination,
16
+ * and visibility policy, and §17 requires uploading and making public to be separate
17
+ * operations. An unauthorized release is refused rather than warned about: a warning that
18
+ * still publishes is not a gate.
19
+ */
20
+ readonly RELEASE_NOT_AUTHORIZED: "ALDUS_RELEASE_NOT_AUTHORIZED";
21
+ /** No adapter is registered for an operation's destination. */
22
+ readonly ADAPTER_NOT_REGISTERED: "ALDUS_RELEASE_ADAPTER_NOT_REGISTERED";
23
+ /** A bundle declared two operations with the same `operationId`. */
24
+ readonly DUPLICATE_OPERATION: "ALDUS_RELEASE_DUPLICATE_OPERATION";
25
+ /** A bundle was constructed with no operations at all. */
26
+ readonly EMPTY_BUNDLE: "ALDUS_RELEASE_EMPTY_BUNDLE";
27
+ /**
28
+ * A required operation failed, so the release did not complete.
29
+ *
30
+ * Distinct from a best-effort failure, which is recorded and does not fail the release
31
+ * (contract §17: "Pre-release hard gates and post-upload best-effort operations MUST be
32
+ * distinguished").
33
+ */
34
+ readonly REQUIRED_OPERATION_FAILED: "ALDUS_RELEASE_REQUIRED_OPERATION_FAILED";
35
+ /**
36
+ * A stored receipt disagrees with the bundle that produced it.
37
+ *
38
+ * The identity of an operation is its `operationId` plus its idempotency key. A receipt whose
39
+ * key no longer matches describes a different operation than the one about to run, and reusing
40
+ * it would let changed inputs inherit an old approval's outcome.
41
+ */
42
+ readonly RECEIPT_MISMATCH: "ALDUS_RELEASE_RECEIPT_MISMATCH";
43
+ /**
44
+ * Reconciliation was required but the adapter cannot look up remote state.
45
+ *
46
+ * Contract §17 requires operations to be resumable "where the platform allows it". Where it
47
+ * does not, the honest outcome is to say so rather than to re-execute and risk a duplicate
48
+ * publish.
49
+ */
50
+ readonly RECONCILIATION_UNAVAILABLE: "ALDUS_RELEASE_RECONCILIATION_UNAVAILABLE";
51
+ };
52
+ /** @see ReleaseErrorCodes */
53
+ export type ReleaseErrorCode = (typeof ReleaseErrorCodes)[keyof typeof ReleaseErrorCodes];
54
+ /** Construct an {@link AldusError} with a release code. */
55
+ export declare function releaseError(code: ReleaseErrorCode, message: string, options: {
56
+ category: ErrorCategory;
57
+ retryable?: boolean;
58
+ details?: Record<string, unknown>;
59
+ }): AldusError;
60
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAErE,kDAAkD;AAClD,eAAO,MAAM,iBAAiB;IAC5B;;;;;;;OAOG;aACH,sBAAsB,EAAE,8BAA8B;IACtD,+DAA+D;aAC/D,sBAAsB,EAAE,sCAAsC;IAC9D,oEAAoE;aACpE,mBAAmB,EAAE,mCAAmC;IACxD,0DAA0D;aAC1D,YAAY,EAAE,4BAA4B;IAC1C;;;;;;OAMG;aACH,yBAAyB,EAAE,yCAAyC;IACpE;;;;;;OAMG;aACH,gBAAgB,EAAE,gCAAgC;IAClD;;;;;;OAMG;aACH,0BAA0B,EAAE,0CAA0C;CAC9D,CAAC;AAEX,6BAA6B;AAC7B,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,OAAO,iBAAiB,CAAC,CAAC;AAE1F,2DAA2D;AAC3D,wBAAgB,YAAY,CAC1B,IAAI,EAAE,gBAAgB,EACtB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE;IAAE,QAAQ,EAAE,aAAa,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAC3F,UAAU,CAEZ"}
package/dist/errors.js ADDED
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Failures specific to release execution.
3
+ *
4
+ * Aldus Core deliberately keeps no central error-code registry, so that a package can name a new
5
+ * failure without forking Core. These codes are this package's contribution; they carry the same
6
+ * `ALDUS_` prefix and `SCREAMING_SNAKE_CASE` shape so production trace (contract §20) stays
7
+ * uniform across packages.
8
+ */
9
+ import { AldusError } from "@aldus-runtime/core";
10
+ /** Error codes raised by the release executor. */
11
+ export const ReleaseErrorCodes = {
12
+ /**
13
+ * An operation was attempted that no gate authorizes.
14
+ *
15
+ * Contract §13.4 binds release approval to the final render, captions, metadata, destination,
16
+ * and visibility policy, and §17 requires uploading and making public to be separate
17
+ * operations. An unauthorized release is refused rather than warned about: a warning that
18
+ * still publishes is not a gate.
19
+ */
20
+ RELEASE_NOT_AUTHORIZED: "ALDUS_RELEASE_NOT_AUTHORIZED",
21
+ /** No adapter is registered for an operation's destination. */
22
+ ADAPTER_NOT_REGISTERED: "ALDUS_RELEASE_ADAPTER_NOT_REGISTERED",
23
+ /** A bundle declared two operations with the same `operationId`. */
24
+ DUPLICATE_OPERATION: "ALDUS_RELEASE_DUPLICATE_OPERATION",
25
+ /** A bundle was constructed with no operations at all. */
26
+ EMPTY_BUNDLE: "ALDUS_RELEASE_EMPTY_BUNDLE",
27
+ /**
28
+ * A required operation failed, so the release did not complete.
29
+ *
30
+ * Distinct from a best-effort failure, which is recorded and does not fail the release
31
+ * (contract §17: "Pre-release hard gates and post-upload best-effort operations MUST be
32
+ * distinguished").
33
+ */
34
+ REQUIRED_OPERATION_FAILED: "ALDUS_RELEASE_REQUIRED_OPERATION_FAILED",
35
+ /**
36
+ * A stored receipt disagrees with the bundle that produced it.
37
+ *
38
+ * The identity of an operation is its `operationId` plus its idempotency key. A receipt whose
39
+ * key no longer matches describes a different operation than the one about to run, and reusing
40
+ * it would let changed inputs inherit an old approval's outcome.
41
+ */
42
+ RECEIPT_MISMATCH: "ALDUS_RELEASE_RECEIPT_MISMATCH",
43
+ /**
44
+ * Reconciliation was required but the adapter cannot look up remote state.
45
+ *
46
+ * Contract §17 requires operations to be resumable "where the platform allows it". Where it
47
+ * does not, the honest outcome is to say so rather than to re-execute and risk a duplicate
48
+ * publish.
49
+ */
50
+ RECONCILIATION_UNAVAILABLE: "ALDUS_RELEASE_RECONCILIATION_UNAVAILABLE",
51
+ };
52
+ /** Construct an {@link AldusError} with a release code. */
53
+ export function releaseError(code, message, options) {
54
+ return new AldusError(code, message, options);
55
+ }
56
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,UAAU,EAAsB,MAAM,qBAAqB,CAAC;AAErE,kDAAkD;AAClD,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B;;;;;;;OAOG;IACH,sBAAsB,EAAE,8BAA8B;IACtD,+DAA+D;IAC/D,sBAAsB,EAAE,sCAAsC;IAC9D,oEAAoE;IACpE,mBAAmB,EAAE,mCAAmC;IACxD,0DAA0D;IAC1D,YAAY,EAAE,4BAA4B;IAC1C;;;;;;OAMG;IACH,yBAAyB,EAAE,yCAAyC;IACpE;;;;;;OAMG;IACH,gBAAgB,EAAE,gCAAgC;IAClD;;;;;;OAMG;IACH,0BAA0B,EAAE,0CAA0C;CAC9D,CAAC;AAKX,2DAA2D;AAC3D,MAAM,UAAU,YAAY,CAC1B,IAAsB,EACtB,OAAe,EACf,OAA4F;IAE5F,OAAO,IAAI,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC"}
@@ -0,0 +1,171 @@
1
+ /**
2
+ * Release execution, resumption, and reconciliation (architecture contract §17, §19.1).
3
+ *
4
+ * Three properties drive the design, and each rules out the obvious implementation:
5
+ *
6
+ * 1. **§17: every operation is independently idempotent and resumable.** So execution is never a
7
+ * transaction over a bundle. Each operation carries its own derived idempotency key and its
8
+ * own receipt, and a half-executed bundle is resumed by skipping what already succeeded.
9
+ *
10
+ * 2. **§17: pre-release hard gates and post-upload best-effort operations are distinguished.**
11
+ * The first failure among required operations stops the bundle — a failed media upload must
12
+ * not be followed by a visibility transition making nothing public. A best-effort failure is
13
+ * recorded and execution continues.
14
+ *
15
+ * 3. **§17: external state must be reconciled, not guessed.** A response lost after the
16
+ * destination accepted a request leaves local records saying nothing happened while something
17
+ * did. Retrying then publishes twice. So an operation whose outcome was recorded as `pending`
18
+ * is never retried; it is looked up, and if the destination cannot be queried the executor
19
+ * refuses rather than risking the duplicate.
20
+ *
21
+ * Nothing about a bundle's progress is stored beyond its receipts. State is derived on every
22
+ * call, for the reason ADR-0009 derives gate state: a stored progress flag survives a crash that
23
+ * the work it describes did not.
24
+ */
25
+ import type { ActorRef, ReleaseReceipt } from "@aldus-runtime/core";
26
+ import type { AdapterRegistry } from "./adapter.js";
27
+ import { type ReleaseBundle } from "./bundle.js";
28
+ import type { OperationCriticality } from "./operation.js";
29
+ import { type ReleaseEventSink, type ReleaseReceiptStore } from "./ports.js";
30
+ import { type ReleaseAuthorizer } from "./authorization.js";
31
+ /** Where one operation stands. */
32
+ export declare const OPERATION_STATES: readonly [
33
+ /** No receipt exists; it has not been attempted. */
34
+ "not_started",
35
+ /** Attempted, outcome unconfirmed. MUST be reconciled, never retried (contract §17). */
36
+ "pending",
37
+ /** Completed at the destination. */
38
+ "succeeded",
39
+ /** Attempted and rejected by the destination. */
40
+ "failed",
41
+ /** Deliberately not attempted — no authority, or nothing to do. */
42
+ "skipped"];
43
+ /** @see OPERATION_STATES */
44
+ export type OperationState = (typeof OPERATION_STATES)[number];
45
+ /** The derived state of one operation in a bundle. */
46
+ export interface OperationStatus {
47
+ operationId: string;
48
+ kind: string;
49
+ destination: string;
50
+ /** Which §17 category the bundle placed it in. */
51
+ criticality: OperationCriticality;
52
+ idempotencyKey: string;
53
+ state: OperationState;
54
+ /** The receipt this state was derived from, if any. */
55
+ receipt?: ReleaseReceipt;
56
+ }
57
+ /** Where a whole bundle stands (contract §19.1 "recovery from partial success"). */
58
+ export interface BundleStatus {
59
+ bundleId: string;
60
+ runId: string;
61
+ /**
62
+ * `succeeded` once every required operation has succeeded, whatever became of the best-effort
63
+ * ones — that is what §17's distinction means in practice.
64
+ */
65
+ state: "not_started" | "in_progress" | "pending" | "failed" | "succeeded";
66
+ operations: OperationStatus[];
67
+ /** Operation ids that still need to run for the release to complete. */
68
+ remaining: string[];
69
+ }
70
+ /** What reconciliation did about one operation. */
71
+ export interface ReconciliationFinding {
72
+ operationId: string;
73
+ idempotencyKey: string;
74
+ action:
75
+ /** A terminal receipt already existed; nothing to do. */
76
+ "already_recorded"
77
+ /** The destination holds the result, so a missing or pending receipt was repaired. */
78
+ | "repaired"
79
+ /** The destination does not hold it, so the operation genuinely still needs to run. */
80
+ | "confirmed_absent"
81
+ /** The adapter cannot query the destination (contract §17 "where the platform allows it"). */
82
+ | "unavailable";
83
+ explanation?: string;
84
+ }
85
+ /** What a reconciliation pass found. */
86
+ export interface ReconciliationReport {
87
+ bundleId: string;
88
+ runId: string;
89
+ findings: ReconciliationFinding[];
90
+ /** Receipts written to repair the local record. */
91
+ repaired: ReleaseReceipt[];
92
+ }
93
+ /** The result of executing a bundle. */
94
+ export interface ReleaseOutcome {
95
+ bundleId: string;
96
+ runId: string;
97
+ /**
98
+ * `succeeded` when every required operation succeeded. A best-effort failure does not change
99
+ * it (contract §17).
100
+ */
101
+ state: "succeeded" | "failed" | "pending";
102
+ status: BundleStatus;
103
+ /** Receipts written by this call, in order. */
104
+ written: ReleaseReceipt[];
105
+ /** Operator-facing notes: best-effort failures, skipped operations, reconciliation actions. */
106
+ warnings: string[];
107
+ }
108
+ /**
109
+ * Options for one reconciliation.
110
+ *
111
+ * Reconciliation writes receipts, which makes it a mutating action, and §19.2 requires a
112
+ * mutating action to record actor identity. A repair attributed to no one is a record an
113
+ * operator cannot question later, so the actor is required rather than defaulted to a system
114
+ * placeholder.
115
+ */
116
+ export interface ReconcileOptions {
117
+ /** Who is reconciling (contract §19.2). */
118
+ actor: ActorRef;
119
+ }
120
+ /** Options for one execution. */
121
+ export interface ExecuteOptions {
122
+ /** Who is releasing (contract §19.2 "mutating actions MUST record actor identity"). */
123
+ actor: ActorRef;
124
+ /**
125
+ * Reconcile before executing. Default `true`.
126
+ *
127
+ * Turning it off is what a blind retry looks like, and it is the unsafe path — it exists so
128
+ * the tests can demonstrate the duplicate publish that reconciliation prevents.
129
+ */
130
+ reconcile?: boolean;
131
+ }
132
+ /** Wiring for a {@link ReleaseExecutor}. */
133
+ export interface ReleaseExecutorOptions {
134
+ adapters: AdapterRegistry;
135
+ receipts: ReleaseReceiptStore;
136
+ events: ReleaseEventSink;
137
+ /** Defaults to permitting everything, which is only correct when no operation needs authority. */
138
+ authorizer?: ReleaseAuthorizer;
139
+ /** Injected for deterministic tests. */
140
+ now?: () => Date;
141
+ /** Injected for deterministic tests. */
142
+ nextReleaseId?: () => string;
143
+ /** Injected for deterministic tests. */
144
+ nextEventId?: () => string;
145
+ }
146
+ /** Executes release bundles, resumably. */
147
+ export declare class ReleaseExecutor {
148
+ #private;
149
+ constructor(options: ReleaseExecutorOptions);
150
+ /**
151
+ * Derive where a bundle stands from its receipts (contract §19.1).
152
+ *
153
+ * Reads only; safe to call at any time, including on a bundle that has never run.
154
+ */
155
+ status(bundle: ReleaseBundle): Promise<BundleStatus>;
156
+ /**
157
+ * Repair the local record against the destinations (contract §17).
158
+ *
159
+ * Only operations without a terminal local receipt are looked up: an operation already
160
+ * recorded as succeeded or failed has an answer, and asking again would turn reconciliation
161
+ * into polling.
162
+ */
163
+ reconcile(bundle: ReleaseBundle, options: ReconcileOptions): Promise<ReconciliationReport>;
164
+ /**
165
+ * Execute a bundle, resuming whatever has already succeeded (contract §17, §19.1).
166
+ *
167
+ * Reconciles first by default, so the safe path is the one a caller gets without asking.
168
+ */
169
+ execute(bundle: ReleaseBundle, options: ExecuteOptions): Promise<ReleaseOutcome>;
170
+ }
171
+ //# sourceMappingURL=executor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"executor.d.ts","sourceRoot":"","sources":["../src/executor.ts"],"names":[],"mappings":"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"}