@lionden/plugin-deploy 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.
Files changed (59) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +23 -0
  3. package/dist/deploy-task.d.ts +83 -0
  4. package/dist/deploy-task.d.ts.map +1 -0
  5. package/dist/deploy-task.js +599 -0
  6. package/dist/deploy-task.js.map +1 -0
  7. package/dist/deployment-manager.d.ts +80 -0
  8. package/dist/deployment-manager.d.ts.map +1 -0
  9. package/dist/deployment-manager.js +521 -0
  10. package/dist/deployment-manager.js.map +1 -0
  11. package/dist/deployment-state.d.ts +40 -0
  12. package/dist/deployment-state.d.ts.map +1 -0
  13. package/dist/deployment-state.js +204 -0
  14. package/dist/deployment-state.js.map +1 -0
  15. package/dist/deployment-types.d.ts +112 -0
  16. package/dist/deployment-types.d.ts.map +1 -0
  17. package/dist/deployment-types.js +9 -0
  18. package/dist/deployment-types.js.map +1 -0
  19. package/dist/errors.d.ts +7 -0
  20. package/dist/errors.d.ts.map +1 -0
  21. package/dist/errors.js +10 -0
  22. package/dist/errors.js.map +1 -0
  23. package/dist/index.d.ts +13 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +184 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/leo-sources.d.ts +11 -0
  28. package/dist/leo-sources.d.ts.map +1 -0
  29. package/dist/leo-sources.js +31 -0
  30. package/dist/leo-sources.js.map +1 -0
  31. package/dist/leo-version.d.ts +2 -0
  32. package/dist/leo-version.d.ts.map +1 -0
  33. package/dist/leo-version.js +10 -0
  34. package/dist/leo-version.js.map +1 -0
  35. package/dist/on-chain-check.d.ts +34 -0
  36. package/dist/on-chain-check.d.ts.map +1 -0
  37. package/dist/on-chain-check.js +84 -0
  38. package/dist/on-chain-check.js.map +1 -0
  39. package/dist/preflight.d.ts +94 -0
  40. package/dist/preflight.d.ts.map +1 -0
  41. package/dist/preflight.js +288 -0
  42. package/dist/preflight.js.map +1 -0
  43. package/dist/prove.d.ts +11 -0
  44. package/dist/prove.d.ts.map +1 -0
  45. package/dist/prove.js +19 -0
  46. package/dist/prove.js.map +1 -0
  47. package/dist/recipe-task.d.ts +18 -0
  48. package/dist/recipe-task.d.ts.map +1 -0
  49. package/dist/recipe-task.js +201 -0
  50. package/dist/recipe-task.js.map +1 -0
  51. package/dist/recipe-types.d.ts +95 -0
  52. package/dist/recipe-types.d.ts.map +1 -0
  53. package/dist/recipe-types.js +10 -0
  54. package/dist/recipe-types.js.map +1 -0
  55. package/dist/upgrade-task.d.ts +30 -0
  56. package/dist/upgrade-task.d.ts.map +1 -0
  57. package/dist/upgrade-task.js +315 -0
  58. package/dist/upgrade-task.js.map +1 -0
  59. package/package.json +39 -0
