@tiangong-lca/cli 0.0.1

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 (96) hide show
  1. package/README.md +368 -0
  2. package/bin/tiangong.d.ts +1 -0
  3. package/bin/tiangong.js +32 -0
  4. package/dist/scripts/assert-full-coverage.js +77 -0
  5. package/dist/scripts/assert-full-coverage.js.map +1 -0
  6. package/dist/src/cli.js +2740 -0
  7. package/dist/src/cli.js.map +1 -0
  8. package/dist/src/lib/artifacts.js +86 -0
  9. package/dist/src/lib/artifacts.js.map +1 -0
  10. package/dist/src/lib/dotenv.js +36 -0
  11. package/dist/src/lib/dotenv.js.map +1 -0
  12. package/dist/src/lib/env.js +139 -0
  13. package/dist/src/lib/env.js.map +1 -0
  14. package/dist/src/lib/errors.js +38 -0
  15. package/dist/src/lib/errors.js.map +1 -0
  16. package/dist/src/lib/flow-build-alias-map.js +299 -0
  17. package/dist/src/lib/flow-build-alias-map.js.map +1 -0
  18. package/dist/src/lib/flow-get.js +81 -0
  19. package/dist/src/lib/flow-get.js.map +1 -0
  20. package/dist/src/lib/flow-governance.js +164 -0
  21. package/dist/src/lib/flow-governance.js.map +1 -0
  22. package/dist/src/lib/flow-list.js +187 -0
  23. package/dist/src/lib/flow-list.js.map +1 -0
  24. package/dist/src/lib/flow-publish-reviewed-data.js +808 -0
  25. package/dist/src/lib/flow-publish-reviewed-data.js.map +1 -0
  26. package/dist/src/lib/flow-publish-version.js +541 -0
  27. package/dist/src/lib/flow-publish-version.js.map +1 -0
  28. package/dist/src/lib/flow-read.js +310 -0
  29. package/dist/src/lib/flow-read.js.map +1 -0
  30. package/dist/src/lib/flow-regen-product.js +1396 -0
  31. package/dist/src/lib/flow-regen-product.js.map +1 -0
  32. package/dist/src/lib/flow-remediate.js +821 -0
  33. package/dist/src/lib/flow-remediate.js.map +1 -0
  34. package/dist/src/lib/http.js +45 -0
  35. package/dist/src/lib/http.js.map +1 -0
  36. package/dist/src/lib/io.js +30 -0
  37. package/dist/src/lib/io.js.map +1 -0
  38. package/dist/src/lib/kb-search.js +83 -0
  39. package/dist/src/lib/kb-search.js.map +1 -0
  40. package/dist/src/lib/lifecyclemodel-auto-build.js +1328 -0
  41. package/dist/src/lib/lifecyclemodel-auto-build.js.map +1 -0
  42. package/dist/src/lib/lifecyclemodel-orchestrate.js +1556 -0
  43. package/dist/src/lib/lifecyclemodel-orchestrate.js.map +1 -0
  44. package/dist/src/lib/lifecyclemodel-publish-build.js +296 -0
  45. package/dist/src/lib/lifecyclemodel-publish-build.js.map +1 -0
  46. package/dist/src/lib/lifecyclemodel-publish-resulting-process.js +101 -0
  47. package/dist/src/lib/lifecyclemodel-publish-resulting-process.js.map +1 -0
  48. package/dist/src/lib/lifecyclemodel-resulting-process.js +1152 -0
  49. package/dist/src/lib/lifecyclemodel-resulting-process.js.map +1 -0
  50. package/dist/src/lib/lifecyclemodel-validate-build.js +238 -0
  51. package/dist/src/lib/lifecyclemodel-validate-build.js.map +1 -0
  52. package/dist/src/lib/llm.js +383 -0
  53. package/dist/src/lib/llm.js.map +1 -0
  54. package/dist/src/lib/process-auto-build.js +717 -0
  55. package/dist/src/lib/process-auto-build.js.map +1 -0
  56. package/dist/src/lib/process-batch-build.js +409 -0
  57. package/dist/src/lib/process-batch-build.js.map +1 -0
  58. package/dist/src/lib/process-get.js +66 -0
  59. package/dist/src/lib/process-get.js.map +1 -0
  60. package/dist/src/lib/process-publish-build.js +451 -0
  61. package/dist/src/lib/process-publish-build.js.map +1 -0
  62. package/dist/src/lib/process-resume-build.js +364 -0
  63. package/dist/src/lib/process-resume-build.js.map +1 -0
  64. package/dist/src/lib/publish.js +562 -0
  65. package/dist/src/lib/publish.js.map +1 -0
  66. package/dist/src/lib/remote.js +88 -0
  67. package/dist/src/lib/remote.js.map +1 -0
  68. package/dist/src/lib/review-flow.js +1110 -0
  69. package/dist/src/lib/review-flow.js.map +1 -0
  70. package/dist/src/lib/review-lifecyclemodel.js +727 -0
  71. package/dist/src/lib/review-lifecyclemodel.js.map +1 -0
  72. package/dist/src/lib/review-process.js +702 -0
  73. package/dist/src/lib/review-process.js.map +1 -0
  74. package/dist/src/lib/run.js +106 -0
  75. package/dist/src/lib/run.js.map +1 -0
  76. package/dist/src/lib/state-lock.js +150 -0
  77. package/dist/src/lib/state-lock.js.map +1 -0
  78. package/dist/src/lib/supabase-client.js +269 -0
  79. package/dist/src/lib/supabase-client.js.map +1 -0
  80. package/dist/src/lib/supabase-json-ordered-write.js +186 -0
  81. package/dist/src/lib/supabase-json-ordered-write.js.map +1 -0
  82. package/dist/src/lib/supabase-rest.js +138 -0
  83. package/dist/src/lib/supabase-rest.js.map +1 -0
  84. package/dist/src/lib/supabase-session.js +424 -0
  85. package/dist/src/lib/supabase-session.js.map +1 -0
  86. package/dist/src/lib/tidas-sdk-package-validator.js +493 -0
  87. package/dist/src/lib/tidas-sdk-package-validator.js.map +1 -0
  88. package/dist/src/lib/unstructured.js +203 -0
  89. package/dist/src/lib/unstructured.js.map +1 -0
  90. package/dist/src/lib/user-api-key.js +75 -0
  91. package/dist/src/lib/user-api-key.js.map +1 -0
  92. package/dist/src/lib/validation.js +191 -0
  93. package/dist/src/lib/validation.js.map +1 -0
  94. package/dist/src/main.js +38 -0
  95. package/dist/src/main.js.map +1 -0
  96. package/package.json +81 -0
