@abloatai/transaction 0.58.0 → 0.59.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/dist/client/ablo.d.ts +3 -4
  2. package/dist/client/ablo.d.ts.map +1 -1
  3. package/dist/client/ablo.js.map +1 -1
  4. package/dist/client/surface.d.ts +15 -0
  5. package/dist/client/surface.d.ts.map +1 -0
  6. package/dist/client/surface.js +29 -0
  7. package/dist/client/surface.js.map +1 -0
  8. package/dist/pricing.d.ts +7 -1
  9. package/dist/pricing.d.ts.map +1 -1
  10. package/dist/pricing.js +16 -2
  11. package/dist/pricing.js.map +1 -1
  12. package/dist/schema/ddl.d.ts.map +1 -1
  13. package/dist/schema/ddl.js +1 -1
  14. package/dist/schema/ddl.js.map +1 -1
  15. package/dist/schema/deployment/backfill.d.ts +44 -0
  16. package/dist/schema/deployment/backfill.d.ts.map +1 -0
  17. package/dist/schema/deployment/backfill.js +57 -0
  18. package/dist/schema/deployment/backfill.js.map +1 -0
  19. package/dist/schema/deployment/contracts.d.ts +526 -0
  20. package/dist/schema/deployment/contracts.d.ts.map +1 -0
  21. package/dist/schema/deployment/contracts.js +77 -0
  22. package/dist/schema/deployment/contracts.js.map +1 -0
  23. package/dist/schema/deployment/fingerprint.d.ts +3 -0
  24. package/dist/schema/deployment/fingerprint.d.ts.map +1 -0
  25. package/dist/schema/deployment/fingerprint.js +18 -0
  26. package/dist/schema/deployment/fingerprint.js.map +1 -0
  27. package/dist/schema/deployment/index.d.ts +18 -0
  28. package/dist/schema/deployment/index.d.ts.map +1 -0
  29. package/dist/schema/deployment/index.js +120 -0
  30. package/dist/schema/deployment/index.js.map +1 -0
  31. package/dist/schema/deployment/postgresCatalog.d.ts +39 -0
  32. package/dist/schema/deployment/postgresCatalog.d.ts.map +1 -0
  33. package/dist/schema/deployment/postgresCatalog.js +86 -0
  34. package/dist/schema/deployment/postgresCatalog.js.map +1 -0
  35. package/dist/schema/deployment/reconcile.d.ts +20 -0
  36. package/dist/schema/deployment/reconcile.d.ts.map +1 -0
  37. package/dist/schema/deployment/reconcile.js +318 -0
  38. package/dist/schema/deployment/reconcile.js.map +1 -0
  39. package/dist/schema/deployment/sequence.d.ts +4 -0
  40. package/dist/schema/deployment/sequence.d.ts.map +1 -0
  41. package/dist/schema/deployment/sequence.js +71 -0
  42. package/dist/schema/deployment/sequence.js.map +1 -0
  43. package/dist/schema/index.d.ts +1 -0
  44. package/dist/schema/index.d.ts.map +1 -1
  45. package/dist/schema/index.js +4 -0
  46. package/dist/schema/index.js.map +1 -1
  47. package/package.json +1 -1
  48. package/src/client/ablo.ts +2 -2
  49. package/src/client/surface.ts +50 -0
  50. package/src/pricing.ts +16 -2
  51. package/src/schema/ddl.ts +3 -1
  52. package/src/schema/deployment/backfill.ts +88 -0
  53. package/src/schema/deployment/contracts.ts +119 -0
  54. package/src/schema/deployment/fingerprint.ts +13 -0
  55. package/src/schema/deployment/index.ts +132 -0
  56. package/src/schema/deployment/postgresCatalog.ts +131 -0
  57. package/src/schema/deployment/reconcile.ts +335 -0
  58. package/src/schema/deployment/sequence.ts +85 -0
  59. package/src/schema/index.ts +5 -0
