@tiangong-lca/cli 0.0.4 → 0.0.6
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/README.md +31 -23
- package/bin/tiangong.js +15 -2
- package/dist/src/cli.js +256 -7
- package/dist/src/cli.js.map +1 -1
- package/dist/src/lib/dataset-command.js +115 -96
- package/dist/src/lib/dataset-command.js.map +1 -1
- package/dist/src/lib/flow-publish-version.js +13 -13
- package/dist/src/lib/flow-publish-version.js.map +1 -1
- package/dist/src/lib/http.js +19 -0
- package/dist/src/lib/http.js.map +1 -1
- package/dist/src/lib/lifecyclemodel-bundle-save.js +468 -0
- package/dist/src/lib/lifecyclemodel-bundle-save.js.map +1 -0
- package/dist/src/lib/lifecyclemodel-publish-build.js +3 -1
- package/dist/src/lib/lifecyclemodel-publish-build.js.map +1 -1
- package/dist/src/lib/package-version.js +23 -0
- package/dist/src/lib/package-version.js.map +1 -0
- package/dist/src/lib/process-list.js +337 -0
- package/dist/src/lib/process-list.js.map +1 -0
- package/dist/src/lib/process-save-draft-run.js +325 -0
- package/dist/src/lib/process-save-draft-run.js.map +1 -0
- package/dist/src/lib/process-save-draft.js +165 -0
- package/dist/src/lib/process-save-draft.js.map +1 -0
- package/dist/src/lib/publish.js +81 -13
- package/dist/src/lib/publish.js.map +1 -1
- package/dist/src/lib/review-process.js +180 -9
- package/dist/src/lib/review-process.js.map +1 -1
- package/dist/src/lib/supabase-json-ordered-write.js +14 -32
- package/dist/src/lib/supabase-json-ordered-write.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,468 @@
|
|
|
1
|
+
import { CliError } from './errors.js';
|
|
2
|
+
import { buildSupabaseAuthHeaders, createSupabaseDataClient, deriveSupabaseFunctionsBaseUrl, requireSupabaseRestRuntime, runSupabaseArrayQuery, } from './supabase-client.js';
|
|
3
|
+
import { createSupabaseDataRuntime } from './supabase-session.js';
|
|
4
|
+
const DEFAULT_TIMEOUT_MS = 10_000;
|
|
5
|
+
const DEFAULT_NODE_WIDTH = 350;
|
|
6
|
+
const DEFAULT_NODE_HEIGHT = 120;
|
|
7
|
+
const DEFAULT_NODE_GAP_X = 420;
|
|
8
|
+
const DEFAULT_NODE_GAP_Y = 180;
|
|
9
|
+
function isRecord(value) {
|
|
10
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
11
|
+
}
|
|
12
|
+
function ensureList(value) {
|
|
13
|
+
if (value === undefined || value === null) {
|
|
14
|
+
return [];
|
|
15
|
+
}
|
|
16
|
+
return Array.isArray(value) ? value : [value];
|
|
17
|
+
}
|
|
18
|
+
function cloneJson(value) {
|
|
19
|
+
return JSON.parse(JSON.stringify(value));
|
|
20
|
+
}
|
|
21
|
+
function trimToken(value) {
|
|
22
|
+
if (typeof value !== 'string') {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
const trimmed = value.trim();
|
|
26
|
+
return trimmed || null;
|
|
27
|
+
}
|
|
28
|
+
function firstNonEmpty(...values) {
|
|
29
|
+
for (const value of values) {
|
|
30
|
+
const trimmed = trimToken(value);
|
|
31
|
+
if (trimmed) {
|
|
32
|
+
return trimmed;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
function lifecyclemodelRoot(payload) {
|
|
38
|
+
return isRecord(payload.lifeCycleModelDataSet) ? payload.lifeCycleModelDataSet : payload;
|
|
39
|
+
}
|
|
40
|
+
function dataSetInformation(root) {
|
|
41
|
+
const info = isRecord(root.lifeCycleModelInformation) ? root.lifeCycleModelInformation : {};
|
|
42
|
+
return isRecord(info.dataSetInformation) ? info.dataSetInformation : {};
|
|
43
|
+
}
|
|
44
|
+
function technology(root) {
|
|
45
|
+
const info = isRecord(root.lifeCycleModelInformation) ? root.lifeCycleModelInformation : {};
|
|
46
|
+
return isRecord(info.technology) ? info.technology : {};
|
|
47
|
+
}
|
|
48
|
+
function processesBlock(root) {
|
|
49
|
+
const tech = technology(root);
|
|
50
|
+
return isRecord(tech.processes) ? tech.processes : {};
|
|
51
|
+
}
|
|
52
|
+
function extractProcessInstances(payload) {
|
|
53
|
+
return ensureList(processesBlock(lifecyclemodelRoot(payload)).processInstance).filter(isRecord);
|
|
54
|
+
}
|
|
55
|
+
function outputConnections(instance) {
|
|
56
|
+
const connections = isRecord(instance.connections) ? instance.connections : {};
|
|
57
|
+
return ensureList(connections.outputExchange).filter(isRecord);
|
|
58
|
+
}
|
|
59
|
+
function matchingResultingProcessType(instance, payload) {
|
|
60
|
+
const ref = isRecord(instance.referenceToProcess) ? instance.referenceToProcess : {};
|
|
61
|
+
const resulting = isRecord(dataSetInformation(lifecyclemodelRoot(payload)).referenceToResultingProcess)
|
|
62
|
+
? dataSetInformation(lifecyclemodelRoot(payload)).referenceToResultingProcess
|
|
63
|
+
: {};
|
|
64
|
+
const processId = trimToken(ref['@refObjectId']);
|
|
65
|
+
const processVersion = trimToken(ref['@version']);
|
|
66
|
+
const resultingId = trimToken(resulting['@refObjectId']);
|
|
67
|
+
const resultingVersion = trimToken(resulting['@version']);
|
|
68
|
+
if (processId &&
|
|
69
|
+
processId === resultingId &&
|
|
70
|
+
(!resultingVersion || processVersion === resultingVersion)) {
|
|
71
|
+
return 'primary';
|
|
72
|
+
}
|
|
73
|
+
return 'secondary';
|
|
74
|
+
}
|
|
75
|
+
function displayName(reference) {
|
|
76
|
+
if (reference.name !== undefined) {
|
|
77
|
+
return cloneJson(reference.name);
|
|
78
|
+
}
|
|
79
|
+
if (reference['common:shortDescription'] !== undefined) {
|
|
80
|
+
return cloneJson(reference['common:shortDescription']);
|
|
81
|
+
}
|
|
82
|
+
return undefined;
|
|
83
|
+
}
|
|
84
|
+
function deriveSubmodels(payload) {
|
|
85
|
+
const submodels = extractProcessInstances(payload).map((instance, index) => {
|
|
86
|
+
const reference = isRecord(instance.referenceToProcess) ? instance.referenceToProcess : {};
|
|
87
|
+
const id = trimToken(reference['@refObjectId']);
|
|
88
|
+
if (!id) {
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
const version = trimToken(reference['@version']);
|
|
92
|
+
return {
|
|
93
|
+
id,
|
|
94
|
+
...(version ? { version } : {}),
|
|
95
|
+
type: matchingResultingProcessType(instance, payload),
|
|
96
|
+
...(displayName(reference) !== undefined ? { name: displayName(reference) } : {}),
|
|
97
|
+
instanceId: firstNonEmpty(instance['@dataSetInternalID'], `instance-${index + 1}`),
|
|
98
|
+
};
|
|
99
|
+
});
|
|
100
|
+
return submodels.filter((value) => value !== null);
|
|
101
|
+
}
|
|
102
|
+
function buildNodeLabel(reference, fallback) {
|
|
103
|
+
return displayName(reference) ?? fallback;
|
|
104
|
+
}
|
|
105
|
+
function deriveXflowNodes(payload) {
|
|
106
|
+
const instances = extractProcessInstances(payload);
|
|
107
|
+
const columnCount = Math.max(1, Math.ceil(Math.sqrt(Math.max(instances.length, 1))));
|
|
108
|
+
return instances.map((instance, index) => {
|
|
109
|
+
const reference = isRecord(instance.referenceToProcess) ? instance.referenceToProcess : {};
|
|
110
|
+
const internalId = firstNonEmpty(instance['@dataSetInternalID'], `node-${index + 1}`);
|
|
111
|
+
const processId = firstNonEmpty(reference['@refObjectId'], `process-${index + 1}`);
|
|
112
|
+
const version = trimToken(reference['@version']);
|
|
113
|
+
const x = (index % columnCount) * DEFAULT_NODE_GAP_X;
|
|
114
|
+
const y = Math.floor(index / columnCount) * DEFAULT_NODE_GAP_Y;
|
|
115
|
+
return {
|
|
116
|
+
id: internalId,
|
|
117
|
+
x,
|
|
118
|
+
y,
|
|
119
|
+
width: DEFAULT_NODE_WIDTH,
|
|
120
|
+
height: DEFAULT_NODE_HEIGHT,
|
|
121
|
+
data: {
|
|
122
|
+
id: processId,
|
|
123
|
+
...(version ? { version } : {}),
|
|
124
|
+
label: buildNodeLabel(reference, processId),
|
|
125
|
+
shortDescription: cloneJson(reference['common:shortDescription'] ?? []),
|
|
126
|
+
},
|
|
127
|
+
};
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
function deriveXflowEdges(payload) {
|
|
131
|
+
const instances = extractProcessInstances(payload);
|
|
132
|
+
const nodeByInternalId = new Map(instances.map((instance, index) => {
|
|
133
|
+
const reference = isRecord(instance.referenceToProcess) ? instance.referenceToProcess : {};
|
|
134
|
+
return [
|
|
135
|
+
firstNonEmpty(instance['@dataSetInternalID'], `node-${index + 1}`),
|
|
136
|
+
{
|
|
137
|
+
processId: firstNonEmpty(reference['@refObjectId'], `process-${index + 1}`),
|
|
138
|
+
version: trimToken(reference['@version']),
|
|
139
|
+
},
|
|
140
|
+
];
|
|
141
|
+
}));
|
|
142
|
+
let edgeIndex = 0;
|
|
143
|
+
const edges = [];
|
|
144
|
+
instances.forEach((instance, index) => {
|
|
145
|
+
const sourceCell = firstNonEmpty(instance['@dataSetInternalID'], `node-${index + 1}`);
|
|
146
|
+
const sourceNode = nodeByInternalId.get(sourceCell);
|
|
147
|
+
outputConnections(instance).forEach((outputExchange) => {
|
|
148
|
+
const flowUuid = trimToken(outputExchange['@flowUUID']);
|
|
149
|
+
const downstreamProcesses = ensureList(outputExchange.downstreamProcess).filter(isRecord);
|
|
150
|
+
downstreamProcesses.forEach((downstreamProcess) => {
|
|
151
|
+
const targetCell = trimToken(downstreamProcess['@id']);
|
|
152
|
+
if (!targetCell) {
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
const targetNode = nodeByInternalId.get(targetCell) ?? { processId: null, version: null };
|
|
156
|
+
edgeIndex += 1;
|
|
157
|
+
edges.push({
|
|
158
|
+
id: [sourceCell, targetCell, flowUuid ?? `edge-${edgeIndex}`].join(':'),
|
|
159
|
+
source: {
|
|
160
|
+
cell: sourceCell,
|
|
161
|
+
},
|
|
162
|
+
target: {
|
|
163
|
+
cell: targetCell,
|
|
164
|
+
},
|
|
165
|
+
labels: [],
|
|
166
|
+
data: {
|
|
167
|
+
connection: {
|
|
168
|
+
outputExchange: {
|
|
169
|
+
...(flowUuid ? { '@flowUUID': flowUuid } : {}),
|
|
170
|
+
downstreamProcess: cloneJson(downstreamProcess),
|
|
171
|
+
},
|
|
172
|
+
},
|
|
173
|
+
node: {
|
|
174
|
+
sourceNodeID: sourceCell,
|
|
175
|
+
targetNodeID: targetCell,
|
|
176
|
+
sourceProcessId: sourceNode.processId,
|
|
177
|
+
...(sourceNode.version ? { sourceProcessVersion: sourceNode.version } : {}),
|
|
178
|
+
...(targetNode.processId ? { targetProcessId: targetNode.processId } : {}),
|
|
179
|
+
...(targetNode.version ? { targetProcessVersion: targetNode.version } : {}),
|
|
180
|
+
},
|
|
181
|
+
},
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
});
|
|
185
|
+
});
|
|
186
|
+
return edges;
|
|
187
|
+
}
|
|
188
|
+
export function deriveLifecyclemodelJsonTg(payload) {
|
|
189
|
+
return {
|
|
190
|
+
xflow: {
|
|
191
|
+
nodes: deriveXflowNodes(payload),
|
|
192
|
+
edges: deriveXflowEdges(payload),
|
|
193
|
+
},
|
|
194
|
+
submodels: deriveSubmodels(payload),
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
function mergeLifecyclemodelJsonTg(explicit, derived) {
|
|
198
|
+
if (!explicit) {
|
|
199
|
+
return derived;
|
|
200
|
+
}
|
|
201
|
+
const derivedXflow = isRecord(derived.xflow) ? derived.xflow : {};
|
|
202
|
+
const explicitXflow = isRecord(explicit.xflow) ? explicit.xflow : null;
|
|
203
|
+
return {
|
|
204
|
+
...derived,
|
|
205
|
+
...cloneJson(explicit),
|
|
206
|
+
xflow: explicitXflow
|
|
207
|
+
? {
|
|
208
|
+
...cloneJson(derivedXflow),
|
|
209
|
+
...cloneJson(explicitXflow),
|
|
210
|
+
nodes: Array.isArray(explicitXflow.nodes)
|
|
211
|
+
? cloneJson(explicitXflow.nodes)
|
|
212
|
+
: derivedXflow.nodes,
|
|
213
|
+
edges: Array.isArray(explicitXflow.edges)
|
|
214
|
+
? cloneJson(explicitXflow.edges)
|
|
215
|
+
: derivedXflow.edges,
|
|
216
|
+
}
|
|
217
|
+
: derived.xflow,
|
|
218
|
+
submodels: Array.isArray(explicit.submodels)
|
|
219
|
+
? cloneJson(explicit.submodels)
|
|
220
|
+
: derived.submodels,
|
|
221
|
+
};
|
|
222
|
+
}
|
|
223
|
+
function normalizeProcessMutations(value) {
|
|
224
|
+
if (value === undefined || value === null) {
|
|
225
|
+
return [];
|
|
226
|
+
}
|
|
227
|
+
const mutations = ensureList(value);
|
|
228
|
+
if (!mutations.every(isRecord)) {
|
|
229
|
+
throw new CliError('Lifecyclemodel publish metadata expected processMutations to contain JSON objects.', {
|
|
230
|
+
code: 'LIFECYCLEMODEL_PROCESS_MUTATIONS_INVALID',
|
|
231
|
+
exitCode: 2,
|
|
232
|
+
details: value,
|
|
233
|
+
});
|
|
234
|
+
}
|
|
235
|
+
return cloneJson(mutations);
|
|
236
|
+
}
|
|
237
|
+
export function buildLifecyclemodelBundlePlan(options) {
|
|
238
|
+
const explicitJsonTg = isRecord(options.metadata?.json_tg) ? options.metadata?.json_tg : null;
|
|
239
|
+
const derivedJsonTg = deriveLifecyclemodelJsonTg(options.payload);
|
|
240
|
+
return {
|
|
241
|
+
mode: options.mode,
|
|
242
|
+
modelId: options.id,
|
|
243
|
+
...(options.mode === 'update' ? { version: options.version } : {}),
|
|
244
|
+
parent: {
|
|
245
|
+
jsonOrdered: cloneJson(options.payload),
|
|
246
|
+
jsonTg: mergeLifecyclemodelJsonTg(explicitJsonTg, derivedJsonTg),
|
|
247
|
+
...(typeof options.metadata?.ruleVerification === 'boolean'
|
|
248
|
+
? { ruleVerification: options.metadata.ruleVerification }
|
|
249
|
+
: {}),
|
|
250
|
+
},
|
|
251
|
+
processMutations: normalizeProcessMutations(options.metadata?.processMutations),
|
|
252
|
+
};
|
|
253
|
+
}
|
|
254
|
+
function buildVisibleRowsUrl(restBaseUrl, id, version) {
|
|
255
|
+
const url = new URL(`${restBaseUrl.replace(/\/+$/u, '')}/lifecyclemodels`);
|
|
256
|
+
url.searchParams.set('select', 'id,version');
|
|
257
|
+
url.searchParams.set('id', `eq.${id}`);
|
|
258
|
+
url.searchParams.set('version', `eq.${version}`);
|
|
259
|
+
return url.toString();
|
|
260
|
+
}
|
|
261
|
+
function parseVisibleRows(payload, url) {
|
|
262
|
+
if (!Array.isArray(payload)) {
|
|
263
|
+
throw new CliError(`Supabase REST response was not a JSON array for ${url}`, {
|
|
264
|
+
code: 'SUPABASE_REST_RESPONSE_INVALID',
|
|
265
|
+
exitCode: 1,
|
|
266
|
+
details: payload,
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
return payload.map((item, index) => {
|
|
270
|
+
if (!isRecord(item)) {
|
|
271
|
+
throw new CliError(`Supabase REST row ${index} was not a JSON object for ${url}`, {
|
|
272
|
+
code: 'SUPABASE_REST_RESPONSE_INVALID',
|
|
273
|
+
exitCode: 1,
|
|
274
|
+
details: item,
|
|
275
|
+
});
|
|
276
|
+
}
|
|
277
|
+
return {
|
|
278
|
+
id: trimToken(item.id) ?? '',
|
|
279
|
+
version: trimToken(item.version) ?? '',
|
|
280
|
+
};
|
|
281
|
+
});
|
|
282
|
+
}
|
|
283
|
+
async function exactVisibleRows(options) {
|
|
284
|
+
const runtime = createSupabaseDataRuntime({
|
|
285
|
+
runtime: requireSupabaseRestRuntime(options.env),
|
|
286
|
+
fetchImpl: options.fetchImpl,
|
|
287
|
+
timeoutMs: options.timeoutMs,
|
|
288
|
+
});
|
|
289
|
+
const { client, restBaseUrl } = createSupabaseDataClient(runtime, options.fetchImpl, options.timeoutMs);
|
|
290
|
+
const url = buildVisibleRowsUrl(restBaseUrl, options.id, options.version);
|
|
291
|
+
const payload = await runSupabaseArrayQuery(client
|
|
292
|
+
.from('lifecyclemodels')
|
|
293
|
+
.select('id,version')
|
|
294
|
+
.eq('id', options.id)
|
|
295
|
+
.eq('version', options.version), url);
|
|
296
|
+
return parseVisibleRows(payload, url);
|
|
297
|
+
}
|
|
298
|
+
function parseLifecyclemodelBundleJson(rawText, url) {
|
|
299
|
+
try {
|
|
300
|
+
return JSON.parse(rawText);
|
|
301
|
+
}
|
|
302
|
+
catch (error) {
|
|
303
|
+
throw new CliError(`Remote response was not valid JSON for ${url}`, {
|
|
304
|
+
code: 'REMOTE_INVALID_JSON',
|
|
305
|
+
exitCode: 1,
|
|
306
|
+
details: String(error),
|
|
307
|
+
});
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
function requireLifecyclemodelBundleResponse(payload, url) {
|
|
311
|
+
if (!isRecord(payload)) {
|
|
312
|
+
throw new CliError(`Lifecyclemodel bundle endpoint returned an unexpected payload for ${url}`, {
|
|
313
|
+
code: 'REMOTE_RESPONSE_INVALID',
|
|
314
|
+
exitCode: 1,
|
|
315
|
+
details: payload,
|
|
316
|
+
});
|
|
317
|
+
}
|
|
318
|
+
if (payload.ok === false) {
|
|
319
|
+
const code = trimToken(payload.code) ?? 'REMOTE_APPLICATION_ERROR';
|
|
320
|
+
const message = trimToken(payload.message) ?? `Remote application response returned ok:false for ${url}`;
|
|
321
|
+
throw new CliError(message, {
|
|
322
|
+
code,
|
|
323
|
+
exitCode: 1,
|
|
324
|
+
details: payload.details ?? payload,
|
|
325
|
+
});
|
|
326
|
+
}
|
|
327
|
+
return payload;
|
|
328
|
+
}
|
|
329
|
+
function throwLifecyclemodelBundleHttpError(status, payload, rawText, url) {
|
|
330
|
+
if (isRecord(payload)) {
|
|
331
|
+
const code = trimToken(payload.code);
|
|
332
|
+
const message = trimToken(payload.message);
|
|
333
|
+
if (code && message) {
|
|
334
|
+
throw new CliError(message, {
|
|
335
|
+
code,
|
|
336
|
+
exitCode: 1,
|
|
337
|
+
details: payload.details ?? payload,
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
throw new CliError(`HTTP ${status} returned from ${url}`, {
|
|
342
|
+
code: 'REMOTE_REQUEST_FAILED',
|
|
343
|
+
exitCode: 1,
|
|
344
|
+
details: rawText,
|
|
345
|
+
});
|
|
346
|
+
}
|
|
347
|
+
async function invokeSaveLifecyclemodelBundle(options) {
|
|
348
|
+
const runtime = createSupabaseDataRuntime({
|
|
349
|
+
runtime: requireSupabaseRestRuntime(options.env),
|
|
350
|
+
fetchImpl: options.fetchImpl,
|
|
351
|
+
timeoutMs: options.timeoutMs,
|
|
352
|
+
});
|
|
353
|
+
const accessToken = await runtime.getAccessToken();
|
|
354
|
+
const url = `${deriveSupabaseFunctionsBaseUrl(runtime.apiBaseUrl)}/save_lifecycle_model_bundle`;
|
|
355
|
+
const response = await options.fetchImpl(url, {
|
|
356
|
+
method: 'POST',
|
|
357
|
+
headers: {
|
|
358
|
+
...buildSupabaseAuthHeaders(runtime.publishableKey, accessToken),
|
|
359
|
+
'Content-Type': 'application/json',
|
|
360
|
+
},
|
|
361
|
+
body: JSON.stringify(options.plan),
|
|
362
|
+
signal: AbortSignal.timeout(options.timeoutMs),
|
|
363
|
+
});
|
|
364
|
+
const rawText = await response.text();
|
|
365
|
+
const contentType = response.headers.get('content-type') ?? '';
|
|
366
|
+
const payload = contentType.includes('application/json') && rawText.length > 0
|
|
367
|
+
? parseLifecyclemodelBundleJson(rawText, url)
|
|
368
|
+
: rawText;
|
|
369
|
+
if (!response.ok) {
|
|
370
|
+
throwLifecyclemodelBundleHttpError(response.status, payload, rawText, url);
|
|
371
|
+
}
|
|
372
|
+
return requireLifecyclemodelBundleResponse(payload, url);
|
|
373
|
+
}
|
|
374
|
+
export async function syncLifecyclemodelBundleRecord(options) {
|
|
375
|
+
const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
376
|
+
const visibleRows = await exactVisibleRows({
|
|
377
|
+
id: options.id,
|
|
378
|
+
version: options.version,
|
|
379
|
+
env: options.env,
|
|
380
|
+
fetchImpl: options.fetchImpl,
|
|
381
|
+
timeoutMs,
|
|
382
|
+
});
|
|
383
|
+
if (visibleRows.length > 0) {
|
|
384
|
+
return {
|
|
385
|
+
status: 'success',
|
|
386
|
+
operation: 'update',
|
|
387
|
+
mode: 'update',
|
|
388
|
+
transport: 'save_lifecycle_model_bundle',
|
|
389
|
+
response: await invokeSaveLifecyclemodelBundle({
|
|
390
|
+
plan: buildLifecyclemodelBundlePlan({
|
|
391
|
+
id: options.id,
|
|
392
|
+
version: options.version,
|
|
393
|
+
payload: options.payload,
|
|
394
|
+
metadata: options.metadata,
|
|
395
|
+
mode: 'update',
|
|
396
|
+
}),
|
|
397
|
+
env: options.env,
|
|
398
|
+
fetchImpl: options.fetchImpl,
|
|
399
|
+
timeoutMs,
|
|
400
|
+
}),
|
|
401
|
+
};
|
|
402
|
+
}
|
|
403
|
+
try {
|
|
404
|
+
return {
|
|
405
|
+
status: 'success',
|
|
406
|
+
operation: 'create',
|
|
407
|
+
mode: 'create',
|
|
408
|
+
transport: 'save_lifecycle_model_bundle',
|
|
409
|
+
response: await invokeSaveLifecyclemodelBundle({
|
|
410
|
+
plan: buildLifecyclemodelBundlePlan({
|
|
411
|
+
id: options.id,
|
|
412
|
+
version: options.version,
|
|
413
|
+
payload: options.payload,
|
|
414
|
+
metadata: options.metadata,
|
|
415
|
+
mode: 'create',
|
|
416
|
+
}),
|
|
417
|
+
env: options.env,
|
|
418
|
+
fetchImpl: options.fetchImpl,
|
|
419
|
+
timeoutMs,
|
|
420
|
+
}),
|
|
421
|
+
};
|
|
422
|
+
}
|
|
423
|
+
catch (error) {
|
|
424
|
+
if (!(error instanceof CliError) || error.code !== 'VERSION_CONFLICT') {
|
|
425
|
+
throw error;
|
|
426
|
+
}
|
|
427
|
+
const visibleAfterConflict = await exactVisibleRows({
|
|
428
|
+
id: options.id,
|
|
429
|
+
version: options.version,
|
|
430
|
+
env: options.env,
|
|
431
|
+
fetchImpl: options.fetchImpl,
|
|
432
|
+
timeoutMs,
|
|
433
|
+
});
|
|
434
|
+
if (visibleAfterConflict.length === 0) {
|
|
435
|
+
throw error;
|
|
436
|
+
}
|
|
437
|
+
return {
|
|
438
|
+
status: 'success',
|
|
439
|
+
operation: 'update_after_create_conflict',
|
|
440
|
+
mode: 'update',
|
|
441
|
+
transport: 'save_lifecycle_model_bundle',
|
|
442
|
+
response: await invokeSaveLifecyclemodelBundle({
|
|
443
|
+
plan: buildLifecyclemodelBundlePlan({
|
|
444
|
+
id: options.id,
|
|
445
|
+
version: options.version,
|
|
446
|
+
payload: options.payload,
|
|
447
|
+
metadata: options.metadata,
|
|
448
|
+
mode: 'update',
|
|
449
|
+
}),
|
|
450
|
+
env: options.env,
|
|
451
|
+
fetchImpl: options.fetchImpl,
|
|
452
|
+
timeoutMs,
|
|
453
|
+
}),
|
|
454
|
+
};
|
|
455
|
+
}
|
|
456
|
+
}
|
|
457
|
+
export const __testInternals = {
|
|
458
|
+
buildLifecyclemodelBundlePlan,
|
|
459
|
+
deriveLifecyclemodelJsonTg,
|
|
460
|
+
exactVisibleRows,
|
|
461
|
+
firstNonEmpty,
|
|
462
|
+
matchingResultingProcessType,
|
|
463
|
+
mergeLifecyclemodelJsonTg,
|
|
464
|
+
parseVisibleRows,
|
|
465
|
+
requireLifecyclemodelBundleResponse,
|
|
466
|
+
trimToken,
|
|
467
|
+
};
|
|
468
|
+
//# sourceMappingURL=lifecyclemodel-bundle-save.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecyclemodel-bundle-save.js","sourceRoot":"","sources":["../../../src/lib/lifecyclemodel-bundle-save.ts"],"names":[],"mappings":"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","sourcesContent":["import { CliError } from './errors.js';\nimport type { FetchLike } from './http.js';\nimport {\n buildSupabaseAuthHeaders,\n createSupabaseDataClient,\n deriveSupabaseFunctionsBaseUrl,\n requireSupabaseRestRuntime,\n runSupabaseArrayQuery,\n} from './supabase-client.js';\nimport { createSupabaseDataRuntime } from './supabase-session.js';\n\ntype JsonObject = Record<string, unknown>;\n\nconst DEFAULT_TIMEOUT_MS = 10_000;\nconst DEFAULT_NODE_WIDTH = 350;\nconst DEFAULT_NODE_HEIGHT = 120;\nconst DEFAULT_NODE_GAP_X = 420;\nconst DEFAULT_NODE_GAP_Y = 180;\n\nexport type LifecyclemodelPublishMetadata = {\n json_tg?: JsonObject;\n processMutations?: JsonObject[];\n ruleVerification?: boolean;\n};\n\ntype LifecyclemodelVisibleRow = {\n id: string;\n version: string;\n};\n\ntype LifecyclemodelBundlePlan = {\n mode: 'create' | 'update';\n modelId: string;\n version?: string;\n parent: {\n jsonOrdered: JsonObject;\n jsonTg: JsonObject;\n ruleVerification?: boolean;\n };\n processMutations: JsonObject[];\n};\n\nexport type LifecyclemodelBundleWriteResult = {\n status: 'success';\n operation: 'create' | 'update' | 'update_after_create_conflict';\n mode: 'create' | 'update';\n transport: 'save_lifecycle_model_bundle';\n response: JsonObject;\n};\n\nfunction isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction ensureList<T = unknown>(value: unknown): T[] {\n if (value === undefined || value === null) {\n return [];\n }\n return Array.isArray(value) ? (value as T[]) : ([value] as T[]);\n}\n\nfunction cloneJson<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction trimToken(value: unknown): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n\n const trimmed = value.trim();\n return trimmed || null;\n}\n\nfunction firstNonEmpty(...values: unknown[]): string | null {\n for (const value of values) {\n const trimmed = trimToken(value);\n if (trimmed) {\n return trimmed;\n }\n }\n return null;\n}\n\nfunction lifecyclemodelRoot(payload: JsonObject): JsonObject {\n return isRecord(payload.lifeCycleModelDataSet) ? payload.lifeCycleModelDataSet : payload;\n}\n\nfunction dataSetInformation(root: JsonObject): JsonObject {\n const info = isRecord(root.lifeCycleModelInformation) ? root.lifeCycleModelInformation : {};\n return isRecord(info.dataSetInformation) ? info.dataSetInformation : {};\n}\n\nfunction technology(root: JsonObject): JsonObject {\n const info = isRecord(root.lifeCycleModelInformation) ? root.lifeCycleModelInformation : {};\n return isRecord(info.technology) ? info.technology : {};\n}\n\nfunction processesBlock(root: JsonObject): JsonObject {\n const tech = technology(root);\n return isRecord(tech.processes) ? tech.processes : {};\n}\n\nfunction extractProcessInstances(payload: JsonObject): JsonObject[] {\n return ensureList<JsonObject>(processesBlock(lifecyclemodelRoot(payload)).processInstance).filter(\n isRecord,\n );\n}\n\nfunction outputConnections(instance: JsonObject): JsonObject[] {\n const connections = isRecord(instance.connections) ? instance.connections : {};\n return ensureList<JsonObject>(connections.outputExchange).filter(isRecord);\n}\n\nfunction matchingResultingProcessType(\n instance: JsonObject,\n payload: JsonObject,\n): 'primary' | 'secondary' {\n const ref = isRecord(instance.referenceToProcess) ? instance.referenceToProcess : {};\n const resulting = isRecord(\n dataSetInformation(lifecyclemodelRoot(payload)).referenceToResultingProcess,\n )\n ? (dataSetInformation(lifecyclemodelRoot(payload)).referenceToResultingProcess as JsonObject)\n : {};\n const processId = trimToken(ref['@refObjectId']);\n const processVersion = trimToken(ref['@version']);\n const resultingId = trimToken(resulting['@refObjectId']);\n const resultingVersion = trimToken(resulting['@version']);\n\n if (\n processId &&\n processId === resultingId &&\n (!resultingVersion || processVersion === resultingVersion)\n ) {\n return 'primary';\n }\n\n return 'secondary';\n}\n\nfunction displayName(reference: JsonObject): unknown {\n if (reference.name !== undefined) {\n return cloneJson(reference.name);\n }\n\n if (reference['common:shortDescription'] !== undefined) {\n return cloneJson(reference['common:shortDescription']);\n }\n\n return undefined;\n}\n\nfunction deriveSubmodels(payload: JsonObject): JsonObject[] {\n const submodels: Array<JsonObject | null> = extractProcessInstances(payload).map(\n (instance, index) => {\n const reference = isRecord(instance.referenceToProcess) ? instance.referenceToProcess : {};\n const id = trimToken(reference['@refObjectId']);\n if (!id) {\n return null;\n }\n\n const version = trimToken(reference['@version']);\n return {\n id,\n ...(version ? { version } : {}),\n type: matchingResultingProcessType(instance, payload),\n ...(displayName(reference) !== undefined ? { name: displayName(reference) } : {}),\n instanceId: firstNonEmpty(instance['@dataSetInternalID'], `instance-${index + 1}`),\n };\n },\n );\n\n return submodels.filter((value): value is JsonObject => value !== null);\n}\n\nfunction buildNodeLabel(reference: JsonObject, fallback: string): unknown {\n return displayName(reference) ?? fallback;\n}\n\nfunction deriveXflowNodes(payload: JsonObject): JsonObject[] {\n const instances = extractProcessInstances(payload);\n const columnCount = Math.max(1, Math.ceil(Math.sqrt(Math.max(instances.length, 1))));\n\n return instances.map((instance, index) => {\n const reference = isRecord(instance.referenceToProcess) ? instance.referenceToProcess : {};\n const internalId = firstNonEmpty(instance['@dataSetInternalID'], `node-${index + 1}`)!;\n const processId = firstNonEmpty(reference['@refObjectId'], `process-${index + 1}`)!;\n const version = trimToken(reference['@version']);\n const x = (index % columnCount) * DEFAULT_NODE_GAP_X;\n const y = Math.floor(index / columnCount) * DEFAULT_NODE_GAP_Y;\n\n return {\n id: internalId,\n x,\n y,\n width: DEFAULT_NODE_WIDTH,\n height: DEFAULT_NODE_HEIGHT,\n data: {\n id: processId,\n ...(version ? { version } : {}),\n label: buildNodeLabel(reference, processId),\n shortDescription: cloneJson(reference['common:shortDescription'] ?? []),\n },\n };\n });\n}\n\nfunction deriveXflowEdges(payload: JsonObject): JsonObject[] {\n const instances = extractProcessInstances(payload);\n const nodeByInternalId = new Map<string, { processId: string; version: string | null }>(\n instances.map((instance, index) => {\n const reference = isRecord(instance.referenceToProcess) ? instance.referenceToProcess : {};\n return [\n firstNonEmpty(instance['@dataSetInternalID'], `node-${index + 1}`)!,\n {\n processId: firstNonEmpty(reference['@refObjectId'], `process-${index + 1}`)!,\n version: trimToken(reference['@version']),\n },\n ];\n }),\n );\n\n let edgeIndex = 0;\n const edges: JsonObject[] = [];\n\n instances.forEach((instance, index) => {\n const sourceCell = firstNonEmpty(instance['@dataSetInternalID'], `node-${index + 1}`)!;\n const sourceNode = nodeByInternalId.get(sourceCell)!;\n\n outputConnections(instance).forEach((outputExchange) => {\n const flowUuid = trimToken(outputExchange['@flowUUID']);\n const downstreamProcesses = ensureList<JsonObject>(outputExchange.downstreamProcess).filter(\n isRecord,\n );\n\n downstreamProcesses.forEach((downstreamProcess) => {\n const targetCell = trimToken(downstreamProcess['@id']);\n if (!targetCell) {\n return;\n }\n\n const targetNode = nodeByInternalId.get(targetCell) ?? { processId: null, version: null };\n edgeIndex += 1;\n edges.push({\n id: [sourceCell, targetCell, flowUuid ?? `edge-${edgeIndex}`].join(':'),\n source: {\n cell: sourceCell,\n },\n target: {\n cell: targetCell,\n },\n labels: [],\n data: {\n connection: {\n outputExchange: {\n ...(flowUuid ? { '@flowUUID': flowUuid } : {}),\n downstreamProcess: cloneJson(downstreamProcess),\n },\n },\n node: {\n sourceNodeID: sourceCell,\n targetNodeID: targetCell,\n sourceProcessId: sourceNode.processId,\n ...(sourceNode.version ? { sourceProcessVersion: sourceNode.version } : {}),\n ...(targetNode.processId ? { targetProcessId: targetNode.processId } : {}),\n ...(targetNode.version ? { targetProcessVersion: targetNode.version } : {}),\n },\n },\n });\n });\n });\n });\n\n return edges;\n}\n\nexport function deriveLifecyclemodelJsonTg(payload: JsonObject): JsonObject {\n return {\n xflow: {\n nodes: deriveXflowNodes(payload),\n edges: deriveXflowEdges(payload),\n },\n submodels: deriveSubmodels(payload),\n };\n}\n\nfunction mergeLifecyclemodelJsonTg(explicit: JsonObject | null, derived: JsonObject): JsonObject {\n if (!explicit) {\n return derived;\n }\n\n const derivedXflow = isRecord(derived.xflow) ? derived.xflow : {};\n const explicitXflow = isRecord(explicit.xflow) ? explicit.xflow : null;\n\n return {\n ...derived,\n ...cloneJson(explicit),\n xflow: explicitXflow\n ? {\n ...cloneJson(derivedXflow),\n ...cloneJson(explicitXflow),\n nodes: Array.isArray(explicitXflow.nodes)\n ? cloneJson(explicitXflow.nodes)\n : derivedXflow.nodes,\n edges: Array.isArray(explicitXflow.edges)\n ? cloneJson(explicitXflow.edges)\n : derivedXflow.edges,\n }\n : derived.xflow,\n submodels: Array.isArray(explicit.submodels)\n ? cloneJson(explicit.submodels)\n : derived.submodels,\n };\n}\n\nfunction normalizeProcessMutations(value: unknown): JsonObject[] {\n if (value === undefined || value === null) {\n return [];\n }\n\n const mutations = ensureList<JsonObject>(value);\n if (!mutations.every(isRecord)) {\n throw new CliError(\n 'Lifecyclemodel publish metadata expected processMutations to contain JSON objects.',\n {\n code: 'LIFECYCLEMODEL_PROCESS_MUTATIONS_INVALID',\n exitCode: 2,\n details: value,\n },\n );\n }\n\n return cloneJson(mutations);\n}\n\nexport function buildLifecyclemodelBundlePlan(options: {\n id: string;\n version: string;\n payload: JsonObject;\n metadata?: LifecyclemodelPublishMetadata | null;\n mode: 'create' | 'update';\n}): LifecyclemodelBundlePlan {\n const explicitJsonTg = isRecord(options.metadata?.json_tg) ? options.metadata?.json_tg : null;\n const derivedJsonTg = deriveLifecyclemodelJsonTg(options.payload);\n\n return {\n mode: options.mode,\n modelId: options.id,\n ...(options.mode === 'update' ? { version: options.version } : {}),\n parent: {\n jsonOrdered: cloneJson(options.payload),\n jsonTg: mergeLifecyclemodelJsonTg(explicitJsonTg, derivedJsonTg),\n ...(typeof options.metadata?.ruleVerification === 'boolean'\n ? { ruleVerification: options.metadata.ruleVerification }\n : {}),\n },\n processMutations: normalizeProcessMutations(options.metadata?.processMutations),\n };\n}\n\nfunction buildVisibleRowsUrl(restBaseUrl: string, id: string, version: string): string {\n const url = new URL(`${restBaseUrl.replace(/\\/+$/u, '')}/lifecyclemodels`);\n url.searchParams.set('select', 'id,version');\n url.searchParams.set('id', `eq.${id}`);\n url.searchParams.set('version', `eq.${version}`);\n return url.toString();\n}\n\nfunction parseVisibleRows(payload: unknown, url: string): LifecyclemodelVisibleRow[] {\n if (!Array.isArray(payload)) {\n throw new CliError(`Supabase REST response was not a JSON array for ${url}`, {\n code: 'SUPABASE_REST_RESPONSE_INVALID',\n exitCode: 1,\n details: payload,\n });\n }\n\n return payload.map((item, index) => {\n if (!isRecord(item)) {\n throw new CliError(`Supabase REST row ${index} was not a JSON object for ${url}`, {\n code: 'SUPABASE_REST_RESPONSE_INVALID',\n exitCode: 1,\n details: item,\n });\n }\n\n return {\n id: trimToken(item.id) ?? '',\n version: trimToken(item.version) ?? '',\n };\n });\n}\n\nasync function exactVisibleRows(options: {\n id: string;\n version: string;\n env: NodeJS.ProcessEnv;\n fetchImpl: FetchLike;\n timeoutMs: number;\n}): Promise<LifecyclemodelVisibleRow[]> {\n const runtime = createSupabaseDataRuntime({\n runtime: requireSupabaseRestRuntime(options.env),\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n });\n const { client, restBaseUrl } = createSupabaseDataClient(\n runtime,\n options.fetchImpl,\n options.timeoutMs,\n );\n const url = buildVisibleRowsUrl(restBaseUrl, options.id, options.version);\n const payload = await runSupabaseArrayQuery(\n client\n .from('lifecyclemodels')\n .select('id,version')\n .eq('id', options.id)\n .eq('version', options.version),\n url,\n );\n\n return parseVisibleRows(payload, url);\n}\n\nfunction parseLifecyclemodelBundleJson(rawText: string, url: string): unknown {\n try {\n return JSON.parse(rawText);\n } catch (error) {\n throw new CliError(`Remote response was not valid JSON for ${url}`, {\n code: 'REMOTE_INVALID_JSON',\n exitCode: 1,\n details: String(error),\n });\n }\n}\n\nfunction requireLifecyclemodelBundleResponse(payload: unknown, url: string): JsonObject {\n if (!isRecord(payload)) {\n throw new CliError(`Lifecyclemodel bundle endpoint returned an unexpected payload for ${url}`, {\n code: 'REMOTE_RESPONSE_INVALID',\n exitCode: 1,\n details: payload,\n });\n }\n\n if (payload.ok === false) {\n const code = trimToken(payload.code) ?? 'REMOTE_APPLICATION_ERROR';\n const message =\n trimToken(payload.message) ?? `Remote application response returned ok:false for ${url}`;\n throw new CliError(message, {\n code,\n exitCode: 1,\n details: payload.details ?? payload,\n });\n }\n\n return payload;\n}\n\nfunction throwLifecyclemodelBundleHttpError(\n status: number,\n payload: unknown,\n rawText: string,\n url: string,\n): never {\n if (isRecord(payload)) {\n const code = trimToken(payload.code);\n const message = trimToken(payload.message);\n if (code && message) {\n throw new CliError(message, {\n code,\n exitCode: 1,\n details: payload.details ?? payload,\n });\n }\n }\n\n throw new CliError(`HTTP ${status} returned from ${url}`, {\n code: 'REMOTE_REQUEST_FAILED',\n exitCode: 1,\n details: rawText,\n });\n}\n\nasync function invokeSaveLifecyclemodelBundle(options: {\n plan: LifecyclemodelBundlePlan;\n env: NodeJS.ProcessEnv;\n fetchImpl: FetchLike;\n timeoutMs: number;\n}): Promise<JsonObject> {\n const runtime = createSupabaseDataRuntime({\n runtime: requireSupabaseRestRuntime(options.env),\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n });\n const accessToken = await runtime.getAccessToken();\n const url = `${deriveSupabaseFunctionsBaseUrl(runtime.apiBaseUrl)}/save_lifecycle_model_bundle`;\n const response = await options.fetchImpl(url, {\n method: 'POST',\n headers: {\n ...buildSupabaseAuthHeaders(runtime.publishableKey, accessToken),\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(options.plan),\n signal: AbortSignal.timeout(options.timeoutMs),\n });\n const rawText = await response.text();\n const contentType = response.headers.get('content-type') ?? '';\n const payload =\n contentType.includes('application/json') && rawText.length > 0\n ? parseLifecyclemodelBundleJson(rawText, url)\n : rawText;\n\n if (!response.ok) {\n throwLifecyclemodelBundleHttpError(response.status, payload, rawText, url);\n }\n\n return requireLifecyclemodelBundleResponse(payload, url);\n}\n\nexport async function syncLifecyclemodelBundleRecord(options: {\n id: string;\n version: string;\n payload: JsonObject;\n metadata?: LifecyclemodelPublishMetadata | null;\n env: NodeJS.ProcessEnv;\n fetchImpl: FetchLike;\n timeoutMs?: number;\n}): Promise<LifecyclemodelBundleWriteResult> {\n const timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const visibleRows = await exactVisibleRows({\n id: options.id,\n version: options.version,\n env: options.env,\n fetchImpl: options.fetchImpl,\n timeoutMs,\n });\n\n if (visibleRows.length > 0) {\n return {\n status: 'success',\n operation: 'update',\n mode: 'update',\n transport: 'save_lifecycle_model_bundle',\n response: await invokeSaveLifecyclemodelBundle({\n plan: buildLifecyclemodelBundlePlan({\n id: options.id,\n version: options.version,\n payload: options.payload,\n metadata: options.metadata,\n mode: 'update',\n }),\n env: options.env,\n fetchImpl: options.fetchImpl,\n timeoutMs,\n }),\n };\n }\n\n try {\n return {\n status: 'success',\n operation: 'create',\n mode: 'create',\n transport: 'save_lifecycle_model_bundle',\n response: await invokeSaveLifecyclemodelBundle({\n plan: buildLifecyclemodelBundlePlan({\n id: options.id,\n version: options.version,\n payload: options.payload,\n metadata: options.metadata,\n mode: 'create',\n }),\n env: options.env,\n fetchImpl: options.fetchImpl,\n timeoutMs,\n }),\n };\n } catch (error) {\n if (!(error instanceof CliError) || error.code !== 'VERSION_CONFLICT') {\n throw error;\n }\n\n const visibleAfterConflict = await exactVisibleRows({\n id: options.id,\n version: options.version,\n env: options.env,\n fetchImpl: options.fetchImpl,\n timeoutMs,\n });\n if (visibleAfterConflict.length === 0) {\n throw error;\n }\n\n return {\n status: 'success',\n operation: 'update_after_create_conflict',\n mode: 'update',\n transport: 'save_lifecycle_model_bundle',\n response: await invokeSaveLifecyclemodelBundle({\n plan: buildLifecyclemodelBundlePlan({\n id: options.id,\n version: options.version,\n payload: options.payload,\n metadata: options.metadata,\n mode: 'update',\n }),\n env: options.env,\n fetchImpl: options.fetchImpl,\n timeoutMs,\n }),\n };\n }\n}\n\nexport const __testInternals = {\n buildLifecyclemodelBundlePlan,\n deriveLifecyclemodelJsonTg,\n exactVisibleRows,\n firstNonEmpty,\n matchingResultingProcessType,\n mergeLifecyclemodelJsonTg,\n parseVisibleRows,\n requireLifecyclemodelBundleResponse,\n trimToken,\n};\n"]}
|
|
@@ -185,6 +185,7 @@ function buildPublishIntent(layout, lifecyclemodelCount) {
|
|
|
185
185
|
return {
|
|
186
186
|
ok: true,
|
|
187
187
|
command: 'publish run',
|
|
188
|
+
lifecyclemodel_transport: 'save_lifecycle_model_bundle',
|
|
188
189
|
input_path: layout.publishRequestPath,
|
|
189
190
|
run_id: layout.runId,
|
|
190
191
|
run_root: layout.runRoot,
|
|
@@ -217,7 +218,7 @@ function buildNextActions(layout) {
|
|
|
217
218
|
return [
|
|
218
219
|
`inspect: ${layout.publishBundlePath}`,
|
|
219
220
|
`inspect: ${layout.publishRequestPath}`,
|
|
220
|
-
`run: tiangong publish run --input ${layout.publishRequestPath}`,
|
|
221
|
+
`run: tiangong publish run --input ${layout.publishRequestPath} # lifecyclemodels commit through save_lifecycle_model_bundle`,
|
|
221
222
|
];
|
|
222
223
|
}
|
|
223
224
|
export async function runLifecyclemodelPublishBuild(options) {
|
|
@@ -238,6 +239,7 @@ export async function runLifecyclemodelPublishBuild(options) {
|
|
|
238
239
|
run_id: layout.runId,
|
|
239
240
|
run_root: layout.runRoot,
|
|
240
241
|
status: 'prepared_local_lifecyclemodel_publish_bundle',
|
|
242
|
+
lifecyclemodel_transport: 'save_lifecycle_model_bundle',
|
|
241
243
|
source_run: {
|
|
242
244
|
run_manifest: copyJson(runManifest),
|
|
243
245
|
},
|