@abloatai/ablo 0.27.0 → 0.28.0

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 (73) hide show
  1. package/CHANGELOG.md +29 -3
  2. package/README.md +1 -1
  3. package/dist/BaseSyncedStore.js +8 -9
  4. package/dist/Database.d.ts +14 -1
  5. package/dist/Database.js +225 -28
  6. package/dist/Model.d.ts +17 -0
  7. package/dist/Model.js +32 -1
  8. package/dist/SyncClient.d.ts +10 -6
  9. package/dist/SyncClient.js +379 -76
  10. package/dist/adapters/inMemoryStorage.d.ts +1 -0
  11. package/dist/adapters/inMemoryStorage.js +12 -0
  12. package/dist/cli.cjs +6 -2
  13. package/dist/client/Ablo.d.ts +24 -1
  14. package/dist/client/Ablo.js +4 -3
  15. package/dist/client/ApiClient.js +309 -43
  16. package/dist/client/createInternalComponents.d.ts +2 -0
  17. package/dist/client/createInternalComponents.js +1 -1
  18. package/dist/client/httpClient.d.ts +2 -0
  19. package/dist/client/modelRegistration.js +11 -0
  20. package/dist/client/options.d.ts +23 -0
  21. package/dist/client/wsMutationExecutor.d.ts +3 -2
  22. package/dist/client/wsMutationExecutor.js +3 -2
  23. package/dist/commit/contract.d.ts +493 -0
  24. package/dist/commit/contract.js +187 -0
  25. package/dist/commit/index.d.ts +6 -0
  26. package/dist/commit/index.js +5 -0
  27. package/dist/core/StoreManager.d.ts +2 -0
  28. package/dist/core/StoreManager.js +12 -0
  29. package/dist/errorCodes.js +6 -2
  30. package/dist/index.d.ts +6 -0
  31. package/dist/index.js +2 -0
  32. package/dist/interfaces/index.d.ts +2 -2
  33. package/dist/mutators/UndoManager.d.ts +2 -0
  34. package/dist/mutators/UndoManager.js +32 -0
  35. package/dist/react/useAblo.d.ts +6 -4
  36. package/dist/react/useAblo.js +25 -3
  37. package/dist/schema/index.d.ts +1 -1
  38. package/dist/schema/schema.d.ts +31 -1
  39. package/dist/stores/ObjectStore.d.ts +14 -1
  40. package/dist/stores/ObjectStore.js +27 -4
  41. package/dist/stores/ObjectStoreContract.d.ts +2 -0
  42. package/dist/surface.d.ts +1 -1
  43. package/dist/surface.js +2 -0
  44. package/dist/sync/SyncWebSocket.d.ts +2 -1
  45. package/dist/sync/persistedPrefix.d.ts +12 -0
  46. package/dist/sync/persistedPrefix.js +22 -0
  47. package/dist/testing/index.d.ts +2 -0
  48. package/dist/testing/index.js +1 -0
  49. package/dist/testing/mocks/FakeDatabase.d.ts +18 -0
  50. package/dist/testing/mocks/FakeDatabase.js +10 -0
  51. package/dist/testing/mocks/MockWebSocket.d.ts +2 -1
  52. package/dist/transactions/TransactionQueue.d.ts +66 -8
  53. package/dist/transactions/TransactionQueue.js +607 -89
  54. package/dist/transactions/commitEnvelope.d.ts +132 -0
  55. package/dist/transactions/commitEnvelope.js +139 -0
  56. package/dist/transactions/commitOutboxStore.d.ts +32 -0
  57. package/dist/transactions/commitOutboxStore.js +26 -0
  58. package/dist/transactions/commitPayload.d.ts +15 -0
  59. package/dist/transactions/commitPayload.js +6 -0
  60. package/dist/transactions/httpCommitEnvelope.d.ts +43 -0
  61. package/dist/transactions/httpCommitEnvelope.js +179 -0
  62. package/dist/transactions/replayValidation.d.ts +83 -0
  63. package/dist/transactions/replayValidation.js +46 -1
  64. package/dist/wire/bootstrapReason.d.ts +9 -0
  65. package/dist/wire/bootstrapReason.js +8 -0
  66. package/dist/wire/frames.d.ts +236 -0
  67. package/dist/wire/frames.js +21 -0
  68. package/dist/wire/index.d.ts +4 -2
  69. package/dist/wire/index.js +2 -1
  70. package/docs/api.md +10 -10
  71. package/docs/coordination.md +2 -2
  72. package/docs/mcp.md +1 -1
  73. package/package.json +7 -2