@@ -0,0 +1,318 @@
1
+ import { auditSchemaAccessPolicies } from '../audit.js';
2
+ import { camelToSnake, sqlType } from '../ddl.js';
3
+ import { classifyMigration, diffSchema, unresolvedBlockers } from '../diff.js';
4
+ import { resolveTenancy, tenancyColumn } from '../tenancy.js';
5
+ const id = (...parts) => parts.filter(Boolean).join(':');
6
+ function signalFinding(signal, direction) {
7
+ const destructive = ['drop_model', 'drop_field', 'risky_cast', 'lossy_recreate', 'enum_value_removed'].includes(signal.code);
8
+ return {
9
+ id: id(direction, signal.code, signal.model, signal.field), code: signal.code,
10
+ category: destructive ? 'destructive_contract' : 'data_movement', severity: destructive ? 'error' : 'blocker',
11
+ direction, phase: destructive ? 'contract' : 'backfill', owner: 'application_migration', model: signal.model,
12
+ ...(signal.field ? { field: signal.field } : {}), message: signal.detail,
13
+ action: destructive ? 'Schedule this contract change after compatibility and data verification pass.' : 'Provide and verify a backfill before making this field required.',
14
+ };
15
+ }
16
+ function stepFinding(step) {
17
+ if (step.kind === 'drop_field' || step.kind === 'drop_model')
18
+ return null;
19
+ if (step.kind === 'create_model')
20
+ return {
21
+ id: id('source_to_active', step.kind, step.model), code: step.kind, category: 'compatibility', severity: 'info', direction: 'source_to_active',
22
+ phase: 'expand', owner: 'ablo', model: step.model, from: null, to: step.tableName,
23
+ message: `Model "${step.model}" is not active on the target plane.`, action: 'Expand its physical contract, then activate the candidate schema.',
24
+ };
25
+ if (step.kind === 'add_field')
26
+ return {
27
+ id: id('source_to_active', step.kind, step.model, step.field), code: step.kind, category: 'compatibility', severity: step.meta.isOptional ? 'info' : 'blocker', direction: 'source_to_active',
28
+ phase: 'expand', owner: step.meta.isOptional ? 'ablo' : 'application_migration', model: step.model, field: step.field,
29
+ column: step.meta.column ?? camelToSnake(step.field), from: null, to: step.meta.type,
30
+ message: `Field "${step.model}.${step.field}" is not active on the target plane.`,
31
+ action: step.meta.isOptional ? 'Add the nullable column before activating the candidate schema.' : 'Add the column, backfill existing rows, verify it, then enforce the required contract.',
32
+ };
33
+ if (step.kind === 'rename_model')
34
+ return {
35
+ id: id('source_to_active', step.kind, step.from, step.to), code: step.kind, category: 'compatibility', severity: 'warning', direction: 'source_to_active',
36
+ phase: 'dual_write', owner: 'application', model: step.to, from: step.from, to: step.to,
37
+ message: `Model "${step.from}" is renamed to "${step.to}".`, action: 'Verify the rename mapping and compatibility window before activation.',
38
+ };
39
+ if (step.kind === 'rename_field')
40
+ return {
41
+ id: id('source_to_active', step.kind, step.model, step.from, step.to), code: step.kind, category: 'compatibility', severity: 'warning', direction: 'source_to_active',
42
+ phase: 'dual_write', owner: 'application', model: step.model, field: step.to, from: step.from, to: step.to,
43
+ message: `Field "${step.model}.${step.from}" is renamed to "${step.to}".`, action: 'Keep old and new readers/writers compatible through the rename window.',
44
+ };
45
+ return {
46
+ id: id('source_to_active', step.kind, step.model, step.field), code: step.kind, category: 'compatibility', severity: 'warning', direction: 'source_to_active',
47
+ phase: 'dual_write', owner: 'application_migration', model: step.model, field: step.field, from: step.changes,
48
+ message: `Field "${step.model}.${step.field}" changes shape.`, action: 'Apply the ordered physical and compatibility changes, then verify old and current clients.',
49
+ };
50
+ }
51
+ function databaseSatisfiesRequiredField(signal, source, database) {
52
+ if (!database || (signal.code !== 'required_field_added' && signal.code !== 'made_required') || !signal.field)
53
+ return false;
54
+ const model = source.models[signal.model];
55
+ const field = model?.fields[signal.field];
56
+ if (!model || !field || field.isOptional)
57
+ return false;
58
+ const table = database.tables[model.tableName ?? signal.model];
59
+ const column = table?.columns[field.column ?? camelToSnake(signal.field)];
60
+ return column !== undefined &&
61
+ !column.nullable &&
62
+ (column.nullCount === undefined || column.nullCount === null || column.nullCount === 0) &&
63
+ normalizePgType(column.dataType) === sqlType(field.type);
64
+ }
65
+ function databaseSatisfiesRiskyCast(signal, source, database) {
66
+ if (!database || signal.code !== 'risky_cast' || !signal.field)
67
+ return false;
68
+ const model = source.models[signal.model];
69
+ const field = model?.fields[signal.field];
70
+ // A TEXT column does not prove that existing rows satisfy a newly narrowed
71
+ // enum CHECK constraint; the catalog snapshot currently observes type only.
72
+ if (!model || !field || field.type === 'enum')
73
+ return false;
74
+ const table = database.tables[model.tableName ?? signal.model];
75
+ const column = table?.columns[field.column ?? camelToSnake(signal.field)];
76
+ return column !== undefined && normalizePgType(column.dataType) === sqlType(field.type);
77
+ }
78
+ function databasePreservesRemovedApplicationModel(signal, active, source, database) {
79
+ if (!active || !database || database.ownership !== 'application' || signal.code !== 'drop_model')
80
+ return false;
81
+ if (source.models[signal.model])
82
+ return false;
83
+ const activeModel = active.models[signal.model];
84
+ return activeModel !== undefined && database.tables[activeModel.tableName ?? signal.model] !== undefined;
85
+ }
86
+ export function reconcileSourceToActive(active, source, hints = {}, backfills = [], database = null) {
87
+ return reconcileSourceToActiveResult(active, source, hints, backfills, database).findings;
88
+ }
89
+ export function reconcileSourceToActiveResult(active, source, hints = {}, backfills = [], database = null) {
90
+ const steps = diffSchema(active, source, hints);
91
+ const classification = classifyMigration(steps);
92
+ const blockers = unresolvedBlockers(classification, backfills);
93
+ const requiredFieldsVerified = blockers.filter((signal) => databaseSatisfiesRequiredField(signal, source, database));
94
+ const typeCorrectionsVerified = classification.warnings.filter((signal) => databaseSatisfiesRiskyCast(signal, source, database));
95
+ const removedApplicationModelsPreserved = classification.warnings.filter((signal) => databasePreservesRemovedApplicationModel(signal, active, source, database));
96
+ const databaseVerified = new Set([
97
+ ...requiredFieldsVerified,
98
+ ...typeCorrectionsVerified,
99
+ ...removedApplicationModelsPreserved,
100
+ ]);
101
+ const signals = [
102
+ ...blockers.filter((signal) => !databaseVerified.has(signal)),
103
+ ...classification.warnings.filter((signal) => !databaseVerified.has(signal)),
104
+ ].map((signal) => signalFinding(signal, 'source_to_active'));
105
+ // Keep every classified location out of the ordinary step findings, including
106
+ // blockers discharged by observed PostgreSQL evidence. Otherwise a verified
107
+ // required field falls through and is emitted again as an add_field blocker.
108
+ const signalLocations = new Set([...blockers, ...classification.warnings].map(({ model, field }) => `${model}:${field ?? ''}`));
109
+ const ordinary = steps
110
+ .map(stepFinding)
111
+ .filter((finding) => finding !== null)
112
+ .filter((finding) => !signalLocations.has(`${finding.model}:${finding.field ?? ''}`))
113
+ .map((finding) => {
114
+ const hasBackfill = finding.model !== undefined && finding.field !== undefined &&
115
+ backfills.some((backfill) => backfill.model === finding.model && backfill.field === finding.field);
116
+ return hasBackfill && finding.code === 'add_field' && finding.severity === 'blocker'
117
+ ? {
118
+ ...finding,
119
+ severity: 'info',
120
+ phase: 'backfill',
121
+ action: 'Run the declared backfill, verify it completed, then enforce the required contract.',
122
+ }
123
+ : finding;
124
+ });
125
+ const requiredFieldEvidence = requiredFieldsVerified.length === 0 ? [] : [{
126
+ id: 'source_to_active:database_migration_verified',
127
+ code: 'database_migration_verified',
128
+ category: 'data_movement',
129
+ severity: 'info',
130
+ direction: 'source_to_active',
131
+ phase: 'verify',
132
+ owner: database?.ownership === 'ablo' ? 'ablo' : 'application_migration',
133
+ from: { requiredChanges: requiredFieldsVerified.length },
134
+ to: 'satisfied',
135
+ message: `PostgreSQL already enforces ${requiredFieldsVerified.length} required field migration(s) absent from the active artifact.`,
136
+ action: 'No synthetic backfill declaration is needed; preserve the matching non-null columns and activate the reviewed schema.',
137
+ }];
138
+ const typeCorrectionEvidence = typeCorrectionsVerified.length === 0 ? [] : [{
139
+ id: 'source_to_active:database_type_correction_verified',
140
+ code: 'database_type_correction_verified',
141
+ category: 'destructive_contract',
142
+ severity: 'info',
143
+ direction: 'source_to_active',
144
+ phase: 'verify',
145
+ owner: database?.ownership === 'ablo' ? 'ablo' : 'application_migration',
146
+ from: { typeCorrections: typeCorrectionsVerified.length },
147
+ to: 'source_database_alignment',
148
+ message: `PostgreSQL already matches ${typeCorrectionsVerified.length} candidate field type correction(s) that differ from the active artifact.`,
149
+ action: 'No physical cast is needed; activate the reviewed schema and use forward recovery because the prior artifact no longer matches PostgreSQL.',
150
+ }];
151
+ const removedModelEvidence = removedApplicationModelsPreserved.length === 0 ? [] : [{
152
+ id: 'source_to_active:application_model_removal_verified',
153
+ code: 'application_model_removal_verified',
154
+ category: 'compatibility',
155
+ severity: 'warning',
156
+ direction: 'source_to_active',
157
+ phase: 'verify',
158
+ owner: 'application',
159
+ from: { removedModels: removedApplicationModelsPreserved.length },
160
+ to: 'physical_tables_preserved',
161
+ message: `${removedApplicationModelsPreserved.length} model removal(s) only change the served schema; their application-owned PostgreSQL tables remain present.`,
162
+ action: 'Verify no supported client still reads these models, then activate; Ablo will not drop the preserved application tables.',
163
+ }];
164
+ return {
165
+ operations: steps,
166
+ findings: [...signals, ...requiredFieldEvidence, ...typeCorrectionEvidence, ...removedModelEvidence, ...ordinary],
167
+ };
168
+ }
169
+ export function reconcilePolicyIntent(source) {
170
+ return auditSchemaAccessPolicies(source).map((finding) => ({
171
+ id: id('policy', finding.code, finding.model), code: finding.code, category: 'policy_intent', severity: 'blocker', direction: 'source_to_active',
172
+ phase: 'intent', owner: 'application', model: finding.model, message: finding.message, action: finding.fix,
173
+ }));
174
+ }
175
+ function normalizePgType(value) {
176
+ const type = value.toLowerCase();
177
+ if (type.includes('timestamp'))
178
+ return 'TIMESTAMPTZ';
179
+ if (type === 'double precision' || type === 'numeric' || type === 'real' || type.includes('int'))
180
+ return 'DOUBLE PRECISION';
181
+ if (type === 'boolean')
182
+ return 'BOOLEAN';
183
+ if (type === 'json' || type === 'jsonb')
184
+ return 'JSONB';
185
+ return 'TEXT';
186
+ }
187
+ function requiredColumns(model) {
188
+ const orgColumn = tenancyColumn(resolveTenancy(model));
189
+ return [
190
+ { column: 'id', type: 'TEXT', nullable: false, primary: true },
191
+ ...(orgColumn ? [{ column: orgColumn, type: 'TEXT', nullable: false, primary: false }] : []),
192
+ ...Object.entries(model.fields).map(([field, meta]) => ({ field, column: meta.column ?? camelToSnake(field), type: sqlType(meta.type), nullable: meta.isOptional, primary: false })),
193
+ ];
194
+ }
195
+ function physicalFindings(schema, database, direction) {
196
+ const findings = [];
197
+ const physicalOwner = database.ownership === 'ablo' ? 'ablo' : 'application_migration';
198
+ for (const [modelKey, model] of Object.entries(schema.models)) {
199
+ if ((model.plane ?? 'tenant') === 'control')
200
+ continue;
201
+ const tableName = model.tableName ?? modelKey;
202
+ const table = database.tables[tableName];
203
+ if (!table) {
204
+ findings.push({ id: id(direction, 'missing_table', modelKey), code: 'missing_table', category: 'physical_contract', severity: database.ownership === 'ablo' ? 'info' : 'blocker', direction, phase: 'expand', owner: physicalOwner, model: modelKey, from: null, to: tableName, message: `Table "${database.appSchema}.${tableName}" is missing.`, action: database.ownership === 'ablo' ? 'Create it through the reviewed Ablo expand plan.' : 'Create it through the application migration owner, then re-run the plan.' });
205
+ continue;
206
+ }
207
+ for (const expected of requiredColumns(model)) {
208
+ const actual = table.columns[expected.column];
209
+ const base = [direction, modelKey, expected.field, expected.column];
210
+ if (!actual) {
211
+ findings.push({ id: id(...base, 'missing_column'), code: expected.primary ? 'missing_identity_column' : 'missing_column', category: 'physical_contract', severity: database.ownership === 'ablo' ? 'info' : 'blocker', direction, phase: 'expand', owner: physicalOwner, model: modelKey, ...(expected.field ? { field: expected.field } : {}), column: expected.column, from: null, to: expected.type, message: `Column "${tableName}.${expected.column}" is missing.`, action: database.ownership === 'ablo' ? 'Create it through the reviewed Ablo expand plan.' : expected.primary ? 'Add or explicitly map a stable row identity and enforce uniqueness and non-nullness.' : 'Add the column through the application migration owner, then re-run the plan.' });
212
+ continue;
213
+ }
214
+ if (expected.primary && !actual.primary && !actual.unique)
215
+ findings.push({ id: id(...base, 'identity_not_unique'), code: 'identity_not_unique', category: 'physical_contract', severity: 'blocker', direction, phase: 'expand', owner: physicalOwner, model: modelKey, column: expected.column, from: { primary: actual.primary, unique: actual.unique }, to: { primary: true }, message: `Column "${tableName}.${expected.column}" is present but is not a usable unique row identity.`, action: 'Verify uniqueness and non-nullness, then add a primary-key or unique constraint.' });
216
+ const actualType = normalizePgType(actual.dataType);
217
+ if (actualType !== expected.type)
218
+ findings.push({ id: id(...base, 'column_type_mismatch'), code: 'column_type_mismatch', category: 'physical_contract', severity: 'blocker', direction, phase: 'expand', owner: physicalOwner, model: modelKey, ...(expected.field ? { field: expected.field } : {}), column: expected.column, from: actualType, to: expected.type, message: `Column "${tableName}.${expected.column}" is ${actualType}; the schema expects ${expected.type}.`, action: 'Review and apply a safe type migration before activation.' });
219
+ if (!expected.nullable && actual.nullable)
220
+ findings.push({ id: id(...base, 'column_nullable'), code: 'column_nullable', category: 'data_movement', severity: 'blocker', direction, phase: 'backfill', owner: physicalOwner, model: modelKey, ...(expected.field ? { field: expected.field } : {}), column: expected.column, from: 'nullable', to: 'required', message: `Column "${tableName}.${expected.column}" is nullable; the schema requires a value.`, action: 'Backfill NULL rows, verify none remain, then enforce NOT NULL.' });
221
+ if (expected.column === tenancyColumn(resolveTenancy(model)) && actual.nullCount !== undefined && actual.nullCount !== null && actual.nullCount > 0) {
222
+ findings.push({ id: id(...base, 'unstamped_tenancy_rows'), code: 'unstamped_tenancy_rows', category: 'data_movement', severity: 'blocker', direction, phase: 'backfill', owner: 'application_migration', model: modelKey, column: expected.column, from: actual.nullCount, to: 0, message: `Table "${tableName}" has ${actual.nullCount >= 501 ? '500+' : actual.nullCount} row(s) with no "${expected.column}" routing value.`, action: 'Backfill the routing value, verify zero NULL rows, then run `ablo connect resnapshot`.' });
223
+ }
224
+ }
225
+ for (const column of ['created_by', 'created_at', 'updated_at'])
226
+ if (!table.columns[column])
227
+ findings.push({ id: id(direction, modelKey, column, 'base_column_degraded'), code: 'base_column_degraded', category: 'advisory', severity: 'warning', direction, phase: 'intent', owner: 'application', model: modelKey, column, message: `Table "${tableName}" has no "${column}"; audit or ordering metadata may be reduced.`, action: 'Declare and add this field only if the application needs that metadata.' });
228
+ for (const [field, meta] of Object.entries(model.fields))
229
+ if (meta.isIndexed) {
230
+ const column = meta.column ?? camelToSnake(field);
231
+ const index = table.indexes?.find((candidate) => candidate.columns.length === 1 && candidate.columns[0] === column && candidate.valid && candidate.ready);
232
+ if (!index)
233
+ findings.push({ id: id(direction, modelKey, field, 'declared_index_missing'), code: 'declared_index_missing', category: 'physical_contract', severity: 'blocker', direction, phase: 'expand', owner: physicalOwner, model: modelKey, field, column, message: `Field "${modelKey}.${field}" is declared indexed, but "${tableName}.${column}" has no ready, valid index.`, action: 'Create the index concurrently, wait until it is ready and valid, then re-run the plan.' });
234
+ }
235
+ for (const relation of Object.values(model.relations))
236
+ if (relation.type === 'belongsTo') {
237
+ const target = schema.models[relation.target];
238
+ const expectedTable = target?.tableName ?? relation.target;
239
+ const constraint = table.foreignKeys?.find((foreignKey) => foreignKey.columns.length === 1 && foreignKey.columns[0] === relation.foreignKeyColumn && foreignKey.referencedTable === expectedTable);
240
+ if (!constraint)
241
+ findings.push({ id: id(direction, modelKey, relation.foreignKey, 'foreign_key_unverified'), code: 'foreign_key_unverified', category: 'advisory', severity: 'warning', direction, phase: 'verify', owner: physicalOwner, model: modelKey, field: relation.foreignKey, column: relation.foreignKeyColumn, message: `Relation "${modelKey}.${relation.foreignKey}" has no observed PostgreSQL foreign key to "${expectedTable}".`, action: 'If the application database owns relational integrity, add the foreign key NOT VALID and validate it after existing rows are clean.' });
242
+ else if (!constraint.validated)
243
+ findings.push({ id: id(direction, modelKey, relation.foreignKey, 'foreign_key_not_validated'), code: 'foreign_key_not_validated', category: 'physical_contract', severity: 'warning', direction, phase: 'verify', owner: physicalOwner, model: modelKey, field: relation.foreignKey, column: relation.foreignKeyColumn, message: `Foreign key "${constraint.name}" exists but has not validated existing rows.`, action: 'Run VALIDATE CONSTRAINT under the verification gate before relying on it.' });
244
+ }
245
+ if (database.ownership === 'application' && table.publicationMember === false)
246
+ findings.push({ id: id(direction, modelKey, 'publication_missing'), code: 'publication_missing', category: 'physical_contract', severity: 'blocker', direction, phase: 'expand', owner: 'application_migration', model: modelKey, message: `Table "${tableName}" is not a member of the connected logical-replication publication.`, action: 'Add the table to the publication through the database owner, then verify replication before activation.' });
247
+ if (table.rowLevelSecurity === true && table.forceRowLevelSecurity !== true)
248
+ findings.push({ id: id(direction, modelKey, 'rls_not_forced'), code: 'rls_not_forced', category: 'advisory', severity: 'warning', direction, phase: 'verify', owner: physicalOwner, model: modelKey, message: `Table "${tableName}" enables RLS but does not force it for the table owner.`, action: 'Confirm the runtime role cannot bypass the intended policy, or FORCE ROW LEVEL SECURITY.' });
249
+ }
250
+ return findings;
251
+ }
252
+ export function reconcileSchemaToDatabase(schema, database, direction) {
253
+ if (!database)
254
+ return [{ id: `${direction}:database_unobserved`, code: 'database_unobserved', category: 'observation', severity: 'blocker', direction, phase: 'verify', owner: 'application_migration', message: 'The connected PostgreSQL shape was not observed.', action: 'Provide the application migration credential and re-run the plan against the confirmed database.' }];
255
+ return physicalFindings(schema, database, direction);
256
+ }
257
+ /** Client-runtime projection of the same compatibility finding contract. */
258
+ export function reconcileClientToActive(changed, unpushed, serverLabel, fieldDifferences = []) {
259
+ return [
260
+ ...fieldDifferences.map((difference) => ({
261
+ id: id('client_to_active', `field_${difference.direction}`, difference.model, difference.field), code: `field_${difference.direction}`,
262
+ category: 'compatibility', severity: difference.direction === 'active_only' ? 'warning' : 'error', direction: 'client_to_active',
263
+ phase: difference.direction === 'active_only' ? 'verify' : 'dual_write', owner: 'application', model: difference.model, field: difference.field,
264
+ message: `Field "${difference.model}.${difference.field}" is ${difference.detail} at ${serverLabel}.`,
265
+ action: 'Run `ablo plan` for the ordered compatibility action before deploying this build.',
266
+ })),
267
+ ...changed.map((model) => ({
268
+ id: id('client_to_active', 'model_changed', model), code: 'model_changed', category: 'compatibility', severity: 'warning',
269
+ direction: 'client_to_active', phase: 'verify', owner: 'application', model,
270
+ message: `Model "${model}" differs between this build and the active schema at ${serverLabel}.`,
271
+ action: 'Run `ablo plan` to see field direction; use `ablo status` to confirm the deployed target.',
272
+ })),
273
+ ...unpushed.map((model) => ({
274
+ id: id('client_to_active', 'model_unpushed', model), code: 'model_unpushed', category: 'compatibility', severity: 'error',
275
+ direction: 'client_to_active', phase: 'dual_write', owner: 'ablo', model,
276
+ message: `Model "${model}" is declared by this build but is not active at ${serverLabel}.`,
277
+ action: 'Run `ablo plan`, resolve its gates, then run `ablo push` with the reviewed schema.',
278
+ })),
279
+ ];
280
+ }
281
+ /** Turns an explicit lifecycle manifest into the same findings consumed by every surface. */
282
+ export function reconcileDeploymentManifest(manifest) {
283
+ if (!manifest)
284
+ return [];
285
+ const findings = [];
286
+ const gates = new Map(manifest.gates.map((gate) => [gate.id, gate]));
287
+ const phases = ['expand', 'dual_write', 'backfill', 'verify', 'switch', 'contract'];
288
+ const targetIndex = phases.indexOf(manifest.targetPhase);
289
+ for (const gate of manifest.gates) {
290
+ const unmet = gate.dependsOn.filter((dependency) => gates.get(dependency)?.status !== 'satisfied');
291
+ const contractWithoutApproval = gate.phase === 'contract' && !gate.approval;
292
+ const future = phases.indexOf(gate.phase) > targetIndex;
293
+ const blocked = !future && (gate.status === 'pending' || unmet.length > 0 || contractWithoutApproval);
294
+ findings.push({
295
+ id: id('manifest', manifest.id, gate.id), code: future ? 'lifecycle_future' : contractWithoutApproval ? 'contract_approval_required' : unmet.length > 0 ? 'lifecycle_dependency_unsatisfied' : `lifecycle_${gate.status}`,
296
+ category: gate.phase === 'contract' ? 'destructive_contract' : gate.phase === 'backfill' ? 'data_movement' : 'compatibility',
297
+ severity: blocked ? 'blocker' : future || gate.status === 'satisfied' ? 'info' : 'warning', direction: 'source_to_active', phase: gate.phase,
298
+ owner: gate.owner, model: gate.resource.split('.')[0], ...(gate.resource.includes('.') ? { field: gate.resource.split('.').slice(1).join('.') } : {}),
299
+ message: future ? `Lifecycle gate "${gate.title}" is visible but belongs after this ${manifest.targetPhase} deployment.` : blocked ? `Lifecycle gate "${gate.title}" is not satisfied${unmet.length ? `; waiting for ${unmet.join(', ')}` : ''}.` : `Lifecycle gate "${gate.title}" is ${gate.status}.`,
300
+ action: contractWithoutApproval ? 'Approve contract as a separate reviewed deployment and record the approval identifier.' : gate.action,
301
+ dependsOn: gate.dependsOn.map((dependency) => id('manifest', manifest.id, dependency)),
302
+ });
303
+ }
304
+ if (manifest.live) {
305
+ const phasesByResource = new Map();
306
+ for (const gate of manifest.gates) {
307
+ const phases = phasesByResource.get(gate.resource) ?? new Set();
308
+ phases.add(gate.phase);
309
+ phasesByResource.set(gate.resource, phases);
310
+ }
311
+ for (const [resource, phases] of phasesByResource)
312
+ if (phases.has('expand') && phases.has('contract')) {
313
+ findings.push({ id: id('manifest', manifest.id, resource, 'mixed_expand_contract'), code: 'mixed_expand_contract', category: 'destructive_contract', severity: 'blocker', direction: 'source_to_active', phase: 'contract', owner: 'application', model: resource.split('.')[0], ...(resource.includes('.') ? { field: resource.split('.').slice(1).join('.') } : {}), message: `Live resource "${resource}" combines expand and contract in one deployment manifest.`, action: 'Remove contract from this manifest; deploy and verify expand first, then submit a separately approved contract manifest.' });
314
+ }
315
+ }
316
+ return findings;
317
+ }
318
+ //# sourceMappingURL=reconcile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reconcile.js","sourceRoot":"","sources":["../../../src/schema/deployment/reconcile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { DeploymentFinding, DeploymentStep } from './contracts.js';
2
+ /** Preserve manifest gates while grouping ordinary diagnostics by phase/owner. */
3
+ export declare function sequenceDeployment(findings: readonly DeploymentFinding[]): readonly DeploymentStep[];
4
+ //# sourceMappingURL=sequence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sequence.d.ts","sourceRoot":"","sources":["../../../src/schema/deployment/sequence.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAmB,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAyDzF,kFAAkF;AAClF,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,SAAS,iBAAiB,EAAE,GAAG,SAAS,cAAc,EAAE,CA0BpG"}
@@ -0,0 +1,71 @@
1
+ const PHASES = [
2
+ 'intent',
3
+ 'expand',
4
+ 'dual_write',
5
+ 'backfill',
6
+ 'verify',
7
+ 'switch',
8
+ 'contract',
9
+ 'recover',
10
+ ];
11
+ function statusOf(findings) {
12
+ if (findings.some(({ severity }) => severity === 'blocker' || severity === 'error')) {
13
+ return 'blocked';
14
+ }
15
+ if (findings.some(({ code }) => code === 'lifecycle_ready'))
16
+ return 'ready';
17
+ return findings.every(({ severity }) => severity === 'warning' || severity === 'info')
18
+ ? 'advisory'
19
+ : 'ready';
20
+ }
21
+ function manifestStep(finding) {
22
+ const status = statusOf([finding]);
23
+ return {
24
+ id: finding.id,
25
+ phase: finding.phase,
26
+ owner: finding.owner,
27
+ title: finding.message,
28
+ action: finding.action,
29
+ dependsOn: finding.dependsOn ?? [],
30
+ findingIds: [finding.id],
31
+ status,
32
+ executableByAblo: finding.owner === 'ablo' && status === 'ready',
33
+ };
34
+ }
35
+ function groupedStep(phase, owner, findings) {
36
+ const status = statusOf(findings);
37
+ return {
38
+ id: `${phase}:${owner}`,
39
+ phase,
40
+ owner,
41
+ title: `${phase} — ${owner.replaceAll('_', ' ')}`,
42
+ action: [...new Set(findings.map(({ action }) => action))].join(' '),
43
+ dependsOn: [],
44
+ findingIds: findings.map(({ id }) => id),
45
+ status,
46
+ executableByAblo: owner === 'ablo' && status === 'ready',
47
+ };
48
+ }
49
+ /** Preserve manifest gates while grouping ordinary diagnostics by phase/owner. */
50
+ export function sequenceDeployment(findings) {
51
+ const steps = [];
52
+ let previousPhase = [];
53
+ for (const phase of PHASES) {
54
+ const phaseFindings = findings.filter((finding) => finding.phase === phase);
55
+ const manifest = phaseFindings.filter(({ id }) => id.startsWith('manifest:'));
56
+ const ordinary = phaseFindings.filter(({ id }) => !id.startsWith('manifest:'));
57
+ const phaseSteps = manifest.map(manifestStep);
58
+ for (const owner of [...new Set(ordinary.map(({ owner }) => owner))]) {
59
+ phaseSteps.push(groupedStep(phase, owner, ordinary.filter((finding) => finding.owner === owner)));
60
+ }
61
+ for (const step of phaseSteps) {
62
+ const explicit = step.dependsOn;
63
+ const barrier = explicit.length === 0 ? previousPhase : [];
64
+ steps.push({ ...step, dependsOn: [...new Set([...explicit, ...barrier])] });
65
+ }
66
+ if (phaseSteps.length > 0)
67
+ previousPhase = phaseSteps.map(({ id }) => id);
68
+ }
69
+ return steps;
70
+ }
71
+ //# sourceMappingURL=sequence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sequence.js","sourceRoot":"","sources":["../../../src/schema/deployment/sequence.ts"],"names":[],"mappings":"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"}
@@ -38,6 +38,7 @@ export { selectModels, omitModels, omittedModelError } from './select.js';
38
38
  export { generateProvisionPlan, generateMigrationPlan, appSchemaName, camelToSnake, snakeToCamel, q, sqlType, type ProvisionPlan, type MigrationPlan, } from './ddl.js';
