@tiangong-lca/cli 0.0.28 → 0.0.29

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/README.md +85 -2
  2. package/dist/src/cli.js +544 -3
  3. package/dist/src/cli.js.map +1 -1
  4. package/dist/src/lib/dataset-maintenance-contract.js.map +1 -1
  5. package/dist/src/lib/dataset-maintenance-flow-identity-approval-claim.js +175 -0
  6. package/dist/src/lib/dataset-maintenance-flow-identity-approval-claim.js.map +1 -0
  7. package/dist/src/lib/dataset-maintenance-flow-identity-capture.js +511 -0
  8. package/dist/src/lib/dataset-maintenance-flow-identity-capture.js.map +1 -0
  9. package/dist/src/lib/dataset-maintenance-flow-identity-command.js +26 -0
  10. package/dist/src/lib/dataset-maintenance-flow-identity-command.js.map +1 -0
  11. package/dist/src/lib/dataset-maintenance-flow-identity-contract.js +784 -0
  12. package/dist/src/lib/dataset-maintenance-flow-identity-contract.js.map +1 -0
  13. package/dist/src/lib/dataset-maintenance-flow-identity-execution-contract.js +1317 -0
  14. package/dist/src/lib/dataset-maintenance-flow-identity-execution-contract.js.map +1 -0
  15. package/dist/src/lib/dataset-maintenance-flow-identity-freeze.js +342 -0
  16. package/dist/src/lib/dataset-maintenance-flow-identity-freeze.js.map +1 -0
  17. package/dist/src/lib/dataset-maintenance-flow-identity-plan.js +900 -0
  18. package/dist/src/lib/dataset-maintenance-flow-identity-plan.js.map +1 -0
  19. package/dist/src/lib/dataset-maintenance-flow-identity-recovery.js +688 -0
  20. package/dist/src/lib/dataset-maintenance-flow-identity-recovery.js.map +1 -0
  21. package/dist/src/lib/dataset-maintenance-flow-identity-run.js +1369 -0
  22. package/dist/src/lib/dataset-maintenance-flow-identity-run.js.map +1 -0
  23. package/dist/src/lib/dataset-maintenance-flow-identity-seal.js +144 -0
  24. package/dist/src/lib/dataset-maintenance-flow-identity-seal.js.map +1 -0
  25. package/dist/src/lib/dataset-maintenance-flow-identity-verify.js +377 -0
  26. package/dist/src/lib/dataset-maintenance-flow-identity-verify.js.map +1 -0
  27. package/dist/src/lib/dataset-maintenance-flow-identity-wire.js +178 -0
  28. package/dist/src/lib/dataset-maintenance-flow-identity-wire.js.map +1 -0
  29. package/dist/src/lib/dataset-maintenance-remote.js +156 -10
  30. package/dist/src/lib/dataset-maintenance-remote.js.map +1 -1
  31. package/dist/src/lib/http.js.map +1 -1
  32. package/dist/src/lib/lca-release.js +683 -0
  33. package/dist/src/lib/lca-release.js.map +1 -0
  34. package/package.json +1 -1
@@ -3,6 +3,7 @@ import { buildSnapshotCompleteness, fetchCompletePostgrestPages, } from './datas
3
3
  import { buildSupabaseAuthHeaders, deriveSupabaseProjectBaseUrl, requireSupabaseRestRuntime, } from './supabase-client.js';
4
4
  import { resolveSupabaseUserSession } from './supabase-session.js';
5
5
  import { isJsonObject, MAINTENANCE_SCAN_TABLES, } from './dataset-maintenance-contract.js';
6
+ import { assertFlowIdentityWireJson } from './dataset-maintenance-flow-identity-wire.js';
6
7
  const DEFAULT_PAGE_SIZE = 1_000;
7
8
  const DEFAULT_TIMEOUT_MS = 10_000;
