@tiangong-lca/cli 0.1.6 → 0.1.8
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 +21 -22
- package/dist/src/cli.js +46 -48
- package/dist/src/cli.js.map +1 -1
- package/dist/src/lib/auth-identity-receipt.d.ts +1 -2
- package/dist/src/lib/auth-identity-receipt.js +3 -20
- package/dist/src/lib/auth-identity-receipt.js.map +1 -1
- package/dist/src/lib/credential-safety.d.ts +7 -0
- package/dist/src/lib/credential-safety.js +28 -0
- package/dist/src/lib/credential-safety.js.map +1 -0
- package/dist/src/lib/dataset-command.d.ts +2 -0
- package/dist/src/lib/dataset-command.js +20 -0
- package/dist/src/lib/dataset-command.js.map +1 -1
- package/dist/src/lib/dataset-save-draft-run.js +3 -1
- package/dist/src/lib/dataset-save-draft-run.js.map +1 -1
- package/dist/src/lib/env.d.ts +9 -2
- package/dist/src/lib/env.js +83 -24
- package/dist/src/lib/env.js.map +1 -1
- package/dist/src/lib/flow-publish-reviewed-data.js +1 -1
- package/dist/src/lib/flow-publish-reviewed-data.js.map +1 -1
- package/dist/src/lib/lifecyclemodel-resulting-process.js +5 -7
- package/dist/src/lib/lifecyclemodel-resulting-process.js.map +1 -1
- package/dist/src/lib/process-refresh-references.js +1 -1
- package/dist/src/lib/process-refresh-references.js.map +1 -1
- package/dist/src/lib/process-save-draft.d.ts +1 -0
- package/dist/src/lib/process-save-draft.js +8 -0
- package/dist/src/lib/process-save-draft.js.map +1 -1
- package/dist/src/lib/process-scope-statistics.js +1 -1
- package/dist/src/lib/process-scope-statistics.js.map +1 -1
- package/dist/src/lib/publish.d.ts +7 -0
- package/dist/src/lib/publish.js +111 -7
- package/dist/src/lib/publish.js.map +1 -1
- package/dist/src/lib/supabase-client.d.ts +4 -4
- package/dist/src/lib/supabase-client.js +16 -16
- package/dist/src/lib/supabase-client.js.map +1 -1
- package/dist/src/lib/supabase-data-api-contract.d.ts +18 -10
- package/dist/src/lib/supabase-data-api-contract.js +17 -9
- package/dist/src/lib/supabase-data-api-contract.js.map +1 -1
- package/dist/src/lib/supabase-json-ordered-write.js +3 -1
- package/dist/src/lib/supabase-json-ordered-write.js.map +1 -1
- package/dist/src/lib/supabase-session.d.ts +5 -14
- package/dist/src/lib/supabase-session.js +34 -113
- package/dist/src/lib/supabase-session.js.map +1 -1
- package/package.json +1 -2
- package/dist/src/lib/user-api-key.d.ts +0 -16
- package/dist/src/lib/user-api-key.js +0 -75
- package/dist/src/lib/user-api-key.js.map +0 -1
package/dist/src/lib/env.d.ts
CHANGED
|
@@ -12,7 +12,6 @@ export type ResolvedEnv = {
|
|
|
12
12
|
};
|
|
13
13
|
export declare const ENV_KEYS: {
|
|
14
14
|
readonly apiBaseUrl: 'TIANGONG_LCA_API_BASE_URL';
|
|
15
|
-
readonly apiKey: 'TIANGONG_LCA_API_KEY';
|
|
16
15
|
readonly authMode: 'TIANGONG_LCA_AUTH_MODE';
|
|
17
16
|
readonly oauthClientId: 'TIANGONG_LCA_OAUTH_CLIENT_ID';
|
|
18
17
|
readonly oauthRedirectUri: 'TIANGONG_LCA_OAUTH_REDIRECT_URI';
|
|
@@ -23,6 +22,15 @@ export declare const ENV_KEYS: {
|
|
|
23
22
|
readonly disableSessionCache: 'TIANGONG_LCA_DISABLE_SESSION_CACHE';
|
|
24
23
|
readonly forceReauth: 'TIANGONG_LCA_FORCE_REAUTH';
|
|
25
24
|
};
|
|
25
|
+
export declare const OFFICIAL_PRODUCTION_PROFILE: Readonly<{
|
|
26
|
+
apiBaseUrl: "https://qgzvkongdjqiiamzbbts.supabase.co/functions/v1";
|
|
27
|
+
supabasePublishableKey: "sb_publishable_EFWH4E61tpAtf82WQ37xTA_Fxa5OPyg";
|
|
28
|
+
oauthClientId: "1837c6d3-3c9d-48e0-bbf7-b532b78f9f76";
|
|
29
|
+
oauthRedirectUri: "http://127.0.0.1:49191/oauth/callback";
|
|
30
|
+
region: "us-east-1";
|
|
31
|
+
}>;
|
|
32
|
+
export declare function hasProductionProfileMismatch(env: NodeJS.ProcessEnv): boolean;
|
|
33
|
+
export declare function resolveProductionRuntimeEnv(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
|
|
26
34
|
export declare const ENV_SPECS: EnvSpec[];
|
|
27
35
|
export type DoctorCheck = {
|
|
28
36
|
key: string;
|
|
@@ -41,7 +49,6 @@ export type DoctorReport = {
|
|
|
41
49
|
};
|
|
42
50
|
export type RuntimeEnv = {
|
|
43
51
|
apiBaseUrl: string | null;
|
|
44
|
-
apiKey: string | null;
|
|
45
52
|
authMode: string | null;
|
|
46
53
|
oauthClientId: string | null;
|
|
47
54
|
oauthRedirectUri: string | null;
|
package/dist/src/lib/env.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { DEFAULT_OAUTH_REDIRECT_URI } from './oauth-loopback.js';
|
|
1
2
|
export const ENV_KEYS = {
|
|
2
3
|
apiBaseUrl: 'TIANGONG_LCA_API_BASE_URL',
|
|
3
|
-
apiKey: 'TIANGONG_LCA_API_KEY',
|
|
4
4
|
authMode: 'TIANGONG_LCA_AUTH_MODE',
|
|
5
5
|
oauthClientId: 'TIANGONG_LCA_OAUTH_CLIENT_ID',
|
|
6
6
|
oauthRedirectUri: 'TIANGONG_LCA_OAUTH_REDIRECT_URI',
|
|
@@ -11,22 +11,80 @@ export const ENV_KEYS = {
|
|
|
11
11
|
disableSessionCache: 'TIANGONG_LCA_DISABLE_SESSION_CACHE',
|
|
12
12
|
forceReauth: 'TIANGONG_LCA_FORCE_REAUTH',
|
|
13
13
|
};
|
|
14
|
+
const PRODUCTION_PROJECT_URL = 'https://qgzvkongdjqiiamzbbts.supabase.co';
|
|
15
|
+
// Public application configuration, not user credentials. Keep this as the one
|
|
16
|
+
// source used by auth, remote adapters, and doctor; Skills must not copy it.
|
|
17
|
+
export const OFFICIAL_PRODUCTION_PROFILE = Object.freeze({
|
|
18
|
+
apiBaseUrl: `${PRODUCTION_PROJECT_URL}/functions/v1`,
|
|
19
|
+
supabasePublishableKey: 'sb_publishable_EFWH4E61tpAtf82WQ37xTA_Fxa5OPyg',
|
|
20
|
+
oauthClientId: '1837c6d3-3c9d-48e0-bbf7-b532b78f9f76',
|
|
21
|
+
oauthRedirectUri: DEFAULT_OAUTH_REDIRECT_URI,
|
|
22
|
+
region: 'us-east-1',
|
|
23
|
+
});
|
|
24
|
+
const PRODUCTION_ENV_DEFAULTS = Object.freeze({
|
|
25
|
+
[ENV_KEYS.apiBaseUrl]: OFFICIAL_PRODUCTION_PROFILE.apiBaseUrl,
|
|
26
|
+
[ENV_KEYS.supabasePublishableKey]: OFFICIAL_PRODUCTION_PROFILE.supabasePublishableKey,
|
|
27
|
+
[ENV_KEYS.oauthClientId]: OFFICIAL_PRODUCTION_PROFILE.oauthClientId,
|
|
28
|
+
[ENV_KEYS.oauthRedirectUri]: OFFICIAL_PRODUCTION_PROFILE.oauthRedirectUri,
|
|
29
|
+
});
|
|
30
|
+
function runtimeToken(value) {
|
|
31
|
+
return typeof value === 'string' ? value.trim() : '';
|
|
32
|
+
}
|
|
33
|
+
function isProductionBase(value) {
|
|
34
|
+
return [
|
|
35
|
+
PRODUCTION_PROJECT_URL,
|
|
36
|
+
`${PRODUCTION_PROJECT_URL}/functions/v1`,
|
|
37
|
+
`${PRODUCTION_PROJECT_URL}/rest/v1`,
|
|
38
|
+
].includes(value.replace(/\/+$/u, ''));
|
|
39
|
+
}
|
|
40
|
+
export function hasProductionProfileMismatch(env) {
|
|
41
|
+
const base = runtimeToken(env[ENV_KEYS.apiBaseUrl]);
|
|
42
|
+
return Boolean(base &&
|
|
43
|
+
!isProductionBase(base) &&
|
|
44
|
+
(runtimeToken(env[ENV_KEYS.oauthClientId]).toLowerCase() ===
|
|
45
|
+
OFFICIAL_PRODUCTION_PROFILE.oauthClientId ||
|
|
46
|
+
runtimeToken(env[ENV_KEYS.supabasePublishableKey]) ===
|
|
47
|
+
OFFICIAL_PRODUCTION_PROFILE.supabasePublishableKey));
|
|
48
|
+
}
|
|
49
|
+
function productionDefaults(env) {
|
|
50
|
+
const mode = runtimeToken(env[ENV_KEYS.authMode]).toLowerCase();
|
|
51
|
+
// A caller-supplied bearer must always have an explicit destination and key.
|
|
52
|
+
if ((mode && mode !== 'oauth') || runtimeToken(env[ENV_KEYS.accessToken]))
|
|
53
|
+
return {};
|
|
54
|
+
const base = runtimeToken(env[ENV_KEYS.apiBaseUrl]);
|
|
55
|
+
if (base && !isProductionBase(base))
|
|
56
|
+
return {};
|
|
57
|
+
for (const key of [
|
|
58
|
+
ENV_KEYS.supabasePublishableKey,
|
|
59
|
+
ENV_KEYS.oauthClientId,
|
|
60
|
+
ENV_KEYS.oauthRedirectUri,
|
|
61
|
+
]) {
|
|
62
|
+
const configured = runtimeToken(env[key]);
|
|
63
|
+
const value = key === ENV_KEYS.oauthClientId ? configured.toLowerCase() : configured;
|
|
64
|
+
if (value && value !== PRODUCTION_ENV_DEFAULTS[key])
|
|
65
|
+
return {};
|
|
66
|
+
}
|
|
67
|
+
return PRODUCTION_ENV_DEFAULTS;
|
|
68
|
+
}
|
|
69
|
+
export function resolveProductionRuntimeEnv(env) {
|
|
70
|
+
const resolved = { ...env };
|
|
71
|
+
for (const [key, value] of Object.entries(productionDefaults(env))) {
|
|
72
|
+
if (!runtimeToken(env[key]))
|
|
73
|
+
resolved[key] = value;
|
|
74
|
+
}
|
|
75
|
+
return resolved;
|
|
76
|
+
}
|
|
14
77
|
export const ENV_SPECS = [
|
|
15
78
|
{
|
|
16
79
|
key: ENV_KEYS.apiBaseUrl,
|
|
17
80
|
required: true,
|
|
18
81
|
description: 'Main TianGong LCA API / Edge Functions base URL',
|
|
19
82
|
},
|
|
20
|
-
{
|
|
21
|
-
key: ENV_KEYS.apiKey,
|
|
22
|
-
required: false,
|
|
23
|
-
description: 'Deprecated legacy email/password API key bootstrap',
|
|
24
|
-
},
|
|
25
83
|
{
|
|
26
84
|
key: ENV_KEYS.region,
|
|
27
85
|
required: false,
|
|
28
86
|
description: 'Target TianGong LCA API region',
|
|
29
|
-
defaultValue:
|
|
87
|
+
defaultValue: OFFICIAL_PRODUCTION_PROFILE.region,
|
|
30
88
|
},
|
|
31
89
|
{
|
|
32
90
|
key: ENV_KEYS.supabasePublishableKey,
|
|
@@ -53,7 +111,7 @@ export const ENV_SPECS = [
|
|
|
53
111
|
{
|
|
54
112
|
key: ENV_KEYS.authMode,
|
|
55
113
|
required: false,
|
|
56
|
-
description: 'Optional explicit auth mode: oauth
|
|
114
|
+
description: 'Optional explicit auth mode: oauth or access-token',
|
|
57
115
|
},
|
|
58
116
|
{
|
|
59
117
|
key: ENV_KEYS.oauthClientId,
|
|
@@ -87,7 +145,7 @@ function parseBooleanEnv(value) {
|
|
|
87
145
|
}
|
|
88
146
|
export function resolveEnv(spec, env) {
|
|
89
147
|
const envValue = env[spec.key];
|
|
90
|
-
if (envValue) {
|
|
148
|
+
if (envValue && (!Object.hasOwn(PRODUCTION_ENV_DEFAULTS, spec.key) || runtimeToken(envValue))) {
|
|
91
149
|
return {
|
|
92
150
|
key: spec.key,
|
|
93
151
|
source: 'env',
|
|
@@ -95,11 +153,13 @@ export function resolveEnv(spec, env) {
|
|
|
95
153
|
present: true,
|
|
96
154
|
};
|
|
97
155
|
}
|
|
98
|
-
|
|
156
|
+
const defaults = productionDefaults(env);
|
|
157
|
+
const defaultValue = spec.defaultValue ?? (Object.hasOwn(defaults, spec.key) ? defaults[spec.key] : undefined);
|
|
158
|
+
if (defaultValue !== undefined) {
|
|
99
159
|
return {
|
|
100
160
|
key: spec.key,
|
|
101
161
|
source: 'default',
|
|
102
|
-
value:
|
|
162
|
+
value: defaultValue,
|
|
103
163
|
present: true,
|
|
104
164
|
};
|
|
105
165
|
}
|
|
@@ -112,19 +172,17 @@ export function resolveEnv(spec, env) {
|
|
|
112
172
|
}
|
|
113
173
|
export function readRuntimeEnv(env) {
|
|
114
174
|
const apiBaseUrl = resolveEnv(ENV_SPECS[0], env).value;
|
|
115
|
-
const
|
|
116
|
-
const
|
|
117
|
-
const
|
|
118
|
-
const
|
|
119
|
-
const
|
|
120
|
-
const
|
|
121
|
-
const
|
|
122
|
-
const
|
|
123
|
-
const
|
|
124
|
-
const accessToken = resolveEnv(ENV_SPECS[10], env).value;
|
|
175
|
+
const region = resolveEnv(ENV_SPECS[1], env).value;
|
|
176
|
+
const supabasePublishableKey = resolveEnv(ENV_SPECS[2], env).value;
|
|
177
|
+
const sessionFile = resolveEnv(ENV_SPECS[3], env).value;
|
|
178
|
+
const disableSessionCache = parseBooleanEnv(resolveEnv(ENV_SPECS[4], env).value);
|
|
179
|
+
const forceReauth = parseBooleanEnv(resolveEnv(ENV_SPECS[5], env).value);
|
|
180
|
+
const authMode = resolveEnv(ENV_SPECS[6], env).value;
|
|
181
|
+
const oauthClientId = resolveEnv(ENV_SPECS[7], env).value;
|
|
182
|
+
const oauthRedirectUri = resolveEnv(ENV_SPECS[8], env).value;
|
|
183
|
+
const accessToken = resolveEnv(ENV_SPECS[9], env).value;
|
|
125
184
|
return {
|
|
126
185
|
apiBaseUrl,
|
|
127
|
-
apiKey,
|
|
128
186
|
authMode,
|
|
129
187
|
oauthClientId,
|
|
130
188
|
oauthRedirectUri,
|
|
@@ -158,8 +216,9 @@ export function buildDoctorReport(env, dotEnvStatus) {
|
|
|
158
216
|
};
|
|
159
217
|
});
|
|
160
218
|
return {
|
|
161
|
-
ok:
|
|
162
|
-
|
|
219
|
+
ok: !hasProductionProfileMismatch(env) &&
|
|
220
|
+
checks.every((check) => !check.required || check.present) &&
|
|
221
|
+
[ENV_KEYS.oauthClientId, ENV_KEYS.accessToken].some((key) => checks.find((check) => check.key === key)?.present),
|
|
163
222
|
loadedDotEnv: dotEnvStatus.loaded,
|
|
164
223
|
dotEnvPath: dotEnvStatus.path,
|
|
165
224
|
dotEnvKeysLoaded: dotEnvStatus.count,
|
package/dist/src/lib/env.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../../src/lib/env.ts"],"names":[],"mappings":"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","sourcesContent":["export type EnvSpec = {\n key: string;\n required: boolean;\n description: string;\n defaultValue?: string;\n};\n\nexport type ResolvedEnv = {\n key: string;\n source: 'env' | 'default' | 'missing';\n value: string | null;\n present: boolean;\n};\n\nexport const ENV_KEYS = {\n apiBaseUrl: 'TIANGONG_LCA_API_BASE_URL',\n apiKey: 'TIANGONG_LCA_API_KEY',\n authMode: 'TIANGONG_LCA_AUTH_MODE',\n oauthClientId: 'TIANGONG_LCA_OAUTH_CLIENT_ID',\n oauthRedirectUri: 'TIANGONG_LCA_OAUTH_REDIRECT_URI',\n accessToken: 'TIANGONG_LCA_ACCESS_TOKEN',\n region: 'TIANGONG_LCA_REGION',\n supabasePublishableKey: 'TIANGONG_LCA_SUPABASE_PUBLISHABLE_KEY',\n sessionFile: 'TIANGONG_LCA_SESSION_FILE',\n disableSessionCache: 'TIANGONG_LCA_DISABLE_SESSION_CACHE',\n forceReauth: 'TIANGONG_LCA_FORCE_REAUTH',\n} as const;\n\nexport const ENV_SPECS: EnvSpec[] = [\n {\n key: ENV_KEYS.apiBaseUrl,\n required: true,\n description: 'Main TianGong LCA API / Edge Functions base URL',\n },\n {\n key: ENV_KEYS.apiKey,\n required: false,\n description: 'Deprecated legacy email/password API key bootstrap',\n },\n {\n key: ENV_KEYS.region,\n required: false,\n description: 'Target TianGong LCA API region',\n defaultValue: 'us-east-1',\n },\n {\n key: ENV_KEYS.supabasePublishableKey,\n required: true,\n description: 'Supabase publishable key used to bootstrap and refresh user sessions',\n },\n {\n key: ENV_KEYS.sessionFile,\n required: false,\n description: 'Optional local path for the CLI session cache file',\n },\n {\n key: ENV_KEYS.disableSessionCache,\n required: false,\n description: 'Disable the persistent CLI session cache when set to true',\n defaultValue: 'false',\n },\n {\n key: ENV_KEYS.forceReauth,\n required: false,\n description: 'Ignore cached sessions and force a fresh login when set to true',\n defaultValue: 'false',\n },\n {\n key: ENV_KEYS.authMode,\n required: false,\n description: 'Optional explicit auth mode: oauth, access-token, or legacy-user-api-key',\n },\n {\n key: ENV_KEYS.oauthClientId,\n required: false,\n description: 'Registered public Supabase OAuth client ID',\n },\n {\n key: ENV_KEYS.oauthRedirectUri,\n required: false,\n description: 'Exact registered CLI loopback OAuth redirect URI',\n },\n {\n key: ENV_KEYS.accessToken,\n required: false,\n description: 'Explicit short-lived actor access token for headless execution',\n },\n];\n\nexport type DoctorCheck = {\n key: string;\n description: string;\n required: boolean;\n source: ResolvedEnv['source'];\n present: boolean;\n valuePreview: string | null;\n};\n\nexport type DoctorReport = {\n ok: boolean;\n loadedDotEnv: boolean;\n dotEnvPath: string;\n dotEnvKeysLoaded: number;\n checks: DoctorCheck[];\n};\n\nexport type RuntimeEnv = {\n apiBaseUrl: string | null;\n apiKey: string | null;\n authMode: string | null;\n oauthClientId: string | null;\n oauthRedirectUri: string | null;\n accessToken: string | null;\n region: string;\n supabasePublishableKey: string | null;\n sessionFile: string | null;\n disableSessionCache: boolean;\n forceReauth: boolean;\n};\n\nfunction parseBooleanEnv(value: string | null): boolean {\n if (typeof value !== 'string') {\n return false;\n }\n\n switch (value.trim().toLowerCase()) {\n case '1':\n case 'true':\n case 'yes':\n case 'on':\n return true;\n default:\n return false;\n }\n}\n\nexport function resolveEnv(spec: EnvSpec, env: NodeJS.ProcessEnv): ResolvedEnv {\n const envValue = env[spec.key];\n if (envValue) {\n return {\n key: spec.key,\n source: 'env',\n value: envValue,\n present: true,\n };\n }\n\n if (spec.defaultValue !== undefined) {\n return {\n key: spec.key,\n source: 'default',\n value: spec.defaultValue,\n present: true,\n };\n }\n\n return {\n key: spec.key,\n source: 'missing',\n value: null,\n present: false,\n };\n}\n\nexport function readRuntimeEnv(env: NodeJS.ProcessEnv): RuntimeEnv {\n const apiBaseUrl = resolveEnv(ENV_SPECS[0], env).value;\n const apiKey = resolveEnv(ENV_SPECS[1], env).value;\n const region = resolveEnv(ENV_SPECS[2], env).value as string;\n const supabasePublishableKey = resolveEnv(ENV_SPECS[3], env).value;\n const sessionFile = resolveEnv(ENV_SPECS[4], env).value;\n const disableSessionCache = parseBooleanEnv(resolveEnv(ENV_SPECS[5], env).value);\n const forceReauth = parseBooleanEnv(resolveEnv(ENV_SPECS[6], env).value);\n const authMode = resolveEnv(ENV_SPECS[7], env).value;\n const oauthClientId = resolveEnv(ENV_SPECS[8], env).value;\n const oauthRedirectUri = resolveEnv(ENV_SPECS[9], env).value;\n const accessToken = resolveEnv(ENV_SPECS[10], env).value;\n\n return {\n apiBaseUrl,\n apiKey,\n authMode,\n oauthClientId,\n oauthRedirectUri,\n accessToken,\n region,\n supabasePublishableKey,\n sessionFile,\n disableSessionCache,\n forceReauth,\n };\n}\n\nexport function maskSecret(value: string | null): string | null {\n if (!value) {\n return value;\n }\n if (value.length <= 8) {\n return value;\n }\n return `${value.slice(0, 4)}...${value.slice(-4)}`;\n}\n\nexport function buildDoctorReport(\n env: NodeJS.ProcessEnv,\n dotEnvStatus: { loaded: boolean; path: string; count: number },\n): DoctorReport {\n const checks = ENV_SPECS.map((spec) => {\n const resolved = resolveEnv(spec, env);\n return {\n key: spec.key,\n description: spec.description,\n required: spec.required,\n source: resolved.source,\n present: resolved.present,\n valuePreview: maskSecret(resolved.value),\n };\n });\n\n return {\n ok:\n checks.every((check) => !check.required || check.present) &&\n [ENV_KEYS.oauthClientId, ENV_KEYS.accessToken, ENV_KEYS.apiKey].some(\n (key) => checks.find((check) => check.key === key)?.present,\n ),\n loadedDotEnv: dotEnvStatus.loaded,\n dotEnvPath: dotEnvStatus.path,\n dotEnvKeysLoaded: dotEnvStatus.count,\n checks,\n };\n}\n\nexport const __testInternals = {\n parseBooleanEnv,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"env.js","sourceRoot":"","sources":["../../../src/lib/env.ts"],"names":[],"mappings":"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","sourcesContent":["import { DEFAULT_OAUTH_REDIRECT_URI } from './oauth-loopback.js';\n\nexport type EnvSpec = {\n key: string;\n required: boolean;\n description: string;\n defaultValue?: string;\n};\n\nexport type ResolvedEnv = {\n key: string;\n source: 'env' | 'default' | 'missing';\n value: string | null;\n present: boolean;\n};\n\nexport const ENV_KEYS = {\n apiBaseUrl: 'TIANGONG_LCA_API_BASE_URL',\n authMode: 'TIANGONG_LCA_AUTH_MODE',\n oauthClientId: 'TIANGONG_LCA_OAUTH_CLIENT_ID',\n oauthRedirectUri: 'TIANGONG_LCA_OAUTH_REDIRECT_URI',\n accessToken: 'TIANGONG_LCA_ACCESS_TOKEN',\n region: 'TIANGONG_LCA_REGION',\n supabasePublishableKey: 'TIANGONG_LCA_SUPABASE_PUBLISHABLE_KEY',\n sessionFile: 'TIANGONG_LCA_SESSION_FILE',\n disableSessionCache: 'TIANGONG_LCA_DISABLE_SESSION_CACHE',\n forceReauth: 'TIANGONG_LCA_FORCE_REAUTH',\n} as const;\n\nconst PRODUCTION_PROJECT_URL = 'https://qgzvkongdjqiiamzbbts.supabase.co';\n\n// Public application configuration, not user credentials. Keep this as the one\n// source used by auth, remote adapters, and doctor; Skills must not copy it.\nexport const OFFICIAL_PRODUCTION_PROFILE = Object.freeze({\n apiBaseUrl: `${PRODUCTION_PROJECT_URL}/functions/v1`,\n supabasePublishableKey: 'sb_publishable_EFWH4E61tpAtf82WQ37xTA_Fxa5OPyg',\n oauthClientId: '1837c6d3-3c9d-48e0-bbf7-b532b78f9f76',\n oauthRedirectUri: DEFAULT_OAUTH_REDIRECT_URI,\n region: 'us-east-1',\n});\n\nconst PRODUCTION_ENV_DEFAULTS: Readonly<Record<string, string>> = Object.freeze({\n [ENV_KEYS.apiBaseUrl]: OFFICIAL_PRODUCTION_PROFILE.apiBaseUrl,\n [ENV_KEYS.supabasePublishableKey]: OFFICIAL_PRODUCTION_PROFILE.supabasePublishableKey,\n [ENV_KEYS.oauthClientId]: OFFICIAL_PRODUCTION_PROFILE.oauthClientId,\n [ENV_KEYS.oauthRedirectUri]: OFFICIAL_PRODUCTION_PROFILE.oauthRedirectUri,\n});\n\nfunction runtimeToken(value: unknown): string {\n return typeof value === 'string' ? value.trim() : '';\n}\n\nfunction isProductionBase(value: string): boolean {\n return [\n PRODUCTION_PROJECT_URL,\n `${PRODUCTION_PROJECT_URL}/functions/v1`,\n `${PRODUCTION_PROJECT_URL}/rest/v1`,\n ].includes(value.replace(/\\/+$/u, ''));\n}\n\nexport function hasProductionProfileMismatch(env: NodeJS.ProcessEnv): boolean {\n const base = runtimeToken(env[ENV_KEYS.apiBaseUrl]);\n return Boolean(\n base &&\n !isProductionBase(base) &&\n (runtimeToken(env[ENV_KEYS.oauthClientId]).toLowerCase() ===\n OFFICIAL_PRODUCTION_PROFILE.oauthClientId ||\n runtimeToken(env[ENV_KEYS.supabasePublishableKey]) ===\n OFFICIAL_PRODUCTION_PROFILE.supabasePublishableKey),\n );\n}\n\nfunction productionDefaults(env: NodeJS.ProcessEnv): Readonly<Record<string, string>> {\n const mode = runtimeToken(env[ENV_KEYS.authMode]).toLowerCase();\n // A caller-supplied bearer must always have an explicit destination and key.\n if ((mode && mode !== 'oauth') || runtimeToken(env[ENV_KEYS.accessToken])) return {};\n\n const base = runtimeToken(env[ENV_KEYS.apiBaseUrl]);\n if (base && !isProductionBase(base)) return {};\n\n for (const key of [\n ENV_KEYS.supabasePublishableKey,\n ENV_KEYS.oauthClientId,\n ENV_KEYS.oauthRedirectUri,\n ]) {\n const configured = runtimeToken(env[key]);\n const value = key === ENV_KEYS.oauthClientId ? configured.toLowerCase() : configured;\n if (value && value !== PRODUCTION_ENV_DEFAULTS[key]) return {};\n }\n return PRODUCTION_ENV_DEFAULTS;\n}\n\nexport function resolveProductionRuntimeEnv(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv {\n const resolved = { ...env };\n for (const [key, value] of Object.entries(productionDefaults(env))) {\n if (!runtimeToken(env[key])) resolved[key] = value;\n }\n return resolved;\n}\n\nexport const ENV_SPECS: EnvSpec[] = [\n {\n key: ENV_KEYS.apiBaseUrl,\n required: true,\n description: 'Main TianGong LCA API / Edge Functions base URL',\n },\n {\n key: ENV_KEYS.region,\n required: false,\n description: 'Target TianGong LCA API region',\n defaultValue: OFFICIAL_PRODUCTION_PROFILE.region,\n },\n {\n key: ENV_KEYS.supabasePublishableKey,\n required: true,\n description: 'Supabase publishable key used to bootstrap and refresh user sessions',\n },\n {\n key: ENV_KEYS.sessionFile,\n required: false,\n description: 'Optional local path for the CLI session cache file',\n },\n {\n key: ENV_KEYS.disableSessionCache,\n required: false,\n description: 'Disable the persistent CLI session cache when set to true',\n defaultValue: 'false',\n },\n {\n key: ENV_KEYS.forceReauth,\n required: false,\n description: 'Ignore cached sessions and force a fresh login when set to true',\n defaultValue: 'false',\n },\n {\n key: ENV_KEYS.authMode,\n required: false,\n description: 'Optional explicit auth mode: oauth or access-token',\n },\n {\n key: ENV_KEYS.oauthClientId,\n required: false,\n description: 'Registered public Supabase OAuth client ID',\n },\n {\n key: ENV_KEYS.oauthRedirectUri,\n required: false,\n description: 'Exact registered CLI loopback OAuth redirect URI',\n },\n {\n key: ENV_KEYS.accessToken,\n required: false,\n description: 'Explicit short-lived actor access token for headless execution',\n },\n];\n\nexport type DoctorCheck = {\n key: string;\n description: string;\n required: boolean;\n source: ResolvedEnv['source'];\n present: boolean;\n valuePreview: string | null;\n};\n\nexport type DoctorReport = {\n ok: boolean;\n loadedDotEnv: boolean;\n dotEnvPath: string;\n dotEnvKeysLoaded: number;\n checks: DoctorCheck[];\n};\n\nexport type RuntimeEnv = {\n apiBaseUrl: string | null;\n authMode: string | null;\n oauthClientId: string | null;\n oauthRedirectUri: string | null;\n accessToken: string | null;\n region: string;\n supabasePublishableKey: string | null;\n sessionFile: string | null;\n disableSessionCache: boolean;\n forceReauth: boolean;\n};\n\nfunction parseBooleanEnv(value: string | null): boolean {\n if (typeof value !== 'string') {\n return false;\n }\n\n switch (value.trim().toLowerCase()) {\n case '1':\n case 'true':\n case 'yes':\n case 'on':\n return true;\n default:\n return false;\n }\n}\n\nexport function resolveEnv(spec: EnvSpec, env: NodeJS.ProcessEnv): ResolvedEnv {\n const envValue = env[spec.key];\n if (envValue && (!Object.hasOwn(PRODUCTION_ENV_DEFAULTS, spec.key) || runtimeToken(envValue))) {\n return {\n key: spec.key,\n source: 'env',\n value: envValue as string,\n present: true,\n };\n }\n\n const defaults = productionDefaults(env);\n const defaultValue =\n spec.defaultValue ?? (Object.hasOwn(defaults, spec.key) ? defaults[spec.key] : undefined);\n if (defaultValue !== undefined) {\n return {\n key: spec.key,\n source: 'default',\n value: defaultValue,\n present: true,\n };\n }\n\n return {\n key: spec.key,\n source: 'missing',\n value: null,\n present: false,\n };\n}\n\nexport function readRuntimeEnv(env: NodeJS.ProcessEnv): RuntimeEnv {\n const apiBaseUrl = resolveEnv(ENV_SPECS[0], env).value;\n const region = resolveEnv(ENV_SPECS[1], env).value as string;\n const supabasePublishableKey = resolveEnv(ENV_SPECS[2], env).value;\n const sessionFile = resolveEnv(ENV_SPECS[3], env).value;\n const disableSessionCache = parseBooleanEnv(resolveEnv(ENV_SPECS[4], env).value);\n const forceReauth = parseBooleanEnv(resolveEnv(ENV_SPECS[5], env).value);\n const authMode = resolveEnv(ENV_SPECS[6], env).value;\n const oauthClientId = resolveEnv(ENV_SPECS[7], env).value;\n const oauthRedirectUri = resolveEnv(ENV_SPECS[8], env).value;\n const accessToken = resolveEnv(ENV_SPECS[9], env).value;\n\n return {\n apiBaseUrl,\n authMode,\n oauthClientId,\n oauthRedirectUri,\n accessToken,\n region,\n supabasePublishableKey,\n sessionFile,\n disableSessionCache,\n forceReauth,\n };\n}\n\nexport function maskSecret(value: string | null): string | null {\n if (!value) {\n return value;\n }\n if (value.length <= 8) {\n return value;\n }\n return `${value.slice(0, 4)}...${value.slice(-4)}`;\n}\n\nexport function buildDoctorReport(\n env: NodeJS.ProcessEnv,\n dotEnvStatus: { loaded: boolean; path: string; count: number },\n): DoctorReport {\n const checks = ENV_SPECS.map((spec) => {\n const resolved = resolveEnv(spec, env);\n return {\n key: spec.key,\n description: spec.description,\n required: spec.required,\n source: resolved.source,\n present: resolved.present,\n valuePreview: maskSecret(resolved.value),\n };\n });\n\n return {\n ok:\n !hasProductionProfileMismatch(env) &&\n checks.every((check) => !check.required || check.present) &&\n [ENV_KEYS.oauthClientId, ENV_KEYS.accessToken].some(\n (key) => checks.find((check) => check.key === key)?.present,\n ),\n loadedDotEnv: dotEnvStatus.loaded,\n dotEnvPath: dotEnvStatus.path,\n dotEnvKeysLoaded: dotEnvStatus.count,\n checks,\n };\n}\n\nexport const __testInternals = {\n parseBooleanEnv,\n};\n"]}
|
|
@@ -734,7 +734,7 @@ export async function runFlowReviewedPublishData(options) {
|
|
|
734
734
|
}
|
|
735
735
|
const runtimeEnv = options.env;
|
|
736
736
|
if (!runtimeEnv || !hasSupabaseRestRuntime(runtimeEnv)) {
|
|
737
|
-
throw new CliError('Process commit requires TIANGONG_LCA_API_BASE_URL,
|
|
737
|
+
throw new CliError('Process commit requires TIANGONG_LCA_API_BASE_URL, TIANGONG_LCA_SUPABASE_PUBLISHABLE_KEY, and an OAuth or explicit access-token session.', {
|
|
738
738
|
code: 'FLOW_PUBLISH_REVIEWED_PROCESS_RUNTIME_REQUIRED',
|
|
739
739
|
exitCode: 2,
|
|
740
740
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flow-publish-reviewed-data.js","sourceRoot":"","sources":["../../../src/lib/flow-publish-reviewed-data.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport { writeJsonArtifact, writeJsonLinesArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\nimport {\n coerceText,\n datasetPayloadFromRow,\n deepGet,\n extractFlowRecord,\n isRecord,\n listify,\n loadRowsFromFile,\n type FlowRecord,\n type JsonRecord,\n} from './flow-governance.js';\nimport {\n runFlowPublishVersion,\n type FlowPublishVersionReport,\n type RunFlowPublishVersionOptions,\n} from './flow-publish-version.js';\nimport type { FetchLike } from './http.js';\nimport { getRuntimeRuleset } from './runtime-rulesets.js';\nimport {\n hasSupabaseRestRuntime,\n syncSupabaseJsonOrderedRecord,\n type SupabaseJsonOrderedWriteOperation,\n} from './supabase-json-ordered-write.js';\n\nconst DEFAULT_MAX_WORKERS = 4;\nconst LEGACY_OUTPUT_PREFIX = 'flows_tidas_sdk_plus_classification';\n\nexport type FlowPublishPolicy = 'skip' | 'append_only_bump' | 'upsert_current_version';\nexport type ProcessPublishPolicy = FlowPublishPolicy;\n\ntype FlowPublishVersionCompatMode = 'dry_run' | 'commit';\n\ntype FlowVersionMapEntry = {\n id: string;\n source_version: string;\n target_version: string;\n};\n\ntype ProcessIdentity = {\n id: string;\n version: string;\n name: string;\n};\n\ntype FlowIndex = {\n byUuidVersion: Record<string, FlowRecord>;\n};\n\ntype SkippedUnchangedFlowRow = {\n entity_type: 'flow';\n entity_id: string;\n entity_name: string;\n version: string;\n reason: 'unchanged_vs_original_rows_file';\n};\n\ntype PreparedFlowPlan = {\n entity_type: 'flow';\n entity_id: string;\n entity_name: string;\n original_version: string;\n publish_version: string;\n version_strategy: 'keep_current' | 'bump';\n publish_policy: FlowPublishPolicy;\n row: JsonRecord;\n};\n\ntype PreparedProcessPlan = {\n entity_type: 'process';\n entity_id: string;\n entity_name: string;\n original_version: string;\n publish_version: string;\n version_strategy: 'keep_current' | 'bump';\n publish_policy: ProcessPublishPolicy;\n row: JsonRecord;\n};\n\ntype ProcessFlowRefRewriteEvidence = {\n process_id: string;\n process_version_before_publish: string;\n process_name: string;\n exchange_internal_id: string;\n source_flow_id: string;\n source_flow_version: string;\n target_flow_id: string;\n target_flow_version: string;\n target_flow_name: string;\n};\n\ntype FlowPublishSuccessRow = {\n id: string;\n version: string;\n operation:\n | 'would_insert'\n | 'would_update_existing'\n | 'insert'\n | 'update_existing'\n | 'update_after_insert_error';\n};\n\ntype FlowPublishFailureReason = {\n validator: string;\n stage: string;\n path: string;\n message: string;\n code: string;\n visible_user_id?: string;\n visible_state_code?: string;\n};\n\ntype FlowPublishFailureRow = {\n id: unknown;\n user_id?: unknown;\n json_ordered: JsonRecord;\n reason: FlowPublishFailureReason[];\n state_code?: unknown;\n};\n\ntype FlowReviewedPublishFiles = {\n prepared_flow_rows: string;\n prepared_process_rows: string;\n flow_version_map: string;\n skipped_unchanged_flow_rows: string;\n process_ref_rewrite_evidence: string;\n success_list: string;\n remote_failed: string;\n flow_publish_version_report: string;\n report: string;\n};\n\nexport type FlowReviewedPublishRowReport = {\n entity_type: 'flow';\n id: string;\n name: string;\n original_version: string;\n publish_version: string;\n publish_policy: FlowPublishPolicy;\n version_strategy: 'keep_current' | 'bump';\n status: 'prepared' | 'inserted' | 'updated' | 'failed';\n operation?: FlowPublishSuccessRow['operation'];\n error?: unknown;\n};\n\nexport type FlowReviewedPublishProcessRowReport = {\n entity_type: 'process';\n id: string;\n name: string;\n original_version: string;\n publish_version: string;\n publish_policy: ProcessPublishPolicy;\n version_strategy: 'keep_current' | 'bump';\n status: 'prepared' | 'inserted' | 'updated' | 'skipped_existing' | 'failed';\n operation?: SupabaseJsonOrderedWriteOperation;\n error?: unknown;\n};\n\nexport type FlowReviewedPublishDataReport = {\n schema_version: 1;\n generated_at_utc: string;\n status:\n | 'prepared_flow_publish_reviewed_data'\n | 'completed_flow_publish_reviewed_data'\n | 'completed_flow_publish_reviewed_data_with_failures';\n mode: FlowPublishVersionCompatMode;\n flow_rows_file: string | null;\n process_rows_file: string | null;\n original_flow_rows_file: string | null;\n out_dir: string;\n flow_publish_policy: FlowPublishPolicy;\n process_publish_policy: ProcessPublishPolicy;\n rewrite_process_flow_refs: boolean;\n counts: {\n input_flow_rows: number;\n input_process_rows: number;\n original_flow_rows: number;\n prepared_flow_rows: number;\n prepared_process_rows: number;\n skipped_unchanged_flow_rows: number;\n rewritten_process_flow_refs: number;\n flow_publish_reports: number;\n process_publish_reports: number;\n success_count: number;\n failure_count: number;\n };\n max_workers: number;\n target_user_id_override: string | null;\n files: FlowReviewedPublishFiles;\n flow_reports: FlowReviewedPublishRowReport[];\n process_reports: FlowReviewedPublishProcessRowReport[];\n skipped_unchanged_flow_rows: SkippedUnchangedFlowRow[];\n};\n\nexport type RunFlowReviewedPublishDataOptions = {\n flowRowsFile?: string | null;\n originalFlowRowsFile?: string | null;\n processRowsFile?: string | null;\n outDir: string;\n flowPublishPolicy?: FlowPublishPolicy;\n processPublishPolicy?: ProcessPublishPolicy;\n rewriteProcessFlowRefs?: boolean;\n commit?: boolean;\n maxWorkers?: number;\n targetUserId?: string | null;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n timeoutMs?: number;\n now?: Date;\n validateFlowPayloadImpl?: RunFlowPublishVersionOptions['validateFlowPayloadImpl'];\n runFlowPublishVersionImpl?: (\n options: RunFlowPublishVersionOptions,\n ) => Promise<FlowPublishVersionReport>;\n};\n\nfunction assert_input_file(\n inputFile: string,\n code: string,\n message = 'Missing required input file value.',\n): string {\n if (!inputFile) {\n throw new CliError(message, {\n code,\n exitCode: 2,\n });\n }\n\n const resolved = path.resolve(inputFile);\n if (!existsSync(resolved)) {\n throw new CliError(`Input file not found: ${resolved}`, {\n code,\n exitCode: 2,\n });\n }\n\n return resolved;\n}\n\nfunction assert_optional_input_file(\n inputFile: string | null | undefined,\n code: string,\n): string | null {\n if (!inputFile) {\n return null;\n }\n\n const resolved = path.resolve(inputFile);\n if (!existsSync(resolved)) {\n throw new CliError(`Input file not found: ${resolved}`, {\n code,\n exitCode: 2,\n });\n }\n\n return resolved;\n}\n\nfunction assert_out_dir(outDir: string): string {\n if (!outDir) {\n throw new CliError('Missing required --out-dir value.', {\n code: 'FLOW_PUBLISH_REVIEWED_OUT_DIR_REQUIRED',\n exitCode: 2,\n });\n }\n\n return path.resolve(outDir);\n}\n\nfunction clone_json<T>(value: T): T {\n if (value === undefined) {\n return value;\n }\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction json_equal(left: unknown, right: unknown): boolean {\n if (left === right) {\n return true;\n }\n\n if (Array.isArray(left) || Array.isArray(right)) {\n if (!Array.isArray(left) || !Array.isArray(right) || left.length !== right.length) {\n return false;\n }\n\n return left.every((value, index) => json_equal(value, right[index]));\n }\n\n if (!isRecord(left) || !isRecord(right)) {\n return false;\n }\n\n const leftKeys = Object.keys(left).sort();\n const rightKeys = Object.keys(right).sort();\n if (leftKeys.length !== rightKeys.length) {\n return false;\n }\n\n return leftKeys.every(\n (key, index) => key === rightKeys[index] && json_equal(left[key], right[key]),\n );\n}\n\nfunction normalize_publish_policy(\n value: FlowPublishPolicy | string | undefined,\n label = '--flow-publish-policy',\n code = 'FLOW_PUBLISH_REVIEWED_POLICY_INVALID',\n): FlowPublishPolicy {\n if (value === undefined || value === '') {\n return 'append_only_bump';\n }\n\n if (value === 'skip' || value === 'append_only_bump' || value === 'upsert_current_version') {\n return value;\n }\n\n throw new CliError(\n `Expected ${label} to be one of: skip, append_only_bump, upsert_current_version.`,\n {\n code,\n exitCode: 2,\n },\n );\n}\n\nfunction bump_ilcd_version(version: string): string {\n const parts = String(version || '')\n .trim()\n .split('.');\n if (parts.length !== 3 || !parts.every((part) => /^\\d+$/u.test(part))) {\n return '01.01.001';\n }\n\n const [head, middle, tail] = parts;\n return `${Number.parseInt(head, 10).toString().padStart(head.length, '0')}.${Number.parseInt(\n middle,\n 10,\n )\n .toString()\n .padStart(middle.length, '0')}.${(Number.parseInt(tail, 10) + 1)\n .toString()\n .padStart(tail.length, '0')}`;\n}\n\nfunction set_flow_version(row: JsonRecord, newVersion: string): void {\n const payload = datasetPayloadFromRow(row);\n const dataset = isRecord(payload.flowDataSet) ? payload.flowDataSet : payload;\n const administrativeInformation = isRecord(dataset.administrativeInformation)\n ? dataset.administrativeInformation\n : {};\n if (!isRecord(dataset.administrativeInformation)) {\n dataset.administrativeInformation = administrativeInformation;\n }\n const publicationAndOwnership = isRecord(administrativeInformation.publicationAndOwnership)\n ? administrativeInformation.publicationAndOwnership\n : {};\n if (!isRecord(administrativeInformation.publicationAndOwnership)) {\n administrativeInformation.publicationAndOwnership = publicationAndOwnership;\n }\n publicationAndOwnership['common:dataSetVersion'] = newVersion;\n row.version = newVersion;\n}\n\nfunction process_dataset_from_row(row: JsonRecord): JsonRecord {\n const payload = datasetPayloadFromRow(row);\n return isRecord(payload.processDataSet) ? payload.processDataSet : payload;\n}\n\nfunction extract_process_identity(row: JsonRecord): ProcessIdentity {\n const dataset = process_dataset_from_row(row);\n const info = deepGet(dataset, ['processInformation', 'dataSetInformation'], {}) as JsonRecord;\n const id = coerceText(row.id) || coerceText(info['common:UUID']);\n const version =\n coerceText(row.version) ||\n coerceText(\n deepGet(dataset, [\n 'administrativeInformation',\n 'publicationAndOwnership',\n 'common:dataSetVersion',\n ]),\n ) ||\n '01.00.000';\n const nameBlock = deepGet(info, ['name', 'baseName']) ?? deepGet(info, ['name']) ?? info.name;\n const name = coerceText(nameBlock) || id;\n\n return {\n id,\n version,\n name,\n };\n}\n\nfunction exchange_records(processRow: JsonRecord): JsonRecord[] {\n const dataset = process_dataset_from_row(processRow);\n return listify(deepGet(dataset, ['exchanges', 'exchange'], [])).filter(isRecord);\n}\n\nfunction set_process_version(row: JsonRecord, newVersion: string): void {\n const payload = datasetPayloadFromRow(row);\n const dataset = isRecord(payload.processDataSet) ? payload.processDataSet : payload;\n const administrativeInformation = isRecord(dataset.administrativeInformation)\n ? dataset.administrativeInformation\n : {};\n if (!isRecord(dataset.administrativeInformation)) {\n dataset.administrativeInformation = administrativeInformation;\n }\n const publicationAndOwnership = isRecord(administrativeInformation.publicationAndOwnership)\n ? administrativeInformation.publicationAndOwnership\n : {};\n if (!isRecord(administrativeInformation.publicationAndOwnership)) {\n administrativeInformation.publicationAndOwnership = publicationAndOwnership;\n }\n publicationAndOwnership['common:dataSetVersion'] = newVersion;\n row.version = newVersion;\n}\n\nfunction build_flow_index(rows: JsonRecord[]): FlowIndex {\n const byUuidVersion: Record<string, FlowRecord> = {};\n\n for (const row of rows) {\n const record = extractFlowRecord(row);\n byUuidVersion[`${record.id}@${record.version}`] = record;\n }\n\n return {\n byUuidVersion,\n };\n}\n\nfunction build_local_dataset_uri(datasetKind: string, uuidValue: string, version: string): string {\n if (!uuidValue) {\n return '';\n }\n\n const folderMap: Record<string, string> = {\n flow: 'flows',\n 'flow data set': 'flows',\n };\n const folder = folderMap[datasetKind.trim().toLowerCase()] ?? 'datasets';\n const versionText = version.trim() || '01.00.000';\n return `../${folder}/${uuidValue}_${versionText}.xml`;\n}\n\nfunction preserve_short_description_shape(existing: unknown, target: JsonRecord): unknown {\n if (Array.isArray(existing)) {\n if (existing.length > 0 && isRecord(existing[0])) {\n const patched = clone_json(existing[0]);\n patched['@xml:lang'] =\n coerceText(target['@xml:lang']) || coerceText(patched['@xml:lang']) || 'en';\n patched['#text'] = coerceText(target['#text']);\n return [patched];\n }\n return [clone_json(target)];\n }\n\n if (isRecord(existing)) {\n const patched = clone_json(existing);\n patched['@xml:lang'] =\n coerceText(target['@xml:lang']) || coerceText(patched['@xml:lang']) || 'en';\n patched['#text'] = coerceText(target['#text']);\n return patched;\n }\n\n return clone_json(target);\n}\n\nfunction flow_reference_from_record(record: FlowRecord): JsonRecord {\n const targetShortDescription =\n record.shortDescription ??\n ({\n '@xml:lang': 'en',\n '#text': record.name,\n } satisfies JsonRecord);\n\n return {\n '@type': 'flow data set',\n '@refObjectId': record.id,\n '@version': record.version,\n '@uri': build_local_dataset_uri('flow data set', record.id, record.version),\n 'common:shortDescription': clone_json(targetShortDescription),\n };\n}\n\nfunction patched_flow_reference(currentRef: unknown, record: FlowRecord): JsonRecord {\n const current = isRecord(currentRef) ? clone_json(currentRef) : {};\n const target = flow_reference_from_record(record);\n\n current['@type'] = coerceText(current['@type']) || coerceText(target['@type']);\n current['@refObjectId'] = target['@refObjectId'];\n current['@version'] = target['@version'];\n current['@uri'] = target['@uri'];\n current['common:shortDescription'] = preserve_short_description_shape(\n current['common:shortDescription'],\n target['common:shortDescription'] as JsonRecord,\n );\n\n return current;\n}\n\nfunction build_output_files(outDir: string): FlowReviewedPublishFiles {\n return {\n prepared_flow_rows: path.join(outDir, 'prepared-flow-rows.json'),\n prepared_process_rows: path.join(outDir, 'prepared-process-rows.json'),\n flow_version_map: path.join(outDir, 'flow-version-map.json'),\n skipped_unchanged_flow_rows: path.join(outDir, 'skipped-unchanged-flow-rows.json'),\n process_ref_rewrite_evidence: path.join(outDir, 'process-flow-ref-rewrite-evidence.jsonl'),\n success_list: path.join(outDir, `${LEGACY_OUTPUT_PREFIX}_mcp_success_list.json`),\n remote_failed: path.join(outDir, `${LEGACY_OUTPUT_PREFIX}_remote_validation_failed.jsonl`),\n flow_publish_version_report: path.join(outDir, `${LEGACY_OUTPUT_PREFIX}_mcp_sync_report.json`),\n report: path.join(outDir, 'publish-report.json'),\n };\n}\n\nfunction status_from_mode(\n mode: FlowPublishVersionCompatMode,\n failureCount: number,\n): FlowReviewedPublishDataReport['status'] {\n if (mode === 'dry_run') {\n return 'prepared_flow_publish_reviewed_data';\n }\n\n return failureCount > 0\n ? 'completed_flow_publish_reviewed_data_with_failures'\n : 'completed_flow_publish_reviewed_data';\n}\n\nfunction prepare_flow_rows(options: {\n rows: JsonRecord[];\n policy: FlowPublishPolicy;\n originalRows: JsonRecord[];\n}): {\n preparedRows: JsonRecord[];\n plans: PreparedFlowPlan[];\n flowVersionMap: Record<string, FlowVersionMapEntry>;\n skippedUnchangedRows: SkippedUnchangedFlowRow[];\n} {\n if (options.policy === 'skip') {\n return {\n preparedRows: [],\n plans: [],\n flowVersionMap: {},\n skippedUnchangedRows: [],\n };\n }\n\n const originalMap = new Map<string, JsonRecord>();\n for (const row of options.originalRows) {\n const record = extractFlowRecord(row);\n if (record.id && record.version) {\n originalMap.set(`${record.id}@${record.version}`, row);\n }\n }\n\n const preparedRows: JsonRecord[] = [];\n const plans: PreparedFlowPlan[] = [];\n const flowVersionMap: Record<string, FlowVersionMapEntry> = {};\n const skippedUnchangedRows: SkippedUnchangedFlowRow[] = [];\n\n for (const row of options.rows) {\n const working = clone_json(row);\n const record = extractFlowRecord(working);\n const originalRow =\n record.id && record.version ? originalMap.get(`${record.id}@${record.version}`) : undefined;\n\n if (originalRow && json_equal(datasetPayloadFromRow(originalRow), datasetPayloadFromRow(row))) {\n skippedUnchangedRows.push({\n entity_type: 'flow',\n entity_id: record.id,\n entity_name: record.name,\n version: record.version,\n reason: 'unchanged_vs_original_rows_file',\n });\n continue;\n }\n\n let publishVersion = record.version;\n let versionStrategy: PreparedFlowPlan['version_strategy'] = 'keep_current';\n if (options.policy === 'append_only_bump') {\n publishVersion = bump_ilcd_version(record.version);\n set_flow_version(working, publishVersion);\n versionStrategy = 'bump';\n if (record.id && record.version) {\n flowVersionMap[`${record.id}@${record.version}`] = {\n id: record.id,\n source_version: record.version,\n target_version: publishVersion,\n };\n }\n }\n\n preparedRows.push(working);\n plans.push({\n entity_type: 'flow',\n entity_id: record.id,\n entity_name: record.name,\n original_version: record.version,\n publish_version: publishVersion,\n version_strategy: versionStrategy,\n publish_policy: options.policy,\n row: working,\n });\n }\n\n return {\n preparedRows,\n plans,\n flowVersionMap,\n skippedUnchangedRows,\n };\n}\n\nfunction prepare_process_rows(options: {\n rows: JsonRecord[];\n policy: ProcessPublishPolicy;\n rewriteRefs: boolean;\n preparedFlowRows: JsonRecord[];\n flowVersionMap: Record<string, FlowVersionMapEntry>;\n}): {\n preparedRows: JsonRecord[];\n plans: PreparedProcessPlan[];\n rewriteEvidence: ProcessFlowRefRewriteEvidence[];\n} {\n if (options.policy === 'skip') {\n return {\n preparedRows: [],\n plans: [],\n rewriteEvidence: [],\n };\n }\n\n const preparedRows = options.rows.map((row) => clone_json(row));\n const rewriteEvidence: ProcessFlowRefRewriteEvidence[] = [];\n\n if (\n options.rewriteRefs &&\n preparedRows.length > 0 &&\n options.preparedFlowRows.length > 0 &&\n Object.keys(options.flowVersionMap).length > 0\n ) {\n const targetIndex = build_flow_index(options.preparedFlowRows).byUuidVersion;\n\n for (const row of preparedRows) {\n const processIdentity = extract_process_identity(row);\n\n for (const exchange of exchange_records(row)) {\n const currentRef = isRecord(exchange.referenceToFlowDataSet)\n ? exchange.referenceToFlowDataSet\n : null;\n if (!currentRef) {\n continue;\n }\n\n const flowId = coerceText(currentRef['@refObjectId']);\n const flowVersion = coerceText(currentRef['@version']);\n const mapped = options.flowVersionMap[`${flowId}@${flowVersion}`];\n if (!mapped) {\n continue;\n }\n\n const targetRecord = targetIndex[`${mapped.id}@${mapped.target_version}`];\n if (!targetRecord) {\n continue;\n }\n\n exchange.referenceToFlowDataSet = patched_flow_reference(currentRef, targetRecord);\n rewriteEvidence.push({\n process_id: processIdentity.id,\n process_version_before_publish: processIdentity.version,\n process_name: processIdentity.name,\n exchange_internal_id: coerceText(exchange['@dataSetInternalID']),\n source_flow_id: flowId,\n source_flow_version: flowVersion,\n target_flow_id: mapped.id,\n target_flow_version: mapped.target_version,\n target_flow_name: targetRecord.name,\n });\n }\n }\n }\n\n const plans: PreparedProcessPlan[] = [];\n for (const row of preparedRows) {\n const record = extract_process_identity(row);\n let publishVersion = record.version;\n let versionStrategy: PreparedProcessPlan['version_strategy'] = 'keep_current';\n if (options.policy === 'append_only_bump') {\n publishVersion = bump_ilcd_version(record.version);\n set_process_version(row, publishVersion);\n versionStrategy = 'bump';\n }\n\n plans.push({\n entity_type: 'process',\n entity_id: record.id,\n entity_name: record.name,\n original_version: record.version,\n publish_version: publishVersion,\n version_strategy: versionStrategy,\n publish_policy: options.policy,\n row,\n });\n }\n\n return {\n preparedRows,\n plans,\n rewriteEvidence,\n };\n}\n\nfunction build_local_row_report(plan: PreparedFlowPlan): FlowReviewedPublishRowReport {\n return {\n entity_type: 'flow',\n id: plan.entity_id,\n name: plan.entity_name,\n original_version: plan.original_version,\n publish_version: plan.publish_version,\n publish_policy: plan.publish_policy,\n version_strategy: plan.version_strategy,\n status: 'prepared',\n };\n}\n\nfunction build_local_process_row_report(\n plan: PreparedProcessPlan,\n): FlowReviewedPublishProcessRowReport {\n return {\n entity_type: 'process',\n id: plan.entity_id,\n name: plan.entity_name,\n original_version: plan.original_version,\n publish_version: plan.publish_version,\n publish_policy: plan.publish_policy,\n version_strategy: plan.version_strategy,\n status: 'prepared',\n };\n}\n\nfunction process_publish_payload_from_row(row: JsonRecord): JsonRecord {\n const payload = datasetPayloadFromRow(row);\n const dataset = isRecord(payload.processDataSet) ? payload.processDataSet : payload;\n return {\n processDataSet: clone_json(dataset),\n };\n}\n\nfunction build_process_commit_success_report(\n plan: PreparedProcessPlan,\n operation: SupabaseJsonOrderedWriteOperation,\n): FlowReviewedPublishProcessRowReport {\n return {\n entity_type: 'process',\n id: plan.entity_id,\n name: plan.entity_name,\n original_version: plan.original_version,\n publish_version: plan.publish_version,\n publish_policy: plan.publish_policy,\n version_strategy: plan.version_strategy,\n status:\n operation === 'insert'\n ? 'inserted'\n : operation === 'skipped_existing'\n ? 'skipped_existing'\n : 'updated',\n operation,\n };\n}\n\nfunction build_process_commit_failure_report(\n plan: PreparedProcessPlan,\n error: unknown,\n): FlowReviewedPublishProcessRowReport {\n return {\n entity_type: 'process',\n id: plan.entity_id,\n name: plan.entity_name,\n original_version: plan.original_version,\n publish_version: plan.publish_version,\n publish_policy: plan.publish_policy,\n version_strategy: plan.version_strategy,\n status: 'failed',\n error,\n };\n}\n\nfunction normalize_process_commit_failure(error: unknown): unknown {\n if (error instanceof CliError && error.code === 'REMOTE_REQUEST_FAILED') {\n if (typeof error.details === 'string' && error.details.trim()) {\n return error.details;\n }\n\n if (error.message.startsWith('HTTP 0 returned') && isRecord(error.details)) {\n const detailMessage =\n typeof error.details.message === 'string' ? error.details.message.trim() : '';\n const normalized = detailMessage.replace(/^(?:FetchError|Error):\\s*/u, '').trim();\n if (normalized && normalized !== 'undefined') {\n return normalized;\n }\n }\n }\n\n return error instanceof Error ? error.message : error;\n}\n\nfunction build_commit_success_report(\n plan: PreparedFlowPlan,\n success: FlowPublishSuccessRow,\n): FlowReviewedPublishRowReport {\n return {\n entity_type: 'flow',\n id: plan.entity_id,\n name: plan.entity_name,\n original_version: plan.original_version,\n publish_version: plan.publish_version,\n publish_policy: plan.publish_policy,\n version_strategy: plan.version_strategy,\n status: success.operation === 'insert' ? 'inserted' : 'updated',\n operation: success.operation,\n };\n}\n\nfunction build_commit_failure_report(\n plan: PreparedFlowPlan,\n failure: FlowPublishFailureRow,\n): FlowReviewedPublishRowReport {\n return {\n entity_type: 'flow',\n id: plan.entity_id,\n name: plan.entity_name,\n original_version: plan.original_version,\n publish_version: plan.publish_version,\n publish_policy: plan.publish_policy,\n version_strategy: plan.version_strategy,\n status: 'failed',\n error: failure.reason,\n };\n}\n\nfunction build_flow_key(id: string, version: string): string | null {\n if (!id || !version) {\n return null;\n }\n return `${id}@${version}`;\n}\n\nfunction queue_by_key<T>(items: T[], keyFn: (item: T) => string | null): Map<string, T[]> {\n const queued = new Map<string, T[]>();\n\n for (const item of items) {\n const key = keyFn(item);\n if (!key) {\n continue;\n }\n const queue = queued.get(key) ?? [];\n queue.push(item);\n queued.set(key, queue);\n }\n\n return queued;\n}\n\nfunction failure_key(row: FlowPublishFailureRow): string | null {\n const record = extractFlowRecord(row as unknown as JsonRecord);\n return build_flow_key(record.id, record.version);\n}\n\nfunction success_key(row: FlowPublishSuccessRow): string | null {\n return build_flow_key(row.id, row.version);\n}\n\nfunction shift_queue<T>(queue: Map<string, T[]>, key: string | null): T | null {\n if (!key) {\n return null;\n }\n\n const items = queue.get(key);\n if (!items?.length) {\n return null;\n }\n\n const [first, ...rest] = items;\n if (rest.length) {\n queue.set(key, rest);\n } else {\n queue.delete(key);\n }\n return first ?? null;\n}\n\nasync function map_with_concurrency<T, R>(\n items: T[],\n maxWorkers: number,\n worker: (item: T, index: number) => Promise<R>,\n): Promise<R[]> {\n const results = new Array<R>(items.length);\n const workerCount = Math.min(Math.max(1, maxWorkers), Math.max(items.length, 1));\n let nextIndex = 0;\n\n async function runWorker(): Promise<void> {\n while (true) {\n const currentIndex = nextIndex;\n nextIndex += 1;\n if (currentIndex >= items.length) {\n return;\n }\n results[currentIndex] = await worker(items[currentIndex] as T, currentIndex);\n }\n }\n\n await Promise.all(Array.from({ length: workerCount }, () => runWorker()));\n return results;\n}\n\nfunction map_commit_reports(\n plans: PreparedFlowPlan[],\n successes: FlowPublishSuccessRow[],\n failures: FlowPublishFailureRow[],\n): FlowReviewedPublishRowReport[] {\n const successQueue = queue_by_key(successes, success_key);\n const failureQueue = queue_by_key(failures, failure_key);\n const unkeyedFailures = failures.filter((failure) => failure_key(failure) === null);\n\n return plans.map((plan) => {\n const key = build_flow_key(plan.entity_id, plan.publish_version);\n const success = shift_queue(successQueue, key);\n if (success) {\n return build_commit_success_report(plan, success);\n }\n\n const failure =\n shift_queue(failureQueue, key) ?? (key ? null : (unkeyedFailures.shift() ?? null));\n if (failure) {\n return build_commit_failure_report(plan, failure);\n }\n\n return {\n ...build_local_row_report(plan),\n status: 'failed',\n error: [\n {\n code: 'UNMATCHED_PUBLISH_RESULT',\n message: 'Publish result was missing for prepared flow row.',\n },\n ],\n };\n });\n}\n\nfunction build_compat_report(options: {\n now: Date;\n mode: FlowPublishVersionCompatMode;\n preparedRows: number;\n successCount: number;\n failureCount: number;\n maxWorkers: number;\n targetUserId: string | null;\n files: FlowReviewedPublishFiles;\n}): FlowPublishVersionReport {\n const ruleset = getRuntimeRuleset('flow-publish/default');\n let status: FlowPublishVersionReport['status'];\n if (options.mode === 'dry_run') {\n status = 'prepared_flow_publish_version';\n } else {\n status =\n options.failureCount > 0\n ? 'completed_flow_publish_version_with_failures'\n : 'completed_flow_publish_version';\n }\n\n return {\n schema_version: 1,\n generated_at_utc: options.now.toISOString(),\n status,\n mode: options.mode,\n input_file: options.files.prepared_flow_rows,\n out_dir: path.dirname(options.files.report),\n counts: {\n total_rows: options.preparedRows,\n success_count: options.successCount,\n failure_count: options.failureCount,\n },\n flow_gate: {\n status: 'passed',\n ruleset_id: ruleset.id,\n ruleset_version: ruleset.version,\n counts: {\n total: options.preparedRows,\n valid: options.preparedRows,\n invalid: 0,\n },\n blocker_count: 0,\n next_action: 'query_remote_write_plan',\n },\n operation_counts: {},\n max_workers: options.maxWorkers,\n limit: null,\n target_user_id_override: options.targetUserId,\n files: {\n success_list: options.files.success_list,\n remote_failed: options.files.remote_failed,\n gate_report: options.files.flow_publish_version_report,\n report: options.files.flow_publish_version_report,\n },\n };\n}\n\nasync function commit_process_plans(options: {\n plans: PreparedProcessPlan[];\n maxWorkers: number;\n env: NodeJS.ProcessEnv;\n fetchImpl: FetchLike;\n timeoutMs?: number;\n}): Promise<FlowReviewedPublishProcessRowReport[]> {\n return map_with_concurrency(options.plans, options.maxWorkers, async (plan) => {\n try {\n const result = await syncSupabaseJsonOrderedRecord({\n table: 'processes',\n id: plan.entity_id,\n version: plan.publish_version,\n payload: process_publish_payload_from_row(plan.row),\n writeMode:\n plan.publish_policy === 'append_only_bump'\n ? 'append_only_insert'\n : 'upsert_current_version',\n env: options.env,\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n });\n return build_process_commit_success_report(plan, result.operation);\n } catch (error) {\n return build_process_commit_failure_report(plan, normalize_process_commit_failure(error));\n }\n });\n}\n\nexport async function runFlowReviewedPublishData(\n options: RunFlowReviewedPublishDataOptions,\n): Promise<FlowReviewedPublishDataReport> {\n const flowRowsFile = assert_optional_input_file(\n options.flowRowsFile,\n 'FLOW_PUBLISH_REVIEWED_FLOW_ROWS_NOT_FOUND',\n );\n const processRowsFile = assert_optional_input_file(\n options.processRowsFile,\n 'FLOW_PUBLISH_REVIEWED_PROCESS_ROWS_NOT_FOUND',\n );\n if (!flowRowsFile && !processRowsFile) {\n throw new CliError('Provide at least one of --flow-rows-file or --process-rows-file.', {\n code: 'FLOW_PUBLISH_REVIEWED_INPUT_REQUIRED',\n exitCode: 2,\n });\n }\n const originalFlowRowsFile = assert_optional_input_file(\n options.originalFlowRowsFile,\n 'FLOW_PUBLISH_REVIEWED_ORIGINAL_ROWS_NOT_FOUND',\n );\n const outDir = assert_out_dir(options.outDir);\n const flowPublishPolicy = normalize_publish_policy(options.flowPublishPolicy);\n const processPublishPolicy = normalize_publish_policy(\n options.processPublishPolicy,\n '--process-publish-policy',\n 'FLOW_PUBLISH_REVIEWED_PROCESS_POLICY_INVALID',\n );\n const rewriteProcessFlowRefs = options.rewriteProcessFlowRefs !== false;\n const mode: FlowPublishVersionCompatMode = options.commit ? 'commit' : 'dry_run';\n const maxWorkers = options.maxWorkers ?? DEFAULT_MAX_WORKERS;\n const targetUserId =\n typeof options.targetUserId === 'string' && options.targetUserId.trim()\n ? options.targetUserId.trim()\n : null;\n const now = options.now ?? new Date();\n const files = build_output_files(outDir);\n const inputFlowRows = flowRowsFile ? loadRowsFromFile(flowRowsFile) : [];\n const originalFlowRows = originalFlowRowsFile ? loadRowsFromFile(originalFlowRowsFile) : [];\n const inputProcessRows = processRowsFile ? loadRowsFromFile(processRowsFile) : [];\n const prepared = prepare_flow_rows({\n rows: inputFlowRows,\n policy: flowPublishPolicy,\n originalRows: originalFlowRows,\n });\n const preparedProcesses = prepare_process_rows({\n rows: inputProcessRows,\n policy: processPublishPolicy,\n rewriteRefs: rewriteProcessFlowRefs,\n preparedFlowRows: prepared.preparedRows,\n flowVersionMap: prepared.flowVersionMap,\n });\n\n writeJsonArtifact(files.prepared_flow_rows, prepared.preparedRows);\n writeJsonArtifact(files.prepared_process_rows, preparedProcesses.preparedRows);\n writeJsonArtifact(files.flow_version_map, prepared.flowVersionMap);\n writeJsonArtifact(files.skipped_unchanged_flow_rows, prepared.skippedUnchangedRows);\n writeJsonLinesArtifact(files.process_ref_rewrite_evidence, preparedProcesses.rewriteEvidence);\n\n let flowReports = prepared.plans.map(build_local_row_report);\n let processReports = preparedProcesses.plans.map(build_local_process_row_report);\n\n if (options.commit && prepared.preparedRows.length > 0) {\n const publishImpl = options.runFlowPublishVersionImpl ?? runFlowPublishVersion;\n await publishImpl({\n inputFile: files.prepared_flow_rows,\n outDir,\n commit: true,\n maxWorkers,\n targetUserId,\n env: options.env,\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n now,\n validateFlowPayloadImpl: options.validateFlowPayloadImpl,\n });\n\n const successRows = loadRowsFromFile(files.success_list) as FlowPublishSuccessRow[];\n const failureRows = loadRowsFromFile(files.remote_failed) as FlowPublishFailureRow[];\n flowReports = map_commit_reports(prepared.plans, successRows, failureRows);\n } else {\n writeJsonArtifact(files.success_list, []);\n writeJsonLinesArtifact(files.remote_failed, []);\n const compatReport = build_compat_report({\n now,\n mode,\n preparedRows: prepared.preparedRows.length,\n successCount: 0,\n failureCount: 0,\n maxWorkers,\n targetUserId,\n files,\n });\n writeJsonArtifact(files.flow_publish_version_report, compatReport);\n }\n\n if (options.commit && preparedProcesses.preparedRows.length > 0) {\n if (!options.fetchImpl) {\n throw new CliError(\n 'Process commit requires a fetch implementation in flow publish-reviewed-data.',\n {\n code: 'FLOW_PUBLISH_REVIEWED_PROCESS_FETCH_REQUIRED',\n exitCode: 2,\n },\n );\n }\n\n const runtimeEnv = options.env;\n if (!runtimeEnv || !hasSupabaseRestRuntime(runtimeEnv)) {\n throw new CliError(\n 'Process commit requires TIANGONG_LCA_API_BASE_URL, TIANGONG_LCA_API_KEY, and TIANGONG_LCA_SUPABASE_PUBLISHABLE_KEY.',\n {\n code: 'FLOW_PUBLISH_REVIEWED_PROCESS_RUNTIME_REQUIRED',\n exitCode: 2,\n },\n );\n }\n\n processReports = await commit_process_plans({\n plans: preparedProcesses.plans,\n maxWorkers,\n env: runtimeEnv,\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n });\n }\n\n const successCount =\n flowReports.filter((report) => report.status === 'inserted' || report.status === 'updated')\n .length +\n processReports.filter(\n (report) =>\n report.status === 'inserted' ||\n report.status === 'updated' ||\n report.status === 'skipped_existing',\n ).length;\n const failureCount =\n flowReports.filter((report) => report.status === 'failed').length +\n processReports.filter((report) => report.status === 'failed').length;\n\n const report: FlowReviewedPublishDataReport = {\n schema_version: 1,\n generated_at_utc: now.toISOString(),\n status: status_from_mode(mode, failureCount),\n mode,\n flow_rows_file: flowRowsFile,\n process_rows_file: processRowsFile,\n original_flow_rows_file: originalFlowRowsFile,\n out_dir: outDir,\n flow_publish_policy: flowPublishPolicy,\n process_publish_policy: processPublishPolicy,\n rewrite_process_flow_refs: rewriteProcessFlowRefs,\n counts: {\n input_flow_rows: inputFlowRows.length,\n input_process_rows: inputProcessRows.length,\n original_flow_rows: originalFlowRows.length,\n prepared_flow_rows: prepared.preparedRows.length,\n prepared_process_rows: preparedProcesses.preparedRows.length,\n skipped_unchanged_flow_rows: prepared.skippedUnchangedRows.length,\n rewritten_process_flow_refs: preparedProcesses.rewriteEvidence.length,\n flow_publish_reports: flowReports.length,\n process_publish_reports: processReports.length,\n success_count: successCount,\n failure_count: failureCount,\n },\n max_workers: maxWorkers,\n target_user_id_override: targetUserId,\n files,\n flow_reports: flowReports,\n process_reports: processReports,\n skipped_unchanged_flow_rows: prepared.skippedUnchangedRows,\n };\n\n writeJsonArtifact(files.report, report);\n return report;\n}\n\nexport const __testInternals = {\n assert_input_file,\n assert_optional_input_file,\n assert_out_dir,\n clone_json,\n json_equal,\n normalize_publish_policy,\n bump_ilcd_version,\n set_flow_version,\n process_dataset_from_row,\n extract_process_identity,\n exchange_records,\n set_process_version,\n build_flow_index,\n build_local_dataset_uri,\n preserve_short_description_shape,\n flow_reference_from_record,\n patched_flow_reference,\n build_output_files,\n status_from_mode,\n prepare_flow_rows,\n prepare_process_rows,\n build_compat_report,\n map_commit_reports,\n shift_queue,\n process_publish_payload_from_row,\n build_process_commit_success_report,\n build_process_commit_failure_report,\n normalize_process_commit_failure,\n map_with_concurrency,\n commit_process_plans,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"flow-publish-reviewed-data.js","sourceRoot":"","sources":["../../../src/lib/flow-publish-reviewed-data.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from 'node:fs';\nimport path from 'node:path';\nimport { writeJsonArtifact, writeJsonLinesArtifact } from './artifacts.js';\nimport { CliError } from './errors.js';\nimport {\n coerceText,\n datasetPayloadFromRow,\n deepGet,\n extractFlowRecord,\n isRecord,\n listify,\n loadRowsFromFile,\n type FlowRecord,\n type JsonRecord,\n} from './flow-governance.js';\nimport {\n runFlowPublishVersion,\n type FlowPublishVersionReport,\n type RunFlowPublishVersionOptions,\n} from './flow-publish-version.js';\nimport type { FetchLike } from './http.js';\nimport { getRuntimeRuleset } from './runtime-rulesets.js';\nimport {\n hasSupabaseRestRuntime,\n syncSupabaseJsonOrderedRecord,\n type SupabaseJsonOrderedWriteOperation,\n} from './supabase-json-ordered-write.js';\n\nconst DEFAULT_MAX_WORKERS = 4;\nconst LEGACY_OUTPUT_PREFIX = 'flows_tidas_sdk_plus_classification';\n\nexport type FlowPublishPolicy = 'skip' | 'append_only_bump' | 'upsert_current_version';\nexport type ProcessPublishPolicy = FlowPublishPolicy;\n\ntype FlowPublishVersionCompatMode = 'dry_run' | 'commit';\n\ntype FlowVersionMapEntry = {\n id: string;\n source_version: string;\n target_version: string;\n};\n\ntype ProcessIdentity = {\n id: string;\n version: string;\n name: string;\n};\n\ntype FlowIndex = {\n byUuidVersion: Record<string, FlowRecord>;\n};\n\ntype SkippedUnchangedFlowRow = {\n entity_type: 'flow';\n entity_id: string;\n entity_name: string;\n version: string;\n reason: 'unchanged_vs_original_rows_file';\n};\n\ntype PreparedFlowPlan = {\n entity_type: 'flow';\n entity_id: string;\n entity_name: string;\n original_version: string;\n publish_version: string;\n version_strategy: 'keep_current' | 'bump';\n publish_policy: FlowPublishPolicy;\n row: JsonRecord;\n};\n\ntype PreparedProcessPlan = {\n entity_type: 'process';\n entity_id: string;\n entity_name: string;\n original_version: string;\n publish_version: string;\n version_strategy: 'keep_current' | 'bump';\n publish_policy: ProcessPublishPolicy;\n row: JsonRecord;\n};\n\ntype ProcessFlowRefRewriteEvidence = {\n process_id: string;\n process_version_before_publish: string;\n process_name: string;\n exchange_internal_id: string;\n source_flow_id: string;\n source_flow_version: string;\n target_flow_id: string;\n target_flow_version: string;\n target_flow_name: string;\n};\n\ntype FlowPublishSuccessRow = {\n id: string;\n version: string;\n operation:\n | 'would_insert'\n | 'would_update_existing'\n | 'insert'\n | 'update_existing'\n | 'update_after_insert_error';\n};\n\ntype FlowPublishFailureReason = {\n validator: string;\n stage: string;\n path: string;\n message: string;\n code: string;\n visible_user_id?: string;\n visible_state_code?: string;\n};\n\ntype FlowPublishFailureRow = {\n id: unknown;\n user_id?: unknown;\n json_ordered: JsonRecord;\n reason: FlowPublishFailureReason[];\n state_code?: unknown;\n};\n\ntype FlowReviewedPublishFiles = {\n prepared_flow_rows: string;\n prepared_process_rows: string;\n flow_version_map: string;\n skipped_unchanged_flow_rows: string;\n process_ref_rewrite_evidence: string;\n success_list: string;\n remote_failed: string;\n flow_publish_version_report: string;\n report: string;\n};\n\nexport type FlowReviewedPublishRowReport = {\n entity_type: 'flow';\n id: string;\n name: string;\n original_version: string;\n publish_version: string;\n publish_policy: FlowPublishPolicy;\n version_strategy: 'keep_current' | 'bump';\n status: 'prepared' | 'inserted' | 'updated' | 'failed';\n operation?: FlowPublishSuccessRow['operation'];\n error?: unknown;\n};\n\nexport type FlowReviewedPublishProcessRowReport = {\n entity_type: 'process';\n id: string;\n name: string;\n original_version: string;\n publish_version: string;\n publish_policy: ProcessPublishPolicy;\n version_strategy: 'keep_current' | 'bump';\n status: 'prepared' | 'inserted' | 'updated' | 'skipped_existing' | 'failed';\n operation?: SupabaseJsonOrderedWriteOperation;\n error?: unknown;\n};\n\nexport type FlowReviewedPublishDataReport = {\n schema_version: 1;\n generated_at_utc: string;\n status:\n | 'prepared_flow_publish_reviewed_data'\n | 'completed_flow_publish_reviewed_data'\n | 'completed_flow_publish_reviewed_data_with_failures';\n mode: FlowPublishVersionCompatMode;\n flow_rows_file: string | null;\n process_rows_file: string | null;\n original_flow_rows_file: string | null;\n out_dir: string;\n flow_publish_policy: FlowPublishPolicy;\n process_publish_policy: ProcessPublishPolicy;\n rewrite_process_flow_refs: boolean;\n counts: {\n input_flow_rows: number;\n input_process_rows: number;\n original_flow_rows: number;\n prepared_flow_rows: number;\n prepared_process_rows: number;\n skipped_unchanged_flow_rows: number;\n rewritten_process_flow_refs: number;\n flow_publish_reports: number;\n process_publish_reports: number;\n success_count: number;\n failure_count: number;\n };\n max_workers: number;\n target_user_id_override: string | null;\n files: FlowReviewedPublishFiles;\n flow_reports: FlowReviewedPublishRowReport[];\n process_reports: FlowReviewedPublishProcessRowReport[];\n skipped_unchanged_flow_rows: SkippedUnchangedFlowRow[];\n};\n\nexport type RunFlowReviewedPublishDataOptions = {\n flowRowsFile?: string | null;\n originalFlowRowsFile?: string | null;\n processRowsFile?: string | null;\n outDir: string;\n flowPublishPolicy?: FlowPublishPolicy;\n processPublishPolicy?: ProcessPublishPolicy;\n rewriteProcessFlowRefs?: boolean;\n commit?: boolean;\n maxWorkers?: number;\n targetUserId?: string | null;\n env?: NodeJS.ProcessEnv;\n fetchImpl?: FetchLike;\n timeoutMs?: number;\n now?: Date;\n validateFlowPayloadImpl?: RunFlowPublishVersionOptions['validateFlowPayloadImpl'];\n runFlowPublishVersionImpl?: (\n options: RunFlowPublishVersionOptions,\n ) => Promise<FlowPublishVersionReport>;\n};\n\nfunction assert_input_file(\n inputFile: string,\n code: string,\n message = 'Missing required input file value.',\n): string {\n if (!inputFile) {\n throw new CliError(message, {\n code,\n exitCode: 2,\n });\n }\n\n const resolved = path.resolve(inputFile);\n if (!existsSync(resolved)) {\n throw new CliError(`Input file not found: ${resolved}`, {\n code,\n exitCode: 2,\n });\n }\n\n return resolved;\n}\n\nfunction assert_optional_input_file(\n inputFile: string | null | undefined,\n code: string,\n): string | null {\n if (!inputFile) {\n return null;\n }\n\n const resolved = path.resolve(inputFile);\n if (!existsSync(resolved)) {\n throw new CliError(`Input file not found: ${resolved}`, {\n code,\n exitCode: 2,\n });\n }\n\n return resolved;\n}\n\nfunction assert_out_dir(outDir: string): string {\n if (!outDir) {\n throw new CliError('Missing required --out-dir value.', {\n code: 'FLOW_PUBLISH_REVIEWED_OUT_DIR_REQUIRED',\n exitCode: 2,\n });\n }\n\n return path.resolve(outDir);\n}\n\nfunction clone_json<T>(value: T): T {\n if (value === undefined) {\n return value;\n }\n return JSON.parse(JSON.stringify(value)) as T;\n}\n\nfunction json_equal(left: unknown, right: unknown): boolean {\n if (left === right) {\n return true;\n }\n\n if (Array.isArray(left) || Array.isArray(right)) {\n if (!Array.isArray(left) || !Array.isArray(right) || left.length !== right.length) {\n return false;\n }\n\n return left.every((value, index) => json_equal(value, right[index]));\n }\n\n if (!isRecord(left) || !isRecord(right)) {\n return false;\n }\n\n const leftKeys = Object.keys(left).sort();\n const rightKeys = Object.keys(right).sort();\n if (leftKeys.length !== rightKeys.length) {\n return false;\n }\n\n return leftKeys.every(\n (key, index) => key === rightKeys[index] && json_equal(left[key], right[key]),\n );\n}\n\nfunction normalize_publish_policy(\n value: FlowPublishPolicy | string | undefined,\n label = '--flow-publish-policy',\n code = 'FLOW_PUBLISH_REVIEWED_POLICY_INVALID',\n): FlowPublishPolicy {\n if (value === undefined || value === '') {\n return 'append_only_bump';\n }\n\n if (value === 'skip' || value === 'append_only_bump' || value === 'upsert_current_version') {\n return value;\n }\n\n throw new CliError(\n `Expected ${label} to be one of: skip, append_only_bump, upsert_current_version.`,\n {\n code,\n exitCode: 2,\n },\n );\n}\n\nfunction bump_ilcd_version(version: string): string {\n const parts = String(version || '')\n .trim()\n .split('.');\n if (parts.length !== 3 || !parts.every((part) => /^\\d+$/u.test(part))) {\n return '01.01.001';\n }\n\n const [head, middle, tail] = parts;\n return `${Number.parseInt(head, 10).toString().padStart(head.length, '0')}.${Number.parseInt(\n middle,\n 10,\n )\n .toString()\n .padStart(middle.length, '0')}.${(Number.parseInt(tail, 10) + 1)\n .toString()\n .padStart(tail.length, '0')}`;\n}\n\nfunction set_flow_version(row: JsonRecord, newVersion: string): void {\n const payload = datasetPayloadFromRow(row);\n const dataset = isRecord(payload.flowDataSet) ? payload.flowDataSet : payload;\n const administrativeInformation = isRecord(dataset.administrativeInformation)\n ? dataset.administrativeInformation\n : {};\n if (!isRecord(dataset.administrativeInformation)) {\n dataset.administrativeInformation = administrativeInformation;\n }\n const publicationAndOwnership = isRecord(administrativeInformation.publicationAndOwnership)\n ? administrativeInformation.publicationAndOwnership\n : {};\n if (!isRecord(administrativeInformation.publicationAndOwnership)) {\n administrativeInformation.publicationAndOwnership = publicationAndOwnership;\n }\n publicationAndOwnership['common:dataSetVersion'] = newVersion;\n row.version = newVersion;\n}\n\nfunction process_dataset_from_row(row: JsonRecord): JsonRecord {\n const payload = datasetPayloadFromRow(row);\n return isRecord(payload.processDataSet) ? payload.processDataSet : payload;\n}\n\nfunction extract_process_identity(row: JsonRecord): ProcessIdentity {\n const dataset = process_dataset_from_row(row);\n const info = deepGet(dataset, ['processInformation', 'dataSetInformation'], {}) as JsonRecord;\n const id = coerceText(row.id) || coerceText(info['common:UUID']);\n const version =\n coerceText(row.version) ||\n coerceText(\n deepGet(dataset, [\n 'administrativeInformation',\n 'publicationAndOwnership',\n 'common:dataSetVersion',\n ]),\n ) ||\n '01.00.000';\n const nameBlock = deepGet(info, ['name', 'baseName']) ?? deepGet(info, ['name']) ?? info.name;\n const name = coerceText(nameBlock) || id;\n\n return {\n id,\n version,\n name,\n };\n}\n\nfunction exchange_records(processRow: JsonRecord): JsonRecord[] {\n const dataset = process_dataset_from_row(processRow);\n return listify(deepGet(dataset, ['exchanges', 'exchange'], [])).filter(isRecord);\n}\n\nfunction set_process_version(row: JsonRecord, newVersion: string): void {\n const payload = datasetPayloadFromRow(row);\n const dataset = isRecord(payload.processDataSet) ? payload.processDataSet : payload;\n const administrativeInformation = isRecord(dataset.administrativeInformation)\n ? dataset.administrativeInformation\n : {};\n if (!isRecord(dataset.administrativeInformation)) {\n dataset.administrativeInformation = administrativeInformation;\n }\n const publicationAndOwnership = isRecord(administrativeInformation.publicationAndOwnership)\n ? administrativeInformation.publicationAndOwnership\n : {};\n if (!isRecord(administrativeInformation.publicationAndOwnership)) {\n administrativeInformation.publicationAndOwnership = publicationAndOwnership;\n }\n publicationAndOwnership['common:dataSetVersion'] = newVersion;\n row.version = newVersion;\n}\n\nfunction build_flow_index(rows: JsonRecord[]): FlowIndex {\n const byUuidVersion: Record<string, FlowRecord> = {};\n\n for (const row of rows) {\n const record = extractFlowRecord(row);\n byUuidVersion[`${record.id}@${record.version}`] = record;\n }\n\n return {\n byUuidVersion,\n };\n}\n\nfunction build_local_dataset_uri(datasetKind: string, uuidValue: string, version: string): string {\n if (!uuidValue) {\n return '';\n }\n\n const folderMap: Record<string, string> = {\n flow: 'flows',\n 'flow data set': 'flows',\n };\n const folder = folderMap[datasetKind.trim().toLowerCase()] ?? 'datasets';\n const versionText = version.trim() || '01.00.000';\n return `../${folder}/${uuidValue}_${versionText}.xml`;\n}\n\nfunction preserve_short_description_shape(existing: unknown, target: JsonRecord): unknown {\n if (Array.isArray(existing)) {\n if (existing.length > 0 && isRecord(existing[0])) {\n const patched = clone_json(existing[0]);\n patched['@xml:lang'] =\n coerceText(target['@xml:lang']) || coerceText(patched['@xml:lang']) || 'en';\n patched['#text'] = coerceText(target['#text']);\n return [patched];\n }\n return [clone_json(target)];\n }\n\n if (isRecord(existing)) {\n const patched = clone_json(existing);\n patched['@xml:lang'] =\n coerceText(target['@xml:lang']) || coerceText(patched['@xml:lang']) || 'en';\n patched['#text'] = coerceText(target['#text']);\n return patched;\n }\n\n return clone_json(target);\n}\n\nfunction flow_reference_from_record(record: FlowRecord): JsonRecord {\n const targetShortDescription =\n record.shortDescription ??\n ({\n '@xml:lang': 'en',\n '#text': record.name,\n } satisfies JsonRecord);\n\n return {\n '@type': 'flow data set',\n '@refObjectId': record.id,\n '@version': record.version,\n '@uri': build_local_dataset_uri('flow data set', record.id, record.version),\n 'common:shortDescription': clone_json(targetShortDescription),\n };\n}\n\nfunction patched_flow_reference(currentRef: unknown, record: FlowRecord): JsonRecord {\n const current = isRecord(currentRef) ? clone_json(currentRef) : {};\n const target = flow_reference_from_record(record);\n\n current['@type'] = coerceText(current['@type']) || coerceText(target['@type']);\n current['@refObjectId'] = target['@refObjectId'];\n current['@version'] = target['@version'];\n current['@uri'] = target['@uri'];\n current['common:shortDescription'] = preserve_short_description_shape(\n current['common:shortDescription'],\n target['common:shortDescription'] as JsonRecord,\n );\n\n return current;\n}\n\nfunction build_output_files(outDir: string): FlowReviewedPublishFiles {\n return {\n prepared_flow_rows: path.join(outDir, 'prepared-flow-rows.json'),\n prepared_process_rows: path.join(outDir, 'prepared-process-rows.json'),\n flow_version_map: path.join(outDir, 'flow-version-map.json'),\n skipped_unchanged_flow_rows: path.join(outDir, 'skipped-unchanged-flow-rows.json'),\n process_ref_rewrite_evidence: path.join(outDir, 'process-flow-ref-rewrite-evidence.jsonl'),\n success_list: path.join(outDir, `${LEGACY_OUTPUT_PREFIX}_mcp_success_list.json`),\n remote_failed: path.join(outDir, `${LEGACY_OUTPUT_PREFIX}_remote_validation_failed.jsonl`),\n flow_publish_version_report: path.join(outDir, `${LEGACY_OUTPUT_PREFIX}_mcp_sync_report.json`),\n report: path.join(outDir, 'publish-report.json'),\n };\n}\n\nfunction status_from_mode(\n mode: FlowPublishVersionCompatMode,\n failureCount: number,\n): FlowReviewedPublishDataReport['status'] {\n if (mode === 'dry_run') {\n return 'prepared_flow_publish_reviewed_data';\n }\n\n return failureCount > 0\n ? 'completed_flow_publish_reviewed_data_with_failures'\n : 'completed_flow_publish_reviewed_data';\n}\n\nfunction prepare_flow_rows(options: {\n rows: JsonRecord[];\n policy: FlowPublishPolicy;\n originalRows: JsonRecord[];\n}): {\n preparedRows: JsonRecord[];\n plans: PreparedFlowPlan[];\n flowVersionMap: Record<string, FlowVersionMapEntry>;\n skippedUnchangedRows: SkippedUnchangedFlowRow[];\n} {\n if (options.policy === 'skip') {\n return {\n preparedRows: [],\n plans: [],\n flowVersionMap: {},\n skippedUnchangedRows: [],\n };\n }\n\n const originalMap = new Map<string, JsonRecord>();\n for (const row of options.originalRows) {\n const record = extractFlowRecord(row);\n if (record.id && record.version) {\n originalMap.set(`${record.id}@${record.version}`, row);\n }\n }\n\n const preparedRows: JsonRecord[] = [];\n const plans: PreparedFlowPlan[] = [];\n const flowVersionMap: Record<string, FlowVersionMapEntry> = {};\n const skippedUnchangedRows: SkippedUnchangedFlowRow[] = [];\n\n for (const row of options.rows) {\n const working = clone_json(row);\n const record = extractFlowRecord(working);\n const originalRow =\n record.id && record.version ? originalMap.get(`${record.id}@${record.version}`) : undefined;\n\n if (originalRow && json_equal(datasetPayloadFromRow(originalRow), datasetPayloadFromRow(row))) {\n skippedUnchangedRows.push({\n entity_type: 'flow',\n entity_id: record.id,\n entity_name: record.name,\n version: record.version,\n reason: 'unchanged_vs_original_rows_file',\n });\n continue;\n }\n\n let publishVersion = record.version;\n let versionStrategy: PreparedFlowPlan['version_strategy'] = 'keep_current';\n if (options.policy === 'append_only_bump') {\n publishVersion = bump_ilcd_version(record.version);\n set_flow_version(working, publishVersion);\n versionStrategy = 'bump';\n if (record.id && record.version) {\n flowVersionMap[`${record.id}@${record.version}`] = {\n id: record.id,\n source_version: record.version,\n target_version: publishVersion,\n };\n }\n }\n\n preparedRows.push(working);\n plans.push({\n entity_type: 'flow',\n entity_id: record.id,\n entity_name: record.name,\n original_version: record.version,\n publish_version: publishVersion,\n version_strategy: versionStrategy,\n publish_policy: options.policy,\n row: working,\n });\n }\n\n return {\n preparedRows,\n plans,\n flowVersionMap,\n skippedUnchangedRows,\n };\n}\n\nfunction prepare_process_rows(options: {\n rows: JsonRecord[];\n policy: ProcessPublishPolicy;\n rewriteRefs: boolean;\n preparedFlowRows: JsonRecord[];\n flowVersionMap: Record<string, FlowVersionMapEntry>;\n}): {\n preparedRows: JsonRecord[];\n plans: PreparedProcessPlan[];\n rewriteEvidence: ProcessFlowRefRewriteEvidence[];\n} {\n if (options.policy === 'skip') {\n return {\n preparedRows: [],\n plans: [],\n rewriteEvidence: [],\n };\n }\n\n const preparedRows = options.rows.map((row) => clone_json(row));\n const rewriteEvidence: ProcessFlowRefRewriteEvidence[] = [];\n\n if (\n options.rewriteRefs &&\n preparedRows.length > 0 &&\n options.preparedFlowRows.length > 0 &&\n Object.keys(options.flowVersionMap).length > 0\n ) {\n const targetIndex = build_flow_index(options.preparedFlowRows).byUuidVersion;\n\n for (const row of preparedRows) {\n const processIdentity = extract_process_identity(row);\n\n for (const exchange of exchange_records(row)) {\n const currentRef = isRecord(exchange.referenceToFlowDataSet)\n ? exchange.referenceToFlowDataSet\n : null;\n if (!currentRef) {\n continue;\n }\n\n const flowId = coerceText(currentRef['@refObjectId']);\n const flowVersion = coerceText(currentRef['@version']);\n const mapped = options.flowVersionMap[`${flowId}@${flowVersion}`];\n if (!mapped) {\n continue;\n }\n\n const targetRecord = targetIndex[`${mapped.id}@${mapped.target_version}`];\n if (!targetRecord) {\n continue;\n }\n\n exchange.referenceToFlowDataSet = patched_flow_reference(currentRef, targetRecord);\n rewriteEvidence.push({\n process_id: processIdentity.id,\n process_version_before_publish: processIdentity.version,\n process_name: processIdentity.name,\n exchange_internal_id: coerceText(exchange['@dataSetInternalID']),\n source_flow_id: flowId,\n source_flow_version: flowVersion,\n target_flow_id: mapped.id,\n target_flow_version: mapped.target_version,\n target_flow_name: targetRecord.name,\n });\n }\n }\n }\n\n const plans: PreparedProcessPlan[] = [];\n for (const row of preparedRows) {\n const record = extract_process_identity(row);\n let publishVersion = record.version;\n let versionStrategy: PreparedProcessPlan['version_strategy'] = 'keep_current';\n if (options.policy === 'append_only_bump') {\n publishVersion = bump_ilcd_version(record.version);\n set_process_version(row, publishVersion);\n versionStrategy = 'bump';\n }\n\n plans.push({\n entity_type: 'process',\n entity_id: record.id,\n entity_name: record.name,\n original_version: record.version,\n publish_version: publishVersion,\n version_strategy: versionStrategy,\n publish_policy: options.policy,\n row,\n });\n }\n\n return {\n preparedRows,\n plans,\n rewriteEvidence,\n };\n}\n\nfunction build_local_row_report(plan: PreparedFlowPlan): FlowReviewedPublishRowReport {\n return {\n entity_type: 'flow',\n id: plan.entity_id,\n name: plan.entity_name,\n original_version: plan.original_version,\n publish_version: plan.publish_version,\n publish_policy: plan.publish_policy,\n version_strategy: plan.version_strategy,\n status: 'prepared',\n };\n}\n\nfunction build_local_process_row_report(\n plan: PreparedProcessPlan,\n): FlowReviewedPublishProcessRowReport {\n return {\n entity_type: 'process',\n id: plan.entity_id,\n name: plan.entity_name,\n original_version: plan.original_version,\n publish_version: plan.publish_version,\n publish_policy: plan.publish_policy,\n version_strategy: plan.version_strategy,\n status: 'prepared',\n };\n}\n\nfunction process_publish_payload_from_row(row: JsonRecord): JsonRecord {\n const payload = datasetPayloadFromRow(row);\n const dataset = isRecord(payload.processDataSet) ? payload.processDataSet : payload;\n return {\n processDataSet: clone_json(dataset),\n };\n}\n\nfunction build_process_commit_success_report(\n plan: PreparedProcessPlan,\n operation: SupabaseJsonOrderedWriteOperation,\n): FlowReviewedPublishProcessRowReport {\n return {\n entity_type: 'process',\n id: plan.entity_id,\n name: plan.entity_name,\n original_version: plan.original_version,\n publish_version: plan.publish_version,\n publish_policy: plan.publish_policy,\n version_strategy: plan.version_strategy,\n status:\n operation === 'insert'\n ? 'inserted'\n : operation === 'skipped_existing'\n ? 'skipped_existing'\n : 'updated',\n operation,\n };\n}\n\nfunction build_process_commit_failure_report(\n plan: PreparedProcessPlan,\n error: unknown,\n): FlowReviewedPublishProcessRowReport {\n return {\n entity_type: 'process',\n id: plan.entity_id,\n name: plan.entity_name,\n original_version: plan.original_version,\n publish_version: plan.publish_version,\n publish_policy: plan.publish_policy,\n version_strategy: plan.version_strategy,\n status: 'failed',\n error,\n };\n}\n\nfunction normalize_process_commit_failure(error: unknown): unknown {\n if (error instanceof CliError && error.code === 'REMOTE_REQUEST_FAILED') {\n if (typeof error.details === 'string' && error.details.trim()) {\n return error.details;\n }\n\n if (error.message.startsWith('HTTP 0 returned') && isRecord(error.details)) {\n const detailMessage =\n typeof error.details.message === 'string' ? error.details.message.trim() : '';\n const normalized = detailMessage.replace(/^(?:FetchError|Error):\\s*/u, '').trim();\n if (normalized && normalized !== 'undefined') {\n return normalized;\n }\n }\n }\n\n return error instanceof Error ? error.message : error;\n}\n\nfunction build_commit_success_report(\n plan: PreparedFlowPlan,\n success: FlowPublishSuccessRow,\n): FlowReviewedPublishRowReport {\n return {\n entity_type: 'flow',\n id: plan.entity_id,\n name: plan.entity_name,\n original_version: plan.original_version,\n publish_version: plan.publish_version,\n publish_policy: plan.publish_policy,\n version_strategy: plan.version_strategy,\n status: success.operation === 'insert' ? 'inserted' : 'updated',\n operation: success.operation,\n };\n}\n\nfunction build_commit_failure_report(\n plan: PreparedFlowPlan,\n failure: FlowPublishFailureRow,\n): FlowReviewedPublishRowReport {\n return {\n entity_type: 'flow',\n id: plan.entity_id,\n name: plan.entity_name,\n original_version: plan.original_version,\n publish_version: plan.publish_version,\n publish_policy: plan.publish_policy,\n version_strategy: plan.version_strategy,\n status: 'failed',\n error: failure.reason,\n };\n}\n\nfunction build_flow_key(id: string, version: string): string | null {\n if (!id || !version) {\n return null;\n }\n return `${id}@${version}`;\n}\n\nfunction queue_by_key<T>(items: T[], keyFn: (item: T) => string | null): Map<string, T[]> {\n const queued = new Map<string, T[]>();\n\n for (const item of items) {\n const key = keyFn(item);\n if (!key) {\n continue;\n }\n const queue = queued.get(key) ?? [];\n queue.push(item);\n queued.set(key, queue);\n }\n\n return queued;\n}\n\nfunction failure_key(row: FlowPublishFailureRow): string | null {\n const record = extractFlowRecord(row as unknown as JsonRecord);\n return build_flow_key(record.id, record.version);\n}\n\nfunction success_key(row: FlowPublishSuccessRow): string | null {\n return build_flow_key(row.id, row.version);\n}\n\nfunction shift_queue<T>(queue: Map<string, T[]>, key: string | null): T | null {\n if (!key) {\n return null;\n }\n\n const items = queue.get(key);\n if (!items?.length) {\n return null;\n }\n\n const [first, ...rest] = items;\n if (rest.length) {\n queue.set(key, rest);\n } else {\n queue.delete(key);\n }\n return first ?? null;\n}\n\nasync function map_with_concurrency<T, R>(\n items: T[],\n maxWorkers: number,\n worker: (item: T, index: number) => Promise<R>,\n): Promise<R[]> {\n const results = new Array<R>(items.length);\n const workerCount = Math.min(Math.max(1, maxWorkers), Math.max(items.length, 1));\n let nextIndex = 0;\n\n async function runWorker(): Promise<void> {\n while (true) {\n const currentIndex = nextIndex;\n nextIndex += 1;\n if (currentIndex >= items.length) {\n return;\n }\n results[currentIndex] = await worker(items[currentIndex] as T, currentIndex);\n }\n }\n\n await Promise.all(Array.from({ length: workerCount }, () => runWorker()));\n return results;\n}\n\nfunction map_commit_reports(\n plans: PreparedFlowPlan[],\n successes: FlowPublishSuccessRow[],\n failures: FlowPublishFailureRow[],\n): FlowReviewedPublishRowReport[] {\n const successQueue = queue_by_key(successes, success_key);\n const failureQueue = queue_by_key(failures, failure_key);\n const unkeyedFailures = failures.filter((failure) => failure_key(failure) === null);\n\n return plans.map((plan) => {\n const key = build_flow_key(plan.entity_id, plan.publish_version);\n const success = shift_queue(successQueue, key);\n if (success) {\n return build_commit_success_report(plan, success);\n }\n\n const failure =\n shift_queue(failureQueue, key) ?? (key ? null : (unkeyedFailures.shift() ?? null));\n if (failure) {\n return build_commit_failure_report(plan, failure);\n }\n\n return {\n ...build_local_row_report(plan),\n status: 'failed',\n error: [\n {\n code: 'UNMATCHED_PUBLISH_RESULT',\n message: 'Publish result was missing for prepared flow row.',\n },\n ],\n };\n });\n}\n\nfunction build_compat_report(options: {\n now: Date;\n mode: FlowPublishVersionCompatMode;\n preparedRows: number;\n successCount: number;\n failureCount: number;\n maxWorkers: number;\n targetUserId: string | null;\n files: FlowReviewedPublishFiles;\n}): FlowPublishVersionReport {\n const ruleset = getRuntimeRuleset('flow-publish/default');\n let status: FlowPublishVersionReport['status'];\n if (options.mode === 'dry_run') {\n status = 'prepared_flow_publish_version';\n } else {\n status =\n options.failureCount > 0\n ? 'completed_flow_publish_version_with_failures'\n : 'completed_flow_publish_version';\n }\n\n return {\n schema_version: 1,\n generated_at_utc: options.now.toISOString(),\n status,\n mode: options.mode,\n input_file: options.files.prepared_flow_rows,\n out_dir: path.dirname(options.files.report),\n counts: {\n total_rows: options.preparedRows,\n success_count: options.successCount,\n failure_count: options.failureCount,\n },\n flow_gate: {\n status: 'passed',\n ruleset_id: ruleset.id,\n ruleset_version: ruleset.version,\n counts: {\n total: options.preparedRows,\n valid: options.preparedRows,\n invalid: 0,\n },\n blocker_count: 0,\n next_action: 'query_remote_write_plan',\n },\n operation_counts: {},\n max_workers: options.maxWorkers,\n limit: null,\n target_user_id_override: options.targetUserId,\n files: {\n success_list: options.files.success_list,\n remote_failed: options.files.remote_failed,\n gate_report: options.files.flow_publish_version_report,\n report: options.files.flow_publish_version_report,\n },\n };\n}\n\nasync function commit_process_plans(options: {\n plans: PreparedProcessPlan[];\n maxWorkers: number;\n env: NodeJS.ProcessEnv;\n fetchImpl: FetchLike;\n timeoutMs?: number;\n}): Promise<FlowReviewedPublishProcessRowReport[]> {\n return map_with_concurrency(options.plans, options.maxWorkers, async (plan) => {\n try {\n const result = await syncSupabaseJsonOrderedRecord({\n table: 'processes',\n id: plan.entity_id,\n version: plan.publish_version,\n payload: process_publish_payload_from_row(plan.row),\n writeMode:\n plan.publish_policy === 'append_only_bump'\n ? 'append_only_insert'\n : 'upsert_current_version',\n env: options.env,\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n });\n return build_process_commit_success_report(plan, result.operation);\n } catch (error) {\n return build_process_commit_failure_report(plan, normalize_process_commit_failure(error));\n }\n });\n}\n\nexport async function runFlowReviewedPublishData(\n options: RunFlowReviewedPublishDataOptions,\n): Promise<FlowReviewedPublishDataReport> {\n const flowRowsFile = assert_optional_input_file(\n options.flowRowsFile,\n 'FLOW_PUBLISH_REVIEWED_FLOW_ROWS_NOT_FOUND',\n );\n const processRowsFile = assert_optional_input_file(\n options.processRowsFile,\n 'FLOW_PUBLISH_REVIEWED_PROCESS_ROWS_NOT_FOUND',\n );\n if (!flowRowsFile && !processRowsFile) {\n throw new CliError('Provide at least one of --flow-rows-file or --process-rows-file.', {\n code: 'FLOW_PUBLISH_REVIEWED_INPUT_REQUIRED',\n exitCode: 2,\n });\n }\n const originalFlowRowsFile = assert_optional_input_file(\n options.originalFlowRowsFile,\n 'FLOW_PUBLISH_REVIEWED_ORIGINAL_ROWS_NOT_FOUND',\n );\n const outDir = assert_out_dir(options.outDir);\n const flowPublishPolicy = normalize_publish_policy(options.flowPublishPolicy);\n const processPublishPolicy = normalize_publish_policy(\n options.processPublishPolicy,\n '--process-publish-policy',\n 'FLOW_PUBLISH_REVIEWED_PROCESS_POLICY_INVALID',\n );\n const rewriteProcessFlowRefs = options.rewriteProcessFlowRefs !== false;\n const mode: FlowPublishVersionCompatMode = options.commit ? 'commit' : 'dry_run';\n const maxWorkers = options.maxWorkers ?? DEFAULT_MAX_WORKERS;\n const targetUserId =\n typeof options.targetUserId === 'string' && options.targetUserId.trim()\n ? options.targetUserId.trim()\n : null;\n const now = options.now ?? new Date();\n const files = build_output_files(outDir);\n const inputFlowRows = flowRowsFile ? loadRowsFromFile(flowRowsFile) : [];\n const originalFlowRows = originalFlowRowsFile ? loadRowsFromFile(originalFlowRowsFile) : [];\n const inputProcessRows = processRowsFile ? loadRowsFromFile(processRowsFile) : [];\n const prepared = prepare_flow_rows({\n rows: inputFlowRows,\n policy: flowPublishPolicy,\n originalRows: originalFlowRows,\n });\n const preparedProcesses = prepare_process_rows({\n rows: inputProcessRows,\n policy: processPublishPolicy,\n rewriteRefs: rewriteProcessFlowRefs,\n preparedFlowRows: prepared.preparedRows,\n flowVersionMap: prepared.flowVersionMap,\n });\n\n writeJsonArtifact(files.prepared_flow_rows, prepared.preparedRows);\n writeJsonArtifact(files.prepared_process_rows, preparedProcesses.preparedRows);\n writeJsonArtifact(files.flow_version_map, prepared.flowVersionMap);\n writeJsonArtifact(files.skipped_unchanged_flow_rows, prepared.skippedUnchangedRows);\n writeJsonLinesArtifact(files.process_ref_rewrite_evidence, preparedProcesses.rewriteEvidence);\n\n let flowReports = prepared.plans.map(build_local_row_report);\n let processReports = preparedProcesses.plans.map(build_local_process_row_report);\n\n if (options.commit && prepared.preparedRows.length > 0) {\n const publishImpl = options.runFlowPublishVersionImpl ?? runFlowPublishVersion;\n await publishImpl({\n inputFile: files.prepared_flow_rows,\n outDir,\n commit: true,\n maxWorkers,\n targetUserId,\n env: options.env,\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n now,\n validateFlowPayloadImpl: options.validateFlowPayloadImpl,\n });\n\n const successRows = loadRowsFromFile(files.success_list) as FlowPublishSuccessRow[];\n const failureRows = loadRowsFromFile(files.remote_failed) as FlowPublishFailureRow[];\n flowReports = map_commit_reports(prepared.plans, successRows, failureRows);\n } else {\n writeJsonArtifact(files.success_list, []);\n writeJsonLinesArtifact(files.remote_failed, []);\n const compatReport = build_compat_report({\n now,\n mode,\n preparedRows: prepared.preparedRows.length,\n successCount: 0,\n failureCount: 0,\n maxWorkers,\n targetUserId,\n files,\n });\n writeJsonArtifact(files.flow_publish_version_report, compatReport);\n }\n\n if (options.commit && preparedProcesses.preparedRows.length > 0) {\n if (!options.fetchImpl) {\n throw new CliError(\n 'Process commit requires a fetch implementation in flow publish-reviewed-data.',\n {\n code: 'FLOW_PUBLISH_REVIEWED_PROCESS_FETCH_REQUIRED',\n exitCode: 2,\n },\n );\n }\n\n const runtimeEnv = options.env;\n if (!runtimeEnv || !hasSupabaseRestRuntime(runtimeEnv)) {\n throw new CliError(\n 'Process commit requires TIANGONG_LCA_API_BASE_URL, TIANGONG_LCA_SUPABASE_PUBLISHABLE_KEY, and an OAuth or explicit access-token session.',\n {\n code: 'FLOW_PUBLISH_REVIEWED_PROCESS_RUNTIME_REQUIRED',\n exitCode: 2,\n },\n );\n }\n\n processReports = await commit_process_plans({\n plans: preparedProcesses.plans,\n maxWorkers,\n env: runtimeEnv,\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n });\n }\n\n const successCount =\n flowReports.filter((report) => report.status === 'inserted' || report.status === 'updated')\n .length +\n processReports.filter(\n (report) =>\n report.status === 'inserted' ||\n report.status === 'updated' ||\n report.status === 'skipped_existing',\n ).length;\n const failureCount =\n flowReports.filter((report) => report.status === 'failed').length +\n processReports.filter((report) => report.status === 'failed').length;\n\n const report: FlowReviewedPublishDataReport = {\n schema_version: 1,\n generated_at_utc: now.toISOString(),\n status: status_from_mode(mode, failureCount),\n mode,\n flow_rows_file: flowRowsFile,\n process_rows_file: processRowsFile,\n original_flow_rows_file: originalFlowRowsFile,\n out_dir: outDir,\n flow_publish_policy: flowPublishPolicy,\n process_publish_policy: processPublishPolicy,\n rewrite_process_flow_refs: rewriteProcessFlowRefs,\n counts: {\n input_flow_rows: inputFlowRows.length,\n input_process_rows: inputProcessRows.length,\n original_flow_rows: originalFlowRows.length,\n prepared_flow_rows: prepared.preparedRows.length,\n prepared_process_rows: preparedProcesses.preparedRows.length,\n skipped_unchanged_flow_rows: prepared.skippedUnchangedRows.length,\n rewritten_process_flow_refs: preparedProcesses.rewriteEvidence.length,\n flow_publish_reports: flowReports.length,\n process_publish_reports: processReports.length,\n success_count: successCount,\n failure_count: failureCount,\n },\n max_workers: maxWorkers,\n target_user_id_override: targetUserId,\n files,\n flow_reports: flowReports,\n process_reports: processReports,\n skipped_unchanged_flow_rows: prepared.skippedUnchangedRows,\n };\n\n writeJsonArtifact(files.report, report);\n return report;\n}\n\nexport const __testInternals = {\n assert_input_file,\n assert_optional_input_file,\n assert_out_dir,\n clone_json,\n json_equal,\n normalize_publish_policy,\n bump_ilcd_version,\n set_flow_version,\n process_dataset_from_row,\n extract_process_identity,\n exchange_records,\n set_process_version,\n build_flow_index,\n build_local_dataset_uri,\n preserve_short_description_shape,\n flow_reference_from_record,\n patched_flow_reference,\n build_output_files,\n status_from_mode,\n prepare_flow_rows,\n prepare_process_rows,\n build_compat_report,\n map_commit_reports,\n shift_queue,\n process_publish_payload_from_row,\n build_process_commit_success_report,\n build_process_commit_failure_report,\n normalize_process_commit_failure,\n map_with_concurrency,\n commit_process_plans,\n};\n"]}
|