39
39
  export { PG_LOCK_NOT_AVAILABLE, resolveDdlLockTimeout, resolveDdlMaxLockAttempts, ddlLockRetryBackoffMs, type DdlLockEnv, } from './ddlLock.js';
40
40
  export { diffSchema, classifyMigration, classifyCast, isAutoApplicable, isBlockerResolved, unresolvedBlockers, type BackfillValue, type MigrationStep, type FieldChanges, type FieldColumnChange, type FieldTypeChange, type NullabilityChange, type EnumValuesChange, type IndexChange, type CastSafety, type FieldType, type RenameHints, type MigrationSignal, type MigrationClassification, type WarningCode, type BlockerCode, } from './diff.js';
41
+ export * from './deployment/index.js';
41
42
  export { generateTypes } from './generate.js';
42
43
  export { query, defineQueries, type QueryDef, type QueryRecord, type Queries, type InferQueryInput, type InferQueryResult, } from './queries.js';
43
44
  export { abloOpenApi, schemaToOpenApi, type SchemaToOpenApiOptions } from './openapi.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"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"}
@@ -68,6 +68,10 @@ export { generateProvisionPlan, generateMigrationPlan, appSchemaName, camelToSna
68
68
  export { PG_LOCK_NOT_AVAILABLE, resolveDdlLockTimeout, resolveDdlMaxLockAttempts, ddlLockRetryBackoffMs, } from './ddlLock.js';
69
69
  // Schema diff + migration planning — produces the plan the DDL layer turns into SQL.
70
70
  export { diffSchema, classifyMigration, classifyCast, isAutoApplicable, isBlockerResolved, unresolvedBlockers, } from './diff.js';
71
+ // One source/active/database deployment skeleton. CLI check/plan/push/migrate,
72
+ // server activation, and runtime drift project this contract instead of
73
+ // maintaining lateral planners.
74
+ export * from './deployment/index.js';
71
75
  // Schema → TypeScript type emission.
72
76
  export { generateTypes } from './generate.js';
73
77
  // Query definition DSL + type inference
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/schema/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@abloatai/transaction",
3
- "version": "0.58.0",
3
+ "version": "0.59.1",
4
4
  "description": "The headless Ablo transaction client and canonical contracts for reads, commits, confirmation, claims, and durable observation.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -23,9 +23,9 @@
23
23
  import {
24
24
  createAbloHttpClient,
25
25
  type AbloHttpClient,
26
- type AbloHttpClientOptions,
27
26
  } from '../transport/http/client.js';
28
27
  import type { SchemaRecord } from '../schema/schema.js';
28
+ import type { PublicAbloOptions } from './surface.js';
29
29
  import type * as _Streams from '../types/streams.js';
30
30
  import type * as _SchemaTypes from '../schema/schema.js';
31
31
  import type * as _Global from '../types/global.js';
@@ -40,7 +40,7 @@ import type * as _Http from './resources/httpResources.js';
40
40
  * socket carve lands (ADR 0016, follow-up 3a).
41
41
  */
42
42
  export function Ablo<const S extends SchemaRecord>(
43
- options: AbloHttpClientOptions<S> & { transport?: 'http' },
43
+ options: PublicAbloOptions<S>,
44
44
  ): AbloHttpClient<S> {
45
45
  return createAbloHttpClient(options);
46
46
  }
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Machine-checked names on the public `Ablo({ ... })` configuration surface.
3
+ *
4
+ * Documentation reads this tuple. Type equality below makes a constructor
5
+ * option change fail compilation until the reference inventory changes with it.
6
+ * `onCommitReceipt` is an internal transport callback, so it is deliberately
7
+ * removed from the public factory type before the equality check.
8
+ */
9
+
10
+ import type { AbloHttpClientOptions } from '../transport/http/client.js';
11
+ import type { SchemaRecord } from '../schema/schema.js';
12
+
13
+ export type PublicAbloOptions<S extends SchemaRecord = SchemaRecord> = Omit<
14
+ AbloHttpClientOptions<S>,
15
+ 'onCommitReceipt' | 'transport'
16
+ > & {
17
+ readonly transport?: 'http';
18
+ };
19
+
20
+ export const PUBLIC_ABLO_OPTION_KEYS = [
21
+ 'schema',
22
+ 'apiKey',
23
+ 'authEndpoint',
24
+ 'authToken',
25
+ 'baseURL',
26
+ 'dangerouslyAllowBrowser',
27
+ 'fetch',
28
+ 'authTimeoutMs',
29
+ 'allowCrossOriginAuthEndpoint',
30
+ 'bootstrapBaseUrl',
31
+ 'defaultHeaders',
32
+ 'defaultQuery',
33
+ 'observability',
34
+ 'durableWrites',
35
+ 'commitOutbox',
36
+ 'commitOutboxScope',
37
+ 'transport',
38
+ 'timeoutMs',
39
+ ] as const;
40
+
41
+ type Equal<A, B> =
42
+ (<T>() => T extends A ? 1 : 2) extends (<T>() => T extends B ? 1 : 2)
43
+ ? true
44
+ : false;
45
+ type Expect<T extends true> = T;
46
+
47
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
48
+ type _PublicAbloOptionsExact = Expect<
49
+ Equal<(typeof PUBLIC_ABLO_OPTION_KEYS)[number], keyof PublicAbloOptions & string>
50
+ >;