@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,364 @@
1
+ import { existsSync } from 'node:fs';
2
+ import path from 'node:path';
3
+ import { readJsonArtifact, readJsonLinesArtifact, writeJsonArtifact, writeJsonLinesArtifact, } from './artifacts.js';
4
+ import { CliError } from './errors.js';
5
+ import { buildResumeMetadata, writeLatestRunId } from './run.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 readRequiredJsonObject(filePath, missingCode, invalidCode, label) {
18
+ if (!existsSync(filePath)) {
19
+ throw new CliError(`Required process resume artifact not found: ${filePath}`, {
20
+ code: missingCode,
21
+ exitCode: 2,
22
+ details: { label, filePath },
23
+ });
24
+ }
25
+ const value = readJsonArtifact(filePath);
26
+ if (!isRecord(value)) {
27
+ throw new CliError(`Expected process resume artifact JSON object: ${filePath}`, {
28
+ code: invalidCode,
29
+ exitCode: 2,
30
+ details: { label, filePath },
31
+ });
32
+ }
33
+ return value;
34
+ }
35
+ function buildLayout(runRoot, runId) {
36
+ const collectionDir = path.dirname(runRoot);
37
+ return {
38
+ runId,
39
+ runRoot,
40
+ collectionDir,
41
+ cacheDir: path.join(runRoot, 'cache'),
42
+ manifestsDir: path.join(runRoot, 'manifests'),
43
+ reportsDir: path.join(runRoot, 'reports'),
44
+ latestRunIdPath: path.join(collectionDir, '.latest_run_id'),
45
+ statePath: path.join(runRoot, 'cache', 'process_from_flow_state.json'),
46
+ handoffSummaryPath: path.join(runRoot, 'cache', 'agent_handoff_summary.json'),
47
+ runManifestPath: path.join(runRoot, 'manifests', 'run-manifest.json'),
48
+ invocationIndexPath: path.join(runRoot, 'manifests', 'invocation-index.json'),
49
+ resumeMetadataPath: path.join(runRoot, 'manifests', 'resume-metadata.json'),
50
+ resumeHistoryPath: path.join(runRoot, 'manifests', 'resume-history.jsonl'),
51
+ reportPath: path.join(runRoot, 'reports', 'process-resume-build-report.json'),
52
+ };
53
+ }
54
+ function resolveLayout(options) {
55
+ const runId = nonEmptyString(options.runId);
56
+ const runDir = nonEmptyString(options.runDir);
57
+ if (!runId && !runDir) {
58
+ throw new CliError('Missing required --run-id or --run-dir for process resume-build.', {
59
+ code: 'PROCESS_RESUME_RUN_REQUIRED',
60
+ exitCode: 2,
61
+ });
62
+ }
63
+ const runRoot = runDir
64
+ ? path.resolve(runDir)
65
+ : path.resolve('artifacts', 'process_from_flow', runId);
66
+ const derivedRunId = path.basename(runRoot);
67
+ if (runDir && runId && derivedRunId !== runId) {
68
+ throw new CliError(`process resume-build run-id does not match run-dir basename: ${runId} !== ${derivedRunId}`, {
69
+ code: 'PROCESS_RESUME_RUN_ID_MISMATCH',
70
+ exitCode: 2,
71
+ });
72
+ }
73
+ return buildLayout(runRoot, runId ?? derivedRunId);
74
+ }
75
+ function ensureRunRootExists(layout) {
76
+ if (!existsSync(layout.runRoot)) {
77
+ throw new CliError(`process resume-build run root not found: ${layout.runRoot}`, {
78
+ code: 'PROCESS_RESUME_RUN_NOT_FOUND',
79
+ exitCode: 2,
80
+ });
81
+ }
82
+ }
83
+ function readRequiredRunManifest(layout) {
84
+ const manifest = readRequiredJsonObject(layout.runManifestPath, 'PROCESS_RESUME_RUN_MANIFEST_MISSING', 'PROCESS_RESUME_RUN_MANIFEST_INVALID', 'run-manifest');
85
+ const manifestRunId = nonEmptyString(manifest.runId);
86
+ if (manifestRunId && manifestRunId !== layout.runId) {
87
+ throw new CliError(`process resume-build run manifest runId mismatch: ${layout.runManifestPath}`, {
88
+ code: 'PROCESS_RESUME_RUN_MANIFEST_MISMATCH',
89
+ exitCode: 2,
90
+ details: {
91
+ expected: layout.runId,
92
+ actual: manifestRunId,
93
+ },
94
+ });
95
+ }
96
+ return manifest;
97
+ }
98
+ function readRequiredState(layout) {
99
+ const state = readRequiredJsonObject(layout.statePath, 'PROCESS_RESUME_STATE_MISSING', 'PROCESS_RESUME_STATE_INVALID', 'state');
100
+ const stateRunId = nonEmptyString(state.run_id);
101
+ if (stateRunId && stateRunId !== layout.runId) {
102
+ throw new CliError(`process resume-build state run_id mismatch: ${layout.statePath}`, {
103
+ code: 'PROCESS_RESUME_STATE_RUN_ID_MISMATCH',
104
+ exitCode: 2,
105
+ details: {
106
+ expected: layout.runId,
107
+ actual: stateRunId,
108
+ },
109
+ });
110
+ }
111
+ return state;
112
+ }
113
+ function readRequiredHandoffSummary(layout) {
114
+ return readRequiredJsonObject(layout.handoffSummaryPath, 'PROCESS_RESUME_HANDOFF_MISSING', 'PROCESS_RESUME_HANDOFF_INVALID', 'handoff-summary');
115
+ }
116
+ function readInvocationIndex(layout) {
117
+ if (!existsSync(layout.invocationIndexPath)) {
118
+ return {
119
+ schema_version: 1,
120
+ invocations: [],
121
+ };
122
+ }
123
+ const value = readJsonArtifact(layout.invocationIndexPath);
124
+ if (!isRecord(value)) {
125
+ throw new CliError(`Expected process resume invocation index JSON object: ${layout.invocationIndexPath}`, {
126
+ code: 'PROCESS_RESUME_INVOCATION_INDEX_INVALID',
127
+ exitCode: 2,
128
+ });
129
+ }
130
+ if (value.invocations === undefined) {
131
+ return {
132
+ schema_version: 1,
133
+ invocations: [],
134
+ };
135
+ }
136
+ if (!Array.isArray(value.invocations)) {
137
+ throw new CliError(`Expected process resume invocation index to contain an invocations array: ${layout.invocationIndexPath}`, {
138
+ code: 'PROCESS_RESUME_INVOCATION_INDEX_INVALID',
139
+ exitCode: 2,
140
+ });
141
+ }
142
+ return value;
143
+ }
144
+ function readResumeHistory(layout) {
145
+ if (!existsSync(layout.resumeHistoryPath)) {
146
+ return [];
147
+ }
148
+ const rows = readJsonLinesArtifact(layout.resumeHistoryPath);
149
+ return rows.map((row, index) => {
150
+ if (!isRecord(row)) {
151
+ throw new CliError(`Expected process resume history JSONL rows to be objects: ${layout.resumeHistoryPath}`, {
152
+ code: 'PROCESS_RESUME_HISTORY_INVALID',
153
+ exitCode: 2,
154
+ details: { index },
155
+ });
156
+ }
157
+ return row;
158
+ });
159
+ }
160
+ function stateArrayLength(value) {
161
+ return Array.isArray(value) ? value.length : 0;
162
+ }
163
+ function buildStateSummary(state) {
164
+ return {
165
+ build_status: nonEmptyString(state.build_status),
166
+ next_stage: nonEmptyString(state.next_stage),
167
+ stop_after: nonEmptyString(state.stop_after),
168
+ process_count: stateArrayLength(state.processes),
169
+ matched_exchange_count: stateArrayLength(state.matched_process_exchanges),
170
+ process_dataset_count: stateArrayLength(state.process_datasets),
171
+ source_dataset_count: stateArrayLength(state.source_datasets),
172
+ };
173
+ }
174
+ function resolveResumedFrom(state) {
175
+ return nonEmptyString(state.next_stage) ?? nonEmptyString(state.build_status) ?? 'unknown';
176
+ }
177
+ function nextAttempt(history) {
178
+ return (history.reduce((maxAttempt, entry) => {
179
+ const attempt = entry.attempt;
180
+ return typeof attempt === 'number' && Number.isFinite(attempt) && attempt > maxAttempt
181
+ ? attempt
182
+ : maxAttempt;
183
+ }, 0) + 1);
184
+ }
185
+ function updateStepMarkers(stepMarkers, completedAt) {
186
+ const markers = isRecord(stepMarkers) ? { ...stepMarkers } : {};
187
+ markers.resume_prepared = {
188
+ status: 'completed',
189
+ completed_at: completedAt,
190
+ };
191
+ return markers;
192
+ }
193
+ function buildUpdatedState(state, resumeMetadata, now) {
194
+ return {
195
+ ...state,
196
+ build_status: 'resume_prepared',
197
+ stop_after: null,
198
+ resume_attempt: resumeMetadata.attempt,
199
+ resume_requested_at: now.toISOString(),
200
+ last_resume_metadata: resumeMetadata,
201
+ step_markers: updateStepMarkers(state.step_markers, now.toISOString()),
202
+ };
203
+ }
204
+ function buildInvocationIndex(layout, invocationIndex, options, now) {
205
+ const priorInvocations = Array.isArray(invocationIndex.invocations)
206
+ ? [...invocationIndex.invocations]
207
+ : [];
208
+ const command = ['process', 'resume-build'];
209
+ if (options.runId) {
210
+ command.push('--run-id', options.runId);
211
+ }
212
+ if (options.runDir) {
213
+ command.push('--run-dir', options.runDir);
214
+ }
215
+ return {
216
+ ...invocationIndex,
217
+ schema_version: typeof invocationIndex.schema_version === 'number' ? invocationIndex.schema_version : 1,
218
+ invocations: [
219
+ ...priorInvocations,
220
+ {
221
+ command,
222
+ cwd: options.cwd ?? process.cwd(),
223
+ created_at: now.toISOString(),
224
+ run_id: layout.runId,
225
+ run_root: layout.runRoot,
226
+ report_path: layout.reportPath,
227
+ },
228
+ ],
229
+ };
230
+ }
231
+ function asRunLayout(layout) {
232
+ return {
233
+ namespace: 'process_from_flow',
234
+ runId: layout.runId,
235
+ artifactsRoot: path.dirname(layout.collectionDir),
236
+ collectionDir: layout.collectionDir,
237
+ runRoot: layout.runRoot,
238
+ cacheDir: layout.cacheDir,
239
+ inputsDir: path.join(layout.runRoot, 'input'),
240
+ outputsDir: path.join(layout.runRoot, 'exports'),
241
+ reportsDir: layout.reportsDir,
242
+ logsDir: path.join(layout.runRoot, 'logs'),
243
+ manifestsDir: layout.manifestsDir,
244
+ latestRunIdPath: layout.latestRunIdPath,
245
+ };
246
+ }
247
+ function buildNextActions(layout, summary) {
248
+ return [
249
+ `inspect: ${layout.statePath}`,
250
+ `inspect: ${layout.resumeMetadataPath}`,
251
+ `inspect: ${layout.invocationIndexPath}`,
252
+ summary.next_stage
253
+ ? `future: migrate CLI stage executor for ${summary.next_stage}`
254
+ : `future: inspect completed run state for ${layout.runId}`,
255
+ `future: tiangong process publish-build --run-id ${layout.runId}`,
256
+ ];
257
+ }
258
+ function buildAgentHandoffSummary(layout, state, resumeMetadata, summary, now) {
259
+ return {
260
+ schema_version: 1,
261
+ generated_at_utc: now.toISOString(),
262
+ run_id: layout.runId,
263
+ command: 'process resume-build',
264
+ flow_path: nonEmptyString(state.flow_path),
265
+ operation: nonEmptyString(state.operation),
266
+ stop_after: null,
267
+ process_count: summary.process_count,
268
+ matched_exchange_count: summary.matched_exchange_count,
269
+ process_dataset_count: summary.process_dataset_count,
270
+ source_dataset_count: summary.source_dataset_count,
271
+ remaining_placeholder_refs: stateArrayLength(state.placeholder_resolutions),
272
+ placeholder_examples: [],
273
+ publish_summary: {},
274
+ artifacts: {
275
+ state_path: layout.statePath,
276
+ timing_report: null,
277
+ publish_summary: null,
278
+ llm_cost_report: null,
279
+ process_update_report: null,
280
+ flow_auto_build_manifest: null,
281
+ resume_metadata: layout.resumeMetadataPath,
282
+ resume_history: layout.resumeHistoryPath,
283
+ invocation_index: layout.invocationIndexPath,
284
+ },
285
+ next_actions: buildNextActions(layout, summary),
286
+ extra: {
287
+ status: 'prepared_local_process_resume_run',
288
+ request_id: nonEmptyString(state.request_id),
289
+ resumed_from: resumeMetadata.resumedFrom,
290
+ checkpoint: resumeMetadata.checkpoint,
291
+ attempt: resumeMetadata.attempt,
292
+ },
293
+ };
294
+ }
295
+ function buildReport(layout, state, resumeMetadata, summary, now) {
296
+ return {
297
+ schema_version: 1,
298
+ generated_at_utc: now.toISOString(),
299
+ status: 'prepared_local_process_resume_run',
300
+ run_id: layout.runId,
301
+ run_root: layout.runRoot,
302
+ request_id: nonEmptyString(state.request_id),
303
+ resumed_from: String(resumeMetadata.resumedFrom),
304
+ checkpoint: resumeMetadata.checkpoint === null ? null : String(resumeMetadata.checkpoint ?? ''),
305
+ attempt: Number(resumeMetadata.attempt ?? 1),
306
+ state_summary: summary,
307
+ files: {
308
+ state: layout.statePath,
309
+ handoff_summary: layout.handoffSummaryPath,
310
+ run_manifest: layout.runManifestPath,
311
+ invocation_index: layout.invocationIndexPath,
312
+ resume_metadata: layout.resumeMetadataPath,
313
+ resume_history: layout.resumeHistoryPath,
314
+ report: layout.reportPath,
315
+ },
316
+ next_actions: buildNextActions(layout, summary),
317
+ };
318
+ }
319
+ export async function runProcessResumeBuild(options) {
320
+ const now = options.now ?? new Date();
321
+ const layout = resolveLayout(options);
322
+ ensureRunRootExists(layout);
323
+ readRequiredRunManifest(layout);
324
+ readRequiredHandoffSummary(layout);
325
+ const history = readResumeHistory(layout);
326
+ const invocationIndex = readInvocationIndex(layout);
327
+ return await withStateFileLock(layout.statePath, { reason: 'process-resume-build.prepare_resume', now }, () => {
328
+ const state = readRequiredState(layout);
329
+ const resumeMetadata = buildResumeMetadata({
330
+ runId: layout.runId,
331
+ resumedFrom: resolveResumedFrom(state),
332
+ checkpoint: nonEmptyString(state.stop_after),
333
+ attempt: nextAttempt(history),
334
+ resumedAt: now,
335
+ });
336
+ const updatedState = buildUpdatedState(state, resumeMetadata, now);
337
+ const summary = buildStateSummary(updatedState);
338
+ const updatedInvocationIndex = buildInvocationIndex(layout, invocationIndex, options, now);
339
+ const handoffSummary = buildAgentHandoffSummary(layout, updatedState, resumeMetadata, summary, now);
340
+ const report = buildReport(layout, updatedState, resumeMetadata, summary, now);
341
+ writeJsonArtifact(layout.statePath, updatedState);
342
+ writeJsonArtifact(layout.invocationIndexPath, updatedInvocationIndex);
343
+ writeJsonArtifact(layout.resumeMetadataPath, resumeMetadata);
344
+ writeJsonLinesArtifact(layout.resumeHistoryPath, resumeMetadata, { append: true });
345
+ writeJsonArtifact(layout.handoffSummaryPath, handoffSummary);
346
+ writeLatestRunId(asRunLayout(layout), layout.runId);
347
+ writeJsonArtifact(layout.reportPath, report);
348
+ return report;
349
+ });
350
+ }
351
+ // Exposed for deterministic unit coverage of process resume-build helpers.
352
+ export const __testInternals = {
353
+ buildLayout,
354
+ resolveLayout,
355
+ buildStateSummary,
356
+ resolveResumedFrom,
357
+ nextAttempt,
358
+ updateStepMarkers,
359
+ buildUpdatedState,
360
+ buildInvocationIndex,
361
+ buildNextActions,
362
+ buildReport,
363
+ };
364
+ //# sourceMappingURL=process-resume-build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"process-resume-build.js","sourceRoot":"","sources":["../../../src/lib/process-resume-build.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport {\n readJsonArtifact,\n readJsonLinesArtifact,\n writeJsonArtifact,\n writeJsonLinesArtifact,\n} from './artifacts.js';\nimport { CliError } from './errors.js';\nimport { buildResumeMetadata, writeLatestRunId, type RunLayout } from './run.js';\nimport { withStateFileLock } from './state-lock.js';\n\ntype JsonRecord = Record<string, unknown>;\n\nexport type ProcessResumeBuildLayout = {\n runId: string;\n runRoot: string;\n collectionDir: string;\n cacheDir: string;\n manifestsDir: string;\n reportsDir: string;\n latestRunIdPath: string;\n statePath: string;\n handoffSummaryPath: string;\n runManifestPath: string;\n invocationIndexPath: string;\n resumeMetadataPath: string;\n resumeHistoryPath: string;\n reportPath: string;\n};\n\nexport type ProcessResumeBuildReport = {\n schema_version: 1;\n generated_at_utc: string;\n status: 'prepared_local_process_resume_run';\n run_id: string;\n run_root: string;\n request_id: string | null;\n resumed_from: string;\n checkpoint: string | null;\n attempt: number;\n state_summary: {\n build_status: string | null;\n next_stage: string | null;\n stop_after: string | null;\n process_count: number;\n matched_exchange_count: number;\n process_dataset_count: number;\n source_dataset_count: number;\n };\n files: {\n state: string;\n handoff_summary: string;\n run_manifest: string;\n invocation_index: string;\n resume_metadata: string;\n resume_history: string;\n report: string;\n };\n next_actions: string[];\n};\n\nexport type RunProcessResumeBuildOptions = {\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 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 resume 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 resume 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): ProcessResumeBuildLayout {\n const collectionDir = path.dirname(runRoot);\n\n return {\n runId,\n runRoot,\n collectionDir,\n cacheDir: path.join(runRoot, 'cache'),\n manifestsDir: path.join(runRoot, 'manifests'),\n reportsDir: path.join(runRoot, 'reports'),\n latestRunIdPath: path.join(collectionDir, '.latest_run_id'),\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 resumeMetadataPath: path.join(runRoot, 'manifests', 'resume-metadata.json'),\n resumeHistoryPath: path.join(runRoot, 'manifests', 'resume-history.jsonl'),\n reportPath: path.join(runRoot, 'reports', 'process-resume-build-report.json'),\n };\n}\n\nfunction resolveLayout(options: RunProcessResumeBuildOptions): ProcessResumeBuildLayout {\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 resume-build.', {\n code: 'PROCESS_RESUME_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 resume-build run-id does not match run-dir basename: ${runId} !== ${derivedRunId}`,\n {\n code: 'PROCESS_RESUME_RUN_ID_MISMATCH',\n exitCode: 2,\n },\n );\n }\n\n return buildLayout(runRoot, runId ?? derivedRunId);\n}\n\nfunction ensureRunRootExists(layout: ProcessResumeBuildLayout): void {\n if (!existsSync(layout.runRoot)) {\n throw new CliError(`process resume-build run root not found: ${layout.runRoot}`, {\n code: 'PROCESS_RESUME_RUN_NOT_FOUND',\n exitCode: 2,\n });\n }\n}\n\nfunction readRequiredRunManifest(layout: ProcessResumeBuildLayout): JsonRecord {\n const manifest = readRequiredJsonObject(\n layout.runManifestPath,\n 'PROCESS_RESUME_RUN_MANIFEST_MISSING',\n 'PROCESS_RESUME_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 resume-build run manifest runId mismatch: ${layout.runManifestPath}`,\n {\n code: 'PROCESS_RESUME_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: ProcessResumeBuildLayout): JsonRecord {\n const state = readRequiredJsonObject(\n layout.statePath,\n 'PROCESS_RESUME_STATE_MISSING',\n 'PROCESS_RESUME_STATE_INVALID',\n 'state',\n );\n\n const stateRunId = nonEmptyString(state.run_id);\n if (stateRunId && stateRunId !== layout.runId) {\n throw new CliError(`process resume-build state run_id mismatch: ${layout.statePath}`, {\n code: 'PROCESS_RESUME_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: ProcessResumeBuildLayout): JsonRecord {\n return readRequiredJsonObject(\n layout.handoffSummaryPath,\n 'PROCESS_RESUME_HANDOFF_MISSING',\n 'PROCESS_RESUME_HANDOFF_INVALID',\n 'handoff-summary',\n );\n}\n\nfunction readInvocationIndex(layout: ProcessResumeBuildLayout): 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 resume invocation index JSON object: ${layout.invocationIndexPath}`,\n {\n code: 'PROCESS_RESUME_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 resume invocation index to contain an invocations array: ${layout.invocationIndexPath}`,\n {\n code: 'PROCESS_RESUME_INVOCATION_INDEX_INVALID',\n exitCode: 2,\n },\n );\n }\n\n return value;\n}\n\nfunction readResumeHistory(layout: ProcessResumeBuildLayout): JsonRecord[] {\n if (!existsSync(layout.resumeHistoryPath)) {\n return [];\n }\n\n const rows = readJsonLinesArtifact(layout.resumeHistoryPath);\n return rows.map((row, index) => {\n if (!isRecord(row)) {\n throw new CliError(\n `Expected process resume history JSONL rows to be objects: ${layout.resumeHistoryPath}`,\n {\n code: 'PROCESS_RESUME_HISTORY_INVALID',\n exitCode: 2,\n details: { index },\n },\n );\n }\n\n return row;\n });\n}\n\nfunction stateArrayLength(value: unknown): number {\n return Array.isArray(value) ? value.length : 0;\n}\n\nfunction buildStateSummary(state: JsonRecord): ProcessResumeBuildReport['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 process_count: stateArrayLength(state.processes),\n matched_exchange_count: stateArrayLength(state.matched_process_exchanges),\n process_dataset_count: stateArrayLength(state.process_datasets),\n source_dataset_count: stateArrayLength(state.source_datasets),\n };\n}\n\nfunction resolveResumedFrom(state: JsonRecord): string {\n return nonEmptyString(state.next_stage) ?? nonEmptyString(state.build_status) ?? 'unknown';\n}\n\nfunction nextAttempt(history: JsonRecord[]): number {\n return (\n history.reduce((maxAttempt, entry) => {\n const attempt = entry.attempt;\n return typeof attempt === 'number' && Number.isFinite(attempt) && attempt > maxAttempt\n ? attempt\n : maxAttempt;\n }, 0) + 1\n );\n}\n\nfunction updateStepMarkers(stepMarkers: unknown, completedAt: string): JsonRecord {\n const markers = isRecord(stepMarkers) ? { ...stepMarkers } : {};\n markers.resume_prepared = {\n status: 'completed',\n completed_at: completedAt,\n };\n return markers;\n}\n\nfunction buildUpdatedState(state: JsonRecord, resumeMetadata: JsonRecord, now: Date): JsonRecord {\n return {\n ...state,\n build_status: 'resume_prepared',\n stop_after: null,\n resume_attempt: resumeMetadata.attempt,\n resume_requested_at: now.toISOString(),\n last_resume_metadata: resumeMetadata,\n step_markers: updateStepMarkers(state.step_markers, now.toISOString()),\n };\n}\n\nfunction buildInvocationIndex(\n layout: ProcessResumeBuildLayout,\n invocationIndex: JsonRecord,\n options: RunProcessResumeBuildOptions,\n now: Date,\n): JsonRecord {\n const priorInvocations = Array.isArray(invocationIndex.invocations)\n ? [...invocationIndex.invocations]\n : [];\n const command = ['process', 'resume-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 },\n ],\n };\n}\n\nfunction asRunLayout(layout: ProcessResumeBuildLayout): RunLayout {\n return {\n namespace: 'process_from_flow',\n runId: layout.runId,\n artifactsRoot: path.dirname(layout.collectionDir),\n collectionDir: layout.collectionDir,\n runRoot: layout.runRoot,\n cacheDir: layout.cacheDir,\n inputsDir: path.join(layout.runRoot, 'input'),\n outputsDir: path.join(layout.runRoot, 'exports'),\n reportsDir: layout.reportsDir,\n logsDir: path.join(layout.runRoot, 'logs'),\n manifestsDir: layout.manifestsDir,\n latestRunIdPath: layout.latestRunIdPath,\n };\n}\n\nfunction buildNextActions(\n layout: ProcessResumeBuildLayout,\n summary: ProcessResumeBuildReport['state_summary'],\n): string[] {\n return [\n `inspect: ${layout.statePath}`,\n `inspect: ${layout.resumeMetadataPath}`,\n `inspect: ${layout.invocationIndexPath}`,\n summary.next_stage\n ? `future: migrate CLI stage executor for ${summary.next_stage}`\n : `future: inspect completed run state for ${layout.runId}`,\n `future: tiangong process publish-build --run-id ${layout.runId}`,\n ];\n}\n\nfunction buildAgentHandoffSummary(\n layout: ProcessResumeBuildLayout,\n state: JsonRecord,\n resumeMetadata: JsonRecord,\n summary: ProcessResumeBuildReport['state_summary'],\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 resume-build',\n flow_path: nonEmptyString(state.flow_path),\n operation: nonEmptyString(state.operation),\n stop_after: null,\n process_count: summary.process_count,\n matched_exchange_count: summary.matched_exchange_count,\n process_dataset_count: summary.process_dataset_count,\n source_dataset_count: summary.source_dataset_count,\n remaining_placeholder_refs: stateArrayLength(state.placeholder_resolutions),\n placeholder_examples: [],\n publish_summary: {},\n artifacts: {\n state_path: layout.statePath,\n timing_report: null,\n publish_summary: null,\n llm_cost_report: null,\n process_update_report: null,\n flow_auto_build_manifest: null,\n resume_metadata: layout.resumeMetadataPath,\n resume_history: layout.resumeHistoryPath,\n invocation_index: layout.invocationIndexPath,\n },\n next_actions: buildNextActions(layout, summary),\n extra: {\n status: 'prepared_local_process_resume_run',\n request_id: nonEmptyString(state.request_id),\n resumed_from: resumeMetadata.resumedFrom,\n checkpoint: resumeMetadata.checkpoint,\n attempt: resumeMetadata.attempt,\n },\n };\n}\n\nfunction buildReport(\n layout: ProcessResumeBuildLayout,\n state: JsonRecord,\n resumeMetadata: JsonRecord,\n summary: ProcessResumeBuildReport['state_summary'],\n now: Date,\n): ProcessResumeBuildReport {\n return {\n schema_version: 1,\n generated_at_utc: now.toISOString(),\n status: 'prepared_local_process_resume_run',\n run_id: layout.runId,\n run_root: layout.runRoot,\n request_id: nonEmptyString(state.request_id),\n resumed_from: String(resumeMetadata.resumedFrom),\n checkpoint: resumeMetadata.checkpoint === null ? null : String(resumeMetadata.checkpoint ?? ''),\n attempt: Number(resumeMetadata.attempt ?? 1),\n state_summary: summary,\n files: {\n state: layout.statePath,\n handoff_summary: layout.handoffSummaryPath,\n run_manifest: layout.runManifestPath,\n invocation_index: layout.invocationIndexPath,\n resume_metadata: layout.resumeMetadataPath,\n resume_history: layout.resumeHistoryPath,\n report: layout.reportPath,\n },\n next_actions: buildNextActions(layout, summary),\n };\n}\n\nexport async function runProcessResumeBuild(\n options: RunProcessResumeBuildOptions,\n): Promise<ProcessResumeBuildReport> {\n const now = options.now ?? new Date();\n const layout = resolveLayout(options);\n ensureRunRootExists(layout);\n readRequiredRunManifest(layout);\n readRequiredHandoffSummary(layout);\n const history = readResumeHistory(layout);\n const invocationIndex = readInvocationIndex(layout);\n\n return await withStateFileLock(\n layout.statePath,\n { reason: 'process-resume-build.prepare_resume', now },\n () => {\n const state = readRequiredState(layout);\n const resumeMetadata = buildResumeMetadata({\n runId: layout.runId,\n resumedFrom: resolveResumedFrom(state),\n checkpoint: nonEmptyString(state.stop_after),\n attempt: nextAttempt(history),\n resumedAt: now,\n });\n const updatedState = buildUpdatedState(state, resumeMetadata, now);\n const summary = buildStateSummary(updatedState);\n const updatedInvocationIndex = buildInvocationIndex(layout, invocationIndex, options, now);\n const handoffSummary = buildAgentHandoffSummary(\n layout,\n updatedState,\n resumeMetadata,\n summary,\n now,\n );\n const report = buildReport(layout, updatedState, resumeMetadata, summary, now);\n\n writeJsonArtifact(layout.statePath, updatedState);\n writeJsonArtifact(layout.invocationIndexPath, updatedInvocationIndex);\n writeJsonArtifact(layout.resumeMetadataPath, resumeMetadata);\n writeJsonLinesArtifact(layout.resumeHistoryPath, resumeMetadata, { append: true });\n writeJsonArtifact(layout.handoffSummaryPath, handoffSummary);\n writeLatestRunId(asRunLayout(layout), layout.runId);\n writeJsonArtifact(layout.reportPath, report);\n\n return report;\n },\n );\n}\n\n// Exposed for deterministic unit coverage of process resume-build helpers.\nexport const __testInternals = {\n buildLayout,\n resolveLayout,\n buildStateSummary,\n resolveResumedFrom,\n nextAttempt,\n updateStepMarkers,\n buildUpdatedState,\n buildInvocationIndex,\n buildNextActions,\n buildReport,\n};\n"]}