@treeseed/sdk 0.6.44 → 0.6.46

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.
@@ -139,119 +139,7 @@ export declare function deployProjectPlatform(options: ProjectPlatformActionOpti
139
139
  };
140
140
  railwayResources: {
141
141
  ok: boolean;
142
- checks: ({
143
- type: string;
144
- service: string;
145
- serviceName: string;
146
- projectName: string;
147
- environment: string;
148
- ok: boolean;
149
- status: string;
150
- message: string;
151
- serviceId?: undefined;
152
- projectId?: undefined;
153
- environmentId?: undefined;
154
- instanceId?: undefined;
155
- observed?: undefined;
156
- volumeName?: undefined;
157
- mountPath?: undefined;
158
- } | {
159
- type: string;
160
- service: string;
161
- serviceName: string;
162
- serviceId: string;
163
- projectId: string;
164
- environment: string;
165
- environmentId: string;
166
- instanceId: string | null;
167
- ok: boolean;
168
- status: string;
169
- observed: {
170
- rootDirectory: string | null;
171
- startCommand: string | null;
172
- cronSchedule: string | null;
173
- sleepApplication: boolean | null;
174
- runtimeMode: string | null;
175
- id?: undefined;
176
- name?: undefined;
177
- instances?: undefined;
178
- } | null;
179
- message: string | undefined;
180
- projectName?: undefined;
181
- volumeName?: undefined;
182
- mountPath?: undefined;
183
- } | {
184
- type: string;
185
- service: string;
186
- serviceName: string;
187
- serviceId: string;
188
- projectId: string;
189
- environment: string;
190
- environmentId: string;
191
- volumeName: string;
192
- mountPath: string;
193
- ok: boolean;
194
- status: string;
195
- observed: {
196
- id: string;
197
- name: string;
198
- instances: import("./railway-api.ts").RailwayVolumeInstanceSummary[];
199
- rootDirectory?: undefined;
200
- startCommand?: undefined;
201
- cronSchedule?: undefined;
202
- sleepApplication?: undefined;
203
- runtimeMode?: undefined;
204
- } | null;
205
- message: string | undefined;
206
- projectName?: undefined;
207
- instanceId?: undefined;
208
- } | {
209
- id: null;
210
- ok: boolean;
211
- status: string;
212
- message: string;
213
- service: string;
214
- projectId: string | null;
215
- projectName: string;
216
- serviceId: string | null;
217
- serviceName: string;
218
- environment: string;
219
- environmentId: string | null;
220
- expression: string;
221
- command: string | null;
222
- enabled: boolean;
223
- logicalName: string;
224
- type: string;
225
- instanceId?: undefined;
226
- observed?: undefined;
227
- volumeName?: undefined;
228
- mountPath?: undefined;
229
- } | {
230
- id: string | null;
231
- projectId: string;
232
- serviceId: string;
233
- environmentId: string;
234
- ok: boolean;
235
- status: string;
236
- observed: {
237
- expression: string | null;
238
- command: string | null;
239
- enabled: boolean;
240
- } | null;
241
- message: string | undefined;
242
- service: string;
243
- projectName: string;
244
- serviceName: string;
245
- environment: string;
246
- expression: string;
247
- command: string | null;
248
- enabled: boolean;
249
- logicalName: string;
250
- type: string;
251
- instanceId?: undefined;
252
- volumeName?: undefined;
253
- mountPath?: undefined;
254
- })[];
142
+ checks: any[];
255
143
  } | {
256
144
  ok: boolean;
257
145
  skipped: boolean;
@@ -437,119 +325,7 @@ export declare function monitorProjectPlatform(options: ProjectPlatformActionOpt
437
325
  };
438
326
  railwayResources: {
439
327
  ok: boolean;
440
- checks: ({
441
- type: string;
442
- service: string;
443
- serviceName: string;
444
- projectName: string;
445
- environment: string;
446
- ok: boolean;
447
- status: string;
448
- message: string;
449
- serviceId?: undefined;
450
- projectId?: undefined;
451
- environmentId?: undefined;
452
- instanceId?: undefined;
453
- observed?: undefined;
454
- volumeName?: undefined;
455
- mountPath?: undefined;
456
- } | {
457
- type: string;
458
- service: string;
459
- serviceName: string;
460
- serviceId: string;
461
- projectId: string;
462
- environment: string;
463
- environmentId: string;
464
- instanceId: string | null;
465
- ok: boolean;
466
- status: string;
467
- observed: {
468
- rootDirectory: string | null;
469
- startCommand: string | null;
470
- cronSchedule: string | null;
471
- sleepApplication: boolean | null;
472
- runtimeMode: string | null;
473
- id?: undefined;
474
- name?: undefined;
475
- instances?: undefined;
476
- } | null;
477
- message: string | undefined;
478
- projectName?: undefined;
479
- volumeName?: undefined;
480
- mountPath?: undefined;
481
- } | {
482
- type: string;
483
- service: string;
484
- serviceName: string;
485
- serviceId: string;
486
- projectId: string;
487
- environment: string;
488
- environmentId: string;
489
- volumeName: string;
490
- mountPath: string;
491
- ok: boolean;
492
- status: string;
493
- observed: {
494
- id: string;
495
- name: string;
496
- instances: import("./railway-api.ts").RailwayVolumeInstanceSummary[];
497
- rootDirectory?: undefined;
498
- startCommand?: undefined;
499
- cronSchedule?: undefined;
500
- sleepApplication?: undefined;
501
- runtimeMode?: undefined;
502
- } | null;
503
- message: string | undefined;
504
- projectName?: undefined;
505
- instanceId?: undefined;
506
- } | {
507
- id: null;
508
- ok: boolean;
509
- status: string;
510
- message: string;
511
- service: string;
512
- projectId: string | null;
513
- projectName: string;
514
- serviceId: string | null;
515
- serviceName: string;
516
- environment: string;
517
- environmentId: string | null;
518
- expression: string;
519
- command: string | null;
520
- enabled: boolean;
521
- logicalName: string;
522
- type: string;
523
- instanceId?: undefined;
524
- observed?: undefined;
525
- volumeName?: undefined;
526
- mountPath?: undefined;
527
- } | {
528
- id: string | null;
529
- projectId: string;
530
- serviceId: string;
531
- environmentId: string;
532
- ok: boolean;
533
- status: string;
534
- observed: {
535
- expression: string | null;
536
- command: string | null;
537
- enabled: boolean;
538
- } | null;
539
- message: string | undefined;
540
- service: string;
541
- projectName: string;
542
- serviceName: string;
543
- environment: string;
544
- expression: string;
545
- command: string | null;
546
- enabled: boolean;
547
- logicalName: string;
548
- type: string;
549
- instanceId?: undefined;
550
- volumeName?: undefined;
551
- mountPath?: undefined;
552
- })[];
328
+ checks: any[];
553
329
  } | {
554
330
  ok: boolean;
555
331
  skipped: boolean;
@@ -740,119 +516,7 @@ export declare function runProjectPlatformAction(action: ProjectPlatformAction,
740
516
  };
741
517
  railwayResources: {
742
518
  ok: boolean;
743
- checks: ({
744
- type: string;
745
- service: string;
746
- serviceName: string;
747
- projectName: string;
748
- environment: string;
749
- ok: boolean;
750
- status: string;
751
- message: string;
752
- serviceId?: undefined;
753
- projectId?: undefined;
754
- environmentId?: undefined;
755
- instanceId?: undefined;
756
- observed?: undefined;
757
- volumeName?: undefined;
758
- mountPath?: undefined;
759
- } | {
760
- type: string;
761
- service: string;
762
- serviceName: string;
763
- serviceId: string;
764
- projectId: string;
765
- environment: string;
766
- environmentId: string;
767
- instanceId: string | null;
768
- ok: boolean;
769
- status: string;
770
- observed: {
771
- rootDirectory: string | null;
772
- startCommand: string | null;
773
- cronSchedule: string | null;
774
- sleepApplication: boolean | null;
775
- runtimeMode: string | null;
776
- id?: undefined;
777
- name?: undefined;
778
- instances?: undefined;
779
- } | null;
780
- message: string | undefined;
781
- projectName?: undefined;
782
- volumeName?: undefined;
783
- mountPath?: undefined;
784
- } | {
785
- type: string;
786
- service: string;
787
- serviceName: string;
788
- serviceId: string;
789
- projectId: string;
790
- environment: string;
791
- environmentId: string;
792
- volumeName: string;
793
- mountPath: string;
794
- ok: boolean;
795
- status: string;
796
- observed: {
797
- id: string;
798
- name: string;
799
- instances: import("./railway-api.ts").RailwayVolumeInstanceSummary[];
800
- rootDirectory?: undefined;
801
- startCommand?: undefined;
802
- cronSchedule?: undefined;
803
- sleepApplication?: undefined;
804
- runtimeMode?: undefined;
805
- } | null;
806
- message: string | undefined;
807
- projectName?: undefined;
808
- instanceId?: undefined;
809
- } | {
810
- id: null;
811
- ok: boolean;
812
- status: string;
813
- message: string;
814
- service: string;
815
- projectId: string | null;
816
- projectName: string;
817
- serviceId: string | null;
818
- serviceName: string;
819
- environment: string;
820
- environmentId: string | null;
821
- expression: string;
822
- command: string | null;
823
- enabled: boolean;
824
- logicalName: string;
825
- type: string;
826
- instanceId?: undefined;
827
- observed?: undefined;
828
- volumeName?: undefined;
829
- mountPath?: undefined;
830
- } | {
831
- id: string | null;
832
- projectId: string;
833
- serviceId: string;
834
- environmentId: string;
835
- ok: boolean;
836
- status: string;
837
- observed: {
838
- expression: string | null;
839
- command: string | null;
840
- enabled: boolean;
841
- } | null;
842
- message: string | undefined;
843
- service: string;
844
- projectName: string;
845
- serviceName: string;
846
- environment: string;
847
- expression: string;
848
- command: string | null;
849
- enabled: boolean;
850
- logicalName: string;
851
- type: string;
852
- instanceId?: undefined;
853
- volumeName?: undefined;
854
- mountPath?: undefined;
855
- })[];
519
+ checks: any[];
856
520
  } | {
857
521
  ok: boolean;
858
522
  skipped: boolean;
@@ -999,119 +663,7 @@ export declare function runProjectPlatformAction(action: ProjectPlatformAction,
999
663
  };
1000
664
  railwayResources: {
1001
665
  ok: boolean;
1002
- checks: ({
1003
- type: string;
1004
- service: string;
1005
- serviceName: string;
1006
- projectName: string;
1007
- environment: string;
1008
- ok: boolean;
1009
- status: string;
1010
- message: string;
1011
- serviceId?: undefined;
1012
- projectId?: undefined;
1013
- environmentId?: undefined;
1014
- instanceId?: undefined;
1015
- observed?: undefined;
1016
- volumeName?: undefined;
1017
- mountPath?: undefined;
1018
- } | {
1019
- type: string;
1020
- service: string;
1021
- serviceName: string;
1022
- serviceId: string;
1023
- projectId: string;
1024
- environment: string;
1025
- environmentId: string;
1026
- instanceId: string | null;
1027
- ok: boolean;
1028
- status: string;
1029
- observed: {
1030
- rootDirectory: string | null;
1031
- startCommand: string | null;
1032
- cronSchedule: string | null;
1033
- sleepApplication: boolean | null;
1034
- runtimeMode: string | null;
1035
- id?: undefined;
1036
- name?: undefined;
1037
- instances?: undefined;
1038
- } | null;
1039
- message: string | undefined;
1040
- projectName?: undefined;
1041
- volumeName?: undefined;
1042
- mountPath?: undefined;
1043
- } | {
1044
- type: string;
1045
- service: string;
1046
- serviceName: string;
1047
- serviceId: string;
1048
- projectId: string;
1049
- environment: string;
1050
- environmentId: string;
1051
- volumeName: string;
1052
- mountPath: string;
1053
- ok: boolean;
1054
- status: string;
1055
- observed: {
1056
- id: string;
1057
- name: string;
1058
- instances: import("./railway-api.ts").RailwayVolumeInstanceSummary[];
1059
- rootDirectory?: undefined;
1060
- startCommand?: undefined;
1061
- cronSchedule?: undefined;
1062
- sleepApplication?: undefined;
1063
- runtimeMode?: undefined;
1064
- } | null;
1065
- message: string | undefined;
1066
- projectName?: undefined;
1067
- instanceId?: undefined;
1068
- } | {
1069
- id: null;
1070
- ok: boolean;
1071
- status: string;
1072
- message: string;
1073
- service: string;
1074
- projectId: string | null;
1075
- projectName: string;
1076
- serviceId: string | null;
1077
- serviceName: string;
1078
- environment: string;
1079
- environmentId: string | null;
1080
- expression: string;
1081
- command: string | null;
1082
- enabled: boolean;
1083
- logicalName: string;
1084
- type: string;
1085
- instanceId?: undefined;
1086
- observed?: undefined;
1087
- volumeName?: undefined;
1088
- mountPath?: undefined;
1089
- } | {
1090
- id: string | null;
1091
- projectId: string;
1092
- serviceId: string;
1093
- environmentId: string;
1094
- ok: boolean;
1095
- status: string;
1096
- observed: {
1097
- expression: string | null;
1098
- command: string | null;
1099
- enabled: boolean;
1100
- } | null;
1101
- message: string | undefined;
1102
- service: string;
1103
- projectName: string;
1104
- serviceName: string;
1105
- environment: string;
1106
- expression: string;
1107
- command: string | null;
1108
- enabled: boolean;
1109
- logicalName: string;
1110
- type: string;
1111
- instanceId?: undefined;
1112
- volumeName?: undefined;
1113
- mountPath?: undefined;
1114
- })[];
666
+ checks: any[];
1115
667
  } | {
1116
668
  ok: boolean;
1117
669
  skipped: boolean;
@@ -1230,7 +1230,7 @@ async function monitorProjectPlatform(options) {
1230
1230
  r2: options.dryRun ? { ok: true, skipped: true, reason: "dry_run" } : probeR2(options.tenantRoot, siteConfig, state, target),
1231
1231
  queue: options.dryRun ? Promise.resolve({ ok: true, skipped: true, reason: "dry_run" }) : probeQueue(siteConfig, state),
1232
1232
  scaleProbe: probeScaleConfiguration(siteConfig, state),
1233
- railwayResources: options.scope === "local" || !apiSelected && !agentsSelected ? Promise.resolve({ ok: true, skipped: true, reason: options.scope === "local" ? "local_scope" : "railway_not_selected" }) : verifyRailwayManagedResources(options.tenantRoot, options.scope, { env }),
1233
+ railwayResources: options.scope === "local" || !apiSelected && !agentsSelected ? Promise.resolve({ ok: true, skipped: true, reason: options.scope === "local" ? "local_scope" : "railway_not_selected" }) : verifyRailwayManagedResources(options.tenantRoot, options.scope, { env, settleDeployments: true }),
1234
1234
  readiness: state.readiness
1235
1235
  };
1236
1236
  const resolvedChecks = {
@@ -2,6 +2,7 @@ import { type TreeseedBootstrapTaskPrefix, type TreeseedBootstrapWriter } from '
2
2
  export declare function deriveRailwayWorkerRunnerServiceName(projectSlug: any, index?: number): string;
3
3
  export declare function deriveRailwayWorkerRunnerVolumeName(serviceName: any, environmentName?: string): string;
4
4
  export declare function railwayServiceRuntimeStartCommand(service: any): any;
5
+ export declare function collectRailwayDeploymentStatusChecks(statusPayload: any, scope: any, services: any): any;
5
6
  export declare function isUsableRailwayToken(value: any): boolean;
6
7
  export declare function resolveRailwayAuthToken(env?: NodeJS.ProcessEnv): string;
7
8
  export declare function buildRailwayCommandEnv(env?: NodeJS.ProcessEnv): {
@@ -12,6 +13,43 @@ export declare function runRailway(args: any, { cwd, capture, allowFailure, inpu
12
13
  capture?: boolean | undefined;
13
14
  allowFailure?: boolean | undefined;
14
15
  }): import("child_process").SpawnSyncReturns<string>;
16
+ export declare function waitForRailwayManagedDeploymentsSettled(tenantRoot: any, scope: any, { services, env, timeoutMs, pollMs, }?: {
17
+ services?: ({
18
+ key: string;
19
+ scope: string;
20
+ projectId: string | null;
21
+ projectName: string;
22
+ serviceId: string | null;
23
+ serviceName: string;
24
+ rootDir: string;
25
+ publicBaseUrl: string | null;
26
+ railwayEnvironment: string;
27
+ buildCommand: string | null;
28
+ startCommand: string | null;
29
+ healthcheckPath: any;
30
+ healthcheckTimeoutSeconds: any;
31
+ healthcheckIntervalSeconds: any;
32
+ restartPolicy: any;
33
+ runtimeMode: any;
34
+ schedule: string[];
35
+ hostingKind: string;
36
+ runnerPool: {
37
+ bootstrapIndex: number;
38
+ volumeMountPath: string;
39
+ } | null;
40
+ } | null)[] | undefined;
41
+ env?: NodeJS.ProcessEnv | undefined;
42
+ timeoutMs?: number | undefined;
43
+ pollMs?: number | undefined;
44
+ }): Promise<{
45
+ ok: boolean;
46
+ checks: any;
47
+ message?: undefined;
48
+ } | {
49
+ ok: boolean;
50
+ checks: any;
51
+ message: string;
52
+ }>;
15
53
  export declare function setRailwaySecretVariable({ cwd, service, environment, key, value, env, capture, allowFailure }: {
16
54
  cwd: any;
17
55
  service: any;
@@ -281,124 +319,15 @@ export declare function verifyRailwayScheduledJobs(tenantRoot: any, scope: any,
281
319
  unsupported?: undefined;
282
320
  message?: undefined;
283
321
  }>;
284
- export declare function verifyRailwayManagedResources(tenantRoot: any, scope: any, { fetchImpl, apiToken, apiUrl, env }?: {
322
+ export declare function verifyRailwayManagedResources(tenantRoot: any, scope: any, { fetchImpl, apiToken, apiUrl, env, settleDeployments, settleTimeoutMs, settlePollMs, }?: {
285
323
  fetchImpl?: typeof fetch | undefined;
286
324
  env?: NodeJS.ProcessEnv | undefined;
325
+ settleDeployments?: boolean | undefined;
326
+ settleTimeoutMs?: number | undefined;
327
+ settlePollMs?: number | undefined;
287
328
  }): Promise<{
288
329
  ok: boolean;
289
- checks: ({
290
- type: string;
291
- service: string;
292
- serviceName: string;
293
- projectName: string;
294
- environment: string;
295
- ok: boolean;
296
- status: string;
297
- message: string;
298
- serviceId?: undefined;
299
- projectId?: undefined;
300
- environmentId?: undefined;
301
- instanceId?: undefined;
302
- observed?: undefined;
303
- volumeName?: undefined;
304
- mountPath?: undefined;
305
- } | {
306
- type: string;
307
- service: string;
308
- serviceName: string;
309
- serviceId: string;
310
- projectId: string;
311
- environment: string;
312
- environmentId: string;
313
- instanceId: string | null;
314
- ok: boolean;
315
- status: string;
316
- observed: {
317
- rootDirectory: string | null;
318
- startCommand: string | null;
319
- cronSchedule: string | null;
320
- sleepApplication: boolean | null;
321
- runtimeMode: string | null;
322
- id?: undefined;
323
- name?: undefined;
324
- instances?: undefined;
325
- } | null;
326
- message: string | undefined;
327
- projectName?: undefined;
328
- volumeName?: undefined;
329
- mountPath?: undefined;
330
- } | {
331
- type: string;
332
- service: string;
333
- serviceName: string;
334
- serviceId: string;
335
- projectId: string;
336
- environment: string;
337
- environmentId: string;
338
- volumeName: string;
339
- mountPath: string;
340
- ok: boolean;
341
- status: string;
342
- observed: {
343
- id: string;
344
- name: string;
345
- instances: import("./railway-api.ts").RailwayVolumeInstanceSummary[];
346
- rootDirectory?: undefined;
347
- startCommand?: undefined;
348
- cronSchedule?: undefined;
349
- sleepApplication?: undefined;
350
- runtimeMode?: undefined;
351
- } | null;
352
- message: string | undefined;
353
- projectName?: undefined;
354
- instanceId?: undefined;
355
- } | {
356
- id: null;
357
- ok: boolean;
358
- status: string;
359
- message: string;
360
- service: string;
361
- projectId: string | null;
362
- projectName: string;
363
- serviceId: string | null;
364
- serviceName: string;
365
- environment: string;
366
- environmentId: string | null;
367
- expression: string;
368
- command: string | null;
369
- enabled: boolean;
370
- logicalName: string;
371
- type: string;
372
- instanceId?: undefined;
373
- observed?: undefined;
374
- volumeName?: undefined;
375
- mountPath?: undefined;
376
- } | {
377
- id: string | null;
378
- projectId: string;
379
- serviceId: string;
380
- environmentId: string;
381
- ok: boolean;
382
- status: string;
383
- observed: {
384
- expression: string | null;
385
- command: string | null;
386
- enabled: boolean;
387
- } | null;
388
- message: string | undefined;
389
- service: string;
390
- projectName: string;
391
- serviceName: string;
392
- environment: string;
393
- expression: string;
394
- command: string | null;
395
- enabled: boolean;
396
- logicalName: string;
397
- type: string;
398
- instanceId?: undefined;
399
- volumeName?: undefined;
400
- mountPath?: undefined;
401
- })[];
330
+ checks: any[];
402
331
  }>;
403
332
  export declare function planRailwayServiceDeploy(service: any, { env }?: {
404
333
  env?: NodeJS.ProcessEnv | undefined;
@@ -95,6 +95,74 @@ function parseRailwayJsonOutput(output) {
95
95
  }
96
96
  return null;
97
97
  }
98
+ function railwayEdgeNodes(value) {
99
+ return Array.isArray(value?.edges) ? value.edges.map((entry) => entry?.node).filter(Boolean) : [];
100
+ }
101
+ function railwayStatusEnvironmentNodes(payload) {
102
+ if (!payload || typeof payload !== "object") {
103
+ return [];
104
+ }
105
+ if (Array.isArray(payload.environments)) {
106
+ return payload.environments;
107
+ }
108
+ return railwayEdgeNodes(payload.environments);
109
+ }
110
+ function railwayStatusDeploymentSettled(status) {
111
+ const normalized = String(status ?? "").trim().toUpperCase();
112
+ return normalized === "SUCCESS" || normalized === "SLEEPING";
113
+ }
114
+ function collectRailwayDeploymentStatusChecks(statusPayload, scope, services) {
115
+ const expectedEnvironment = resolveRailwayEnvironmentForScope(scope);
116
+ const environments = railwayStatusEnvironmentNodes(statusPayload);
117
+ const environment = environments.find(
118
+ (candidate) => normalizeRailwayEnvironmentName(candidate?.name) === expectedEnvironment
119
+ ) ?? null;
120
+ if (!environment) {
121
+ return services.map((service) => ({
122
+ type: "deployment-status",
123
+ service: service.key,
124
+ serviceName: service.serviceName,
125
+ environment: expectedEnvironment,
126
+ ok: false,
127
+ status: "missing_environment",
128
+ message: `Railway status did not include the ${expectedEnvironment} environment.`
129
+ }));
130
+ }
131
+ const instances = railwayEdgeNodes(environment.serviceInstances);
132
+ return services.map((service) => {
133
+ const instance = instances.find((candidate) => candidate?.serviceName === service.serviceName) ?? null;
134
+ if (!instance) {
135
+ return {
136
+ type: "deployment-status",
137
+ service: service.key,
138
+ serviceName: service.serviceName,
139
+ environment: expectedEnvironment,
140
+ ok: false,
141
+ status: "missing_service_instance",
142
+ message: `Railway status did not include service ${service.serviceName} in ${expectedEnvironment}.`
143
+ };
144
+ }
145
+ const deployment = instance.latestDeployment ?? null;
146
+ const status = String(deployment?.status ?? "").trim().toUpperCase();
147
+ const instanceStatuses = Array.isArray(deployment?.instances) ? deployment.instances.map((entry) => String(entry?.status ?? "").trim()).filter(Boolean) : [];
148
+ const ok = railwayStatusDeploymentSettled(status);
149
+ return {
150
+ type: "deployment-status",
151
+ service: service.key,
152
+ serviceName: service.serviceName,
153
+ environment: normalizeRailwayEnvironmentName(environment.name),
154
+ ok,
155
+ status: status || "missing_deployment",
156
+ observed: {
157
+ status: status || null,
158
+ deploymentStopped: deployment?.deploymentStopped ?? null,
159
+ instanceStatuses,
160
+ volumeMounts: Array.isArray(deployment?.meta?.volumeMounts) ? deployment.meta.volumeMounts : []
161
+ },
162
+ message: ok ? void 0 : `Railway deployment for ${service.serviceName} is not settled yet; observed ${status || "missing deployment status"}.`
163
+ };
164
+ });
165
+ }
98
166
  function normalizeRailwayCliVolume(value, { serviceId, environmentId, fallbackName, fallbackMountPath }) {
99
167
  if (!value || typeof value !== "object") {
100
168
  return null;
@@ -321,6 +389,60 @@ function runRailway(args, { cwd, capture = false, allowFailure = false, input, e
321
389
  }
322
390
  return result;
323
391
  }
392
+ async function waitForRailwayManagedDeploymentsSettled(tenantRoot, scope, {
393
+ services = configuredRailwayServices(tenantRoot, scope),
394
+ env = process.env,
395
+ timeoutMs = 18e4,
396
+ pollMs = 15e3
397
+ } = {}) {
398
+ const deadline = Date.now() + timeoutMs;
399
+ const environment = resolveRailwayEnvironmentForScope(scope);
400
+ const projectId = services.find((service) => typeof service.projectId === "string" && service.projectId.trim())?.projectId ?? null;
401
+ if (projectId) {
402
+ runRailway(["link", "--project", projectId, "--environment", environment, "--json"], {
403
+ cwd: tenantRoot,
404
+ capture: true,
405
+ allowFailure: true,
406
+ env
407
+ });
408
+ }
409
+ let checks = [];
410
+ let lastError = null;
411
+ for (; ; ) {
412
+ try {
413
+ const result = runRailway(["status", "--json"], {
414
+ cwd: tenantRoot,
415
+ capture: true,
416
+ env
417
+ });
418
+ const payload = parseRailwayJsonOutput(result.stdout);
419
+ checks = collectRailwayDeploymentStatusChecks(payload, scope, services);
420
+ lastError = null;
421
+ if (checks.every((entry) => entry.ok === true)) {
422
+ return { ok: true, checks };
423
+ }
424
+ } catch (error) {
425
+ lastError = error;
426
+ checks = services.map((service) => ({
427
+ type: "deployment-status",
428
+ service: service.key,
429
+ serviceName: service.serviceName,
430
+ environment,
431
+ ok: false,
432
+ status: "status_error",
433
+ message: error instanceof Error ? error.message : String(error)
434
+ }));
435
+ }
436
+ if (Date.now() >= deadline) {
437
+ return {
438
+ ok: false,
439
+ checks,
440
+ message: lastError instanceof Error ? lastError.message : "Railway deployments did not settle before the monitor timeout."
441
+ };
442
+ }
443
+ await sleep(pollMs);
444
+ }
445
+ }
324
446
  function setRailwaySecretVariable({ cwd, service, environment, key, value, env = process.env, capture = false, allowFailure = false }) {
325
447
  const effectiveEnv = buildRailwayCommandEnv({
326
448
  ...process.env,
@@ -842,12 +964,21 @@ async function verifyRailwayScheduledJobs(tenantRoot, scope, { fetchImpl = fetch
842
964
  checks
843
965
  };
844
966
  }
845
- async function verifyRailwayManagedResources(tenantRoot, scope, { fetchImpl = fetch, apiToken, apiUrl, env = process.env } = {}) {
967
+ async function verifyRailwayManagedResources(tenantRoot, scope, {
968
+ fetchImpl = fetch,
969
+ apiToken,
970
+ apiUrl,
971
+ env = process.env,
972
+ settleDeployments = false,
973
+ settleTimeoutMs = 18e4,
974
+ settlePollMs = 15e3
975
+ } = {}) {
846
976
  const effectiveApiToken = apiToken || resolveRailwayAuthToken(env);
847
977
  const effectiveApiUrl = apiUrl || resolveRailwayApiUrl(env);
848
978
  const effectiveEnv = { ...env, RAILWAY_API_TOKEN: effectiveApiToken, TREESEED_RAILWAY_API_URL: effectiveApiUrl };
849
979
  const services = configuredRailwayServices(tenantRoot, scope);
850
980
  const checks = [];
981
+ const deploymentStatusServices = [];
851
982
  for (const service of services) {
852
983
  const target = await resolveRailwayScheduleTarget({
853
984
  projectId: service.projectId,
@@ -874,6 +1005,10 @@ async function verifyRailwayManagedResources(tenantRoot, scope, { fetchImpl = fe
874
1005
  });
875
1006
  continue;
876
1007
  }
1008
+ deploymentStatusServices.push({
1009
+ ...service,
1010
+ projectId: target.project.id
1011
+ });
877
1012
  const instance = await getRailwayServiceInstance({
878
1013
  serviceId: target.service.id,
879
1014
  environmentId: target.environment.id,
@@ -943,6 +1078,17 @@ async function verifyRailwayManagedResources(tenantRoot, scope, { fetchImpl = fe
943
1078
  ...check
944
1079
  });
945
1080
  }
1081
+ if (settleDeployments) {
1082
+ const settled = await waitForRailwayManagedDeploymentsSettled(tenantRoot, scope, {
1083
+ services: deploymentStatusServices.length > 0 ? deploymentStatusServices : services,
1084
+ env: effectiveEnv,
1085
+ timeoutMs: settleTimeoutMs,
1086
+ pollMs: settlePollMs
1087
+ });
1088
+ for (const check of settled.checks ?? []) {
1089
+ checks.push(check);
1090
+ }
1091
+ }
946
1092
  return {
947
1093
  ok: checks.every((entry) => entry.ok === true || entry.skipped === true),
948
1094
  checks
@@ -1255,6 +1401,7 @@ async function deployRailwayService(tenantRoot, service, {
1255
1401
  }
1256
1402
  export {
1257
1403
  buildRailwayCommandEnv,
1404
+ collectRailwayDeploymentStatusChecks,
1258
1405
  configuredRailwayScheduledJobs,
1259
1406
  configuredRailwayServices,
1260
1407
  deployRailwayService,
@@ -1276,5 +1423,6 @@ export {
1276
1423
  validateRailwayDeployPrerequisites,
1277
1424
  validateRailwayServiceConfiguration,
1278
1425
  verifyRailwayManagedResources,
1279
- verifyRailwayScheduledJobs
1426
+ verifyRailwayScheduledJobs,
1427
+ waitForRailwayManagedDeploymentsSettled
1280
1428
  };
@@ -2986,7 +2986,11 @@ async function workflowSave(helpers, input) {
2986
2986
  branch: String(repo.branch),
2987
2987
  headSha: String(repo.commitSha)
2988
2988
  }))
2989
- ], "hosted", { root, runId: workflowRun.runId }).then((workflowGates) => ({ workflowGates }))) : { workflowGates: [] };
2989
+ ], "hosted", {
2990
+ root,
2991
+ runId: workflowRun.runId,
2992
+ onProgress: (line, stream) => helpers.write(line, stream)
2993
+ }).then((workflowGates) => ({ workflowGates }))) : { workflowGates: [] };
2990
2994
  const releaseCandidate = branch === STAGING_BRANCH ? await executeJournalStep(root, workflowRun.runId, "release-candidate", () => {
2991
2995
  const releaseSession = resolveTreeseedWorkflowSession(root);
2992
2996
  const stagingReleasePlan = buildReleasePlanSnapshot({
@@ -3516,7 +3520,11 @@ async function workflowStage(helpers, input) {
3516
3520
  branch: STAGING_BRANCH,
3517
3521
  headSha: String(report.commitSha)
3518
3522
  }))
3519
- ], ciMode, { root, runId: workflowRun.runId }).then((workflowGates) => ({
3523
+ ], ciMode, {
3524
+ root,
3525
+ runId: workflowRun.runId,
3526
+ onProgress: (line, stream) => helpers.write(line, stream)
3527
+ }).then((workflowGates) => ({
3520
3528
  status: "completed",
3521
3529
  workflowGates
3522
3530
  })));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@treeseed/sdk",
3
- "version": "0.6.44",
3
+ "version": "0.6.46",
4
4
  "description": "Shared Treeseed SDK for content-backed and D1-backed object models.",
5
5
  "license": "AGPL-3.0-only",
6
6
  "repository": {