@@ -79,6 +79,8 @@ export type AbloHttpClient<S extends SchemaRecord> = {
79
79
  } & {
80
80
  /** Runs one-time setup, such as registering a configured `databaseUrl` data source, before the client is used. It also runs lazily ahead of the first request, so calling it yourself is optional. */
81
81
  ready(): Promise<void>;
82
+ /** Replays every pending durable HTTP write in seal order and waits for settlement. */
83
+ waitForFlush(): Promise<void>;
82
84
  readonly commits: CommitResource;
83
85
  dispose(): Promise<void>;
84
86
  /** Resolves the bearer credential this client authenticates with, or `null` if none is set. */
@@ -192,8 +192,19 @@ function isZodObject(schema) {
192
192
  }
193
193
  /** Create a Model subclass for a schema-defined model */
194
194
  function createDynamicModelClass(modelName, jsonSubFields, fieldNames, computed, lazyObservable = false) {
195
+ // Names `toReactiveSnapshot` materializes onto plain snapshots: every
196
+ // `${field}Json` getter plus every schema-declared computed. Without this,
197
+ // snapshot rows silently drop getters that the schema's inferred row type
198
+ // declares — reads like `snapshot.settingsObject` would be `undefined`.
199
+ const derivedGetterNames = Object.freeze([
200
+ ...jsonSubFields.map(({ fieldName }) => `${fieldName}Json`),
201
+ ...Object.keys(computed ?? {}),
202
+ ]);
195
203
  const ModelClass = class extends Model {
196
204
  _modelName = modelName;
205
+ getDerivedGetterNames() {
206
+ return derivedGetterNames;
207
+ }
197
208
  constructor(data) {
198
209
  super(data);
199
210
  // Suppress change tracking during initial hydration. `makeObservable()`
@@ -6,6 +6,8 @@
6
6
  import type { Schema, SchemaRecord } from '../schema/schema.js';
7
7
  import type { SyncEngineConfig, SyncLogger, MutationExecutor, SyncObservabilityProvider, SyncAnalytics, SessionErrorDetector, OnlineStatusProvider } from '../interfaces/index.js';
8
8
  import type { AbloPersistence } from './persistence.js';
9
+ import type { CommitOutboxStore } from '../transactions/commitOutboxStore.js';
10
+ import type { CommitOutboxScope } from '../transactions/commitEnvelope.js';
9
11
  /**
10
12
  * An async function that resolves an apiKey at request time. Use it for credential
11
13
  * rotation — read from a vault, refresh from session storage, or pull from an
@@ -108,6 +110,23 @@ export interface AbloOptions<S extends SchemaRecord = SchemaRecord> {
108
110
  * @default 'memory'
109
111
  */
110
112
  persistence?: AbloPersistence;
113
+ /**
114
+ * Durable commit-envelope storage for server-side agents and workers.
115
+ * The stateful browser client uses its strict IndexedDB transaction store;
116
+ * the stateless HTTP client has no implicit filesystem and therefore needs a
117
+ * workflow-, SQLite-, or filesystem-backed implementation to survive a
118
+ * process restart. One store may serve several actors because every record
119
+ * is checked against its authenticated scope before replay.
120
+ */
121
+ commitOutbox?: CommitOutboxStore;
122
+ /**
123
+ * Stable actor/server scope for an injected HTTP {@link commitOutbox}.
124
+ * Omit it to resolve `organizationId` and `participantId` from the authenticated
125
+ * `/auth/identity` endpoint. Supplying it avoids that one setup request in
126
+ * trusted worker environments; `namespace` distinguishes deployments or
127
+ * workflow lanes that share the same actor identity.
128
+ */
129
+ commitOutboxScope?: CommitOutboxScope;
111
130
  /**
112
131
  * Selects the transport. `'websocket'` (the default) is the live client: a
113
132
  * persistent socket, a local synced cache, and `onChange` subscriptions. `'http'`
@@ -280,6 +299,10 @@ export interface InternalAbloOptions<S extends SchemaRecord = SchemaRecord> {
280
299
  * reload-surviving local cache in a browser.
281
300
  */
282
301
  persistence?: AbloPersistence;
302
+ /** Internal mirror of {@link AbloOptions.commitOutbox}. */
303
+ commitOutbox?: CommitOutboxStore;
304
+ /** Internal mirror of {@link AbloOptions.commitOutboxScope}. */
305
+ commitOutboxScope?: CommitOutboxScope;
283
306
  /** @deprecated Use `persistence: 'indexeddb'` for durable browser storage. */
284
307
  offline?: boolean;
285
308
  /**
@@ -17,8 +17,9 @@ import type { MutationExecutor, MutationOperation } from '../interfaces/index.js
17
17
  * the ready socket.
18
18
  *
19
19
  * When set, `options.idempotencyKey` is sent as the wire-level `clientTxId`, so
20
- * retrying a call with the same key is safe; otherwise the executor generates
21
- * one.
20
+ * retrying a call with the same key is safe. TransactionQueue always supplies
21
+ * this key before its first attempt and owns reuse across retries. The fallback
22
+ * generation below exists only for direct, one-shot executor consumers.
22
23
  */
23
24
  export declare function createDefaultMutationExecutor(getWs: () => {
24
25
  sendCommit?: (operations: readonly MutationOperation[], clientTxId: string, timeoutMs?: number, causedByTaskId?: string | null, reads?: readonly ReadDependency[] | null) => Promise<{
@@ -17,8 +17,9 @@ import { AbloError, AbloConnectionError } from '../errors.js';
17
17
  * the ready socket.
18
18
  *
19
19
  * When set, `options.idempotencyKey` is sent as the wire-level `clientTxId`, so
20
- * retrying a call with the same key is safe; otherwise the executor generates
21
- * one.
20
+ * retrying a call with the same key is safe. TransactionQueue always supplies
21
+ * this key before its first attempt and owns reuse across retries. The fallback
22
+ * generation below exists only for direct, one-shot executor consumers.
22
23
  */
23
24
  export function createDefaultMutationExecutor(getWs) {
24
25
  async function commit(operations, options) {
@@ -0,0 +1,493 @@
1
+ /**
2
+ * The transport-independent v2 commit contract.
3
+ *
4
+ * A commit is a caller's atomic write intent. It contains ordered operations,
5
+ * a stable idempotency key, and explicit write preconditions. HTTP and
6
+ * WebSocket transports wrap these schemas; they do not redefine their data.
7
+ * Every public data type in this module is inferred from the Zod schema that
8
+ * validates it at a trust boundary.
9
+ */
10
+ import { z } from 'zod';
11
+ /** Current version of the transport-independent commit contract. */
12
+ export declare const COMMIT_CONTRACT_VERSION: 2;
13
+ /** Stable identity of one logical commit. Reused unchanged for every retry. */
14
+ export declare const idempotencyKeySchema: z.core.$ZodBranded<z.ZodString, "IdempotencyKey", "out">;
15
+ export type IdempotencyKey = z.output<typeof idempotencyKeySchema>;
16
+ /** Server-issued identity of a durable commit execution. */
17
+ export declare const commitIdSchema: z.core.$ZodBranded<z.ZodUUID, "CommitId", "out">;
18
+ export type CommitId = z.output<typeof commitIdSchema>;
19
+ /** Stable identity of one operation within a commit. */
20
+ export declare const operationIdSchema: z.core.$ZodBranded<z.ZodString, "OperationId", "out">;
21
+ export type OperationId = z.output<typeof operationIdSchema>;
22
+ /** Identity of a pessimistic claim whose generation fences a write. */
23
+ export declare const claimIdSchema: z.core.$ZodBranded<z.ZodString, "ClaimId", "out">;
24
+ export type ClaimId = z.output<typeof claimIdSchema>;
25
+ /**
26
+ * Internal committed-log offset. Decimal strings preserve PostgreSQL BIGINT
27
+ * precision across JavaScript and JSON boundaries.
28
+ */
29
+ export declare const syncOffsetSchema: z.core.$ZodBranded<z.ZodString, "SyncOffset", "out">;
30
+ export type SyncOffset = z.output<typeof syncOffsetSchema>;
31
+ /** Opaque resumable cursor returned to clients; consumers must not inspect it. */
32
+ export declare const syncCursorSchema: z.core.$ZodBranded<z.ZodString, "SyncCursor", "out">;
33
+ export type SyncCursor = z.output<typeof syncCursorSchema>;
34
+ /** JSON-safe value accepted by a persisted or fingerprinted commit payload. */
35
+ export declare const jsonValueSchema: z.ZodJSONSchema;
36
+ export type JsonValue = z.output<typeof jsonValueSchema>;
37
+ /** JSON object accepted for entity values, patches, and structured details. */
38
+ export declare const jsonObjectSchema: z.ZodRecord<z.ZodString, z.ZodJSONSchema>;
39
+ export type JsonObject = z.output<typeof jsonObjectSchema>;
40
+ /** Model and row addressed by an operation. */
41
+ export declare const entityRefSchema: z.ZodObject<{
42
+ model: z.ZodString;
43
+ id: z.ZodString;
44
+ }, z.core.$strict>;
45
+ export type EntityRef = z.output<typeof entityRefSchema>;
46
+ /**
47
+ * A condition that must still hold when an operation is applied. Preconditions
48
+ * are data rather than option flags so they are included in the request
49
+ * fingerprint and can be reported precisely when a commit conflicts.
50
+ */
51
+ export declare const writePreconditionSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
52
+ type: z.ZodLiteral<"unchanged_since">;
53
+ cursor: z.core.$ZodBranded<z.ZodString, "SyncOffset", "out">;
54
+ fields: z.ZodOptional<z.ZodArray<z.ZodString>>;
55
+ }, z.core.$strict>, z.ZodObject<{
56
+ type: z.ZodLiteral<"version_matches">;
57
+ version: z.ZodNumber;
58
+ }, z.core.$strict>, z.ZodObject<{
59
+ type: z.ZodLiteral<"claim_fence">;
60
+ claimId: z.core.$ZodBranded<z.ZodString, "ClaimId", "out">;
61
+ generation: z.ZodNumber;
62
+ }, z.core.$strict>], "type">;
63
+ export type WritePrecondition = z.output<typeof writePreconditionSchema>;
64
+ /**
65
+ * One ordered entity change within a commit. The discriminant makes illegal
66
+ * combinations unrepresentable: only create carries `value`, only patch
67
+ * carries `changes`, and destructive actions carry neither.
68
+ */
69
+ export declare const commitOperationSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
70
+ type: z.ZodLiteral<"create">;
71
+ value: z.ZodRecord<z.ZodString, z.ZodJSONSchema>;
72
+ operationId: z.core.$ZodBranded<z.ZodString, "OperationId", "out">;
73
+ target: z.ZodObject<{
74
+ model: z.ZodString;
75
+ id: z.ZodString;
76
+ }, z.core.$strict>;
77
+ preconditions: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
78
+ type: z.ZodLiteral<"unchanged_since">;
79
+ cursor: z.core.$ZodBranded<z.ZodString, "SyncOffset", "out">;
80
+ fields: z.ZodOptional<z.ZodArray<z.ZodString>>;
81
+ }, z.core.$strict>, z.ZodObject<{
82
+ type: z.ZodLiteral<"version_matches">;
83
+ version: z.ZodNumber;
84
+ }, z.core.$strict>, z.ZodObject<{
85
+ type: z.ZodLiteral<"claim_fence">;
86
+ claimId: z.core.$ZodBranded<z.ZodString, "ClaimId", "out">;
87
+ generation: z.ZodNumber;
88
+ }, z.core.$strict>], "type">>>;
89
+ }, z.core.$strict>, z.ZodObject<{
90
+ type: z.ZodLiteral<"patch">;
91
+ changes: z.ZodRecord<z.ZodString, z.ZodJSONSchema>;
92
+ operationId: z.core.$ZodBranded<z.ZodString, "OperationId", "out">;
93
+ target: z.ZodObject<{
94
+ model: z.ZodString;
95
+ id: z.ZodString;
96
+ }, z.core.$strict>;
97
+ preconditions: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
98
+ type: z.ZodLiteral<"unchanged_since">;
99
+ cursor: z.core.$ZodBranded<z.ZodString, "SyncOffset", "out">;
100
+ fields: z.ZodOptional<z.ZodArray<z.ZodString>>;
101
+ }, z.core.$strict>, z.ZodObject<{
102
+ type: z.ZodLiteral<"version_matches">;
103
+ version: z.ZodNumber;
104
+ }, z.core.$strict>, z.ZodObject<{
105
+ type: z.ZodLiteral<"claim_fence">;
106
+ claimId: z.core.$ZodBranded<z.ZodString, "ClaimId", "out">;
107
+ generation: z.ZodNumber;
108
+ }, z.core.$strict>], "type">>>;
109
+ }, z.core.$strict>, z.ZodObject<{
110
+ type: z.ZodLiteral<"delete">;
111
+ operationId: z.core.$ZodBranded<z.ZodString, "OperationId", "out">;
112
+ target: z.ZodObject<{
113
+ model: z.ZodString;
114
+ id: z.ZodString;
115
+ }, z.core.$strict>;
116
+ preconditions: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
117
+ type: z.ZodLiteral<"unchanged_since">;
118
+ cursor: z.core.$ZodBranded<z.ZodString, "SyncOffset", "out">;
119
+ fields: z.ZodOptional<z.ZodArray<z.ZodString>>;
120
+ }, z.core.$strict>, z.ZodObject<{
121
+ type: z.ZodLiteral<"version_matches">;
122
+ version: z.ZodNumber;
123
+ }, z.core.$strict>, z.ZodObject<{
124
+ type: z.ZodLiteral<"claim_fence">;
125
+ claimId: z.core.$ZodBranded<z.ZodString, "ClaimId", "out">;
126
+ generation: z.ZodNumber;
127
+ }, z.core.$strict>], "type">>>;
128
+ }, z.core.$strict>, z.ZodObject<{
129
+ type: z.ZodLiteral<"archive">;
130
+ operationId: z.core.$ZodBranded<z.ZodString, "OperationId", "out">;
131
+ target: z.ZodObject<{
132
+ model: z.ZodString;
133
+ id: z.ZodString;
134
+ }, z.core.$strict>;
135
+ preconditions: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
136
+ type: z.ZodLiteral<"unchanged_since">;
137
+ cursor: z.core.$ZodBranded<z.ZodString, "SyncOffset", "out">;
138
+ fields: z.ZodOptional<z.ZodArray<z.ZodString>>;
139
+ }, z.core.$strict>, z.ZodObject<{
140
+ type: z.ZodLiteral<"version_matches">;
141
+ version: z.ZodNumber;
142
+ }, z.core.$strict>, z.ZodObject<{
143
+ type: z.ZodLiteral<"claim_fence">;
144
+ claimId: z.core.$ZodBranded<z.ZodString, "ClaimId", "out">;
145
+ generation: z.ZodNumber;
146
+ }, z.core.$strict>], "type">>>;
147
+ }, z.core.$strict>, z.ZodObject<{
148
+ type: z.ZodLiteral<"unarchive">;
149
+ operationId: z.core.$ZodBranded<z.ZodString, "OperationId", "out">;
150
+ target: z.ZodObject<{
151
+ model: z.ZodString;
152
+ id: z.ZodString;
153
+ }, z.core.$strict>;
154
+ preconditions: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
155
+ type: z.ZodLiteral<"unchanged_since">;
156
+ cursor: z.core.$ZodBranded<z.ZodString, "SyncOffset", "out">;
157
+ fields: z.ZodOptional<z.ZodArray<z.ZodString>>;
158
+ }, z.core.$strict>, z.ZodObject<{
159
+ type: z.ZodLiteral<"version_matches">;
160
+ version: z.ZodNumber;
161
+ }, z.core.$strict>, z.ZodObject<{
162
+ type: z.ZodLiteral<"claim_fence">;
163
+ claimId: z.core.$ZodBranded<z.ZodString, "ClaimId", "out">;
164
+ generation: z.ZodNumber;
165
+ }, z.core.$strict>], "type">>>;
166
+ }, z.core.$strict>], "type">;
167
+ export type CommitOperationInput = z.input<typeof commitOperationSchema>;
168
+ export type CommitOperation = z.output<typeof commitOperationSchema>;
169
+ /** Semantic lineage included in the durable intent and its fingerprint. */
170
+ export declare const commitMetadataSchema: z.ZodObject<{
171
+ label: z.ZodOptional<z.ZodString>;
172
+ causedByTaskId: z.ZodOptional<z.ZodString>;
173
+ }, z.core.$strict>;
174
+ export type CommitMetadata = z.output<typeof commitMetadataSchema>;
175
+ /** The portion of a request that is fingerprinted, preserving operation order. */
176
+ export declare const commitIntentSchema: z.ZodObject<{
177
+ schemaVersion: z.ZodLiteral<2>;
178
+ operations: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
179
+ type: z.ZodLiteral<"create">;
180
+ value: z.ZodRecord<z.ZodString, z.ZodJSONSchema>;
181
+ operationId: z.core.$ZodBranded<z.ZodString, "OperationId", "out">;
182
+ target: z.ZodObject<{
183
+ model: z.ZodString;
184
+ id: z.ZodString;
185
+ }, z.core.$strict>;
186
+ preconditions: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
187
+ type: z.ZodLiteral<"unchanged_since">;
188
+ cursor: z.core.$ZodBranded<z.ZodString, "SyncOffset", "out">;
189
+ fields: z.ZodOptional<z.ZodArray<z.ZodString>>;
190
+ }, z.core.$strict>, z.ZodObject<{
191
+ type: z.ZodLiteral<"version_matches">;
192
+ version: z.ZodNumber;
193
+ }, z.core.$strict>, z.ZodObject<{
194
+ type: z.ZodLiteral<"claim_fence">;
195
+ claimId: z.core.$ZodBranded<z.ZodString, "ClaimId", "out">;
196
+ generation: z.ZodNumber;
197
+ }, z.core.$strict>], "type">>>;
198
+ }, z.core.$strict>, z.ZodObject<{
199
+ type: z.ZodLiteral<"patch">;
200
+ changes: z.ZodRecord<z.ZodString, z.ZodJSONSchema>;
201
+ operationId: z.core.$ZodBranded<z.ZodString, "OperationId", "out">;
202
+ target: z.ZodObject<{
203
+ model: z.ZodString;
204
+ id: z.ZodString;
205
+ }, z.core.$strict>;
206
+ preconditions: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
207
+ type: z.ZodLiteral<"unchanged_since">;
208
+ cursor: z.core.$ZodBranded<z.ZodString, "SyncOffset", "out">;
209
+ fields: z.ZodOptional<z.ZodArray<z.ZodString>>;
210
+ }, z.core.$strict>, z.ZodObject<{
211
+ type: z.ZodLiteral<"version_matches">;
212
+ version: z.ZodNumber;
213
+ }, z.core.$strict>, z.ZodObject<{
214
+ type: z.ZodLiteral<"claim_fence">;
215
+ claimId: z.core.$ZodBranded<z.ZodString, "ClaimId", "out">;
216
+ generation: z.ZodNumber;
217
+ }, z.core.$strict>], "type">>>;
218
+ }, z.core.$strict>, z.ZodObject<{
219
+ type: z.ZodLiteral<"delete">;
220
+ operationId: z.core.$ZodBranded<z.ZodString, "OperationId", "out">;
221
+ target: z.ZodObject<{
222
+ model: z.ZodString;
223
+ id: z.ZodString;
224
+ }, z.core.$strict>;
225
+ preconditions: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
226
+ type: z.ZodLiteral<"unchanged_since">;
227
+ cursor: z.core.$ZodBranded<z.ZodString, "SyncOffset", "out">;
228
+ fields: z.ZodOptional<z.ZodArray<z.ZodString>>;
229
+ }, z.core.$strict>, z.ZodObject<{
230
+ type: z.ZodLiteral<"version_matches">;
231
+ version: z.ZodNumber;
232
+ }, z.core.$strict>, z.ZodObject<{
233
+ type: z.ZodLiteral<"claim_fence">;
234
+ claimId: z.core.$ZodBranded<z.ZodString, "ClaimId", "out">;
235
+ generation: z.ZodNumber;
236
+ }, z.core.$strict>], "type">>>;
237
+ }, z.core.$strict>, z.ZodObject<{
238
+ type: z.ZodLiteral<"archive">;
239
+ operationId: z.core.$ZodBranded<z.ZodString, "OperationId", "out">;
240
+ target: z.ZodObject<{
241
+ model: z.ZodString;
242
+ id: z.ZodString;
243
+ }, z.core.$strict>;
244
+ preconditions: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
245
+ type: z.ZodLiteral<"unchanged_since">;
246
+ cursor: z.core.$ZodBranded<z.ZodString, "SyncOffset", "out">;
247
+ fields: z.ZodOptional<z.ZodArray<z.ZodString>>;
248
+ }, z.core.$strict>, z.ZodObject<{
249
+ type: z.ZodLiteral<"version_matches">;
250
+ version: z.ZodNumber;
251
+ }, z.core.$strict>, z.ZodObject<{
252
+ type: z.ZodLiteral<"claim_fence">;
253
+ claimId: z.core.$ZodBranded<z.ZodString, "ClaimId", "out">;
254
+ generation: z.ZodNumber;
255
+ }, z.core.$strict>], "type">>>;
256
+ }, z.core.$strict>, z.ZodObject<{
257
+ type: z.ZodLiteral<"unarchive">;
258
+ operationId: z.core.$ZodBranded<z.ZodString, "OperationId", "out">;
259
+ target: z.ZodObject<{
260
+ model: z.ZodString;
261
+ id: z.ZodString;
262
+ }, z.core.$strict>;
263
+ preconditions: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
264
+ type: z.ZodLiteral<"unchanged_since">;
265
+ cursor: z.core.$ZodBranded<z.ZodString, "SyncOffset", "out">;
266
+ fields: z.ZodOptional<z.ZodArray<z.ZodString>>;
267
+ }, z.core.$strict>, z.ZodObject<{
268
+ type: z.ZodLiteral<"version_matches">;
269
+ version: z.ZodNumber;
270
+ }, z.core.$strict>, z.ZodObject<{
271
+ type: z.ZodLiteral<"claim_fence">;
272
+ claimId: z.core.$ZodBranded<z.ZodString, "ClaimId", "out">;
273
+ generation: z.ZodNumber;
274
+ }, z.core.$strict>], "type">>>;
275
+ }, z.core.$strict>], "type">>;
276
+ metadata: z.ZodOptional<z.ZodObject<{
277
+ label: z.ZodOptional<z.ZodString>;
278
+ causedByTaskId: z.ZodOptional<z.ZodString>;
279
+ }, z.core.$strict>>;
280
+ }, z.core.$strict>;
281
+ export type CommitIntentInput = z.input<typeof commitIntentSchema>;
282
+ export type CommitIntent = z.output<typeof commitIntentSchema>;
283
+ /** A caller's stable idempotency identity plus the intent it identifies. */
284
+ export declare const commitRequestSchema: z.ZodObject<{
285
+ idempotencyKey: z.core.$ZodBranded<z.ZodString, "IdempotencyKey", "out">;
286
+ schemaVersion: z.ZodLiteral<2>;
287
+ operations: z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
288
+ type: z.ZodLiteral<"create">;
289
+ value: z.ZodRecord<z.ZodString, z.ZodJSONSchema>;
290
+ operationId: z.core.$ZodBranded<z.ZodString, "OperationId", "out">;
291
+ target: z.ZodObject<{
292
+ model: z.ZodString;
293
+ id: z.ZodString;
294
+ }, z.core.$strict>;
295
+ preconditions: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
296
+ type: z.ZodLiteral<"unchanged_since">;
297
+ cursor: z.core.$ZodBranded<z.ZodString, "SyncOffset", "out">;
298
+ fields: z.ZodOptional<z.ZodArray<z.ZodString>>;
299
+ }, z.core.$strict>, z.ZodObject<{
300
+ type: z.ZodLiteral<"version_matches">;
301
+ version: z.ZodNumber;
302
+ }, z.core.$strict>, z.ZodObject<{
303
+ type: z.ZodLiteral<"claim_fence">;
304
+ claimId: z.core.$ZodBranded<z.ZodString, "ClaimId", "out">;
305
+ generation: z.ZodNumber;
306
+ }, z.core.$strict>], "type">>>;
307
+ }, z.core.$strict>, z.ZodObject<{
308
+ type: z.ZodLiteral<"patch">;
309
+ changes: z.ZodRecord<z.ZodString, z.ZodJSONSchema>;
310
+ operationId: z.core.$ZodBranded<z.ZodString, "OperationId", "out">;
311
+ target: z.ZodObject<{
312
+ model: z.ZodString;
313
+ id: z.ZodString;
314
+ }, z.core.$strict>;
315
+ preconditions: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
316
+ type: z.ZodLiteral<"unchanged_since">;
317
+ cursor: z.core.$ZodBranded<z.ZodString, "SyncOffset", "out">;
318
+ fields: z.ZodOptional<z.ZodArray<z.ZodString>>;
319
+ }, z.core.$strict>, z.ZodObject<{
320
+ type: z.ZodLiteral<"version_matches">;
321
+ version: z.ZodNumber;
322
+ }, z.core.$strict>, z.ZodObject<{
323
+ type: z.ZodLiteral<"claim_fence">;
324
+ claimId: z.core.$ZodBranded<z.ZodString, "ClaimId", "out">;
325
+ generation: z.ZodNumber;
326
+ }, z.core.$strict>], "type">>>;
327
+ }, z.core.$strict>, z.ZodObject<{
328
+ type: z.ZodLiteral<"delete">;
329
+ operationId: z.core.$ZodBranded<z.ZodString, "OperationId", "out">;
330
+ target: z.ZodObject<{
331
+ model: z.ZodString;
332
+ id: z.ZodString;
333
+ }, z.core.$strict>;
334
+ preconditions: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
335
+ type: z.ZodLiteral<"unchanged_since">;
336
+ cursor: z.core.$ZodBranded<z.ZodString, "SyncOffset", "out">;
337
+ fields: z.ZodOptional<z.ZodArray<z.ZodString>>;
338
+ }, z.core.$strict>, z.ZodObject<{
339
+ type: z.ZodLiteral<"version_matches">;
340
+ version: z.ZodNumber;
341
+ }, z.core.$strict>, z.ZodObject<{
342
+ type: z.ZodLiteral<"claim_fence">;
343
+ claimId: z.core.$ZodBranded<z.ZodString, "ClaimId", "out">;
344
+ generation: z.ZodNumber;
345
+ }, z.core.$strict>], "type">>>;
346
+ }, z.core.$strict>, z.ZodObject<{
347
+ type: z.ZodLiteral<"archive">;
348
+ operationId: z.core.$ZodBranded<z.ZodString, "OperationId", "out">;
349
+ target: z.ZodObject<{
350
+ model: z.ZodString;
351
+ id: z.ZodString;
352
+ }, z.core.$strict>;
353
+ preconditions: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
354
+ type: z.ZodLiteral<"unchanged_since">;
355
+ cursor: z.core.$ZodBranded<z.ZodString, "SyncOffset", "out">;
356
+ fields: z.ZodOptional<z.ZodArray<z.ZodString>>;
357
+ }, z.core.$strict>, z.ZodObject<{
358
+ type: z.ZodLiteral<"version_matches">;
359
+ version: z.ZodNumber;
360
+ }, z.core.$strict>, z.ZodObject<{
361
+ type: z.ZodLiteral<"claim_fence">;
362
+ claimId: z.core.$ZodBranded<z.ZodString, "ClaimId", "out">;
363
+ generation: z.ZodNumber;
364
+ }, z.core.$strict>], "type">>>;
365
+ }, z.core.$strict>, z.ZodObject<{
366
+ type: z.ZodLiteral<"unarchive">;
367
+ operationId: z.core.$ZodBranded<z.ZodString, "OperationId", "out">;
368
+ target: z.ZodObject<{
369
+ model: z.ZodString;
370
+ id: z.ZodString;
371
+ }, z.core.$strict>;
372
+ preconditions: z.ZodDefault<z.ZodArray<z.ZodDiscriminatedUnion<[z.ZodObject<{
373
+ type: z.ZodLiteral<"unchanged_since">;
374
+ cursor: z.core.$ZodBranded<z.ZodString, "SyncOffset", "out">;
375
+ fields: z.ZodOptional<z.ZodArray<z.ZodString>>;
376
+ }, z.core.$strict>, z.ZodObject<{
377
+ type: z.ZodLiteral<"version_matches">;
378
+ version: z.ZodNumber;
379
+ }, z.core.$strict>, z.ZodObject<{
380
+ type: z.ZodLiteral<"claim_fence">;
381
+ claimId: z.core.$ZodBranded<z.ZodString, "ClaimId", "out">;
382
+ generation: z.ZodNumber;
383
+ }, z.core.$strict>], "type">>>;
384
+ }, z.core.$strict>], "type">>;
385
+ metadata: z.ZodOptional<z.ZodObject<{
386
+ label: z.ZodOptional<z.ZodString>;
387
+ causedByTaskId: z.ZodOptional<z.ZodString>;
388
+ }, z.core.$strict>>;
389
+ }, z.core.$strict>;
390
+ export type CommitRequestInput = z.input<typeof commitRequestSchema>;
391
+ export type CommitRequest = z.output<typeof commitRequestSchema>;
392
+ /** Returns the exact semantic value that an idempotency fingerprint covers. */
393
+ export declare function commitIntentOf(request: CommitRequest): CommitIntent;
394
+ /** Machine-readable failure code carried by a rejected v2 commit. */
395
+ export declare const commitErrorCodeSchema: z.ZodUnion<readonly [z.ZodEnum<{}>, z.ZodCustom<`policy:${string}`, `policy:${string}`>]>;
396
+ export type CommitErrorCode = z.output<typeof commitErrorCodeSchema>;
397
+ /** Structured capability a rejected commit would require on retry. */
398
+ export declare const requiredCapabilitySchema: z.ZodObject<{
399
+ scope: z.ZodString;
400
+ constraints: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>>;
401
+ issuer: z.ZodOptional<z.ZodString>;
402
+ ttlSeconds: z.ZodOptional<z.ZodNumber>;
403
+ nonce: z.ZodOptional<z.ZodString>;
404
+ }, z.core.$strict>;
405
+ export type RequiredCapability = z.output<typeof requiredCapabilitySchema>;
406
+ /** Structured terminal error for a commit that did not apply. */
407
+ export declare const commitErrorSchema: z.ZodObject<{
408
+ code: z.ZodUnion<readonly [z.ZodEnum<{}>, z.ZodCustom<`policy:${string}`, `policy:${string}`>]>;
409
+ message: z.ZodString;
410
+ field: z.ZodOptional<z.ZodString>;
411
+ requiredCapability: z.ZodOptional<z.ZodObject<{
412
+ scope: z.ZodString;
413
+ constraints: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>>;
414
+ issuer: z.ZodOptional<z.ZodString>;
415
+ ttlSeconds: z.ZodOptional<z.ZodNumber>;
416
+ nonce: z.ZodOptional<z.ZodString>;
417
+ }, z.core.$strict>>;
418
+ details: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
419
+ }, z.core.$strict>;
420
+ export type CommitError = z.output<typeof commitErrorSchema>;
421
+ /** One failed precondition and the smallest current state needed to reconcile. */
422
+ export declare const commitConflictSchema: z.ZodObject<{
423
+ operationId: z.core.$ZodBranded<z.ZodString, "OperationId", "out">;
424
+ target: z.ZodObject<{
425
+ model: z.ZodString;
426
+ id: z.ZodString;
427
+ }, z.core.$strict>;
428
+ fields: z.ZodArray<z.ZodString>;
429
+ currentValues: z.ZodRecord<z.ZodString, z.ZodJSONSchema>;
430
+ observedAt: z.core.$ZodBranded<z.ZodString, "SyncOffset", "out">;
431
+ }, z.core.$strict>;
432
+ export type CommitConflict = z.output<typeof commitConflictSchema>;
433
+ /**
434
+ * Terminal result of a commit execution. Expected outcomes are a discriminated
435
+ * union, so committed, conflicted, and rejected results cannot expose fields
436
+ * belonging to another state.
437
+ */
438
+ export declare const commitReceiptSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
439
+ status: z.ZodLiteral<"committed">;
440
+ syncCursor: z.core.$ZodBranded<z.ZodString, "SyncCursor", "out">;
441
+ operationCount: z.ZodNumber;
442
+ object: z.ZodLiteral<"commit_receipt">;
443
+ schemaVersion: z.ZodLiteral<2>;
444
+ idempotencyKey: z.core.$ZodBranded<z.ZodString, "IdempotencyKey", "out">;
445
+ commitId: z.core.$ZodBranded<z.ZodUUID, "CommitId", "out">;
446
+ }, z.core.$strict>, z.ZodObject<{
447
+ status: z.ZodLiteral<"conflicted">;
448
+ syncCursor: z.core.$ZodBranded<z.ZodString, "SyncCursor", "out">;
449
+ conflicts: z.ZodArray<z.ZodObject<{
450
+ operationId: z.core.$ZodBranded<z.ZodString, "OperationId", "out">;
451
+ target: z.ZodObject<{
452
+ model: z.ZodString;
453
+ id: z.ZodString;
454
+ }, z.core.$strict>;
455
+ fields: z.ZodArray<z.ZodString>;
456
+ currentValues: z.ZodRecord<z.ZodString, z.ZodJSONSchema>;
457
+ observedAt: z.core.$ZodBranded<z.ZodString, "SyncOffset", "out">;
458
+ }, z.core.$strict>>;
459
+ object: z.ZodLiteral<"commit_receipt">;
460
+ schemaVersion: z.ZodLiteral<2>;
461
+ idempotencyKey: z.core.$ZodBranded<z.ZodString, "IdempotencyKey", "out">;
462
+ commitId: z.core.$ZodBranded<z.ZodUUID, "CommitId", "out">;
463
+ }, z.core.$strict>, z.ZodObject<{
464
+ status: z.ZodLiteral<"rejected">;
465
+ error: z.ZodObject<{
466
+ code: z.ZodUnion<readonly [z.ZodEnum<{}>, z.ZodCustom<`policy:${string}`, `policy:${string}`>]>;
467
+ message: z.ZodString;
468
+ field: z.ZodOptional<z.ZodString>;
469
+ requiredCapability: z.ZodOptional<z.ZodObject<{
470
+ scope: z.ZodString;
471
+ constraints: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodArray<z.ZodString>]>>>;
472
+ issuer: z.ZodOptional<z.ZodString>;
473
+ ttlSeconds: z.ZodOptional<z.ZodNumber>;
474
+ nonce: z.ZodOptional<z.ZodString>;
475
+ }, z.core.$strict>>;
476
+ details: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodJSONSchema>>;
477
+ }, z.core.$strict>;
478
+ object: z.ZodLiteral<"commit_receipt">;
479
+ schemaVersion: z.ZodLiteral<2>;
480
+ idempotencyKey: z.core.$ZodBranded<z.ZodString, "IdempotencyKey", "out">;
481
+ commitId: z.core.$ZodBranded<z.ZodUUID, "CommitId", "out">;
482
+ }, z.core.$strict>], "status">;
483
+ export type CommitReceiptInput = z.input<typeof commitReceiptSchema>;
484
+ export type CommitReceipt = z.output<typeof commitReceiptSchema>;
485
+ export type CommittedCommitReceipt = Extract<CommitReceipt, {
486
+ status: 'committed';
487
+ }>;
488
+ export type ConflictedCommitReceipt = Extract<CommitReceipt, {
489
+ status: 'conflicted';
490
+ }>;
491
+ export type RejectedCommitReceipt = Extract<CommitReceipt, {
492
+ status: 'rejected';
493
+ }>;