@@ -0,0 +1,80 @@
1
+ /**
2
+ * DeploymentManager — facade for deployment state, preflight, export, and recovery.
3
+ *
4
+ * Session policy:
5
+ * - Devnode: memory-first. Every async read validates against getProgramSource().
6
+ * - HTTP: disk state trusted after .network.json metadata validation.
7
+ */
8
+ import type { LionDenResolvedConfig } from "@lionden/config";
9
+ import type { ArtifactStore } from "@lionden/core";
10
+ import type { ProgramABI } from "@lionden/leo-compiler";
11
+ import type { NetworkConnection, NetworkManager } from "@lionden/network";
12
+ import type { DeploymentHistoryEntry, DeploymentRecord, ExportBundle, PendingDeployment, RecoveredDeploymentRecord } from "./deployment-types.js";
13
+ import type { DeployPreflightResult } from "./preflight.js";
14
+ export interface PreflightOptions {
15
+ /** Default: config.defaultNetwork */
16
+ network?: string;
17
+ /** Default: config.deploy.skipDeployed */
18
+ skipDeployed?: boolean;
19
+ }
20
+ export interface RecordOptions {
21
+ abi?: ProgramABI;
22
+ historyEntry?: Partial<DeploymentHistoryEntry>;
23
+ }
24
+ export interface DeploymentManager {
25
+ getDeployment(programId: string, network?: string): Promise<DeploymentRecord | null>;
26
+ getAllDeployments(network?: string): Promise<DeploymentRecord[]>;
27
+ isDeployed(programId: string, network?: string): Promise<boolean>;
28
+ getHistory(programId: string, network?: string): Promise<DeploymentHistoryEntry[]>;
29
+ getCached(programId: string, network?: string): DeploymentRecord | null;
30
+ isCachedDeployed(programId: string, network?: string): boolean;
31
+ record(record: DeploymentRecord, action: "deploy" | "upgrade", options?: RecordOptions): Promise<void>;
32
+ setPending(pending: PendingDeployment): Promise<void>;
33
+ getPending(network: string, programId: string): Promise<PendingDeployment | null>;
34
+ clearPending(network: string, programId: string): Promise<void>;
35
+ recoverPendingDeployments(network: string, connection: NetworkConnection): Promise<RecoveredDeploymentRecord[]>;
36
+ preflight(programIds: string[], options?: PreflightOptions): Promise<DeployPreflightResult>;
37
+ export(network?: string): Promise<ExportBundle>;
38
+ isEphemeral(network: string): boolean;
39
+ getCachedAbi(programId: string, network?: string): ProgramABI | null;
40
+ invalidateSession(network: string): void;
41
+ }
42
+ export declare class DeploymentManagerImpl implements DeploymentManager {
43
+ private readonly config;
44
+ private readonly networkAccessor;
45
+ private readonly artifacts;
46
+ /** In-memory cache: network → programId → record */
47
+ private readonly cache;
48
+ /** In-memory ABI cache: network → programId → ABI (populated by record() for all networks) */
49
+ private readonly abiCache;
50
+ /** Memoized metadata validation results: network → "valid" | "invalid" | null */
51
+ private readonly metadataValidated;
52
+ constructor(config: LionDenResolvedConfig, networkAccessor: () => NetworkManager | null, artifacts: ArtifactStore);
53
+ private get deploymentsDir();
54
+ private resolveNetwork;
55
+ private networkCache;
56
+ private networkAbiCache;
57
+ isEphemeral(network: string): boolean;
58
+ getCachedAbi(programId: string, network?: string): ProgramABI | null;
59
+ private requireProgramEdition;
60
+ /**
61
+ * Validate .network.json for an HTTP network before trusting disk state.
62
+ * Throws on mismatch. Returns true when valid, false when metadata absent + no records.
63
+ */
64
+ private validateHttpMetadata;
65
+ getDeployment(programId: string, network?: string): Promise<DeploymentRecord | null>;
66
+ getAllDeployments(network?: string): Promise<DeploymentRecord[]>;
67
+ isDeployed(programId: string, network?: string): Promise<boolean>;
68
+ getHistory(programId: string, network?: string): Promise<DeploymentHistoryEntry[]>;
69
+ getCached(programId: string, network?: string): DeploymentRecord | null;
70
+ isCachedDeployed(programId: string, network?: string): boolean;
71
+ record(record: DeploymentRecord, action: "deploy" | "upgrade", options?: RecordOptions): Promise<void>;
72
+ setPending(pending: PendingDeployment): Promise<void>;
73
+ getPending(network: string, programId: string): Promise<PendingDeployment | null>;
74
+ clearPending(network: string, programId: string): Promise<void>;
75
+ recoverPendingDeployments(network: string, connection: NetworkConnection): Promise<RecoveredDeploymentRecord[]>;
76
+ preflight(programIds: string[], options?: PreflightOptions): Promise<DeployPreflightResult>;
77
+ export(network?: string): Promise<ExportBundle>;
78
+ invalidateSession(network: string): void;
79
+ }
80
+ //# sourceMappingURL=deployment-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployment-manager.d.ts","sourceRoot":"","sources":["../src/deployment-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,521 @@
1
+ /**
2
+ * DeploymentManager — facade for deployment state, preflight, export, and recovery.
3
+ *
4
+ * Session policy:
5
+ * - Devnode: memory-first. Every async read validates against getProgramSource().
6
+ * - HTTP: disk state trusted after .network.json metadata validation.
7
+ */
8
+ import { discoverUnits, parseAbi, resolveDependencies } from "@lionden/leo-compiler";
9
+ import { appendHistory, deletePendingMarker, listPendingMarkers, readAbiSnapshot, readAllDeploymentRecords, readDeploymentRecord, readHistory, readNetworkMetadata, readPendingMarker, writeAbiSnapshot, writeDeploymentRecord, writeExportBundle, writeNetworkMetadata, writePendingMarker, } from "./deployment-state.js";
10
+ import { checkProgramOnChain, createDegradedRecord } from "./on-chain-check.js";
11
+ import { runDeployPreflight } from "./preflight.js";
12
+ // ---------------------------------------------------------------------------
13
+ // DeploymentManagerImpl
14
+ // ---------------------------------------------------------------------------
15
+ export class DeploymentManagerImpl {
16
+ config;
17
+ networkAccessor;
18
+ artifacts;
19
+ /** In-memory cache: network → programId → record */
20
+ cache = new Map();
21
+ /** In-memory ABI cache: network → programId → ABI (populated by record() for all networks) */
22
+ abiCache = new Map();
23
+ /** Memoized metadata validation results: network → "valid" | "invalid" | null */
24
+ metadataValidated = new Map();
25
+ constructor(config, networkAccessor, artifacts) {
26
+ this.config = config;
27
+ this.networkAccessor = networkAccessor;
28
+ this.artifacts = artifacts;
29
+ }
30
+ get deploymentsDir() {
31
+ return this.config.paths.deployments;
32
+ }
33
+ resolveNetwork(network) {
34
+ return network ?? this.config.defaultNetwork;
35
+ }
36
+ networkCache(network) {
37
+ let nc = this.cache.get(network);
38
+ if (!nc) {
39
+ nc = new Map();
40
+ this.cache.set(network, nc);
41
+ }
42
+ return nc;
43
+ }
44
+ networkAbiCache(network) {
45
+ let ac = this.abiCache.get(network);
46
+ if (!ac) {
47
+ ac = new Map();
48
+ this.abiCache.set(network, ac);
49
+ }
50
+ return ac;
51
+ }
52
+ // ---------------------------------------------------------------------------
53
+ // Ephemeral
54
+ // ---------------------------------------------------------------------------
55
+ isEphemeral(network) {
56
+ const nc = this.config.networks[network];
57
+ return nc?.ephemeral ?? nc?.type === "devnode";
58
+ }
59
+ getCachedAbi(programId, network) {
60
+ const net = this.resolveNetwork(network);
61
+ return this.abiCache.get(net)?.get(programId) ?? null;
62
+ }
63
+ requireProgramEdition(programId, edition, actionDescription) {
64
+ if (typeof edition === "number" && Number.isInteger(edition) && edition >= 0) {
65
+ return edition;
66
+ }
67
+ throw new Error(`Unable to ${actionDescription} for "${programId}": on-chain program edition could not be observed.`);
68
+ }
69
+ // ---------------------------------------------------------------------------
70
+ // HTTP metadata validation
71
+ // ---------------------------------------------------------------------------
72
+ /**
73
+ * Validate .network.json for an HTTP network before trusting disk state.
74
+ * Throws on mismatch. Returns true when valid, false when metadata absent + no records.
75
+ */
76
+ async validateHttpMetadata(network) {
77
+ // Already validated this session
78
+ if (this.metadataValidated.get(network) === true)
79
+ return;
80
+ const networkConfig = this.config.networks[network];
81
+ if (!networkConfig || networkConfig.type !== "http")
82
+ return;
83
+ const meta = readNetworkMetadata(this.deploymentsDir, network);
84
+ if (meta !== null) {
85
+ // Metadata exists — validate it matches config
86
+ const configEndpoint = networkConfig.endpoint;
87
+ const configNetworkId = networkConfig.network;
88
+ if (meta.type !== "http" ||
89
+ meta.networkId !== configNetworkId ||
90
+ meta.endpoint !== configEndpoint) {
91
+ throw new Error(`Network metadata mismatch for "${network}": ` +
92
+ `config says type=${networkConfig.type}, networkId=${configNetworkId}, endpoint=${configEndpoint} ` +
93
+ `but deployments/.network.json says type=${meta.type}, networkId=${meta.networkId}, endpoint=${meta.endpoint}. ` +
94
+ `This may mean the network was reconfigured. ` +
95
+ `Delete deployments/${network}/ to reset.`);
96
+ }
97
+ this.metadataValidated.set(network, true);
98
+ return;
99
+ }
100
+ // Metadata absent — check if any record files exist
101
+ const records = readAllDeploymentRecords(this.deploymentsDir, network);
102
+ if (records.length > 0) {
103
+ throw new Error(`Deployment records exist for "${network}" but .network.json is missing. ` +
104
+ `This state is unverifiable. ` +
105
+ `Delete deployments/${network}/ and re-deploy, or create .network.json manually.`);
106
+ }
107
+ // Empty state — metadata will be written on first record()
108
+ this.metadataValidated.set(network, true);
109
+ }
110
+ // ---------------------------------------------------------------------------
111
+ // Async reads
112
+ // ---------------------------------------------------------------------------
113
+ async getDeployment(programId, network) {
114
+ const net = this.resolveNetwork(network);
115
+ const networkConfig = this.config.networks[net];
116
+ const nc = this.networkCache(net);
117
+ if (networkConfig?.type === "devnode") {
118
+ // Devnode: always validate on-chain
119
+ const manager = this.networkAccessor();
120
+ const connection = manager?.getConnection();
121
+ if (!connection) {
122
+ // No connection yet — return cache only
123
+ return nc.get(programId) ?? null;
124
+ }
125
+ const onChain = await checkProgramOnChain(connection, programId);
126
+ if (!onChain.exists) {
127
+ nc.delete(programId);
128
+ return null;
129
+ }
130
+ // On-chain — return existing record (cache preferred, disk as fallback).
131
+ // Disk fallback only for non-ephemeral devnode (ephemeral: false opt-in).
132
+ // When ephemeral (default), disk state is never read — it may be stale from
133
+ // a previous session or process.
134
+ const existing = nc.get(programId) ??
135
+ (this.isEphemeral(net) ? null : readDeploymentRecord(this.deploymentsDir, net, programId));
136
+ if (existing) {
137
+ nc.set(programId, existing);
138
+ return existing;
139
+ }
140
+ const observedEdition = this.requireProgramEdition(programId, onChain.edition, "create degraded deployment record");
141
+ const degraded = createDegradedRecord(programId, net, connection.endpoint, onChain.source, observedEdition);
142
+ nc.set(programId, degraded);
143
+ return degraded;
144
+ }
145
+ // HTTP network
146
+ if (this.isEphemeral(net)) {
147
+ // Ephemeral HTTP: cache-only, skip metadata validation and disk reads
148
+ return nc.get(programId) ?? null;
149
+ }
150
+ await this.validateHttpMetadata(net);
151
+ const existing = nc.get(programId) ?? readDeploymentRecord(this.deploymentsDir, net, programId);
152
+ if (existing) {
153
+ const manager = this.networkAccessor();
154
+ if (!manager) {
155
+ throw new Error(`Unable to validate deployment record for "${programId}" on "${net}": network manager is not available.`);
156
+ }
157
+ const connection = await manager.connect(net);
158
+ const onChain = await checkProgramOnChain(connection, programId);
159
+ if (!onChain.exists) {
160
+ nc.delete(programId);
161
+ return null;
162
+ }
163
+ nc.set(programId, existing);
164
+ return existing;
165
+ }
166
+ return null;
167
+ }
168
+ async getAllDeployments(network) {
169
+ const net = this.resolveNetwork(network);
170
+ const networkConfig = this.config.networks[net];
171
+ const nc = this.networkCache(net);
172
+ if (networkConfig?.type === "devnode") {
173
+ const manager = this.networkAccessor();
174
+ const connection = manager?.getConnection();
175
+ if (!connection) {
176
+ return [...nc.values()];
177
+ }
178
+ const candidateIds = new Set(nc.keys());
179
+ if (!this.isEphemeral(net)) {
180
+ for (const record of readAllDeploymentRecords(this.deploymentsDir, net)) {
181
+ if (!candidateIds.has(record.programId)) {
182
+ candidateIds.add(record.programId);
183
+ }
184
+ }
185
+ }
186
+ const records = [];
187
+ for (const programId of candidateIds) {
188
+ const record = await this.getDeployment(programId, net);
189
+ if (record) {
190
+ records.push(record);
191
+ }
192
+ }
193
+ return records;
194
+ }
195
+ if (this.isEphemeral(net)) {
196
+ // Ephemeral HTTP: cache-only
197
+ return [...nc.values()];
198
+ }
199
+ // Non-ephemeral: validate metadata (HTTP) then read from disk
200
+ if (networkConfig?.type === "http") {
201
+ await this.validateHttpMetadata(net);
202
+ }
203
+ const candidateIds = new Set(nc.keys());
204
+ for (const record of readAllDeploymentRecords(this.deploymentsDir, net)) {
205
+ candidateIds.add(record.programId);
206
+ }
207
+ const records = [];
208
+ for (const programId of candidateIds) {
209
+ const record = await this.getDeployment(programId, net);
210
+ if (record) {
211
+ records.push(record);
212
+ }
213
+ }
214
+ return records;
215
+ }
216
+ async isDeployed(programId, network) {
217
+ return (await this.getDeployment(programId, network)) !== null;
218
+ }
219
+ async getHistory(programId, network) {
220
+ const net = this.resolveNetwork(network);
221
+ if (this.isEphemeral(net))
222
+ return [];
223
+ return readHistory(this.deploymentsDir, net, programId);
224
+ }
225
+ // ---------------------------------------------------------------------------
226
+ // Sync reads (cache-only)
227
+ // ---------------------------------------------------------------------------
228
+ getCached(programId, network) {
229
+ return this.networkCache(this.resolveNetwork(network)).get(programId) ?? null;
230
+ }
231
+ isCachedDeployed(programId, network) {
232
+ return this.getCached(programId, network) !== null;
233
+ }
234
+ // ---------------------------------------------------------------------------
235
+ // State mutations
236
+ // ---------------------------------------------------------------------------
237
+ async record(record, action, options) {
238
+ const net = record.network;
239
+ const programId = record.programId;
240
+ const edition = record.edition;
241
+ if (!(typeof edition === "number" && Number.isInteger(edition) && edition >= 0)) {
242
+ throw new Error(`Cannot record deployment for "${programId}": on-chain program edition is required.`);
243
+ }
244
+ // Enforce ABI for complete records — export consumers rely on it
245
+ if (record.status === "complete" && !options?.abi) {
246
+ throw new Error(`ABI is required when recording a complete deployment for "${programId}". ` +
247
+ `Pass options.abi to manager.record() when status is "complete".`);
248
+ }
249
+ const ephemeral = this.isEphemeral(net);
250
+ if (!ephemeral) {
251
+ // Write network metadata on first record() for HTTP networks
252
+ const networkConfig = this.config.networks[net];
253
+ if (networkConfig?.type === "http") {
254
+ const existing = readNetworkMetadata(this.deploymentsDir, net);
255
+ if (!existing) {
256
+ const meta = {
257
+ type: "http",
258
+ networkId: networkConfig.network,
259
+ endpoint: networkConfig.endpoint,
260
+ };
261
+ writeNetworkMetadata(this.deploymentsDir, net, meta);
262
+ this.metadataValidated.set(net, true);
263
+ }
264
+ }
265
+ // Write ABI snapshot if provided
266
+ if (options?.abi) {
267
+ writeAbiSnapshot(this.deploymentsDir, net, programId, options.abi);
268
+ }
269
+ // Write deployment record
270
+ writeDeploymentRecord(this.deploymentsDir, net, record);
271
+ // Append history
272
+ const historyEntry = {
273
+ record,
274
+ action,
275
+ ...(options?.historyEntry ?? {}),
276
+ };
277
+ appendHistory(this.deploymentsDir, net, programId, historyEntry);
278
+ }
279
+ // Always: populate in-memory ABI cache when ABI provided.
280
+ // Normalize through parseAbi() so getCachedAbi() always returns a fully-normalized
281
+ // ProgramABI with `transitions` (not the compiler's `functions` format). The artifact
282
+ // store's lazy disk fallback returns raw JSON.parse() output (compiler format), so
283
+ // options.abi may arrive un-normalized when it came through lre.artifacts.getAbi().
284
+ if (options?.abi) {
285
+ const raw = options.abi;
286
+ const normalized = parseAbi(JSON.stringify(raw));
287
+ this.networkAbiCache(net).set(programId, normalized);
288
+ }
289
+ // Always: update in-memory record cache
290
+ this.networkCache(net).set(programId, record);
291
+ if (!ephemeral) {
292
+ // Clear pending marker (atomically committed)
293
+ deletePendingMarker(this.deploymentsDir, net, programId);
294
+ }
295
+ }
296
+ async setPending(pending) {
297
+ if (!this.isEphemeral(pending.network)) {
298
+ writePendingMarker(this.deploymentsDir, pending.network, pending);
299
+ }
300
+ }
301
+ async getPending(network, programId) {
302
+ if (this.isEphemeral(network))
303
+ return null;
304
+ await this.validateHttpMetadata(network);
305
+ return readPendingMarker(this.deploymentsDir, network, programId);
306
+ }
307
+ async clearPending(network, programId) {
308
+ if (!this.isEphemeral(network)) {
309
+ deletePendingMarker(this.deploymentsDir, network, programId);
310
+ }
311
+ }
312
+ // ---------------------------------------------------------------------------
313
+ // Recovery
314
+ // ---------------------------------------------------------------------------
315
+ async recoverPendingDeployments(network, connection) {
316
+ if (this.isEphemeral(network))
317
+ return []; // No markers to recover in ephemeral mode
318
+ await this.validateHttpMetadata(network);
319
+ const markerIds = listPendingMarkers(this.deploymentsDir, network);
320
+ const recovered = [];
321
+ for (const programId of markerIds) {
322
+ const marker = readPendingMarker(this.deploymentsDir, network, programId);
323
+ if (!marker)
324
+ continue;
325
+ const onChain = await checkProgramOnChain(connection, programId);
326
+ if (!onChain.exists) {
327
+ // Not on-chain — delete marker, nothing to recover
328
+ deletePendingMarker(this.deploymentsDir, network, programId);
329
+ console.info(`[DeploymentManager] Pending deployment for "${programId}" not found on-chain. ` +
330
+ `The transaction may not have been broadcast. Clearing pending marker.`);
331
+ continue;
332
+ }
333
+ let recoveredEdition;
334
+ if (marker.action === "deploy") {
335
+ recoveredEdition =
336
+ typeof onChain.edition === "number" &&
337
+ Number.isInteger(onChain.edition) &&
338
+ onChain.edition >= 0
339
+ ? onChain.edition
340
+ : 0;
341
+ }
342
+ else {
343
+ recoveredEdition = this.requireProgramEdition(programId, onChain.edition, "recover pending deployment");
344
+ if (typeof marker.previousEdition !== "number" ||
345
+ !Number.isInteger(marker.previousEdition) ||
346
+ marker.previousEdition < 0) {
347
+ deletePendingMarker(this.deploymentsDir, network, programId);
348
+ console.info(`[DeploymentManager] Pending upgrade for "${programId}" did not advance on-chain. ` +
349
+ `Clearing pending marker.`);
350
+ continue;
351
+ }
352
+ if (recoveredEdition <= marker.previousEdition) {
353
+ if (typeof marker.blockHeight === "number") {
354
+ console.info(`[DeploymentManager] Confirmed upgrade for "${programId}" has not propagated to edition reads yet. ` +
355
+ `Keeping pending marker.`);
356
+ continue;
357
+ }
358
+ deletePendingMarker(this.deploymentsDir, network, programId);
359
+ console.info(`[DeploymentManager] Pending upgrade for "${programId}" did not advance on-chain. ` +
360
+ `Clearing pending marker.`);
361
+ continue;
362
+ }
363
+ }
364
+ const existingRecord = this.networkCache(network).get(programId) ??
365
+ (this.isEphemeral(network)
366
+ ? null
367
+ : readDeploymentRecord(this.deploymentsDir, network, programId));
368
+ // On-chain — build RecoveredDeploymentRecord
369
+ const recoveredRecord = {
370
+ status: "recovered",
371
+ programId,
372
+ sourceProgramId: marker.sourceProgramId,
373
+ network,
374
+ endpoint: connection.endpoint,
375
+ updatedAt: new Date().toISOString(),
376
+ edition: recoveredEdition,
377
+ historyCount: existingRecord ? existingRecord.historyCount + 1 : 0,
378
+ txId: marker.txId ?? null,
379
+ blockHeight: marker.blockHeight ?? null,
380
+ deployerAddress: marker.deployerAddress,
381
+ deployedAt: marker.startedAt,
382
+ feePaid: null,
383
+ };
384
+ await this.record(recoveredRecord, marker.action, {
385
+ historyEntry: { action: marker.action },
386
+ });
387
+ recovered.push(recoveredRecord);
388
+ console.info(`[DeploymentManager] Recovered ${marker.action} for "${programId}".`);
389
+ }
390
+ return recovered;
391
+ }
392
+ // ---------------------------------------------------------------------------
393
+ // Preflight (programmatic API)
394
+ // ---------------------------------------------------------------------------
395
+ async preflight(programIds, options) {
396
+ const network = options?.network ?? this.config.defaultNetwork;
397
+ const skipDeployed = options?.skipDeployed ?? this.config.deploy.skipDeployed;
398
+ const networkConfig = this.config.networks[network];
399
+ if (!networkConfig) {
400
+ throw new Error(`Network "${network}" not found in config. ` +
401
+ `Available: ${Object.keys(this.config.networks).join(", ") || "none"}`);
402
+ }
403
+ const manager = this.networkAccessor();
404
+ if (!manager) {
405
+ throw new Error("Network manager not available. Ensure @lionden/plugin-network is loaded.");
406
+ }
407
+ const connection = await manager.connect(network);
408
+ // Normalize program IDs
409
+ const normalizedIds = programIds.map((id) => (id.endsWith(".aleo") ? id : `${id}.aleo`));
410
+ // Build the dependency graph. discoverUnits() reads .leo source files without
411
+ // compilation.
412
+ const programsDir = this.config.paths.programs;
413
+ const discovered = discoverUnits(programsDir);
414
+ let graph;
415
+ try {
416
+ graph = resolveDependencies(discovered);
417
+ }
418
+ catch (err) {
419
+ // Propagate dependency resolution failures (e.g. cycles, malformed imports)
420
+ // as a fatal preflight error rather than silently using an empty graph.
421
+ const message = err instanceof Error ? err.message : String(err);
422
+ return {
423
+ passed: false,
424
+ warnings: [],
425
+ errors: [
426
+ {
427
+ code: "DEPENDENCY_RESOLUTION_FAILED",
428
+ message: `Failed to resolve program dependencies: ${message}`,
429
+ recoverable: false,
430
+ },
431
+ ],
432
+ programs: normalizedIds.map((programId) => ({
433
+ programId,
434
+ action: "deploy",
435
+ })),
436
+ totalFeeEstimate: undefined,
437
+ };
438
+ }
439
+ // Build program entries: aleoSource from artifacts.
440
+ // getDeployment() (async, validates disk/on-chain) gives accurate existing state.
441
+ const programs = [];
442
+ for (const programId of normalizedIds) {
443
+ const aleoSource = this.artifacts.getAleoSource(programId);
444
+ const existingRecord = await this.getDeployment(programId, network);
445
+ programs.push({
446
+ programId,
447
+ aleoSource: typeof aleoSource === "string" ? aleoSource : undefined,
448
+ existingRecord,
449
+ });
450
+ }
451
+ const deployTargets = new Set(normalizedIds);
452
+ const localSources = new Map();
453
+ for (const p of programs) {
454
+ if (p.aleoSource !== undefined) {
455
+ localSources.set(p.programId, p.aleoSource);
456
+ }
457
+ }
458
+ return runDeployPreflight({
459
+ programs,
460
+ connection,
461
+ networkConfig,
462
+ config: this.config,
463
+ skipDeployed,
464
+ deployTargets,
465
+ localSources,
466
+ graph,
467
+ });
468
+ }
469
+ // ---------------------------------------------------------------------------
470
+ // Export
471
+ // ---------------------------------------------------------------------------
472
+ async export(network) {
473
+ const net = this.resolveNetwork(network);
474
+ const networkConfig = this.config.networks[net];
475
+ const ephemeral = this.isEphemeral(net);
476
+ const records = await this.getAllDeployments(net);
477
+ const programs = {};
478
+ for (const record of records) {
479
+ // Ephemeral: skip disk ABI snapshot, use memory cache → artifacts
480
+ // Non-ephemeral: disk snapshot → memory cache → artifacts
481
+ const snapshotAbi = ephemeral
482
+ ? null
483
+ : readAbiSnapshot(this.deploymentsDir, net, record.programId);
484
+ const cachedAbi = this.getCachedAbi(record.programId, net);
485
+ const artifactAbi = this.artifacts.getAbi(record.programId);
486
+ const abi = snapshotAbi ?? cachedAbi ?? artifactAbi ?? null;
487
+ programs[record.programId] = {
488
+ programId: record.programId,
489
+ abi,
490
+ txId: record.status === "complete" ? record.txId : null,
491
+ status: record.status,
492
+ };
493
+ }
494
+ const endpoint = networkConfig?.type === "http"
495
+ ? networkConfig.endpoint
496
+ : networkConfig?.type === "devnode"
497
+ ? `http://${networkConfig.socketAddr ?? "127.0.0.1:3030"}`
498
+ : "unknown";
499
+ const bundle = {
500
+ network: net,
501
+ networkInfo: {
502
+ type: networkConfig?.type ?? "devnode",
503
+ networkId: networkConfig?.network ?? "testnet",
504
+ endpoint,
505
+ },
506
+ exportedAt: new Date().toISOString(),
507
+ programs,
508
+ };
509
+ writeExportBundle(this.deploymentsDir, net, bundle);
510
+ return bundle;
511
+ }
512
+ // ---------------------------------------------------------------------------
513
+ // Session
514
+ // ---------------------------------------------------------------------------
515
+ invalidateSession(network) {
516
+ this.cache.delete(network);
517
+ this.abiCache.delete(network);
518
+ this.metadataValidated.delete(network);
519
+ }
520
+ }
521
+ //# sourceMappingURL=deployment-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deployment-manager.js","sourceRoot":"","sources":["../src/deployment-manager.ts"],"names":[],"mappings":"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"}