8
9
  function trimToken(value) {
@@ -56,7 +57,9 @@ async function fetchJsonResponse(options) {
56
57
  throw new CliError(`HTTP ${response.status} returned from ${options.label}`, {
57
58
  code: 'DATASET_MAINTENANCE_REMOTE_REQUEST_FAILED',
58
59
  exitCode: 1,
59
- details: { url: options.url, response: text },
60
+ details: options.redactResponseDetails
61
+ ? { url: options.url, response_redacted: true }
62
+ : { url: options.url, response: text },
60
63
  });
61
64
  }
62
65
  if (!text.trim()) {
@@ -79,11 +82,11 @@ async function fetchJsonResponse(options) {
79
82
  async function fetchJson(options) {
80
83
  return (await fetchJsonResponse(options)).body;
81
84
  }
82
- function selectForTable(table) {
83
- const common = 'id,version,user_id,state_code,modified_at,json_ordered,rule_verification';
85
+ function selectForTable(table, includeJson = false) {
86
+ const common = `id,version,user_id,state_code,modified_at,${includeJson ? 'json,' : ''}json_ordered,rule_verification`;
84
87
  return table === 'processes' ? `${common},model_id` : common;
85
88
  }
86
- function normalizeRemoteRow(table, value) {
89
+ function normalizeRemoteRow(table, value, includeJson = false) {
87
90
  if (!isJsonObject(value)) {
88
91
  return null;
89
92
  }
@@ -99,12 +102,13 @@ function normalizeRemoteRow(table, value) {
99
102
  user_id: trimToken(value.user_id),
100
103
  state_code: normalizeStateCode(value.state_code),
101
104
  modified_at: trimToken(value.modified_at),
105
+ ...(includeJson ? { json: isJsonObject(value.json) ? value.json : null } : {}),
102
106
  json_ordered: isJsonObject(value.json_ordered) ? value.json_ordered : null,
103
107
  model_id: trimToken(value.model_id),
104
108
  rule_verification: typeof value.rule_verification === 'boolean' ? value.rule_verification : null,
105
109
  };
106
110
  }
107
- function normalizeRemoteRows(table, value, label) {
111
+ function normalizeRemoteRows(table, value, label, includeJson = false) {
108
112
  if (!Array.isArray(value)) {
109
113
  throw new CliError(`Remote response was not an array for ${label}.`, {
110
114
  code: 'DATASET_MAINTENANCE_REMOTE_ROWS_INVALID',
@@ -112,7 +116,7 @@ function normalizeRemoteRows(table, value, label) {
112
116
  details: value,
113
117
  });
114
118
  }
115
- const rows = value.map((entry) => normalizeRemoteRow(table, entry));
119
+ const rows = value.map((entry) => normalizeRemoteRow(table, entry, includeJson));
116
120
  if (rows.some((row) => row === null)) {
117
121
  throw new CliError(`Remote response contained an invalid row for ${label}.`, {
118
122
  code: 'DATASET_MAINTENANCE_REMOTE_ROW_INVALID',
@@ -172,7 +176,7 @@ export async function resolveMaintenanceRemoteContext(options) {
172
176
  }
173
177
  export async function fetchMaintenanceExactRows(options) {
174
178
  const url = new URL(`${options.context.rest_base_url}/${options.table}`);
175
- url.searchParams.set('select', selectForTable(options.table));
179
+ url.searchParams.set('select', selectForTable(options.table, options.includeJson));
176
180
  url.searchParams.set('id', `eq.${options.id}`);
177
181
  url.searchParams.set('version', `eq.${options.version}`);
178
182
  url.searchParams.set('limit', '2');
@@ -183,7 +187,7 @@ export async function fetchMaintenanceExactRows(options) {
183
187
  label: `${options.table} exact maintenance lookup`,
184
188
  });
185
189
  return {
186
- rows: normalizeRemoteRows(options.table, body, sourceUrl),
190
+ rows: normalizeRemoteRows(options.table, body, sourceUrl, options.includeJson),
187
191
  source_url: sourceUrl,
188
192
  };
189
193
  }
@@ -235,8 +239,48 @@ export async function fetchMaintenanceAccountRows(options) {
235
239
  }),
236
240
  };
237
241
  }
242
+ export async function fetchMaintenanceAccountTableRows(options) {
243
+ const pageSize = normalizeMaintenancePageSize(options.pageSize);
244
+ return fetchCompletePostgrestPages({
245
+ table: options.table,
246
+ requestedPageSize: pageSize,
247
+ rowIdentity: (row) => `${row.id}\u0000${row.version}`,
248
+ fetchPage: async (offset) => {
249
+ const url = new URL(`${options.context.rest_base_url}/${options.table}`);
250
+ url.searchParams.set('select', selectForTable(options.table, options.includeJson));
251
+ url.searchParams.set('user_id', `eq.${options.userId}`);
252
+ if (options.stateCode !== undefined) {
253
+ url.searchParams.set('state_code', `eq.${options.stateCode}`);
254
+ }
255
+ url.searchParams.set('order', 'id.asc,version.asc');
256
+ url.searchParams.set('limit', String(pageSize));
257
+ url.searchParams.set('offset', String(offset));
258
+ const sourceUrl = url.toString();
259
+ const response = await fetchJsonResponse({
260
+ context: options.context,
261
+ url: sourceUrl,
262
+ init: { headers: { Prefer: 'count=exact' } },
263
+ label: `${options.table} account maintenance snapshot`,
264
+ });
265
+ const rows = normalizeRemoteRows(options.table, response.body, sourceUrl, options.includeJson);
266
+ if (rows.some((row) => row.user_id !== options.userId ||
267
+ (options.stateCode !== undefined && row.state_code !== options.stateCode))) {
268
+ throw new CliError(`Remote ${options.table} snapshot violated the account/state fence.`, {
269
+ code: 'DATASET_MAINTENANCE_REMOTE_ROW_INVALID',
270
+ exitCode: 1,
271
+ });
272
+ }
273
+ return {
274
+ rows,
275
+ source_url: sourceUrl,
276
+ content_range: response.headers.get('content-range'),
277
+ };
278
+ },
279
+ });
280
+ }
238
281
  async function invokeMaintenanceRpc(options) {
239
282
  const url = `${options.context.rest_base_url}/rpc/${options.rpc}`;
283
+ const redactResponseDetails = options.rpc.startsWith('cmd_dataset_flow_identity_');
240
284
  const body = await fetchJson({
241
285
  context: {
242
286
  ...options.context,
@@ -249,16 +293,37 @@ async function invokeMaintenanceRpc(options) {
249
293
  body: JSON.stringify(options.body),
250
294
  },
251
295
  label: options.rpc,
296
+ redactResponseDetails,
252
297
  });
253
- if (!isJsonObject(body) || body.ok !== true) {
298
+ if (redactResponseDetails &&
299
+ isJsonObject(body) &&
300
+ body.ok !== true &&
301
+ Object.hasOwn(body, 'execution_permit')) {
302
+ throw new CliError(`${options.rpc} returned an invalid rejection envelope.`, {
303
+ code: 'DATASET_MAINTENANCE_RPC_FAILED',
304
+ exitCode: 1,
305
+ details: { rpc: options.rpc, response_redacted: true },
306
+ });
307
+ }
308
+ if (!isJsonObject(body) ||
309
+ (body.ok !== true &&
310
+ !(options.allowDomainFailure === true && isMaintenanceRpcDomainFailure(body)))) {
254
311
  throw new CliError(`${options.rpc} returned an unexpected response.`, {
255
312
  code: 'DATASET_MAINTENANCE_RPC_FAILED',
256
313
  exitCode: 1,
257
- details: body,
314
+ details: redactResponseDetails ? { rpc: options.rpc, response_redacted: true } : body,
258
315
  });
259
316
  }
260
317
  return body;
261
318
  }
319
+ export function isMaintenanceRpcDomainFailure(value) {
320
+ return Boolean(isJsonObject(value) &&
321
+ value.ok === false &&
322
+ typeof value.code === 'string' &&
323
+ value.code.trim() &&
324
+ ((typeof value.status === 'number' && Number.isSafeInteger(value.status)) ||
325
+ (typeof value.status === 'string' && value.status.trim())));
326
+ }
262
327
  export async function preflightMaintenanceAliasExecution(options) {
263
328
  return invokeMaintenanceRpc({
264
329
  context: options.context,
@@ -397,6 +462,87 @@ export async function applyMaintenanceAliasPlan(options) {
397
462
  body: { p_plan: options.plan },
398
463
  });
399
464
  }
465
+ export async function preflightMaintenanceFlowIdentityScope(options) {
466
+ const body = assertFlowIdentityWireJson({ p_request: options.request });
467
+ return invokeMaintenanceRpc({
468
+ context: options.context,
469
+ rpc: 'cmd_dataset_flow_identity_scope_preflight_guarded',
470
+ body,
471
+ minimumTimeoutMs: 130_000,
472
+ allowDomainFailure: true,
473
+ });
474
+ }
475
+ export async function lookupMaintenanceFlowIdentityScope(options) {
476
+ const body = assertFlowIdentityWireJson({ p_request: options.request });
477
+ return invokeMaintenanceRpc({
478
+ context: options.context,
479
+ rpc: 'cmd_dataset_flow_identity_scope_lookup',
480
+ body,
481
+ minimumTimeoutMs: 90_000,
482
+ allowDomainFailure: true,
483
+ });
484
+ }
485
+ export async function rewriteMaintenanceFlowIdentityProcess(options) {
486
+ const body = assertFlowIdentityWireJson({
487
+ p_scope_id: options.scopeId,
488
+ p_request: options.request,
489
+ p_authorization: options.authorization,
490
+ });
491
+ return invokeMaintenanceRpc({
492
+ context: options.context,
493
+ rpc: 'cmd_dataset_flow_identity_process_rewrite_guarded',
494
+ body,
495
+ minimumTimeoutMs: 90_000,
496
+ allowDomainFailure: true,
497
+ });
498
+ }
499
+ export async function readMaintenanceFlowIdentityScope(options) {
500
+ const body = assertFlowIdentityWireJson({ p_scope_id: options.scopeId });
501
+ return invokeMaintenanceRpc({
502
+ context: options.context,
503
+ rpc: 'cmd_dataset_flow_identity_scope_read',
504
+ body,
505
+ minimumTimeoutMs: 90_000,
506
+ allowDomainFailure: true,
507
+ });
508
+ }
509
+ export async function finalizeMaintenanceFlowIdentityScope(options) {
510
+ const body = assertFlowIdentityWireJson({
511
+ p_scope_id: options.scopeId,
512
+ p_request: options.request,
513
+ p_authorization: options.authorization,
514
+ });
515
+ return invokeMaintenanceRpc({
516
+ context: options.context,
517
+ rpc: 'cmd_dataset_flow_identity_scope_finalize_guarded',
518
+ body,
519
+ minimumTimeoutMs: 190_000,
520
+ allowDomainFailure: true,
521
+ });
522
+ }
523
+ export async function recoverMaintenanceFlowIdentityScope(options) {
524
+ const body = assertFlowIdentityWireJson({
525
+ p_scope_id: options.scopeId,
526
+ p_request: options.request,
527
+ });
528
+ return invokeMaintenanceRpc({
529
+ context: options.context,
530
+ rpc: 'cmd_dataset_flow_identity_scope_recover_guarded',
531
+ body,
532
+ minimumTimeoutMs: 130_000,
533
+ allowDomainFailure: true,
534
+ });
535
+ }
536
+ export async function attestMaintenanceFlowIdentityCapture(options) {
537
+ const body = assertFlowIdentityWireJson({ p_request: options.request });
538
+ return invokeMaintenanceRpc({
539
+ context: options.context,
540
+ rpc: 'cmd_dataset_flow_identity_capture_attest_guarded',
541
+ body,
542
+ minimumTimeoutMs: 190_000,
543
+ allowDomainFailure: true,
544
+ });
545
+ }
400
546
  export async function saveDraftMaintenanceRow(options) {
401
547
  return invokeMaintenanceRpc({
402
548
  context: options.context,
@@ -1 +1 @@
1
- {"version":3,"file":"dataset-maintenance-remote.js","sourceRoot":"","sources":["../../../src/lib/dataset-maintenance-remote.ts"],"names":[],"mappings":"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","sourcesContent":["import { CliError } from './errors.js';\nimport type { FetchLike, ResponseLike } from './http.js';\nimport {\n buildSnapshotCompleteness,\n fetchCompletePostgrestPages,\n type DatasetMaintenanceSnapshotCompleteness,\n} from './dataset-maintenance-pagination.js';\nimport {\n buildSupabaseAuthHeaders,\n deriveSupabaseProjectBaseUrl,\n requireSupabaseRestRuntime,\n} from './supabase-client.js';\nimport { resolveSupabaseUserSession } from './supabase-session.js';\nimport {\n isJsonObject,\n MAINTENANCE_SCAN_TABLES,\n type DatasetMaintenanceMutableTable,\n type DatasetMaintenanceRemoteRow,\n type DatasetMaintenanceScanTable,\n type JsonObject,\n} from './dataset-maintenance-contract.js';\n\nconst DEFAULT_PAGE_SIZE = 1_000;\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nexport type DatasetMaintenanceRemoteContext = {\n project_ref: string;\n rest_base_url: string;\n publishable_key: string;\n access_token: string;\n account: {\n user_id: string;\n email: string;\n session_source: string;\n };\n fetch_impl: FetchLike;\n timeout_ms: number;\n};\n\nexport type DatasetMaintenanceDerivativeRemoteRow = {\n table: 'flows' | 'processes';\n id: string;\n version: string;\n user_id: string;\n state_code: number;\n raw: JsonObject;\n};\n\nfunction trimToken(value: unknown): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n const trimmed = value.trim();\n return trimmed || null;\n}\n\nfunction normalizeStateCode(value: unknown): number | null {\n if (typeof value === 'number' && Number.isInteger(value)) {\n return value;\n }\n return typeof value === 'string' && /^-?\\d+$/u.test(value.trim())\n ? Number.parseInt(value.trim(), 10)\n : null;\n}\n\nexport function normalizeMaintenancePageSize(value?: number): number {\n const normalized = value ?? DEFAULT_PAGE_SIZE;\n if (!Number.isInteger(normalized) || normalized < 1 || normalized > 5_000) {\n throw new CliError('Maintenance page size must be an integer between 1 and 5000.', {\n code: 'DATASET_MAINTENANCE_PAGE_SIZE_INVALID',\n exitCode: 2,\n details: value,\n });\n }\n return normalized;\n}\n\nexport function normalizeMaintenanceTimeout(value?: number): number {\n const normalized = value ?? DEFAULT_TIMEOUT_MS;\n if (!Number.isInteger(normalized) || normalized < 1) {\n throw new CliError('Maintenance timeout must be a positive integer.', {\n code: 'DATASET_MAINTENANCE_TIMEOUT_INVALID',\n exitCode: 2,\n details: value,\n });\n }\n return normalized;\n}\n\nasync function fetchJsonResponse(options: {\n context: Pick<\n DatasetMaintenanceRemoteContext,\n 'publishable_key' | 'access_token' | 'fetch_impl' | 'timeout_ms'\n >;\n url: string;\n init?: RequestInit;\n label: string;\n}): Promise<{ body: unknown; headers: ResponseLike['headers'] }> {\n const response = await options.context.fetch_impl(options.url, {\n ...options.init,\n headers: {\n ...buildSupabaseAuthHeaders(options.context.publishable_key, options.context.access_token),\n ...(options.init?.headers ?? {}),\n },\n signal: AbortSignal.timeout(options.context.timeout_ms),\n });\n const text = await response.text();\n if (!response.ok) {\n throw new CliError(`HTTP ${response.status} returned from ${options.label}`, {\n code: 'DATASET_MAINTENANCE_REMOTE_REQUEST_FAILED',\n exitCode: 1,\n details: { url: options.url, response: text },\n });\n }\n if (!text.trim()) {\n return { body: null, headers: response.headers };\n }\n try {\n return { body: JSON.parse(text), headers: response.headers };\n } catch (error) {\n throw new CliError(`Remote response was not valid JSON for ${options.label}`, {\n code: 'DATASET_MAINTENANCE_REMOTE_INVALID_JSON',\n exitCode: 1,\n details: {\n url: options.url,\n error: String(error),\n },\n });\n }\n}\n\nasync function fetchJson(options: {\n context: Pick<\n DatasetMaintenanceRemoteContext,\n 'publishable_key' | 'access_token' | 'fetch_impl' | 'timeout_ms'\n >;\n url: string;\n init?: RequestInit;\n label: string;\n}): Promise<unknown> {\n return (await fetchJsonResponse(options)).body;\n}\n\nfunction selectForTable(table: DatasetMaintenanceScanTable): string {\n const common = 'id,version,user_id,state_code,modified_at,json_ordered,rule_verification';\n return table === 'processes' ? `${common},model_id` : common;\n}\n\nfunction normalizeRemoteRow(\n table: DatasetMaintenanceScanTable,\n value: unknown,\n): DatasetMaintenanceRemoteRow | null {\n if (!isJsonObject(value)) {\n return null;\n }\n const id = trimToken(value.id);\n const version = trimToken(value.version);\n if (!id || !version) {\n return null;\n }\n return {\n table,\n id,\n version,\n user_id: trimToken(value.user_id),\n state_code: normalizeStateCode(value.state_code),\n modified_at: trimToken(value.modified_at),\n json_ordered: isJsonObject(value.json_ordered) ? value.json_ordered : null,\n model_id: trimToken(value.model_id),\n rule_verification:\n typeof value.rule_verification === 'boolean' ? value.rule_verification : null,\n };\n}\n\nfunction normalizeRemoteRows(\n table: DatasetMaintenanceScanTable,\n value: unknown,\n label: string,\n): DatasetMaintenanceRemoteRow[] {\n if (!Array.isArray(value)) {\n throw new CliError(`Remote response was not an array for ${label}.`, {\n code: 'DATASET_MAINTENANCE_REMOTE_ROWS_INVALID',\n exitCode: 1,\n details: value,\n });\n }\n const rows = value.map((entry) => normalizeRemoteRow(table, entry));\n if (rows.some((row) => row === null)) {\n throw new CliError(`Remote response contained an invalid row for ${label}.`, {\n code: 'DATASET_MAINTENANCE_REMOTE_ROW_INVALID',\n exitCode: 1,\n });\n }\n return rows as DatasetMaintenanceRemoteRow[];\n}\n\nexport async function resolveMaintenanceRemoteContext(options: {\n env: NodeJS.ProcessEnv;\n fetchImpl: FetchLike;\n timeoutMs?: number;\n now?: Date;\n}): Promise<DatasetMaintenanceRemoteContext> {\n const timeoutMs = normalizeMaintenanceTimeout(options.timeoutMs);\n const runtime = requireSupabaseRestRuntime(options.env);\n const session = await resolveSupabaseUserSession({\n runtime,\n fetchImpl: options.fetchImpl,\n timeoutMs,\n now: options.now,\n });\n const projectBaseUrl = deriveSupabaseProjectBaseUrl(runtime.apiBaseUrl);\n const projectHost = new URL(projectBaseUrl).hostname;\n const projectRef = projectHost.endsWith('.supabase.co')\n ? projectHost.slice(0, -'.supabase.co'.length)\n : projectHost;\n const partialContext = {\n publishable_key: runtime.publishableKey,\n access_token: session.accessToken,\n fetch_impl: options.fetchImpl,\n timeout_ms: timeoutMs,\n };\n const currentUser = await fetchJson({\n context: partialContext,\n url: `${projectBaseUrl}/auth/v1/user`,\n label: 'supabase current-user lookup',\n });\n const userId = isJsonObject(currentUser) ? trimToken(currentUser.id) : null;\n const email = isJsonObject(currentUser)\n ? (trimToken(currentUser.email) ?? trimToken(session.userEmail))\n : trimToken(session.userEmail);\n if (!userId || !email) {\n throw new CliError('Supabase current-user lookup did not return id and email.', {\n code: 'DATASET_MAINTENANCE_CURRENT_USER_INVALID',\n exitCode: 1,\n });\n }\n return {\n project_ref: projectRef,\n rest_base_url: `${projectBaseUrl}/rest/v1`,\n publishable_key: runtime.publishableKey,\n access_token: session.accessToken,\n account: {\n user_id: userId,\n email,\n session_source: session.source,\n },\n fetch_impl: options.fetchImpl,\n timeout_ms: timeoutMs,\n };\n}\n\nexport async function fetchMaintenanceExactRows(options: {\n context: DatasetMaintenanceRemoteContext;\n table: DatasetMaintenanceScanTable;\n id: string;\n version: string;\n}): Promise<{ rows: DatasetMaintenanceRemoteRow[]; source_url: string }> {\n const url = new URL(`${options.context.rest_base_url}/${options.table}`);\n url.searchParams.set('select', selectForTable(options.table));\n url.searchParams.set('id', `eq.${options.id}`);\n url.searchParams.set('version', `eq.${options.version}`);\n url.searchParams.set('limit', '2');\n const sourceUrl = url.toString();\n const body = await fetchJson({\n context: options.context,\n url: sourceUrl,\n label: `${options.table} exact maintenance lookup`,\n });\n return {\n rows: normalizeRemoteRows(options.table, body, sourceUrl),\n source_url: sourceUrl,\n };\n}\n\nexport async function fetchMaintenanceAccountRows(options: {\n context: DatasetMaintenanceRemoteContext;\n userId: string;\n pageSize?: number;\n}): Promise<{\n rows: DatasetMaintenanceRemoteRow[];\n source_urls: string[];\n completeness: DatasetMaintenanceSnapshotCompleteness<DatasetMaintenanceScanTable>;\n}> {\n const pageSize = normalizeMaintenancePageSize(options.pageSize);\n const tableResults: Array<{\n table: DatasetMaintenanceScanTable;\n rows: DatasetMaintenanceRemoteRow[];\n source_urls: string[];\n completeness: Awaited<ReturnType<typeof fetchCompletePostgrestPages>>['completeness'];\n }> = [];\n for (const table of MAINTENANCE_SCAN_TABLES) {\n const result = await fetchCompletePostgrestPages({\n table,\n requestedPageSize: pageSize,\n rowIdentity: (row: DatasetMaintenanceRemoteRow) => `${row.id}\\u0000${row.version}`,\n fetchPage: async (offset) => {\n const url = new URL(`${options.context.rest_base_url}/${table}`);\n url.searchParams.set('select', selectForTable(table));\n url.searchParams.set('user_id', `eq.${options.userId}`);\n url.searchParams.set('order', 'id.asc,version.asc');\n url.searchParams.set('limit', String(pageSize));\n url.searchParams.set('offset', String(offset));\n const sourceUrl = url.toString();\n const response = await fetchJsonResponse({\n context: options.context,\n url: sourceUrl,\n init: { headers: { Prefer: 'count=exact' } },\n label: `${table} account maintenance snapshot`,\n });\n const rows = normalizeRemoteRows(table, response.body, sourceUrl);\n if (rows.some((row) => row.user_id !== options.userId)) {\n throw new CliError(`Remote ${table} snapshot contained a foreign account row.`, {\n code: 'DATASET_MAINTENANCE_REMOTE_ROW_INVALID',\n exitCode: 1,\n });\n }\n return {\n rows,\n source_url: sourceUrl,\n content_range: response.headers.get('content-range'),\n };\n },\n });\n tableResults.push({ table, ...result });\n }\n return {\n rows: tableResults.flatMap((result) => result.rows),\n source_urls: tableResults.flatMap((result) => result.source_urls),\n completeness: buildSnapshotCompleteness({\n tables: MAINTENANCE_SCAN_TABLES,\n requestedPageSize: pageSize,\n results: tableResults,\n }),\n };\n}\n\nasync function invokeMaintenanceRpc(options: {\n context: DatasetMaintenanceRemoteContext;\n rpc:\n | 'cmd_dataset_save_draft'\n | 'cmd_dataset_delete'\n | 'cmd_dataset_alias_plan_guarded'\n | 'cmd_dataset_alias_execution_preflight_guarded'\n | 'cmd_dataset_alias_execution_gate_guarded'\n | 'cmd_dataset_alias_execution_admit_guarded'\n | 'cmd_dataset_alias_execution_read'\n | 'cmd_dataset_derivative_rebuild_snapshot'\n | 'cmd_dataset_derivative_rebuild_plan_guarded'\n | 'cmd_dataset_derivative_rebuild_read';\n body: JsonObject;\n minimumTimeoutMs?: number;\n}): Promise<JsonObject> {\n const url = `${options.context.rest_base_url}/rpc/${options.rpc}`;\n const body = await fetchJson({\n context: {\n ...options.context,\n timeout_ms: Math.max(options.context.timeout_ms, options.minimumTimeoutMs ?? 0),\n },\n url,\n init: {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(options.body),\n },\n label: options.rpc,\n });\n if (!isJsonObject(body) || body.ok !== true) {\n throw new CliError(`${options.rpc} returned an unexpected response.`, {\n code: 'DATASET_MAINTENANCE_RPC_FAILED',\n exitCode: 1,\n details: body,\n });\n }\n return body;\n}\n\nexport async function preflightMaintenanceAliasExecution(options: {\n context: DatasetMaintenanceRemoteContext;\n request: JsonObject;\n}): Promise<JsonObject> {\n return invokeMaintenanceRpc({\n context: options.context,\n rpc: 'cmd_dataset_alias_execution_preflight_guarded',\n body: { p_request: options.request },\n minimumTimeoutMs: 90_000,\n });\n}\n\nexport async function admitMaintenanceAliasExecution(options: {\n context: DatasetMaintenanceRemoteContext;\n request: JsonObject;\n}): Promise<JsonObject> {\n return invokeMaintenanceRpc({\n context: options.context,\n rpc: 'cmd_dataset_alias_execution_admit_guarded',\n body: { p_request: options.request },\n minimumTimeoutMs: 90_000,\n });\n}\n\nexport async function captureMaintenanceAliasExecutionGate(options: {\n context: DatasetMaintenanceRemoteContext;\n requestId: string;\n preflightToken: string;\n gateName: 'primary_support_plan' | 'execution_unused' | 'derivative_quiescence';\n}): Promise<JsonObject> {\n return invokeMaintenanceRpc({\n context: options.context,\n rpc: 'cmd_dataset_alias_execution_gate_guarded',\n body: {\n p_request_id: options.requestId,\n p_preflight_token: options.preflightToken,\n p_gate_name: options.gateName,\n },\n minimumTimeoutMs: 90_000,\n });\n}\n\nexport async function readMaintenanceAliasExecution(options: {\n context: DatasetMaintenanceRemoteContext;\n requestId: string;\n}): Promise<JsonObject> {\n return invokeMaintenanceRpc({\n context: options.context,\n rpc: 'cmd_dataset_alias_execution_read',\n body: { p_request_id: options.requestId },\n minimumTimeoutMs: 90_000,\n });\n}\n\nfunction derivativeSelectForTable(table: 'flows' | 'processes'): string {\n void table;\n return 'id,version,user_id,state_code,modified_at,json,json_ordered,extracted_text,extracted_md,embedding_ft,embedding_ft_at';\n}\n\nexport async function fetchMaintenanceDerivativeTargetRows(options: {\n context: DatasetMaintenanceRemoteContext;\n targets: Array<{ table: 'flows' | 'processes'; id: string; version: string }>;\n concurrency?: number;\n}): Promise<{ rows: DatasetMaintenanceDerivativeRemoteRow[]; source_urls: string[] }> {\n const concurrency = options.concurrency ?? 5;\n if (!Number.isInteger(concurrency) || concurrency < 1 || concurrency > 10) {\n throw new CliError('Derivative target read concurrency must be an integer between 1 and 10.', {\n code: 'DATASET_MAINTENANCE_DERIVATIVE_READ_CONCURRENCY_INVALID',\n exitCode: 2,\n });\n }\n if (options.targets.length > 50) {\n throw new CliError('Protected derivative target read is bounded to 50 rows.', {\n code: 'DATASET_MAINTENANCE_DERIVATIVE_TARGET_COUNT_INVALID',\n exitCode: 2,\n });\n }\n const rows: DatasetMaintenanceDerivativeRemoteRow[] = [];\n const sourceUrls: string[] = [];\n for (let offset = 0; offset < options.targets.length; offset += concurrency) {\n const chunk = options.targets.slice(offset, offset + concurrency);\n const results = await Promise.all(\n chunk.map(async (target) => {\n const url = new URL(`${options.context.rest_base_url}/${target.table}`);\n url.searchParams.set('select', derivativeSelectForTable(target.table));\n url.searchParams.set('id', `eq.${target.id}`);\n url.searchParams.set('version', `eq.${target.version}`);\n url.searchParams.set('limit', '2');\n const sourceUrl = url.toString();\n const body = await fetchJson({\n context: options.context,\n url: sourceUrl,\n label: `${target.table} protected derivative lookup`,\n });\n if (!Array.isArray(body) || body.length !== 1 || !isJsonObject(body[0])) {\n throw new CliError('Protected derivative target was missing, duplicated, or malformed.', {\n code: 'DATASET_MAINTENANCE_DERIVATIVE_TARGET_READ_INVALID',\n exitCode: 1,\n details: target,\n });\n }\n const row = body[0];\n const id = trimToken(row.id);\n const version = trimToken(row.version);\n const userId = trimToken(row.user_id);\n const stateCode = normalizeStateCode(row.state_code);\n if (id !== target.id || version !== target.version || !userId || stateCode === null) {\n throw new CliError('Protected derivative target identity was malformed.', {\n code: 'DATASET_MAINTENANCE_DERIVATIVE_TARGET_READ_INVALID',\n exitCode: 1,\n details: target,\n });\n }\n return {\n row: {\n table: target.table,\n id,\n version,\n user_id: userId,\n state_code: stateCode,\n raw: row,\n } satisfies DatasetMaintenanceDerivativeRemoteRow,\n sourceUrl,\n };\n }),\n );\n rows.push(...results.map((result) => result.row));\n sourceUrls.push(...results.map((result) => result.sourceUrl));\n }\n return { rows, source_urls: sourceUrls };\n}\n\nexport async function fetchMaintenanceDerivativeSnapshot(options: {\n context: DatasetMaintenanceRemoteContext;\n table?: 'flows' | 'processes';\n id: string;\n version: string;\n}): Promise<JsonObject> {\n return invokeMaintenanceRpc({\n context: options.context,\n rpc: 'cmd_dataset_derivative_rebuild_snapshot',\n body: {\n p_table: options.table ?? 'processes',\n p_id: options.id,\n p_version: options.version,\n },\n });\n}\n\nexport async function applyMaintenanceDerivativeRebuild(options: {\n context: DatasetMaintenanceRemoteContext;\n plan: JsonObject;\n}): Promise<JsonObject> {\n return invokeMaintenanceRpc({\n context: options.context,\n rpc: 'cmd_dataset_derivative_rebuild_plan_guarded',\n body: { p_plan: options.plan },\n });\n}\n\nexport async function readMaintenanceDerivativeRebuild(options: {\n context: DatasetMaintenanceRemoteContext;\n requestId: string;\n}): Promise<JsonObject> {\n return invokeMaintenanceRpc({\n context: options.context,\n rpc: 'cmd_dataset_derivative_rebuild_read',\n body: { p_request_id: options.requestId },\n });\n}\n\nexport async function applyMaintenanceAliasPlan(options: {\n context: DatasetMaintenanceRemoteContext;\n plan: JsonObject;\n}): Promise<JsonObject> {\n return invokeMaintenanceRpc({\n context: options.context,\n rpc: 'cmd_dataset_alias_plan_guarded',\n body: { p_plan: options.plan },\n });\n}\n\nexport async function saveDraftMaintenanceRow(options: {\n context: DatasetMaintenanceRemoteContext;\n table: DatasetMaintenanceMutableTable;\n id: string;\n version: string;\n payload: JsonObject;\n modelId: string | null;\n ruleVerification: boolean | null;\n audit: JsonObject;\n}): Promise<JsonObject> {\n return invokeMaintenanceRpc({\n context: options.context,\n rpc: 'cmd_dataset_save_draft',\n body: {\n p_table: options.table,\n p_id: options.id,\n p_version: options.version,\n p_json_ordered: options.payload,\n p_model_id: options.modelId,\n p_rule_verification: options.ruleVerification,\n p_audit: options.audit,\n },\n });\n}\n\nexport async function deleteMaintenanceRow(options: {\n context: DatasetMaintenanceRemoteContext;\n table: DatasetMaintenanceMutableTable;\n id: string;\n version: string;\n audit: JsonObject;\n}): Promise<JsonObject> {\n return invokeMaintenanceRpc({\n context: options.context,\n rpc: 'cmd_dataset_delete',\n body: {\n p_table: options.table,\n p_id: options.id,\n p_version: options.version,\n p_audit: options.audit,\n },\n });\n}\n\nexport const __testInternals = {\n fetchJson,\n fetchJsonResponse,\n normalizeRemoteRow,\n normalizeRemoteRows,\n selectForTable,\n};\n"]}
1
+ {"version":3,"file":"dataset-maintenance-remote.js","sourceRoot":"","sources":["../../../src/lib/dataset-maintenance-remote.ts"],"names":[],"mappings":"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","sourcesContent":["import { CliError } from './errors.js';\nimport type { FetchLike, ResponseLike } from './http.js';\nimport {\n buildSnapshotCompleteness,\n fetchCompletePostgrestPages,\n type DatasetMaintenanceTableCompleteness,\n type DatasetMaintenanceSnapshotCompleteness,\n} from './dataset-maintenance-pagination.js';\nimport {\n buildSupabaseAuthHeaders,\n deriveSupabaseProjectBaseUrl,\n requireSupabaseRestRuntime,\n} from './supabase-client.js';\nimport { resolveSupabaseUserSession } from './supabase-session.js';\nimport {\n isJsonObject,\n MAINTENANCE_SCAN_TABLES,\n type DatasetMaintenanceMutableTable,\n type DatasetMaintenanceRemoteRow,\n type DatasetMaintenanceScanTable,\n type JsonObject,\n} from './dataset-maintenance-contract.js';\nimport { assertFlowIdentityWireJson } from './dataset-maintenance-flow-identity-wire.js';\n\nconst DEFAULT_PAGE_SIZE = 1_000;\nconst DEFAULT_TIMEOUT_MS = 10_000;\n\nexport type DatasetMaintenanceRemoteContext = {\n project_ref: string;\n rest_base_url: string;\n publishable_key: string;\n access_token: string;\n account: {\n user_id: string;\n email: string;\n session_source: string;\n };\n fetch_impl: FetchLike;\n timeout_ms: number;\n};\n\nexport type DatasetMaintenanceDerivativeRemoteRow = {\n table: 'flows' | 'processes';\n id: string;\n version: string;\n user_id: string;\n state_code: number;\n raw: JsonObject;\n};\n\nfunction trimToken(value: unknown): string | null {\n if (typeof value !== 'string') {\n return null;\n }\n const trimmed = value.trim();\n return trimmed || null;\n}\n\nfunction normalizeStateCode(value: unknown): number | null {\n if (typeof value === 'number' && Number.isInteger(value)) {\n return value;\n }\n return typeof value === 'string' && /^-?\\d+$/u.test(value.trim())\n ? Number.parseInt(value.trim(), 10)\n : null;\n}\n\nexport function normalizeMaintenancePageSize(value?: number): number {\n const normalized = value ?? DEFAULT_PAGE_SIZE;\n if (!Number.isInteger(normalized) || normalized < 1 || normalized > 5_000) {\n throw new CliError('Maintenance page size must be an integer between 1 and 5000.', {\n code: 'DATASET_MAINTENANCE_PAGE_SIZE_INVALID',\n exitCode: 2,\n details: value,\n });\n }\n return normalized;\n}\n\nexport function normalizeMaintenanceTimeout(value?: number): number {\n const normalized = value ?? DEFAULT_TIMEOUT_MS;\n if (!Number.isInteger(normalized) || normalized < 1) {\n throw new CliError('Maintenance timeout must be a positive integer.', {\n code: 'DATASET_MAINTENANCE_TIMEOUT_INVALID',\n exitCode: 2,\n details: value,\n });\n }\n return normalized;\n}\n\nasync function fetchJsonResponse(options: {\n context: Pick<\n DatasetMaintenanceRemoteContext,\n 'publishable_key' | 'access_token' | 'fetch_impl' | 'timeout_ms'\n >;\n url: string;\n init?: RequestInit;\n label: string;\n redactResponseDetails?: boolean;\n}): Promise<{ body: unknown; headers: ResponseLike['headers'] }> {\n const response = await options.context.fetch_impl(options.url, {\n ...options.init,\n headers: {\n ...buildSupabaseAuthHeaders(options.context.publishable_key, options.context.access_token),\n ...(options.init?.headers ?? {}),\n },\n signal: AbortSignal.timeout(options.context.timeout_ms),\n });\n const text = await response.text();\n if (!response.ok) {\n throw new CliError(`HTTP ${response.status} returned from ${options.label}`, {\n code: 'DATASET_MAINTENANCE_REMOTE_REQUEST_FAILED',\n exitCode: 1,\n details: options.redactResponseDetails\n ? { url: options.url, response_redacted: true }\n : { url: options.url, response: text },\n });\n }\n if (!text.trim()) {\n return { body: null, headers: response.headers };\n }\n try {\n return { body: JSON.parse(text), headers: response.headers };\n } catch (error) {\n throw new CliError(`Remote response was not valid JSON for ${options.label}`, {\n code: 'DATASET_MAINTENANCE_REMOTE_INVALID_JSON',\n exitCode: 1,\n details: {\n url: options.url,\n error: String(error),\n },\n });\n }\n}\n\nasync function fetchJson(options: {\n context: Pick<\n DatasetMaintenanceRemoteContext,\n 'publishable_key' | 'access_token' | 'fetch_impl' | 'timeout_ms'\n >;\n url: string;\n init?: RequestInit;\n label: string;\n redactResponseDetails?: boolean;\n}): Promise<unknown> {\n return (await fetchJsonResponse(options)).body;\n}\n\nfunction selectForTable(table: DatasetMaintenanceScanTable, includeJson = false): string {\n const common = `id,version,user_id,state_code,modified_at,${includeJson ? 'json,' : ''}json_ordered,rule_verification`;\n return table === 'processes' ? `${common},model_id` : common;\n}\n\nfunction normalizeRemoteRow(\n table: DatasetMaintenanceScanTable,\n value: unknown,\n includeJson = false,\n): DatasetMaintenanceRemoteRow | null {\n if (!isJsonObject(value)) {\n return null;\n }\n const id = trimToken(value.id);\n const version = trimToken(value.version);\n if (!id || !version) {\n return null;\n }\n return {\n table,\n id,\n version,\n user_id: trimToken(value.user_id),\n state_code: normalizeStateCode(value.state_code),\n modified_at: trimToken(value.modified_at),\n ...(includeJson ? { json: isJsonObject(value.json) ? value.json : null } : {}),\n json_ordered: isJsonObject(value.json_ordered) ? value.json_ordered : null,\n model_id: trimToken(value.model_id),\n rule_verification:\n typeof value.rule_verification === 'boolean' ? value.rule_verification : null,\n };\n}\n\nfunction normalizeRemoteRows(\n table: DatasetMaintenanceScanTable,\n value: unknown,\n label: string,\n includeJson = false,\n): DatasetMaintenanceRemoteRow[] {\n if (!Array.isArray(value)) {\n throw new CliError(`Remote response was not an array for ${label}.`, {\n code: 'DATASET_MAINTENANCE_REMOTE_ROWS_INVALID',\n exitCode: 1,\n details: value,\n });\n }\n const rows = value.map((entry) => normalizeRemoteRow(table, entry, includeJson));\n if (rows.some((row) => row === null)) {\n throw new CliError(`Remote response contained an invalid row for ${label}.`, {\n code: 'DATASET_MAINTENANCE_REMOTE_ROW_INVALID',\n exitCode: 1,\n });\n }\n return rows as DatasetMaintenanceRemoteRow[];\n}\n\nexport async function resolveMaintenanceRemoteContext(options: {\n env: NodeJS.ProcessEnv;\n fetchImpl: FetchLike;\n timeoutMs?: number;\n now?: Date;\n}): Promise<DatasetMaintenanceRemoteContext> {\n const timeoutMs = normalizeMaintenanceTimeout(options.timeoutMs);\n const runtime = requireSupabaseRestRuntime(options.env);\n const session = await resolveSupabaseUserSession({\n runtime,\n fetchImpl: options.fetchImpl,\n timeoutMs,\n now: options.now,\n });\n const projectBaseUrl = deriveSupabaseProjectBaseUrl(runtime.apiBaseUrl);\n const projectHost = new URL(projectBaseUrl).hostname;\n const projectRef = projectHost.endsWith('.supabase.co')\n ? projectHost.slice(0, -'.supabase.co'.length)\n : projectHost;\n const partialContext = {\n publishable_key: runtime.publishableKey,\n access_token: session.accessToken,\n fetch_impl: options.fetchImpl,\n timeout_ms: timeoutMs,\n };\n const currentUser = await fetchJson({\n context: partialContext,\n url: `${projectBaseUrl}/auth/v1/user`,\n label: 'supabase current-user lookup',\n });\n const userId = isJsonObject(currentUser) ? trimToken(currentUser.id) : null;\n const email = isJsonObject(currentUser)\n ? (trimToken(currentUser.email) ?? trimToken(session.userEmail))\n : trimToken(session.userEmail);\n if (!userId || !email) {\n throw new CliError('Supabase current-user lookup did not return id and email.', {\n code: 'DATASET_MAINTENANCE_CURRENT_USER_INVALID',\n exitCode: 1,\n });\n }\n return {\n project_ref: projectRef,\n rest_base_url: `${projectBaseUrl}/rest/v1`,\n publishable_key: runtime.publishableKey,\n access_token: session.accessToken,\n account: {\n user_id: userId,\n email,\n session_source: session.source,\n },\n fetch_impl: options.fetchImpl,\n timeout_ms: timeoutMs,\n };\n}\n\nexport async function fetchMaintenanceExactRows(options: {\n context: DatasetMaintenanceRemoteContext;\n table: DatasetMaintenanceScanTable;\n id: string;\n version: string;\n includeJson?: boolean;\n}): Promise<{ rows: DatasetMaintenanceRemoteRow[]; source_url: string }> {\n const url = new URL(`${options.context.rest_base_url}/${options.table}`);\n url.searchParams.set('select', selectForTable(options.table, options.includeJson));\n url.searchParams.set('id', `eq.${options.id}`);\n url.searchParams.set('version', `eq.${options.version}`);\n url.searchParams.set('limit', '2');\n const sourceUrl = url.toString();\n const body = await fetchJson({\n context: options.context,\n url: sourceUrl,\n label: `${options.table} exact maintenance lookup`,\n });\n return {\n rows: normalizeRemoteRows(options.table, body, sourceUrl, options.includeJson),\n source_url: sourceUrl,\n };\n}\n\nexport async function fetchMaintenanceAccountRows(options: {\n context: DatasetMaintenanceRemoteContext;\n userId: string;\n pageSize?: number;\n}): Promise<{\n rows: DatasetMaintenanceRemoteRow[];\n source_urls: string[];\n completeness: DatasetMaintenanceSnapshotCompleteness<DatasetMaintenanceScanTable>;\n}> {\n const pageSize = normalizeMaintenancePageSize(options.pageSize);\n const tableResults: Array<{\n table: DatasetMaintenanceScanTable;\n rows: DatasetMaintenanceRemoteRow[];\n source_urls: string[];\n completeness: Awaited<ReturnType<typeof fetchCompletePostgrestPages>>['completeness'];\n }> = [];\n for (const table of MAINTENANCE_SCAN_TABLES) {\n const result = await fetchCompletePostgrestPages({\n table,\n requestedPageSize: pageSize,\n rowIdentity: (row: DatasetMaintenanceRemoteRow) => `${row.id}\\u0000${row.version}`,\n fetchPage: async (offset) => {\n const url = new URL(`${options.context.rest_base_url}/${table}`);\n url.searchParams.set('select', selectForTable(table));\n url.searchParams.set('user_id', `eq.${options.userId}`);\n url.searchParams.set('order', 'id.asc,version.asc');\n url.searchParams.set('limit', String(pageSize));\n url.searchParams.set('offset', String(offset));\n const sourceUrl = url.toString();\n const response = await fetchJsonResponse({\n context: options.context,\n url: sourceUrl,\n init: { headers: { Prefer: 'count=exact' } },\n label: `${table} account maintenance snapshot`,\n });\n const rows = normalizeRemoteRows(table, response.body, sourceUrl);\n if (rows.some((row) => row.user_id !== options.userId)) {\n throw new CliError(`Remote ${table} snapshot contained a foreign account row.`, {\n code: 'DATASET_MAINTENANCE_REMOTE_ROW_INVALID',\n exitCode: 1,\n });\n }\n return {\n rows,\n source_url: sourceUrl,\n content_range: response.headers.get('content-range'),\n };\n },\n });\n tableResults.push({ table, ...result });\n }\n return {\n rows: tableResults.flatMap((result) => result.rows),\n source_urls: tableResults.flatMap((result) => result.source_urls),\n completeness: buildSnapshotCompleteness({\n tables: MAINTENANCE_SCAN_TABLES,\n requestedPageSize: pageSize,\n results: tableResults,\n }),\n };\n}\n\nexport async function fetchMaintenanceAccountTableRows(options: {\n context: DatasetMaintenanceRemoteContext;\n userId: string;\n table: DatasetMaintenanceScanTable;\n stateCode?: number;\n includeJson?: boolean;\n pageSize?: number;\n}): Promise<{\n rows: DatasetMaintenanceRemoteRow[];\n source_urls: string[];\n completeness: DatasetMaintenanceTableCompleteness;\n}> {\n const pageSize = normalizeMaintenancePageSize(options.pageSize);\n return fetchCompletePostgrestPages({\n table: options.table,\n requestedPageSize: pageSize,\n rowIdentity: (row: DatasetMaintenanceRemoteRow) => `${row.id}\\u0000${row.version}`,\n fetchPage: async (offset) => {\n const url = new URL(`${options.context.rest_base_url}/${options.table}`);\n url.searchParams.set('select', selectForTable(options.table, options.includeJson));\n url.searchParams.set('user_id', `eq.${options.userId}`);\n if (options.stateCode !== undefined) {\n url.searchParams.set('state_code', `eq.${options.stateCode}`);\n }\n url.searchParams.set('order', 'id.asc,version.asc');\n url.searchParams.set('limit', String(pageSize));\n url.searchParams.set('offset', String(offset));\n const sourceUrl = url.toString();\n const response = await fetchJsonResponse({\n context: options.context,\n url: sourceUrl,\n init: { headers: { Prefer: 'count=exact' } },\n label: `${options.table} account maintenance snapshot`,\n });\n const rows = normalizeRemoteRows(\n options.table,\n response.body,\n sourceUrl,\n options.includeJson,\n );\n if (\n rows.some(\n (row) =>\n row.user_id !== options.userId ||\n (options.stateCode !== undefined && row.state_code !== options.stateCode),\n )\n ) {\n throw new CliError(`Remote ${options.table} snapshot violated the account/state fence.`, {\n code: 'DATASET_MAINTENANCE_REMOTE_ROW_INVALID',\n exitCode: 1,\n });\n }\n return {\n rows,\n source_url: sourceUrl,\n content_range: response.headers.get('content-range'),\n };\n },\n });\n}\n\nasync function invokeMaintenanceRpc(options: {\n context: DatasetMaintenanceRemoteContext;\n rpc:\n | 'cmd_dataset_save_draft'\n | 'cmd_dataset_delete'\n | 'cmd_dataset_alias_plan_guarded'\n | 'cmd_dataset_alias_execution_preflight_guarded'\n | 'cmd_dataset_alias_execution_gate_guarded'\n | 'cmd_dataset_alias_execution_admit_guarded'\n | 'cmd_dataset_alias_execution_read'\n | 'cmd_dataset_derivative_rebuild_snapshot'\n | 'cmd_dataset_derivative_rebuild_plan_guarded'\n | 'cmd_dataset_derivative_rebuild_read'\n | 'cmd_dataset_flow_identity_capture_attest_guarded'\n | 'cmd_dataset_flow_identity_scope_preflight_guarded'\n | 'cmd_dataset_flow_identity_scope_lookup'\n | 'cmd_dataset_flow_identity_scope_recover_guarded'\n | 'cmd_dataset_flow_identity_process_rewrite_guarded'\n | 'cmd_dataset_flow_identity_scope_read'\n | 'cmd_dataset_flow_identity_scope_finalize_guarded';\n body: JsonObject;\n minimumTimeoutMs?: number;\n allowDomainFailure?: boolean;\n}): Promise<JsonObject> {\n const url = `${options.context.rest_base_url}/rpc/${options.rpc}`;\n const redactResponseDetails = options.rpc.startsWith('cmd_dataset_flow_identity_');\n const body = await fetchJson({\n context: {\n ...options.context,\n timeout_ms: Math.max(options.context.timeout_ms, options.minimumTimeoutMs ?? 0),\n },\n url,\n init: {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(options.body),\n },\n label: options.rpc,\n redactResponseDetails,\n });\n if (\n redactResponseDetails &&\n isJsonObject(body) &&\n body.ok !== true &&\n Object.hasOwn(body, 'execution_permit')\n ) {\n throw new CliError(`${options.rpc} returned an invalid rejection envelope.`, {\n code: 'DATASET_MAINTENANCE_RPC_FAILED',\n exitCode: 1,\n details: { rpc: options.rpc, response_redacted: true },\n });\n }\n if (\n !isJsonObject(body) ||\n (body.ok !== true &&\n !(options.allowDomainFailure === true && isMaintenanceRpcDomainFailure(body)))\n ) {\n throw new CliError(`${options.rpc} returned an unexpected response.`, {\n code: 'DATASET_MAINTENANCE_RPC_FAILED',\n exitCode: 1,\n details: redactResponseDetails ? { rpc: options.rpc, response_redacted: true } : body,\n });\n }\n return body;\n}\n\nexport type MaintenanceRpcDomainFailure = JsonObject & {\n ok: false;\n code: string;\n status: string | number;\n};\n\nexport function isMaintenanceRpcDomainFailure(\n value: unknown,\n): value is MaintenanceRpcDomainFailure {\n return Boolean(\n isJsonObject(value) &&\n value.ok === false &&\n typeof value.code === 'string' &&\n value.code.trim() &&\n ((typeof value.status === 'number' && Number.isSafeInteger(value.status)) ||\n (typeof value.status === 'string' && value.status.trim())),\n );\n}\n\nexport async function preflightMaintenanceAliasExecution(options: {\n context: DatasetMaintenanceRemoteContext;\n request: JsonObject;\n}): Promise<JsonObject> {\n return invokeMaintenanceRpc({\n context: options.context,\n rpc: 'cmd_dataset_alias_execution_preflight_guarded',\n body: { p_request: options.request },\n minimumTimeoutMs: 90_000,\n });\n}\n\nexport async function admitMaintenanceAliasExecution(options: {\n context: DatasetMaintenanceRemoteContext;\n request: JsonObject;\n}): Promise<JsonObject> {\n return invokeMaintenanceRpc({\n context: options.context,\n rpc: 'cmd_dataset_alias_execution_admit_guarded',\n body: { p_request: options.request },\n minimumTimeoutMs: 90_000,\n });\n}\n\nexport async function captureMaintenanceAliasExecutionGate(options: {\n context: DatasetMaintenanceRemoteContext;\n requestId: string;\n preflightToken: string;\n gateName: 'primary_support_plan' | 'execution_unused' | 'derivative_quiescence';\n}): Promise<JsonObject> {\n return invokeMaintenanceRpc({\n context: options.context,\n rpc: 'cmd_dataset_alias_execution_gate_guarded',\n body: {\n p_request_id: options.requestId,\n p_preflight_token: options.preflightToken,\n p_gate_name: options.gateName,\n },\n minimumTimeoutMs: 90_000,\n });\n}\n\nexport async function readMaintenanceAliasExecution(options: {\n context: DatasetMaintenanceRemoteContext;\n requestId: string;\n}): Promise<JsonObject> {\n return invokeMaintenanceRpc({\n context: options.context,\n rpc: 'cmd_dataset_alias_execution_read',\n body: { p_request_id: options.requestId },\n minimumTimeoutMs: 90_000,\n });\n}\n\nfunction derivativeSelectForTable(table: 'flows' | 'processes'): string {\n void table;\n return 'id,version,user_id,state_code,modified_at,json,json_ordered,extracted_text,extracted_md,embedding_ft,embedding_ft_at';\n}\n\nexport async function fetchMaintenanceDerivativeTargetRows(options: {\n context: DatasetMaintenanceRemoteContext;\n targets: Array<{ table: 'flows' | 'processes'; id: string; version: string }>;\n concurrency?: number;\n}): Promise<{ rows: DatasetMaintenanceDerivativeRemoteRow[]; source_urls: string[] }> {\n const concurrency = options.concurrency ?? 5;\n if (!Number.isInteger(concurrency) || concurrency < 1 || concurrency > 10) {\n throw new CliError('Derivative target read concurrency must be an integer between 1 and 10.', {\n code: 'DATASET_MAINTENANCE_DERIVATIVE_READ_CONCURRENCY_INVALID',\n exitCode: 2,\n });\n }\n if (options.targets.length > 50) {\n throw new CliError('Protected derivative target read is bounded to 50 rows.', {\n code: 'DATASET_MAINTENANCE_DERIVATIVE_TARGET_COUNT_INVALID',\n exitCode: 2,\n });\n }\n const rows: DatasetMaintenanceDerivativeRemoteRow[] = [];\n const sourceUrls: string[] = [];\n for (let offset = 0; offset < options.targets.length; offset += concurrency) {\n const chunk = options.targets.slice(offset, offset + concurrency);\n const results = await Promise.all(\n chunk.map(async (target) => {\n const url = new URL(`${options.context.rest_base_url}/${target.table}`);\n url.searchParams.set('select', derivativeSelectForTable(target.table));\n url.searchParams.set('id', `eq.${target.id}`);\n url.searchParams.set('version', `eq.${target.version}`);\n url.searchParams.set('limit', '2');\n const sourceUrl = url.toString();\n const body = await fetchJson({\n context: options.context,\n url: sourceUrl,\n label: `${target.table} protected derivative lookup`,\n });\n if (!Array.isArray(body) || body.length !== 1 || !isJsonObject(body[0])) {\n throw new CliError('Protected derivative target was missing, duplicated, or malformed.', {\n code: 'DATASET_MAINTENANCE_DERIVATIVE_TARGET_READ_INVALID',\n exitCode: 1,\n details: target,\n });\n }\n const row = body[0];\n const id = trimToken(row.id);\n const version = trimToken(row.version);\n const userId = trimToken(row.user_id);\n const stateCode = normalizeStateCode(row.state_code);\n if (id !== target.id || version !== target.version || !userId || stateCode === null) {\n throw new CliError('Protected derivative target identity was malformed.', {\n code: 'DATASET_MAINTENANCE_DERIVATIVE_TARGET_READ_INVALID',\n exitCode: 1,\n details: target,\n });\n }\n return {\n row: {\n table: target.table,\n id,\n version,\n user_id: userId,\n state_code: stateCode,\n raw: row,\n } satisfies DatasetMaintenanceDerivativeRemoteRow,\n sourceUrl,\n };\n }),\n );\n rows.push(...results.map((result) => result.row));\n sourceUrls.push(...results.map((result) => result.sourceUrl));\n }\n return { rows, source_urls: sourceUrls };\n}\n\nexport async function fetchMaintenanceDerivativeSnapshot(options: {\n context: DatasetMaintenanceRemoteContext;\n table?: 'flows' | 'processes';\n id: string;\n version: string;\n}): Promise<JsonObject> {\n return invokeMaintenanceRpc({\n context: options.context,\n rpc: 'cmd_dataset_derivative_rebuild_snapshot',\n body: {\n p_table: options.table ?? 'processes',\n p_id: options.id,\n p_version: options.version,\n },\n });\n}\n\nexport async function applyMaintenanceDerivativeRebuild(options: {\n context: DatasetMaintenanceRemoteContext;\n plan: JsonObject;\n}): Promise<JsonObject> {\n return invokeMaintenanceRpc({\n context: options.context,\n rpc: 'cmd_dataset_derivative_rebuild_plan_guarded',\n body: { p_plan: options.plan },\n });\n}\n\nexport async function readMaintenanceDerivativeRebuild(options: {\n context: DatasetMaintenanceRemoteContext;\n requestId: string;\n}): Promise<JsonObject> {\n return invokeMaintenanceRpc({\n context: options.context,\n rpc: 'cmd_dataset_derivative_rebuild_read',\n body: { p_request_id: options.requestId },\n });\n}\n\nexport async function applyMaintenanceAliasPlan(options: {\n context: DatasetMaintenanceRemoteContext;\n plan: JsonObject;\n}): Promise<JsonObject> {\n return invokeMaintenanceRpc({\n context: options.context,\n rpc: 'cmd_dataset_alias_plan_guarded',\n body: { p_plan: options.plan },\n });\n}\n\nexport async function preflightMaintenanceFlowIdentityScope(options: {\n context: DatasetMaintenanceRemoteContext;\n request: JsonObject;\n}): Promise<JsonObject> {\n const body = assertFlowIdentityWireJson({ p_request: options.request });\n return invokeMaintenanceRpc({\n context: options.context,\n rpc: 'cmd_dataset_flow_identity_scope_preflight_guarded',\n body,\n minimumTimeoutMs: 130_000,\n allowDomainFailure: true,\n });\n}\n\nexport async function lookupMaintenanceFlowIdentityScope(options: {\n context: DatasetMaintenanceRemoteContext;\n request: JsonObject;\n}): Promise<JsonObject> {\n const body = assertFlowIdentityWireJson({ p_request: options.request });\n return invokeMaintenanceRpc({\n context: options.context,\n rpc: 'cmd_dataset_flow_identity_scope_lookup',\n body,\n minimumTimeoutMs: 90_000,\n allowDomainFailure: true,\n });\n}\n\nexport async function rewriteMaintenanceFlowIdentityProcess(options: {\n context: DatasetMaintenanceRemoteContext;\n scopeId: string;\n request: JsonObject;\n authorization: JsonObject;\n}): Promise<JsonObject> {\n const body = assertFlowIdentityWireJson({\n p_scope_id: options.scopeId,\n p_request: options.request,\n p_authorization: options.authorization,\n });\n return invokeMaintenanceRpc({\n context: options.context,\n rpc: 'cmd_dataset_flow_identity_process_rewrite_guarded',\n body,\n minimumTimeoutMs: 90_000,\n allowDomainFailure: true,\n });\n}\n\nexport async function readMaintenanceFlowIdentityScope(options: {\n context: DatasetMaintenanceRemoteContext;\n scopeId: string;\n}): Promise<JsonObject> {\n const body = assertFlowIdentityWireJson({ p_scope_id: options.scopeId });\n return invokeMaintenanceRpc({\n context: options.context,\n rpc: 'cmd_dataset_flow_identity_scope_read',\n body,\n minimumTimeoutMs: 90_000,\n allowDomainFailure: true,\n });\n}\n\nexport async function finalizeMaintenanceFlowIdentityScope(options: {\n context: DatasetMaintenanceRemoteContext;\n scopeId: string;\n request: JsonObject;\n authorization: JsonObject;\n}): Promise<JsonObject> {\n const body = assertFlowIdentityWireJson({\n p_scope_id: options.scopeId,\n p_request: options.request,\n p_authorization: options.authorization,\n });\n return invokeMaintenanceRpc({\n context: options.context,\n rpc: 'cmd_dataset_flow_identity_scope_finalize_guarded',\n body,\n minimumTimeoutMs: 190_000,\n allowDomainFailure: true,\n });\n}\n\nexport async function recoverMaintenanceFlowIdentityScope(options: {\n context: DatasetMaintenanceRemoteContext;\n scopeId: string;\n request: JsonObject;\n}): Promise<JsonObject> {\n const body = assertFlowIdentityWireJson({\n p_scope_id: options.scopeId,\n p_request: options.request,\n });\n return invokeMaintenanceRpc({\n context: options.context,\n rpc: 'cmd_dataset_flow_identity_scope_recover_guarded',\n body,\n minimumTimeoutMs: 130_000,\n allowDomainFailure: true,\n });\n}\n\nexport async function attestMaintenanceFlowIdentityCapture(options: {\n context: DatasetMaintenanceRemoteContext;\n request: JsonObject;\n}): Promise<JsonObject> {\n const body = assertFlowIdentityWireJson({ p_request: options.request });\n return invokeMaintenanceRpc({\n context: options.context,\n rpc: 'cmd_dataset_flow_identity_capture_attest_guarded',\n body,\n minimumTimeoutMs: 190_000,\n allowDomainFailure: true,\n });\n}\n\nexport async function saveDraftMaintenanceRow(options: {\n context: DatasetMaintenanceRemoteContext;\n table: DatasetMaintenanceMutableTable;\n id: string;\n version: string;\n payload: JsonObject;\n modelId: string | null;\n ruleVerification: boolean | null;\n audit: JsonObject;\n}): Promise<JsonObject> {\n return invokeMaintenanceRpc({\n context: options.context,\n rpc: 'cmd_dataset_save_draft',\n body: {\n p_table: options.table,\n p_id: options.id,\n p_version: options.version,\n p_json_ordered: options.payload,\n p_model_id: options.modelId,\n p_rule_verification: options.ruleVerification,\n p_audit: options.audit,\n },\n });\n}\n\nexport async function deleteMaintenanceRow(options: {\n context: DatasetMaintenanceRemoteContext;\n table: DatasetMaintenanceMutableTable;\n id: string;\n version: string;\n audit: JsonObject;\n}): Promise<JsonObject> {\n return invokeMaintenanceRpc({\n context: options.context,\n rpc: 'cmd_dataset_delete',\n body: {\n p_table: options.table,\n p_id: options.id,\n p_version: options.version,\n p_audit: options.audit,\n },\n });\n}\n\nexport const __testInternals = {\n fetchJson,\n fetchJsonResponse,\n normalizeRemoteRow,\n normalizeRemoteRows,\n selectForTable,\n};\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/lib/http.ts"],"names":[],"mappings":"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","sourcesContent":["import { CliError } from './errors.js';\n\ntype JsonObject = Record<string, unknown>;\n\nexport type ResponseLike = {\n ok: boolean;\n status: number;\n headers: {\n get(name: string): string | null;\n };\n text(): Promise<string>;\n};\n\nexport type FetchLike = (input: string, init?: RequestInit) => Promise<ResponseLike>;\n\nfunction isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nasync function parseResponse(response: ResponseLike, url: string): Promise<unknown> {\n const rawText = await response.text();\n const contentType = response.headers.get('content-type') ?? '';\n\n if (!response.ok) {\n throw new CliError(`HTTP ${response.status} returned from ${url}`, {\n code: 'REMOTE_REQUEST_FAILED',\n exitCode: 1,\n details: rawText,\n });\n }\n\n if (contentType.includes('application/json')) {\n try {\n return JSON.parse(rawText);\n } catch (error) {\n throw new CliError(`Remote response was not valid JSON for ${url}`, {\n code: 'REMOTE_INVALID_JSON',\n exitCode: 1,\n details: String(error),\n });\n }\n }\n\n return rawText;\n}\n\nexport function requireRemoteOkPayload(payload: unknown, url: string): unknown {\n if (!isRecord(payload) || payload.ok !== false) {\n return payload;\n }\n\n const code =\n typeof payload.code === 'string' && payload.code.trim()\n ? payload.code.trim()\n : 'REMOTE_APPLICATION_ERROR';\n const message =\n typeof payload.message === 'string' && payload.message.trim()\n ? payload.message.trim()\n : `Remote application response returned ok:false for ${url}`;\n\n throw new CliError(message, {\n code,\n exitCode: 1,\n details: payload,\n });\n}\n\nexport async function postJson(options: {\n url: string;\n headers: Record<string, string>;\n body: unknown;\n timeoutMs: number;\n fetchImpl: FetchLike;\n}): Promise<unknown> {\n const signal = AbortSignal.timeout(options.timeoutMs);\n const response = await options.fetchImpl(options.url, {\n method: 'POST',\n headers: options.headers,\n body: JSON.stringify(options.body),\n signal,\n });\n\n return parseResponse(response, options.url);\n}\n\nexport async function getJson(options: {\n url: string;\n headers: Record<string, string>;\n timeoutMs: number;\n fetchImpl: FetchLike;\n}): Promise<unknown> {\n const signal = AbortSignal.timeout(options.timeoutMs);\n const response = await options.fetchImpl(options.url, {\n method: 'GET',\n headers: options.headers,\n signal,\n });\n\n return parseResponse(response, options.url);\n}\n"]}
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../../../src/lib/http.ts"],"names":[],"mappings":"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","sourcesContent":["import { CliError } from './errors.js';\n\ntype JsonObject = Record<string, unknown>;\n\nexport type ResponseLike = {\n ok: boolean;\n status: number;\n headers: {\n get(name: string): string | null;\n };\n text(): Promise<string>;\n arrayBuffer?(): Promise<ArrayBuffer>;\n};\n\nexport type FetchLike = (input: string, init?: RequestInit) => Promise<ResponseLike>;\n\nfunction isRecord(value: unknown): value is JsonObject {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nasync function parseResponse(response: ResponseLike, url: string): Promise<unknown> {\n const rawText = await response.text();\n const contentType = response.headers.get('content-type') ?? '';\n\n if (!response.ok) {\n throw new CliError(`HTTP ${response.status} returned from ${url}`, {\n code: 'REMOTE_REQUEST_FAILED',\n exitCode: 1,\n details: rawText,\n });\n }\n\n if (contentType.includes('application/json')) {\n try {\n return JSON.parse(rawText);\n } catch (error) {\n throw new CliError(`Remote response was not valid JSON for ${url}`, {\n code: 'REMOTE_INVALID_JSON',\n exitCode: 1,\n details: String(error),\n });\n }\n }\n\n return rawText;\n}\n\nexport function requireRemoteOkPayload(payload: unknown, url: string): unknown {\n if (!isRecord(payload) || payload.ok !== false) {\n return payload;\n }\n\n const code =\n typeof payload.code === 'string' && payload.code.trim()\n ? payload.code.trim()\n : 'REMOTE_APPLICATION_ERROR';\n const message =\n typeof payload.message === 'string' && payload.message.trim()\n ? payload.message.trim()\n : `Remote application response returned ok:false for ${url}`;\n\n throw new CliError(message, {\n code,\n exitCode: 1,\n details: payload,\n });\n}\n\nexport async function postJson(options: {\n url: string;\n headers: Record<string, string>;\n body: unknown;\n timeoutMs: number;\n fetchImpl: FetchLike;\n}): Promise<unknown> {\n const signal = AbortSignal.timeout(options.timeoutMs);\n const response = await options.fetchImpl(options.url, {\n method: 'POST',\n headers: options.headers,\n body: JSON.stringify(options.body),\n signal,\n });\n\n return parseResponse(response, options.url);\n}\n\nexport async function getJson(options: {\n url: string;\n headers: Record<string, string>;\n timeoutMs: number;\n fetchImpl: FetchLike;\n}): Promise<unknown> {\n const signal = AbortSignal.timeout(options.timeoutMs);\n const response = await options.fetchImpl(options.url, {\n method: 'GET',\n headers: options.headers,\n signal,\n });\n\n return parseResponse(response, options.url);\n}\n"]}