@tiangong-lca/cli 0.1.7 → 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 +20 -11
- package/dist/src/cli.js +31 -17
- package/dist/src/cli.js.map +1 -1
- 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/env.d.ts +9 -0
- package/dist/src/lib/env.js +72 -5
- package/dist/src/lib/env.js.map +1 -1
- package/dist/src/lib/lifecyclemodel-resulting-process.js +3 -1
- package/dist/src/lib/lifecyclemodel-resulting-process.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/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 +3 -1
- package/dist/src/lib/supabase-client.js +11 -1
- 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/package.json +1 -1
|
@@ -11,6 +11,7 @@ export type DatasetCommandTransport = {
|
|
|
11
11
|
};
|
|
12
12
|
declare function readOptionalRuleVerification(extraData?: JsonObject): boolean | null | undefined;
|
|
13
13
|
declare function readOptionalModelId(extraData: JsonObject | undefined, allowNull: boolean): string | null | undefined;
|
|
14
|
+
declare function readOptionalModelVersion(extraData: JsonObject | undefined): string | null | undefined;
|
|
14
15
|
export declare function deriveSupabaseFunctionsBaseUrl(apiBaseUrl: string): string;
|
|
15
16
|
export declare function buildDatasetCommandTransport(options: {
|
|
16
17
|
runtime: SupabaseDataRuntime;
|
|
@@ -48,6 +49,7 @@ export declare function deleteDatasetRecord(options: {
|
|
|
48
49
|
export declare const __testInternals: {
|
|
49
50
|
deriveSupabaseFunctionsBaseUrl: typeof deriveSupabaseFunctionsBaseUrl;
|
|
50
51
|
readOptionalModelId: typeof readOptionalModelId;
|
|
52
|
+
readOptionalModelVersion: typeof readOptionalModelVersion;
|
|
51
53
|
readOptionalRuleVerification: typeof readOptionalRuleVerification;
|
|
52
54
|
};
|
|
53
55
|
export {};
|
|
@@ -45,6 +45,17 @@ function readOptionalModelId(extraData, allowNull) {
|
|
|
45
45
|
}
|
|
46
46
|
return undefined;
|
|
47
47
|
}
|
|
48
|
+
function readOptionalModelVersion(extraData) {
|
|
49
|
+
if (!extraData) {
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
const value = extraData.modelVersion ?? extraData.model_version;
|
|
53
|
+
const trimmed = trimToken(value);
|
|
54
|
+
if (trimmed) {
|
|
55
|
+
return trimmed;
|
|
56
|
+
}
|
|
57
|
+
return value === null ? null : undefined;
|
|
58
|
+
}
|
|
48
59
|
function requireCommandSuccessPayload(payload, url) {
|
|
49
60
|
const normalized = requireRemoteOkPayload(payload, url);
|
|
50
61
|
if (!isRecord(normalized) || normalized.ok !== true) {
|
|
@@ -111,6 +122,10 @@ export async function createDatasetRecord(options) {
|
|
|
111
122
|
if (modelId !== undefined) {
|
|
112
123
|
body.modelId = modelId;
|
|
113
124
|
}
|
|
125
|
+
const modelVersion = readOptionalModelVersion(options.extraData);
|
|
126
|
+
if (modelVersion !== undefined) {
|
|
127
|
+
body.modelVersion = modelVersion;
|
|
128
|
+
}
|
|
114
129
|
const ruleVerification = readOptionalRuleVerification(options.extraData);
|
|
115
130
|
if (ruleVerification !== undefined) {
|
|
116
131
|
body.ruleVerification = ruleVerification;
|
|
@@ -133,6 +148,10 @@ export async function saveDraftDatasetRecord(options) {
|
|
|
133
148
|
if (modelId !== undefined) {
|
|
134
149
|
body.modelId = modelId;
|
|
135
150
|
}
|
|
151
|
+
const modelVersion = readOptionalModelVersion(options.extraData);
|
|
152
|
+
if (modelVersion !== undefined) {
|
|
153
|
+
body.modelVersion = modelVersion;
|
|
154
|
+
}
|
|
136
155
|
const ruleVerification = readOptionalRuleVerification(options.extraData);
|
|
137
156
|
if (ruleVerification !== undefined) {
|
|
138
157
|
body.ruleVerification = ruleVerification;
|
|
@@ -158,6 +177,7 @@ export async function deleteDatasetRecord(options) {
|
|
|
158
177
|
export const __testInternals = {
|
|
159
178
|
deriveSupabaseFunctionsBaseUrl,
|
|
160
179
|
readOptionalModelId,
|
|
180
|
+
readOptionalModelVersion,
|
|
161
181
|
readOptionalRuleVerification,
|
|
162
182
|
};
|
|
163
183
|
//# sourceMappingURL=dataset-command.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataset-command.js","sourceRoot":"","sources":["../../../src/lib/dataset-command.ts"],"names":[],"mappings":"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","sourcesContent":["import { CliError } from './errors.js';\nimport type { FetchLike } from './http.js';\nimport { postJson, requireRemoteOkPayload } from './http.js';\nimport {\n buildSupabaseAuthHeaders,\n deriveSupabaseProjectBaseUrl,\n requireSupabaseRestRuntime,\n type SupabaseDataRuntime,\n} from './supabase-client.js';\nimport { createSupabaseDataRuntime } from './supabase-session.js';\n\ntype JsonObject = Record<string, unknown>;\n\nexport type DatasetCommandTable =\n | 'contacts'\n | 'sources'\n | 'unitgroups'\n | 'flowproperties'\n | 'flows'\n | 'processes'\n | 'lifecyclemodels';\n\nexport type DatasetCommandTransport = {\n functionsBaseUrl: string;\n publishableKey: string;\n accessToken: string;\n fetchImpl: FetchLike;\n timeoutMs: number;\n};\n\nfunction isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction trimToken(value: unknown): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n\n const trimmed = value.trim();\n return trimmed ? trimmed : null;\n}\n\nfunction readOptionalRuleVerification(extraData?: JsonObject): boolean | null | undefined {\n if (!extraData) {\n return undefined;\n }\n\n if ('ruleVerification' in extraData) {\n const value = extraData.ruleVerification;\n if (typeof value === 'boolean' || value === null) {\n return value;\n }\n return undefined;\n }\n\n if ('rule_verification' in extraData) {\n const value = extraData.rule_verification;\n if (typeof value === 'boolean' || value === null) {\n return value;\n }\n }\n\n return undefined;\n}\n\nfunction readOptionalModelId(\n extraData: JsonObject | undefined,\n allowNull: boolean,\n): string | null | undefined {\n if (!extraData) {\n return undefined;\n }\n\n const value = extraData.modelId ?? extraData.model_id;\n const trimmed = trimToken(value);\n if (trimmed) {\n return trimmed;\n }\n\n if (allowNull && value === null) {\n return null;\n }\n\n return undefined;\n}\n\nfunction requireCommandSuccessPayload(payload: unknown, url: string): JsonObject {\n const normalized = requireRemoteOkPayload(payload, url);\n if (!isRecord(normalized) || normalized.ok !== true) {\n throw new CliError(`Dataset command returned an unexpected payload for ${url}`, {\n code: 'REMOTE_RESPONSE_INVALID',\n exitCode: 1,\n details: normalized,\n });\n }\n\n return normalized;\n}\n\nasync function invokeDatasetCommand(options: {\n transport: DatasetCommandTransport;\n commandName: 'app_dataset_create' | 'app_dataset_save_draft' | 'app_dataset_delete';\n body: JsonObject;\n beforeDispatch?: () => void;\n}): Promise<JsonObject> {\n const url = `${options.transport.functionsBaseUrl}/${options.commandName}`;\n try {\n options.beforeDispatch?.();\n } catch {\n throw new CliError('Dataset command was blocked before request dispatch.', {\n code: 'DATASET_COMMAND_BEFORE_DISPATCH_FAILED',\n exitCode: 1,\n });\n }\n return requireCommandSuccessPayload(\n await postJson({\n url,\n headers: {\n ...buildSupabaseAuthHeaders(\n options.transport.publishableKey,\n options.transport.accessToken,\n ),\n 'Content-Type': 'application/json',\n },\n body: options.body,\n timeoutMs: options.transport.timeoutMs,\n fetchImpl: options.transport.fetchImpl,\n }),\n url,\n );\n}\n\nexport function deriveSupabaseFunctionsBaseUrl(apiBaseUrl: string): string {\n return `${deriveSupabaseProjectBaseUrl(apiBaseUrl)}/functions/v1`;\n}\n\nexport async function buildDatasetCommandTransport(options: {\n runtime: SupabaseDataRuntime;\n fetchImpl: FetchLike;\n timeoutMs: number;\n}): Promise<DatasetCommandTransport> {\n return {\n functionsBaseUrl: deriveSupabaseFunctionsBaseUrl(options.runtime.apiBaseUrl),\n publishableKey: options.runtime.publishableKey,\n accessToken: await options.runtime.getAccessToken(),\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n };\n}\n\nexport async function resolveDatasetCommandTransport(options: {\n env: NodeJS.ProcessEnv;\n fetchImpl: FetchLike;\n timeoutMs: number;\n}): Promise<DatasetCommandTransport> {\n return buildDatasetCommandTransport({\n runtime: createSupabaseDataRuntime({\n runtime: requireSupabaseRestRuntime(options.env),\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n }),\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n });\n}\n\nexport async function createDatasetRecord(options: {\n transport: DatasetCommandTransport;\n table: DatasetCommandTable;\n id: string;\n payload: JsonObject;\n extraData?: JsonObject;\n beforeDispatch?: () => void;\n}): Promise<JsonObject> {\n const body: JsonObject = {\n table: options.table,\n id: options.id,\n jsonOrdered: options.payload,\n };\n const modelId = readOptionalModelId(options.extraData, true);\n if (modelId !== undefined) {\n body.modelId = modelId;\n }\n const ruleVerification = readOptionalRuleVerification(options.extraData);\n if (ruleVerification !== undefined) {\n body.ruleVerification = ruleVerification;\n }\n\n return invokeDatasetCommand({\n transport: options.transport,\n commandName: 'app_dataset_create',\n body,\n beforeDispatch: options.beforeDispatch,\n });\n}\n\nexport async function saveDraftDatasetRecord(options: {\n transport: DatasetCommandTransport;\n table: DatasetCommandTable;\n id: string;\n version: string;\n payload: JsonObject;\n extraData?: JsonObject;\n beforeDispatch?: () => void;\n}): Promise<JsonObject> {\n const body: JsonObject = {\n table: options.table,\n id: options.id,\n version: options.version,\n jsonOrdered: options.payload,\n };\n const modelId = readOptionalModelId(options.extraData, false);\n if (modelId !== undefined) {\n body.modelId = modelId;\n }\n const ruleVerification = readOptionalRuleVerification(options.extraData);\n if (ruleVerification !== undefined) {\n body.ruleVerification = ruleVerification;\n }\n\n return invokeDatasetCommand({\n transport: options.transport,\n commandName: 'app_dataset_save_draft',\n body,\n beforeDispatch: options.beforeDispatch,\n });\n}\n\nexport async function deleteDatasetRecord(options: {\n transport: DatasetCommandTransport;\n table: DatasetCommandTable;\n id: string;\n version: string;\n}): Promise<JsonObject> {\n return invokeDatasetCommand({\n transport: options.transport,\n commandName: 'app_dataset_delete',\n body: {\n table: options.table,\n id: options.id,\n version: options.version,\n },\n });\n}\n\nexport const __testInternals = {\n deriveSupabaseFunctionsBaseUrl,\n readOptionalModelId,\n readOptionalRuleVerification,\n};\n"]}
|
|
1
|
+
{"version":3,"file":"dataset-command.js","sourceRoot":"","sources":["../../../src/lib/dataset-command.ts"],"names":[],"mappings":"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","sourcesContent":["import { CliError } from './errors.js';\nimport type { FetchLike } from './http.js';\nimport { postJson, requireRemoteOkPayload } from './http.js';\nimport {\n buildSupabaseAuthHeaders,\n deriveSupabaseProjectBaseUrl,\n requireSupabaseRestRuntime,\n type SupabaseDataRuntime,\n} from './supabase-client.js';\nimport { createSupabaseDataRuntime } from './supabase-session.js';\n\ntype JsonObject = Record<string, unknown>;\n\nexport type DatasetCommandTable =\n | 'contacts'\n | 'sources'\n | 'unitgroups'\n | 'flowproperties'\n | 'flows'\n | 'processes'\n | 'lifecyclemodels';\n\nexport type DatasetCommandTransport = {\n functionsBaseUrl: string;\n publishableKey: string;\n accessToken: string;\n fetchImpl: FetchLike;\n timeoutMs: number;\n};\n\nfunction isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction trimToken(value: unknown): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n\n const trimmed = value.trim();\n return trimmed ? trimmed : null;\n}\n\nfunction readOptionalRuleVerification(extraData?: JsonObject): boolean | null | undefined {\n if (!extraData) {\n return undefined;\n }\n\n if ('ruleVerification' in extraData) {\n const value = extraData.ruleVerification;\n if (typeof value === 'boolean' || value === null) {\n return value;\n }\n return undefined;\n }\n\n if ('rule_verification' in extraData) {\n const value = extraData.rule_verification;\n if (typeof value === 'boolean' || value === null) {\n return value;\n }\n }\n\n return undefined;\n}\n\nfunction readOptionalModelId(\n extraData: JsonObject | undefined,\n allowNull: boolean,\n): string | null | undefined {\n if (!extraData) {\n return undefined;\n }\n\n const value = extraData.modelId ?? extraData.model_id;\n const trimmed = trimToken(value);\n if (trimmed) {\n return trimmed;\n }\n\n if (allowNull && value === null) {\n return null;\n }\n\n return undefined;\n}\n\nfunction readOptionalModelVersion(extraData: JsonObject | undefined): string | null | undefined {\n if (!extraData) {\n return undefined;\n }\n\n const value = extraData.modelVersion ?? extraData.model_version;\n const trimmed = trimToken(value);\n if (trimmed) {\n return trimmed;\n }\n\n return value === null ? null : undefined;\n}\n\nfunction requireCommandSuccessPayload(payload: unknown, url: string): JsonObject {\n const normalized = requireRemoteOkPayload(payload, url);\n if (!isRecord(normalized) || normalized.ok !== true) {\n throw new CliError(`Dataset command returned an unexpected payload for ${url}`, {\n code: 'REMOTE_RESPONSE_INVALID',\n exitCode: 1,\n details: normalized,\n });\n }\n\n return normalized;\n}\n\nasync function invokeDatasetCommand(options: {\n transport: DatasetCommandTransport;\n commandName: 'app_dataset_create' | 'app_dataset_save_draft' | 'app_dataset_delete';\n body: JsonObject;\n beforeDispatch?: () => void;\n}): Promise<JsonObject> {\n const url = `${options.transport.functionsBaseUrl}/${options.commandName}`;\n try {\n options.beforeDispatch?.();\n } catch {\n throw new CliError('Dataset command was blocked before request dispatch.', {\n code: 'DATASET_COMMAND_BEFORE_DISPATCH_FAILED',\n exitCode: 1,\n });\n }\n return requireCommandSuccessPayload(\n await postJson({\n url,\n headers: {\n ...buildSupabaseAuthHeaders(\n options.transport.publishableKey,\n options.transport.accessToken,\n ),\n 'Content-Type': 'application/json',\n },\n body: options.body,\n timeoutMs: options.transport.timeoutMs,\n fetchImpl: options.transport.fetchImpl,\n }),\n url,\n );\n}\n\nexport function deriveSupabaseFunctionsBaseUrl(apiBaseUrl: string): string {\n return `${deriveSupabaseProjectBaseUrl(apiBaseUrl)}/functions/v1`;\n}\n\nexport async function buildDatasetCommandTransport(options: {\n runtime: SupabaseDataRuntime;\n fetchImpl: FetchLike;\n timeoutMs: number;\n}): Promise<DatasetCommandTransport> {\n return {\n functionsBaseUrl: deriveSupabaseFunctionsBaseUrl(options.runtime.apiBaseUrl),\n publishableKey: options.runtime.publishableKey,\n accessToken: await options.runtime.getAccessToken(),\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n };\n}\n\nexport async function resolveDatasetCommandTransport(options: {\n env: NodeJS.ProcessEnv;\n fetchImpl: FetchLike;\n timeoutMs: number;\n}): Promise<DatasetCommandTransport> {\n return buildDatasetCommandTransport({\n runtime: createSupabaseDataRuntime({\n runtime: requireSupabaseRestRuntime(options.env),\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n }),\n fetchImpl: options.fetchImpl,\n timeoutMs: options.timeoutMs,\n });\n}\n\nexport async function createDatasetRecord(options: {\n transport: DatasetCommandTransport;\n table: DatasetCommandTable;\n id: string;\n payload: JsonObject;\n extraData?: JsonObject;\n beforeDispatch?: () => void;\n}): Promise<JsonObject> {\n const body: JsonObject = {\n table: options.table,\n id: options.id,\n jsonOrdered: options.payload,\n };\n const modelId = readOptionalModelId(options.extraData, true);\n if (modelId !== undefined) {\n body.modelId = modelId;\n }\n const modelVersion = readOptionalModelVersion(options.extraData);\n if (modelVersion !== undefined) {\n body.modelVersion = modelVersion;\n }\n const ruleVerification = readOptionalRuleVerification(options.extraData);\n if (ruleVerification !== undefined) {\n body.ruleVerification = ruleVerification;\n }\n\n return invokeDatasetCommand({\n transport: options.transport,\n commandName: 'app_dataset_create',\n body,\n beforeDispatch: options.beforeDispatch,\n });\n}\n\nexport async function saveDraftDatasetRecord(options: {\n transport: DatasetCommandTransport;\n table: DatasetCommandTable;\n id: string;\n version: string;\n payload: JsonObject;\n extraData?: JsonObject;\n beforeDispatch?: () => void;\n}): Promise<JsonObject> {\n const body: JsonObject = {\n table: options.table,\n id: options.id,\n version: options.version,\n jsonOrdered: options.payload,\n };\n const modelId = readOptionalModelId(options.extraData, false);\n if (modelId !== undefined) {\n body.modelId = modelId;\n }\n const modelVersion = readOptionalModelVersion(options.extraData);\n if (modelVersion !== undefined) {\n body.modelVersion = modelVersion;\n }\n const ruleVerification = readOptionalRuleVerification(options.extraData);\n if (ruleVerification !== undefined) {\n body.ruleVerification = ruleVerification;\n }\n\n return invokeDatasetCommand({\n transport: options.transport,\n commandName: 'app_dataset_save_draft',\n body,\n beforeDispatch: options.beforeDispatch,\n });\n}\n\nexport async function deleteDatasetRecord(options: {\n transport: DatasetCommandTransport;\n table: DatasetCommandTable;\n id: string;\n version: string;\n}): Promise<JsonObject> {\n return invokeDatasetCommand({\n transport: options.transport,\n commandName: 'app_dataset_delete',\n body: {\n table: options.table,\n id: options.id,\n version: options.version,\n },\n });\n}\n\nexport const __testInternals = {\n deriveSupabaseFunctionsBaseUrl,\n readOptionalModelId,\n readOptionalModelVersion,\n readOptionalRuleVerification,\n};\n"]}
|
package/dist/src/lib/env.d.ts
CHANGED
|
@@ -22,6 +22,15 @@ export declare const ENV_KEYS: {
|
|
|
22
22
|
readonly disableSessionCache: 'TIANGONG_LCA_DISABLE_SESSION_CACHE';
|
|
23
23
|
readonly forceReauth: 'TIANGONG_LCA_FORCE_REAUTH';
|
|
24
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;
|
|
25
34
|
export declare const ENV_SPECS: EnvSpec[];
|
|
26
35
|
export type DoctorCheck = {
|
|
27
36
|
key: string;
|
package/dist/src/lib/env.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
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
4
|
authMode: 'TIANGONG_LCA_AUTH_MODE',
|
|
@@ -10,6 +11,69 @@ export const ENV_KEYS = {
|
|
|
10
11
|
disableSessionCache: 'TIANGONG_LCA_DISABLE_SESSION_CACHE',
|
|
11
12
|
forceReauth: 'TIANGONG_LCA_FORCE_REAUTH',
|
|
12
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
|
+
}
|
|
13
77
|
export const ENV_SPECS = [
|
|
14
78
|
{
|
|
15
79
|
key: ENV_KEYS.apiBaseUrl,
|
|
@@ -20,7 +84,7 @@ export const ENV_SPECS = [
|
|
|
20
84
|
key: ENV_KEYS.region,
|
|
21
85
|
required: false,
|
|
22
86
|
description: 'Target TianGong LCA API region',
|
|
23
|
-
defaultValue:
|
|
87
|
+
defaultValue: OFFICIAL_PRODUCTION_PROFILE.region,
|
|
24
88
|
},
|
|
25
89
|
{
|
|
26
90
|
key: ENV_KEYS.supabasePublishableKey,
|
|
@@ -81,7 +145,7 @@ function parseBooleanEnv(value) {
|
|
|
81
145
|
}
|
|
82
146
|
export function resolveEnv(spec, env) {
|
|
83
147
|
const envValue = env[spec.key];
|
|
84
|
-
if (envValue) {
|
|
148
|
+
if (envValue && (!Object.hasOwn(PRODUCTION_ENV_DEFAULTS, spec.key) || runtimeToken(envValue))) {
|
|
85
149
|
return {
|
|
86
150
|
key: spec.key,
|
|
87
151
|
source: 'env',
|
|
@@ -89,11 +153,13 @@ export function resolveEnv(spec, env) {
|
|
|
89
153
|
present: true,
|
|
90
154
|
};
|
|
91
155
|
}
|
|
92
|
-
|
|
156
|
+
const defaults = productionDefaults(env);
|
|
157
|
+
const defaultValue = spec.defaultValue ?? (Object.hasOwn(defaults, spec.key) ? defaults[spec.key] : undefined);
|
|
158
|
+
if (defaultValue !== undefined) {
|
|
93
159
|
return {
|
|
94
160
|
key: spec.key,
|
|
95
161
|
source: 'default',
|
|
96
|
-
value:
|
|
162
|
+
value: defaultValue,
|
|
97
163
|
present: true,
|
|
98
164
|
};
|
|
99
165
|
}
|
|
@@ -150,7 +216,8 @@ export function buildDoctorReport(env, dotEnvStatus) {
|
|
|
150
216
|
};
|
|
151
217
|
});
|
|
152
218
|
return {
|
|
153
|
-
ok:
|
|
219
|
+
ok: !hasProductionProfileMismatch(env) &&
|
|
220
|
+
checks.every((check) => !check.required || check.present) &&
|
|
154
221
|
[ENV_KEYS.oauthClientId, ENV_KEYS.accessToken].some((key) => checks.find((check) => check.key === key)?.present),
|
|
155
222
|
loadedDotEnv: dotEnvStatus.loaded,
|
|
156
223
|
dotEnvPath: dotEnvStatus.path,
|
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 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.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 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) {\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 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 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"]}
|
|
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"]}
|
|
@@ -4,6 +4,7 @@ import path from 'node:path';
|
|
|
4
4
|
import { fileURLToPath } from 'node:url';
|
|
5
5
|
import { writeJsonArtifact } from './artifacts.js';
|
|
6
6
|
import { CliError } from './errors.js';
|
|
7
|
+
import { resolveProductionRuntimeEnv } from './env.js';
|
|
7
8
|
import { readJsonInput } from './io.js';
|
|
8
9
|
import { buildRunId, resolveRunLayout } from './run.js';
|
|
9
10
|
import { fetchExactOrLatestProcessRow, normalizeSupabaseProcessPayload, requireSupabaseRestRuntime, } from './supabase-rest.js';
|
|
@@ -52,7 +53,8 @@ function sha256Text(text) {
|
|
|
52
53
|
function nowIso(now = new Date()) {
|
|
53
54
|
return now.toISOString();
|
|
54
55
|
}
|
|
55
|
-
function requireRemoteProcessLookupRuntime(
|
|
56
|
+
function requireRemoteProcessLookupRuntime(configuredEnv) {
|
|
57
|
+
const env = resolveProductionRuntimeEnv(configuredEnv);
|
|
56
58
|
const missing = [];
|
|
57
59
|
if (typeof env.TIANGONG_LCA_API_BASE_URL !== 'string' || !env.TIANGONG_LCA_API_BASE_URL.trim()) {
|
|
58
60
|
missing.push('TIANGONG_LCA_API_BASE_URL');
|