@@ -0,0 +1,66 @@
1
+ import { CliError } from './errors.js';
2
+ import { fetchExactOrLatestProcessRow, normalizeSupabaseProcessPayload, requireSupabaseRestRuntime, } from './supabase-rest.js';
3
+ import { createSupabaseDataRuntime } from './supabase-session.js';
4
+ const PROCESS_GET_TIMEOUT_MS = 10_000;
5
+ function normalizeToken(value) {
6
+ if (typeof value !== 'string') {
7
+ return null;
8
+ }
9
+ const trimmed = value.trim();
10
+ return trimmed ? trimmed : null;
11
+ }
12
+ function nowIso(now = new Date()) {
13
+ return now.toISOString();
14
+ }
15
+ export async function runProcessGet(options) {
16
+ const processId = normalizeToken(options.processId);
17
+ if (!processId) {
18
+ throw new CliError('Missing required --id value.', {
19
+ code: 'PROCESS_ID_REQUIRED',
20
+ exitCode: 2,
21
+ });
22
+ }
23
+ const requestedVersion = normalizeToken(options.version ?? null);
24
+ const fetchImpl = options.fetchImpl ?? fetch;
25
+ const timeoutMs = options.timeoutMs ?? PROCESS_GET_TIMEOUT_MS;
26
+ const runtime = createSupabaseDataRuntime({
27
+ runtime: requireSupabaseRestRuntime(options.env ?? process.env),
28
+ fetchImpl,
29
+ timeoutMs,
30
+ now: options.now,
31
+ });
32
+ const lookup = await fetchExactOrLatestProcessRow({
33
+ runtime,
34
+ id: processId,
35
+ version: requestedVersion,
36
+ timeoutMs,
37
+ fetchImpl,
38
+ fallbackToLatest: requestedVersion !== null,
39
+ });
40
+ if (!lookup) {
41
+ throw new CliError(requestedVersion
42
+ ? `Could not resolve process dataset for ${processId}@${requestedVersion}.`
43
+ : `Could not resolve process dataset for ${processId}.`, {
44
+ code: 'PROCESS_GET_NOT_FOUND',
45
+ exitCode: 2,
46
+ details: {
47
+ process_id: processId,
48
+ version: requestedVersion,
49
+ },
50
+ });
51
+ }
52
+ return {
53
+ schema_version: 1,
54
+ generated_at_utc: nowIso(options.now),
55
+ status: 'resolved_remote_process',
56
+ process_id: lookup.row.id || processId,
57
+ requested_version: requestedVersion,
58
+ resolved_version: lookup.row.version || requestedVersion || '',
59
+ resolution: lookup.resolution,
60
+ source_url: lookup.sourceUrl,
61
+ modified_at: lookup.row.modified_at,
62
+ state_code: lookup.row.state_code,
63
+ process: normalizeSupabaseProcessPayload(lookup.row.json, requestedVersion ? `${processId}@${requestedVersion}` : processId),
64
+ };
65
+ }
66
+ //# sourceMappingURL=process-get.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-get.js","sourceRoot":"","sources":["../../../src/lib/process-get.ts"],"names":[],"mappings":"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","sourcesContent":["import { CliError } from './errors.js';\nimport type { FetchLike } from './http.js';\nimport {\n fetchExactOrLatestProcessRow,\n normalizeSupabaseProcessPayload,\n requireSupabaseRestRuntime,\n type SupabaseProcessLookup,\n} from './supabase-rest.js';\nimport { createSupabaseDataRuntime } from './supabase-session.js';\n\ntype JsonObject = Record<string, unknown>;\n\nconst PROCESS_GET_TIMEOUT_MS = 10_000;\n\nexport type RunProcessGetOptions = {\n processId: string;\n version?: string | null;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n timeoutMs?: number;\n now?: Date;\n};\n\nexport type ProcessGetReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'resolved_remote_process';\n process_id: string;\n requested_version: string | null;\n resolved_version: string;\n resolution: SupabaseProcessLookup['resolution'];\n source_url: string;\n modified_at: string | null;\n state_code: number | null;\n process: JsonObject;\n};\n\nfunction normalizeToken(value: string | null | undefined): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n\n const trimmed = value.trim();\n return trimmed ? trimmed : null;\n}\n\nfunction nowIso(now: Date = new Date()): string {\n return now.toISOString();\n}\n\nexport async function runProcessGet(options: RunProcessGetOptions): Promise<ProcessGetReport> {\n const processId = normalizeToken(options.processId);\n if (!processId) {\n throw new CliError('Missing required --id value.', {\n code: 'PROCESS_ID_REQUIRED',\n exitCode: 2,\n });\n }\n\n const requestedVersion = normalizeToken(options.version ?? null);\n const fetchImpl = options.fetchImpl ?? (fetch as FetchLike);\n const timeoutMs = options.timeoutMs ?? PROCESS_GET_TIMEOUT_MS;\n const runtime = createSupabaseDataRuntime({\n runtime: requireSupabaseRestRuntime(options.env ?? process.env),\n fetchImpl,\n timeoutMs,\n now: options.now,\n });\n const lookup = await fetchExactOrLatestProcessRow({\n runtime,\n id: processId,\n version: requestedVersion,\n timeoutMs,\n fetchImpl,\n fallbackToLatest: requestedVersion !== null,\n });\n\n if (!lookup) {\n throw new CliError(\n requestedVersion\n ? `Could not resolve process dataset for ${processId}@${requestedVersion}.`\n : `Could not resolve process dataset for ${processId}.`,\n {\n code: 'PROCESS_GET_NOT_FOUND',\n exitCode: 2,\n details: {\n process_id: processId,\n version: requestedVersion,\n },\n },\n );\n }\n\n return {\n schema_version: 1,\n generated_at_utc: nowIso(options.now),\n status: 'resolved_remote_process',\n process_id: lookup.row.id || processId,\n requested_version: requestedVersion,\n resolved_version: lookup.row.version || requestedVersion || '',\n resolution: lookup.resolution,\n source_url: lookup.sourceUrl,\n modified_at: lookup.row.modified_at,\n state_code: lookup.row.state_code,\n process: normalizeSupabaseProcessPayload(\n lookup.row.json,\n requestedVersion ? `${processId}@${requestedVersion}` : processId,\n ),\n };\n}\n"]}
@@ -0,0 +1,451 @@
1
+ import { existsSync, readdirSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { readJsonArtifact, writeJsonArtifact } from './artifacts.js';
4
+ import { CliError } from './errors.js';
5
+ import { normalizePublishRequest } from './publish.js';
6
+ import { withStateFileLock } from './state-lock.js';
7
+ function isRecord(value) {
8
+ return Boolean(value && typeof value === 'object' && !Array.isArray(value));
9
+ }
10
+ function nonEmptyString(value) {
11
+ if (typeof value !== 'string') {
12
+ return null;
13
+ }
14
+ const normalized = value.trim();
15
+ return normalized || null;
16
+ }
17
+ function copyJson(value) {
18
+ return JSON.parse(JSON.stringify(value));
19
+ }
20
+ function readRequiredJsonObject(filePath, missingCode, invalidCode, label) {
21
+ if (!existsSync(filePath)) {
22
+ throw new CliError(`Required process publish artifact not found: ${filePath}`, {
23
+ code: missingCode,
24
+ exitCode: 2,
25
+ details: { label, filePath },
26
+ });
27
+ }
28
+ const value = readJsonArtifact(filePath);
29
+ if (!isRecord(value)) {
30
+ throw new CliError(`Expected process publish artifact JSON object: ${filePath}`, {
31
+ code: invalidCode,
32
+ exitCode: 2,
33
+ details: { label, filePath },
34
+ });
35
+ }
36
+ return value;
37
+ }
38
+ function buildLayout(runRoot, runId) {
39
+ return {
40
+ runId,
41
+ runRoot,
42
+ collectionDir: path.dirname(runRoot),
43
+ cacheDir: path.join(runRoot, 'cache'),
44
+ manifestsDir: path.join(runRoot, 'manifests'),
45
+ reportsDir: path.join(runRoot, 'reports'),
46
+ processExportsDir: path.join(runRoot, 'exports', 'processes'),
47
+ sourceExportsDir: path.join(runRoot, 'exports', 'sources'),
48
+ publishStageDir: path.join(runRoot, 'stage_outputs', '10_publish'),
49
+ statePath: path.join(runRoot, 'cache', 'process_from_flow_state.json'),
50
+ handoffSummaryPath: path.join(runRoot, 'cache', 'agent_handoff_summary.json'),
51
+ runManifestPath: path.join(runRoot, 'manifests', 'run-manifest.json'),
52
+ invocationIndexPath: path.join(runRoot, 'manifests', 'invocation-index.json'),
53
+ publishBundlePath: path.join(runRoot, 'stage_outputs', '10_publish', 'publish-bundle.json'),
54
+ publishRequestPath: path.join(runRoot, 'stage_outputs', '10_publish', 'publish-request.json'),
55
+ publishIntentPath: path.join(runRoot, 'stage_outputs', '10_publish', 'publish-intent.json'),
56
+ reportPath: path.join(runRoot, 'reports', 'process-publish-build-report.json'),
57
+ };
58
+ }
59
+ function resolveLayout(options) {
60
+ const runId = nonEmptyString(options.runId);
61
+ const runDir = nonEmptyString(options.runDir);
62
+ if (!runId && !runDir) {
63
+ throw new CliError('Missing required --run-id or --run-dir for process publish-build.', {
64
+ code: 'PROCESS_PUBLISH_RUN_REQUIRED',
65
+ exitCode: 2,
66
+ });
67
+ }
68
+ const runRoot = runDir
69
+ ? path.resolve(runDir)
70
+ : path.resolve('artifacts', 'process_from_flow', runId);
71
+ const derivedRunId = path.basename(runRoot);
72
+ if (runDir && runId && derivedRunId !== runId) {
73
+ throw new CliError(`process publish-build run-id does not match run-dir basename: ${runId} !== ${derivedRunId}`, {
74
+ code: 'PROCESS_PUBLISH_RUN_ID_MISMATCH',
75
+ exitCode: 2,
76
+ });
77
+ }
78
+ return buildLayout(runRoot, runId ?? derivedRunId);
79
+ }
80
+ function ensureRunRootExists(layout) {
81
+ if (!existsSync(layout.runRoot)) {
82
+ throw new CliError(`process publish-build run root not found: ${layout.runRoot}`, {
83
+ code: 'PROCESS_PUBLISH_RUN_NOT_FOUND',
84
+ exitCode: 2,
85
+ });
86
+ }
87
+ }
88
+ function readRequiredRunManifest(layout) {
89
+ const manifest = readRequiredJsonObject(layout.runManifestPath, 'PROCESS_PUBLISH_RUN_MANIFEST_MISSING', 'PROCESS_PUBLISH_RUN_MANIFEST_INVALID', 'run-manifest');
90
+ const manifestRunId = nonEmptyString(manifest.runId);
91
+ if (manifestRunId && manifestRunId !== layout.runId) {
92
+ throw new CliError(`process publish-build run manifest runId mismatch: ${layout.runManifestPath}`, {
93
+ code: 'PROCESS_PUBLISH_RUN_MANIFEST_MISMATCH',
94
+ exitCode: 2,
95
+ details: {
96
+ expected: layout.runId,
97
+ actual: manifestRunId,
98
+ },
99
+ });
100
+ }
101
+ return manifest;
102
+ }
103
+ function readRequiredState(layout) {
104
+ const state = readRequiredJsonObject(layout.statePath, 'PROCESS_PUBLISH_STATE_MISSING', 'PROCESS_PUBLISH_STATE_INVALID', 'state');
105
+ const stateRunId = nonEmptyString(state.run_id);
106
+ if (stateRunId && stateRunId !== layout.runId) {
107
+ throw new CliError(`process publish-build state run_id mismatch: ${layout.statePath}`, {
108
+ code: 'PROCESS_PUBLISH_STATE_RUN_ID_MISMATCH',
109
+ exitCode: 2,
110
+ details: {
111
+ expected: layout.runId,
112
+ actual: stateRunId,
113
+ },
114
+ });
115
+ }
116
+ return state;
117
+ }
118
+ function readRequiredHandoffSummary(layout) {
119
+ return readRequiredJsonObject(layout.handoffSummaryPath, 'PROCESS_PUBLISH_HANDOFF_MISSING', 'PROCESS_PUBLISH_HANDOFF_INVALID', 'handoff-summary');
120
+ }
121
+ function readInvocationIndex(layout) {
122
+ if (!existsSync(layout.invocationIndexPath)) {
123
+ return {
124
+ schema_version: 1,
125
+ invocations: [],
126
+ };
127
+ }
128
+ const value = readJsonArtifact(layout.invocationIndexPath);
129
+ if (!isRecord(value)) {
130
+ throw new CliError(`Expected process publish invocation index JSON object: ${layout.invocationIndexPath}`, {
131
+ code: 'PROCESS_PUBLISH_INVOCATION_INDEX_INVALID',
132
+ exitCode: 2,
133
+ });
134
+ }
135
+ if (value.invocations === undefined) {
136
+ return {
137
+ schema_version: 1,
138
+ invocations: [],
139
+ };
140
+ }
141
+ if (!Array.isArray(value.invocations)) {
142
+ throw new CliError(`Expected process publish invocation index to contain an invocations array: ${layout.invocationIndexPath}`, {
143
+ code: 'PROCESS_PUBLISH_INVOCATION_INDEX_INVALID',
144
+ exitCode: 2,
145
+ });
146
+ }
147
+ return value;
148
+ }
149
+ function buildStateSummary(state) {
150
+ return {
151
+ build_status: nonEmptyString(state.build_status),
152
+ next_stage: nonEmptyString(state.next_stage),
153
+ stop_after: nonEmptyString(state.stop_after),
154
+ };
155
+ }
156
+ function readDatasetArrayFromState(state, key) {
157
+ if (state[key] === undefined) {
158
+ return [];
159
+ }
160
+ if (!Array.isArray(state[key])) {
161
+ throw new CliError(`process publish-build expected state.${key} to be an array.`, {
162
+ code: 'PROCESS_PUBLISH_STATE_DATASETS_INVALID',
163
+ exitCode: 2,
164
+ details: { key },
165
+ });
166
+ }
167
+ return state[key].map((item, index) => {
168
+ if (!isRecord(item)) {
169
+ throw new CliError(`process publish-build expected state.${key}[${index}] to be an object.`, {
170
+ code: 'PROCESS_PUBLISH_STATE_DATASETS_INVALID',
171
+ exitCode: 2,
172
+ details: { key, index },
173
+ });
174
+ }
175
+ return item;
176
+ });
177
+ }
178
+ function readDatasetDir(dirPath, label) {
179
+ if (!existsSync(dirPath)) {
180
+ return [];
181
+ }
182
+ return readdirSync(dirPath)
183
+ .filter((entry) => entry.endsWith('.json'))
184
+ .sort()
185
+ .map((entry) => {
186
+ const filePath = path.join(dirPath, entry);
187
+ const value = readJsonArtifact(filePath);
188
+ if (!isRecord(value)) {
189
+ throw new CliError(`Expected ${label} export JSON object: ${filePath}`, {
190
+ code: 'PROCESS_PUBLISH_EXPORT_INVALID',
191
+ exitCode: 2,
192
+ details: { label, filePath },
193
+ });
194
+ }
195
+ return value;
196
+ });
197
+ }
198
+ function collectCanonicalDatasets(layout, state) {
199
+ const processExports = readDatasetDir(layout.processExportsDir, 'process');
200
+ const sourceExports = readDatasetDir(layout.sourceExportsDir, 'source');
201
+ const stateProcesses = readDatasetArrayFromState(state, 'process_datasets');
202
+ const stateSources = readDatasetArrayFromState(state, 'source_datasets');
203
+ return {
204
+ processes: processExports.length > 0 ? processExports : stateProcesses,
205
+ processOrigin: processExports.length > 0 ? 'exports' : 'state',
206
+ sources: sourceExports.length > 0 ? sourceExports : stateSources,
207
+ sourceOrigin: sourceExports.length > 0 ? 'exports' : 'state',
208
+ };
209
+ }
210
+ function updateStepMarkers(stepMarkers, completedAt) {
211
+ const markers = isRecord(stepMarkers) ? { ...stepMarkers } : {};
212
+ markers.publish_handoff_prepared = {
213
+ status: 'completed',
214
+ completed_at: completedAt,
215
+ };
216
+ return markers;
217
+ }
218
+ function buildUpdatedState(state, layout, counts, datasetOrigins, now) {
219
+ return {
220
+ ...state,
221
+ publish_build_requested_at: now.toISOString(),
222
+ last_publish_build: {
223
+ status: 'prepared_local_process_publish_bundle',
224
+ prepared_at: now.toISOString(),
225
+ publish_bundle_path: layout.publishBundlePath,
226
+ publish_request_path: layout.publishRequestPath,
227
+ publish_intent_path: layout.publishIntentPath,
228
+ process_count: counts.processes,
229
+ source_count: counts.sources,
230
+ relation_count: counts.relations,
231
+ dataset_origins: datasetOrigins,
232
+ },
233
+ step_markers: updateStepMarkers(state.step_markers, now.toISOString()),
234
+ };
235
+ }
236
+ function buildInvocationIndex(layout, invocationIndex, options, now) {
237
+ const priorInvocations = Array.isArray(invocationIndex.invocations)
238
+ ? [...invocationIndex.invocations]
239
+ : [];
240
+ const command = ['process', 'publish-build'];
241
+ if (options.runId) {
242
+ command.push('--run-id', options.runId);
243
+ }
244
+ if (options.runDir) {
245
+ command.push('--run-dir', options.runDir);
246
+ }
247
+ return {
248
+ ...invocationIndex,
249
+ schema_version: typeof invocationIndex.schema_version === 'number' ? invocationIndex.schema_version : 1,
250
+ invocations: [
251
+ ...priorInvocations,
252
+ {
253
+ command,
254
+ cwd: options.cwd ?? process.cwd(),
255
+ created_at: now.toISOString(),
256
+ run_id: layout.runId,
257
+ run_root: layout.runRoot,
258
+ report_path: layout.reportPath,
259
+ publish_request_path: layout.publishRequestPath,
260
+ },
261
+ ],
262
+ };
263
+ }
264
+ function buildPublishBundle(layout, state, runManifest, processes, sources, counts, datasetOrigins, now) {
265
+ return {
266
+ generated_at_utc: now.toISOString(),
267
+ run_id: layout.runId,
268
+ run_root: layout.runRoot,
269
+ request_id: nonEmptyString(state.request_id),
270
+ status: 'prepared_local_process_publish_bundle',
271
+ counts,
272
+ dataset_origins: datasetOrigins,
273
+ source_run: {
274
+ build_status: nonEmptyString(state.build_status),
275
+ next_stage: nonEmptyString(state.next_stage),
276
+ stop_after: nonEmptyString(state.stop_after),
277
+ run_manifest: copyJson(runManifest),
278
+ },
279
+ processes: copyJson(processes),
280
+ sources: copyJson(sources),
281
+ relations: [],
282
+ };
283
+ }
284
+ function buildPublishRequest() {
285
+ return {
286
+ inputs: {
287
+ bundle_paths: ['./publish-bundle.json'],
288
+ },
289
+ publish: {
290
+ commit: false,
291
+ publish_lifecyclemodels: false,
292
+ publish_processes: true,
293
+ publish_sources: true,
294
+ publish_relations: true,
295
+ publish_process_build_runs: false,
296
+ relation_mode: 'local_manifest_only',
297
+ },
298
+ out_dir: './publish-run',
299
+ };
300
+ }
301
+ function buildPublishIntent(layout, counts) {
302
+ return {
303
+ ok: true,
304
+ command: 'publish run',
305
+ input_path: layout.publishRequestPath,
306
+ run_id: layout.runId,
307
+ run_root: layout.runRoot,
308
+ status: 'prepared_local_process_publish_bundle',
309
+ process_count: counts.processes,
310
+ source_count: counts.sources,
311
+ relation_count: counts.relations,
312
+ };
313
+ }
314
+ function buildNextActions(layout) {
315
+ return [
316
+ `inspect: ${layout.publishBundlePath}`,
317
+ `inspect: ${layout.publishRequestPath}`,
318
+ `run: tiangong publish run --input ${layout.publishRequestPath}`,
319
+ 'future: wire publish executors before remote commit mode is expected',
320
+ ];
321
+ }
322
+ function stateArrayLength(value) {
323
+ return Array.isArray(value) ? value.length : 0;
324
+ }
325
+ function buildAgentHandoffSummary(layout, state, counts, now) {
326
+ return {
327
+ schema_version: 1,
328
+ generated_at_utc: now.toISOString(),
329
+ run_id: layout.runId,
330
+ command: 'process publish-build',
331
+ flow_path: nonEmptyString(state.flow_path),
332
+ operation: nonEmptyString(state.operation),
333
+ stop_after: nonEmptyString(state.stop_after),
334
+ process_count: counts.processes,
335
+ matched_exchange_count: stateArrayLength(state.matched_process_exchanges),
336
+ process_dataset_count: counts.processes,
337
+ source_dataset_count: counts.sources,
338
+ remaining_placeholder_refs: stateArrayLength(state.placeholder_resolutions),
339
+ placeholder_examples: [],
340
+ publish_summary: {},
341
+ artifacts: {
342
+ state_path: layout.statePath,
343
+ publish_bundle: layout.publishBundlePath,
344
+ publish_request: layout.publishRequestPath,
345
+ publish_intent: layout.publishIntentPath,
346
+ process_update_report: null,
347
+ flow_auto_build_manifest: null,
348
+ publish_summary: null,
349
+ timing_report: null,
350
+ llm_cost_report: null,
351
+ },
352
+ next_actions: buildNextActions(layout),
353
+ extra: {
354
+ status: 'prepared_local_process_publish_bundle',
355
+ request_id: nonEmptyString(state.request_id),
356
+ },
357
+ };
358
+ }
359
+ function buildReport(layout, state, counts, datasetOrigins, publishDefaults, now) {
360
+ return {
361
+ schema_version: 1,
362
+ generated_at_utc: now.toISOString(),
363
+ status: 'prepared_local_process_publish_bundle',
364
+ run_id: layout.runId,
365
+ run_root: layout.runRoot,
366
+ request_id: nonEmptyString(state.request_id),
367
+ state_summary: buildStateSummary(state),
368
+ dataset_origins: datasetOrigins,
369
+ counts,
370
+ publish_defaults: publishDefaults,
371
+ files: {
372
+ state: layout.statePath,
373
+ handoff_summary: layout.handoffSummaryPath,
374
+ run_manifest: layout.runManifestPath,
375
+ invocation_index: layout.invocationIndexPath,
376
+ publish_bundle: layout.publishBundlePath,
377
+ publish_request: layout.publishRequestPath,
378
+ publish_intent: layout.publishIntentPath,
379
+ report: layout.reportPath,
380
+ },
381
+ next_actions: buildNextActions(layout),
382
+ };
383
+ }
384
+ export async function runProcessPublishBuild(options) {
385
+ const now = options.now ?? new Date();
386
+ const layout = resolveLayout(options);
387
+ ensureRunRootExists(layout);
388
+ const runManifest = readRequiredRunManifest(layout);
389
+ readRequiredHandoffSummary(layout);
390
+ const invocationIndex = readInvocationIndex(layout);
391
+ return await withStateFileLock(layout.statePath, { reason: 'process-publish-build.prepare_publish', now }, () => {
392
+ const state = readRequiredState(layout);
393
+ const datasets = collectCanonicalDatasets(layout, state);
394
+ if (datasets.processes.length === 0) {
395
+ throw new CliError('process publish-build run does not contain any process datasets to publish.', {
396
+ code: 'PROCESS_PUBLISH_PROCESSES_MISSING',
397
+ exitCode: 2,
398
+ });
399
+ }
400
+ const counts = {
401
+ processes: datasets.processes.length,
402
+ sources: datasets.sources.length,
403
+ relations: 0,
404
+ };
405
+ const datasetOrigins = {
406
+ processes: datasets.processOrigin,
407
+ sources: datasets.sourceOrigin,
408
+ };
409
+ const publishBundle = buildPublishBundle(layout, state, runManifest, datasets.processes, datasets.sources, counts, datasetOrigins, now);
410
+ const publishRequest = buildPublishRequest();
411
+ const normalizedPublishRequest = normalizePublishRequest(publishRequest, {
412
+ requestPath: layout.publishRequestPath,
413
+ now,
414
+ });
415
+ const publishIntent = buildPublishIntent(layout, counts);
416
+ const updatedState = buildUpdatedState(state, layout, counts, datasetOrigins, now);
417
+ const updatedInvocationIndex = buildInvocationIndex(layout, invocationIndex, options, now);
418
+ const handoffSummary = buildAgentHandoffSummary(layout, updatedState, counts, now);
419
+ const report = buildReport(layout, updatedState, counts, datasetOrigins, {
420
+ commit: normalizedPublishRequest.publish.commit,
421
+ publish_lifecyclemodels: normalizedPublishRequest.publish.publish_lifecyclemodels,
422
+ publish_processes: normalizedPublishRequest.publish.publish_processes,
423
+ publish_sources: normalizedPublishRequest.publish.publish_sources,
424
+ publish_relations: normalizedPublishRequest.publish.publish_relations,
425
+ publish_process_build_runs: normalizedPublishRequest.publish.publish_process_build_runs,
426
+ relation_mode: normalizedPublishRequest.publish.relation_mode,
427
+ }, now);
428
+ writeJsonArtifact(layout.statePath, updatedState);
429
+ writeJsonArtifact(layout.invocationIndexPath, updatedInvocationIndex);
430
+ writeJsonArtifact(layout.publishBundlePath, publishBundle);
431
+ writeJsonArtifact(layout.publishRequestPath, publishRequest);
432
+ writeJsonArtifact(layout.publishIntentPath, publishIntent);
433
+ writeJsonArtifact(layout.handoffSummaryPath, handoffSummary);
434
+ writeJsonArtifact(layout.reportPath, report);
435
+ return report;
436
+ });
437
+ }
438
+ export const __testInternals = {
439
+ buildLayout,
440
+ resolveLayout,
441
+ buildStateSummary,
442
+ readDatasetArrayFromState,
443
+ collectCanonicalDatasets,
444
+ buildPublishRequest,
445
+ buildPublishIntent,
446
+ buildUpdatedState,
447
+ buildInvocationIndex,
448
+ buildNextActions,
449
+ buildReport,
450
+ };
451
+ //# sourceMappingURL=process-publish-build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-publish-build.js","sourceRoot":"","sources":["../../../src/lib/process-publish-build.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync, readdirSync } from 'node:fs';\nimport path from 'node:path';\nimport { readJsonArtifact, writeJsonArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\nimport { normalizePublishRequest } from './publish.js';\nimport { withStateFileLock } from './state-lock.js';\n\ntype JsonRecord = Record<string, unknown>;\n\ntype DatasetOrigin = 'exports' | 'state';\n\nexport type ProcessPublishBuildLayout = {\n runId: string;\n runRoot: string;\n collectionDir: string;\n cacheDir: string;\n manifestsDir: string;\n reportsDir: string;\n processExportsDir: string;\n sourceExportsDir: string;\n publishStageDir: string;\n statePath: string;\n handoffSummaryPath: string;\n runManifestPath: string;\n invocationIndexPath: string;\n publishBundlePath: string;\n publishRequestPath: string;\n publishIntentPath: string;\n reportPath: string;\n};\n\nexport type ProcessPublishBuildReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'prepared_local_process_publish_bundle';\n run_id: string;\n run_root: string;\n request_id: string | null;\n state_summary: {\n build_status: string | null;\n next_stage: string | null;\n stop_after: string | null;\n };\n dataset_origins: {\n processes: DatasetOrigin;\n sources: DatasetOrigin;\n };\n counts: {\n processes: number;\n sources: number;\n relations: number;\n };\n publish_defaults: {\n commit: boolean;\n publish_lifecyclemodels: boolean;\n publish_processes: boolean;\n publish_sources: boolean;\n publish_relations: boolean;\n publish_process_build_runs: boolean;\n relation_mode: 'local_manifest_only';\n };\n files: {\n state: string;\n handoff_summary: string;\n run_manifest: string;\n invocation_index: string;\n publish_bundle: string;\n publish_request: string;\n publish_intent: string;\n report: string;\n };\n next_actions: string[];\n};\n\nexport type RunProcessPublishBuildOptions = {\n runId?: string;\n runDir?: string | null;\n now?: Date;\n cwd?: string;\n};\n\nfunction isRecord(value: unknown): value is JsonRecord {\n return Boolean(value && typeof value === 'object' && !Array.isArray(value));\n}\n\nfunction nonEmptyString(value: unknown): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n\n const normalized = value.trim();\n return normalized || null;\n}\n\nfunction copyJson<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction readRequiredJsonObject(\n filePath: string,\n missingCode: string,\n invalidCode: string,\n label: string,\n): JsonRecord {\n if (!existsSync(filePath)) {\n throw new CliError(`Required process publish artifact not found: ${filePath}`, {\n code: missingCode,\n exitCode: 2,\n details: { label, filePath },\n });\n }\n\n const value = readJsonArtifact(filePath);\n if (!isRecord(value)) {\n throw new CliError(`Expected process publish artifact JSON object: ${filePath}`, {\n code: invalidCode,\n exitCode: 2,\n details: { label, filePath },\n });\n }\n\n return value;\n}\n\nfunction buildLayout(runRoot: string, runId: string): ProcessPublishBuildLayout {\n return {\n runId,\n runRoot,\n collectionDir: path.dirname(runRoot),\n cacheDir: path.join(runRoot, 'cache'),\n manifestsDir: path.join(runRoot, 'manifests'),\n reportsDir: path.join(runRoot, 'reports'),\n processExportsDir: path.join(runRoot, 'exports', 'processes'),\n sourceExportsDir: path.join(runRoot, 'exports', 'sources'),\n publishStageDir: path.join(runRoot, 'stage_outputs', '10_publish'),\n statePath: path.join(runRoot, 'cache', 'process_from_flow_state.json'),\n handoffSummaryPath: path.join(runRoot, 'cache', 'agent_handoff_summary.json'),\n runManifestPath: path.join(runRoot, 'manifests', 'run-manifest.json'),\n invocationIndexPath: path.join(runRoot, 'manifests', 'invocation-index.json'),\n publishBundlePath: path.join(runRoot, 'stage_outputs', '10_publish', 'publish-bundle.json'),\n publishRequestPath: path.join(runRoot, 'stage_outputs', '10_publish', 'publish-request.json'),\n publishIntentPath: path.join(runRoot, 'stage_outputs', '10_publish', 'publish-intent.json'),\n reportPath: path.join(runRoot, 'reports', 'process-publish-build-report.json'),\n };\n}\n\nfunction resolveLayout(options: RunProcessPublishBuildOptions): ProcessPublishBuildLayout {\n const runId = nonEmptyString(options.runId);\n const runDir = nonEmptyString(options.runDir);\n\n if (!runId && !runDir) {\n throw new CliError('Missing required --run-id or --run-dir for process publish-build.', {\n code: 'PROCESS_PUBLISH_RUN_REQUIRED',\n exitCode: 2,\n });\n }\n\n const runRoot = runDir\n ? path.resolve(runDir)\n : path.resolve('artifacts', 'process_from_flow', runId as string);\n const derivedRunId = path.basename(runRoot);\n\n if (runDir && runId && derivedRunId !== runId) {\n throw new CliError(\n `process publish-build run-id does not match run-dir basename: ${runId} !== ${derivedRunId}`,\n {\n code: 'PROCESS_PUBLISH_RUN_ID_MISMATCH',\n exitCode: 2,\n },\n );\n }\n\n return buildLayout(runRoot, runId ?? derivedRunId);\n}\n\nfunction ensureRunRootExists(layout: ProcessPublishBuildLayout): void {\n if (!existsSync(layout.runRoot)) {\n throw new CliError(`process publish-build run root not found: ${layout.runRoot}`, {\n code: 'PROCESS_PUBLISH_RUN_NOT_FOUND',\n exitCode: 2,\n });\n }\n}\n\nfunction readRequiredRunManifest(layout: ProcessPublishBuildLayout): JsonRecord {\n const manifest = readRequiredJsonObject(\n layout.runManifestPath,\n 'PROCESS_PUBLISH_RUN_MANIFEST_MISSING',\n 'PROCESS_PUBLISH_RUN_MANIFEST_INVALID',\n 'run-manifest',\n );\n\n const manifestRunId = nonEmptyString(manifest.runId);\n if (manifestRunId && manifestRunId !== layout.runId) {\n throw new CliError(\n `process publish-build run manifest runId mismatch: ${layout.runManifestPath}`,\n {\n code: 'PROCESS_PUBLISH_RUN_MANIFEST_MISMATCH',\n exitCode: 2,\n details: {\n expected: layout.runId,\n actual: manifestRunId,\n },\n },\n );\n }\n\n return manifest;\n}\n\nfunction readRequiredState(layout: ProcessPublishBuildLayout): JsonRecord {\n const state = readRequiredJsonObject(\n layout.statePath,\n 'PROCESS_PUBLISH_STATE_MISSING',\n 'PROCESS_PUBLISH_STATE_INVALID',\n 'state',\n );\n\n const stateRunId = nonEmptyString(state.run_id);\n if (stateRunId && stateRunId !== layout.runId) {\n throw new CliError(`process publish-build state run_id mismatch: ${layout.statePath}`, {\n code: 'PROCESS_PUBLISH_STATE_RUN_ID_MISMATCH',\n exitCode: 2,\n details: {\n expected: layout.runId,\n actual: stateRunId,\n },\n });\n }\n\n return state;\n}\n\nfunction readRequiredHandoffSummary(layout: ProcessPublishBuildLayout): JsonRecord {\n return readRequiredJsonObject(\n layout.handoffSummaryPath,\n 'PROCESS_PUBLISH_HANDOFF_MISSING',\n 'PROCESS_PUBLISH_HANDOFF_INVALID',\n 'handoff-summary',\n );\n}\n\nfunction readInvocationIndex(layout: ProcessPublishBuildLayout): JsonRecord {\n if (!existsSync(layout.invocationIndexPath)) {\n return {\n schema_version: 1,\n invocations: [],\n };\n }\n\n const value = readJsonArtifact(layout.invocationIndexPath);\n if (!isRecord(value)) {\n throw new CliError(\n `Expected process publish invocation index JSON object: ${layout.invocationIndexPath}`,\n {\n code: 'PROCESS_PUBLISH_INVOCATION_INDEX_INVALID',\n exitCode: 2,\n },\n );\n }\n\n if (value.invocations === undefined) {\n return {\n schema_version: 1,\n invocations: [],\n };\n }\n\n if (!Array.isArray(value.invocations)) {\n throw new CliError(\n `Expected process publish invocation index to contain an invocations array: ${layout.invocationIndexPath}`,\n {\n code: 'PROCESS_PUBLISH_INVOCATION_INDEX_INVALID',\n exitCode: 2,\n },\n );\n }\n\n return value;\n}\n\nfunction buildStateSummary(state: JsonRecord): ProcessPublishBuildReport['state_summary'] {\n return {\n build_status: nonEmptyString(state.build_status),\n next_stage: nonEmptyString(state.next_stage),\n stop_after: nonEmptyString(state.stop_after),\n };\n}\n\nfunction readDatasetArrayFromState(\n state: JsonRecord,\n key: 'process_datasets' | 'source_datasets',\n): JsonRecord[] {\n if (state[key] === undefined) {\n return [];\n }\n\n if (!Array.isArray(state[key])) {\n throw new CliError(`process publish-build expected state.${key} to be an array.`, {\n code: 'PROCESS_PUBLISH_STATE_DATASETS_INVALID',\n exitCode: 2,\n details: { key },\n });\n }\n\n return state[key].map((item, index) => {\n if (!isRecord(item)) {\n throw new CliError(`process publish-build expected state.${key}[${index}] to be an object.`, {\n code: 'PROCESS_PUBLISH_STATE_DATASETS_INVALID',\n exitCode: 2,\n details: { key, index },\n });\n }\n\n return item;\n });\n}\n\nfunction readDatasetDir(dirPath: string, label: string): JsonRecord[] {\n if (!existsSync(dirPath)) {\n return [];\n }\n\n return readdirSync(dirPath)\n .filter((entry) => entry.endsWith('.json'))\n .sort()\n .map((entry) => {\n const filePath = path.join(dirPath, entry);\n const value = readJsonArtifact(filePath);\n if (!isRecord(value)) {\n throw new CliError(`Expected ${label} export JSON object: ${filePath}`, {\n code: 'PROCESS_PUBLISH_EXPORT_INVALID',\n exitCode: 2,\n details: { label, filePath },\n });\n }\n\n return value;\n });\n}\n\nfunction collectCanonicalDatasets(\n layout: ProcessPublishBuildLayout,\n state: JsonRecord,\n): {\n processes: JsonRecord[];\n processOrigin: DatasetOrigin;\n sources: JsonRecord[];\n sourceOrigin: DatasetOrigin;\n} {\n const processExports = readDatasetDir(layout.processExportsDir, 'process');\n const sourceExports = readDatasetDir(layout.sourceExportsDir, 'source');\n\n const stateProcesses = readDatasetArrayFromState(state, 'process_datasets');\n const stateSources = readDatasetArrayFromState(state, 'source_datasets');\n\n return {\n processes: processExports.length > 0 ? processExports : stateProcesses,\n processOrigin: processExports.length > 0 ? 'exports' : 'state',\n sources: sourceExports.length > 0 ? sourceExports : stateSources,\n sourceOrigin: sourceExports.length > 0 ? 'exports' : 'state',\n };\n}\n\nfunction updateStepMarkers(stepMarkers: unknown, completedAt: string): JsonRecord {\n const markers = isRecord(stepMarkers) ? { ...stepMarkers } : {};\n markers.publish_handoff_prepared = {\n status: 'completed',\n completed_at: completedAt,\n };\n return markers;\n}\n\nfunction buildUpdatedState(\n state: JsonRecord,\n layout: ProcessPublishBuildLayout,\n counts: ProcessPublishBuildReport['counts'],\n datasetOrigins: ProcessPublishBuildReport['dataset_origins'],\n now: Date,\n): JsonRecord {\n return {\n ...state,\n publish_build_requested_at: now.toISOString(),\n last_publish_build: {\n status: 'prepared_local_process_publish_bundle',\n prepared_at: now.toISOString(),\n publish_bundle_path: layout.publishBundlePath,\n publish_request_path: layout.publishRequestPath,\n publish_intent_path: layout.publishIntentPath,\n process_count: counts.processes,\n source_count: counts.sources,\n relation_count: counts.relations,\n dataset_origins: datasetOrigins,\n },\n step_markers: updateStepMarkers(state.step_markers, now.toISOString()),\n };\n}\n\nfunction buildInvocationIndex(\n layout: ProcessPublishBuildLayout,\n invocationIndex: JsonRecord,\n options: RunProcessPublishBuildOptions,\n now: Date,\n): JsonRecord {\n const priorInvocations = Array.isArray(invocationIndex.invocations)\n ? [...invocationIndex.invocations]\n : [];\n const command = ['process', 'publish-build'];\n\n if (options.runId) {\n command.push('--run-id', options.runId);\n }\n if (options.runDir) {\n command.push('--run-dir', options.runDir);\n }\n\n return {\n ...invocationIndex,\n schema_version:\n typeof invocationIndex.schema_version === 'number' ? invocationIndex.schema_version : 1,\n invocations: [\n ...priorInvocations,\n {\n command,\n cwd: options.cwd ?? process.cwd(),\n created_at: now.toISOString(),\n run_id: layout.runId,\n run_root: layout.runRoot,\n report_path: layout.reportPath,\n publish_request_path: layout.publishRequestPath,\n },\n ],\n };\n}\n\nfunction buildPublishBundle(\n layout: ProcessPublishBuildLayout,\n state: JsonRecord,\n runManifest: JsonRecord,\n processes: JsonRecord[],\n sources: JsonRecord[],\n counts: ProcessPublishBuildReport['counts'],\n datasetOrigins: ProcessPublishBuildReport['dataset_origins'],\n now: Date,\n): JsonRecord {\n return {\n generated_at_utc: now.toISOString(),\n run_id: layout.runId,\n run_root: layout.runRoot,\n request_id: nonEmptyString(state.request_id),\n status: 'prepared_local_process_publish_bundle',\n counts,\n dataset_origins: datasetOrigins,\n source_run: {\n build_status: nonEmptyString(state.build_status),\n next_stage: nonEmptyString(state.next_stage),\n stop_after: nonEmptyString(state.stop_after),\n run_manifest: copyJson(runManifest),\n },\n processes: copyJson(processes),\n sources: copyJson(sources),\n relations: [],\n };\n}\n\nfunction buildPublishRequest(): JsonRecord {\n return {\n inputs: {\n bundle_paths: ['./publish-bundle.json'],\n },\n publish: {\n commit: false,\n publish_lifecyclemodels: false,\n publish_processes: true,\n publish_sources: true,\n publish_relations: true,\n publish_process_build_runs: false,\n relation_mode: 'local_manifest_only',\n },\n out_dir: './publish-run',\n };\n}\n\nfunction buildPublishIntent(\n layout: ProcessPublishBuildLayout,\n counts: ProcessPublishBuildReport['counts'],\n): JsonRecord {\n return {\n ok: true,\n command: 'publish run',\n input_path: layout.publishRequestPath,\n run_id: layout.runId,\n run_root: layout.runRoot,\n status: 'prepared_local_process_publish_bundle',\n process_count: counts.processes,\n source_count: counts.sources,\n relation_count: counts.relations,\n };\n}\n\nfunction buildNextActions(layout: ProcessPublishBuildLayout): string[] {\n return [\n `inspect: ${layout.publishBundlePath}`,\n `inspect: ${layout.publishRequestPath}`,\n `run: tiangong publish run --input ${layout.publishRequestPath}`,\n 'future: wire publish executors before remote commit mode is expected',\n ];\n}\n\nfunction stateArrayLength(value: unknown): number {\n return Array.isArray(value) ? value.length : 0;\n}\n\nfunction buildAgentHandoffSummary(\n layout: ProcessPublishBuildLayout,\n state: JsonRecord,\n counts: ProcessPublishBuildReport['counts'],\n now: Date,\n): JsonRecord {\n return {\n schema_version: 1,\n generated_at_utc: now.toISOString(),\n run_id: layout.runId,\n command: 'process publish-build',\n flow_path: nonEmptyString(state.flow_path),\n operation: nonEmptyString(state.operation),\n stop_after: nonEmptyString(state.stop_after),\n process_count: counts.processes,\n matched_exchange_count: stateArrayLength(state.matched_process_exchanges),\n process_dataset_count: counts.processes,\n source_dataset_count: counts.sources,\n remaining_placeholder_refs: stateArrayLength(state.placeholder_resolutions),\n placeholder_examples: [],\n publish_summary: {},\n artifacts: {\n state_path: layout.statePath,\n publish_bundle: layout.publishBundlePath,\n publish_request: layout.publishRequestPath,\n publish_intent: layout.publishIntentPath,\n process_update_report: null,\n flow_auto_build_manifest: null,\n publish_summary: null,\n timing_report: null,\n llm_cost_report: null,\n },\n next_actions: buildNextActions(layout),\n extra: {\n status: 'prepared_local_process_publish_bundle',\n request_id: nonEmptyString(state.request_id),\n },\n };\n}\n\nfunction buildReport(\n layout: ProcessPublishBuildLayout,\n state: JsonRecord,\n counts: ProcessPublishBuildReport['counts'],\n datasetOrigins: ProcessPublishBuildReport['dataset_origins'],\n publishDefaults: ProcessPublishBuildReport['publish_defaults'],\n now: Date,\n): ProcessPublishBuildReport {\n return {\n schema_version: 1,\n generated_at_utc: now.toISOString(),\n status: 'prepared_local_process_publish_bundle',\n run_id: layout.runId,\n run_root: layout.runRoot,\n request_id: nonEmptyString(state.request_id),\n state_summary: buildStateSummary(state),\n dataset_origins: datasetOrigins,\n counts,\n publish_defaults: publishDefaults,\n files: {\n state: layout.statePath,\n handoff_summary: layout.handoffSummaryPath,\n run_manifest: layout.runManifestPath,\n invocation_index: layout.invocationIndexPath,\n publish_bundle: layout.publishBundlePath,\n publish_request: layout.publishRequestPath,\n publish_intent: layout.publishIntentPath,\n report: layout.reportPath,\n },\n next_actions: buildNextActions(layout),\n };\n}\n\nexport async function runProcessPublishBuild(\n options: RunProcessPublishBuildOptions,\n): Promise<ProcessPublishBuildReport> {\n const now = options.now ?? new Date();\n const layout = resolveLayout(options);\n ensureRunRootExists(layout);\n const runManifest = readRequiredRunManifest(layout);\n readRequiredHandoffSummary(layout);\n const invocationIndex = readInvocationIndex(layout);\n\n return await withStateFileLock(\n layout.statePath,\n { reason: 'process-publish-build.prepare_publish', now },\n () => {\n const state = readRequiredState(layout);\n const datasets = collectCanonicalDatasets(layout, state);\n\n if (datasets.processes.length === 0) {\n throw new CliError(\n 'process publish-build run does not contain any process datasets to publish.',\n {\n code: 'PROCESS_PUBLISH_PROCESSES_MISSING',\n exitCode: 2,\n },\n );\n }\n\n const counts: ProcessPublishBuildReport['counts'] = {\n processes: datasets.processes.length,\n sources: datasets.sources.length,\n relations: 0,\n };\n const datasetOrigins: ProcessPublishBuildReport['dataset_origins'] = {\n processes: datasets.processOrigin,\n sources: datasets.sourceOrigin,\n };\n const publishBundle = buildPublishBundle(\n layout,\n state,\n runManifest,\n datasets.processes,\n datasets.sources,\n counts,\n datasetOrigins,\n now,\n );\n const publishRequest = buildPublishRequest();\n const normalizedPublishRequest = normalizePublishRequest(publishRequest, {\n requestPath: layout.publishRequestPath,\n now,\n });\n const publishIntent = buildPublishIntent(layout, counts);\n const updatedState = buildUpdatedState(state, layout, counts, datasetOrigins, now);\n const updatedInvocationIndex = buildInvocationIndex(layout, invocationIndex, options, now);\n const handoffSummary = buildAgentHandoffSummary(layout, updatedState, counts, now);\n const report = buildReport(\n layout,\n updatedState,\n counts,\n datasetOrigins,\n {\n commit: normalizedPublishRequest.publish.commit,\n publish_lifecyclemodels: normalizedPublishRequest.publish.publish_lifecyclemodels,\n publish_processes: normalizedPublishRequest.publish.publish_processes,\n publish_sources: normalizedPublishRequest.publish.publish_sources,\n publish_relations: normalizedPublishRequest.publish.publish_relations,\n publish_process_build_runs: normalizedPublishRequest.publish.publish_process_build_runs,\n relation_mode: normalizedPublishRequest.publish.relation_mode,\n },\n now,\n );\n\n writeJsonArtifact(layout.statePath, updatedState);\n writeJsonArtifact(layout.invocationIndexPath, updatedInvocationIndex);\n writeJsonArtifact(layout.publishBundlePath, publishBundle);\n writeJsonArtifact(layout.publishRequestPath, publishRequest);\n writeJsonArtifact(layout.publishIntentPath, publishIntent);\n writeJsonArtifact(layout.handoffSummaryPath, handoffSummary);\n writeJsonArtifact(layout.reportPath, report);\n\n return report;\n },\n );\n}\n\nexport const __testInternals = {\n buildLayout,\n resolveLayout,\n buildStateSummary,\n readDatasetArrayFromState,\n collectCanonicalDatasets,\n buildPublishRequest,\n buildPublishIntent,\n buildUpdatedState,\n buildInvocationIndex,\n buildNextActions,\n buildReport,\n};\n"]}