@artkit-ai/react 0.0.0-stage → 0.1.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 (118) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +145 -2
  3. package/dist/cache.d.ts +35 -0
  4. package/dist/cache.d.ts.map +1 -0
  5. package/dist/cache.js +116 -0
  6. package/dist/cache.js.map +1 -0
  7. package/dist/client.d.ts +79 -0
  8. package/dist/client.d.ts.map +1 -0
  9. package/dist/client.js +260 -0
  10. package/dist/client.js.map +1 -0
  11. package/dist/components/approval.d.ts +34 -0
  12. package/dist/components/approval.d.ts.map +1 -0
  13. package/dist/components/approval.js +80 -0
  14. package/dist/components/approval.js.map +1 -0
  15. package/dist/components/card.d.ts +22 -0
  16. package/dist/components/card.d.ts.map +1 -0
  17. package/dist/components/card.js +16 -0
  18. package/dist/components/card.js.map +1 -0
  19. package/dist/components/editor.d.ts +28 -0
  20. package/dist/components/editor.d.ts.map +1 -0
  21. package/dist/components/editor.js +161 -0
  22. package/dist/components/editor.js.map +1 -0
  23. package/dist/components/icons.d.ts +8 -0
  24. package/dist/components/icons.d.ts.map +1 -0
  25. package/dist/components/icons.js +14 -0
  26. package/dist/components/icons.js.map +1 -0
  27. package/dist/components/panel.d.ts +34 -0
  28. package/dist/components/panel.d.ts.map +1 -0
  29. package/dist/components/panel.js +216 -0
  30. package/dist/components/panel.js.map +1 -0
  31. package/dist/components/shared.d.ts +71 -0
  32. package/dist/components/shared.d.ts.map +1 -0
  33. package/dist/components/shared.js +104 -0
  34. package/dist/components/shared.js.map +1 -0
  35. package/dist/components/version-diff.d.ts +35 -0
  36. package/dist/components/version-diff.d.ts.map +1 -0
  37. package/dist/components/version-diff.js +85 -0
  38. package/dist/components/version-diff.js.map +1 -0
  39. package/dist/components/view.d.ts +40 -0
  40. package/dist/components/view.d.ts.map +1 -0
  41. package/dist/components/view.js +75 -0
  42. package/dist/components/view.js.map +1 -0
  43. package/dist/context.d.ts +59 -0
  44. package/dist/context.d.ts.map +1 -0
  45. package/dist/context.js +13 -0
  46. package/dist/context.js.map +1 -0
  47. package/dist/controls.d.ts +145 -0
  48. package/dist/controls.d.ts.map +1 -0
  49. package/dist/controls.js +188 -0
  50. package/dist/controls.js.map +1 -0
  51. package/dist/download.d.ts +4 -0
  52. package/dist/download.d.ts.map +1 -0
  53. package/dist/download.js +20 -0
  54. package/dist/download.js.map +1 -0
  55. package/dist/editor-session.d.ts +184 -0
  56. package/dist/editor-session.d.ts.map +1 -0
  57. package/dist/editor-session.js +614 -0
  58. package/dist/editor-session.js.map +1 -0
  59. package/dist/hooks.d.ts +85 -0
  60. package/dist/hooks.d.ts.map +1 -0
  61. package/dist/hooks.js +297 -0
  62. package/dist/hooks.js.map +1 -0
  63. package/dist/i18n.d.ts +197 -0
  64. package/dist/i18n.d.ts.map +1 -0
  65. package/dist/i18n.js +207 -0
  66. package/dist/i18n.js.map +1 -0
  67. package/dist/index.d.ts +22 -0
  68. package/dist/index.d.ts.map +1 -0
  69. package/dist/index.js +22 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/kit-css.d.ts +3 -0
  72. package/dist/kit-css.d.ts.map +1 -0
  73. package/dist/kit-css.js +5 -0
  74. package/dist/kit-css.js.map +1 -0
  75. package/dist/line-diff.d.ts +25 -0
  76. package/dist/line-diff.d.ts.map +1 -0
  77. package/dist/line-diff.js +96 -0
  78. package/dist/line-diff.js.map +1 -0
  79. package/dist/partial-json.d.ts +8 -0
  80. package/dist/partial-json.d.ts.map +1 -0
  81. package/dist/partial-json.js +176 -0
  82. package/dist/partial-json.js.map +1 -0
  83. package/dist/provider.d.ts +42 -0
  84. package/dist/provider.d.ts.map +1 -0
  85. package/dist/provider.js +95 -0
  86. package/dist/provider.js.map +1 -0
  87. package/dist/styles.d.ts +25 -0
  88. package/dist/styles.d.ts.map +1 -0
  89. package/dist/styles.js +203 -0
  90. package/dist/styles.js.map +1 -0
  91. package/dist/toolbar.d.ts +90 -0
  92. package/dist/toolbar.d.ts.map +1 -0
  93. package/dist/toolbar.js +233 -0
  94. package/dist/toolbar.js.map +1 -0
  95. package/package.json +50 -3
  96. package/src/cache.ts +132 -0
  97. package/src/client.ts +390 -0
  98. package/src/components/approval.tsx +219 -0
  99. package/src/components/card.tsx +87 -0
  100. package/src/components/editor.tsx +392 -0
  101. package/src/components/icons.tsx +14 -0
  102. package/src/components/panel.tsx +591 -0
  103. package/src/components/shared.tsx +207 -0
  104. package/src/components/version-diff.tsx +266 -0
  105. package/src/components/view.tsx +199 -0
  106. package/src/context.ts +82 -0
  107. package/src/controls.tsx +587 -0
  108. package/src/download.ts +23 -0
  109. package/src/editor-session.ts +738 -0
  110. package/src/hooks.ts +411 -0
  111. package/src/i18n.ts +217 -0
  112. package/src/index.ts +160 -0
  113. package/src/kit-css.ts +5 -0
  114. package/src/line-diff.ts +111 -0
  115. package/src/partial-json.ts +160 -0
  116. package/src/provider.tsx +176 -0
  117. package/src/styles.ts +222 -0
  118. package/src/toolbar.tsx +536 -0
@@ -0,0 +1,614 @@
1
+ import { ArtifactError, applyOperations, deepEqual, isArtifactError, } from '@artkit-ai/core';
2
+ export function envelopeOf(artifact) {
3
+ return {
4
+ content: artifact.content,
5
+ title: artifact.title,
6
+ themeId: artifact.themeId,
7
+ locale: artifact.locale,
8
+ };
9
+ }
10
+ function sameEnvelope(a, b) {
11
+ return (a.title === b.title && a.themeId === b.themeId && a.locale === b.locale && deepEqual(a.content, b.content));
12
+ }
13
+ /**
14
+ * Operations that turn `from` into `to`. Kinds do not provide inverse operations, so undo and redo send
15
+ * `replace_content` with the snapshot (plus envelope operations); the commit still becomes a new version
16
+ * (spec §8.5).
17
+ */
18
+ export function operationsBetween(from, to) {
19
+ const ops = [];
20
+ if (!deepEqual(from.content, to.content))
21
+ ops.push({ op: 'replace_content', content: structuredClone(to.content) });
22
+ if (from.title !== to.title)
23
+ ops.push({ op: 'set_title', title: to.title });
24
+ if (from.themeId !== to.themeId)
25
+ ops.push({ op: 'set_theme', themeId: to.themeId });
26
+ if (from.locale !== to.locale)
27
+ ops.push({ op: 'set_locale', locale: to.locale });
28
+ return ops;
29
+ }
30
+ function toArtifactError(error) {
31
+ if (isArtifactError(error))
32
+ return error;
33
+ return new ArtifactError('INTERNAL_ERROR', 'Internal error while processing the request.', {
34
+ cause: error,
35
+ });
36
+ }
37
+ function defaultKey() {
38
+ const cryptoApi = globalThis.crypto;
39
+ if (cryptoApi?.randomUUID)
40
+ return cryptoApi.randomUUID();
41
+ return `ak-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 10)}`;
42
+ }
43
+ /**
44
+ * Framework-free editing session behind `ArtifactEditor` (spec §13.6): batching of typing operations,
45
+ * optimistic apply with the kind's own logic, rollback on rejection, local undo/redo over the user's own
46
+ * batches, rebase of pending operations on newer versions, conflict resolution and lock handling.
47
+ *
48
+ * Batches are sent one at a time, each against the version the previous one produced.
49
+ */
50
+ export class EditorSession {
51
+ options;
52
+ windowMs;
53
+ maxGroupingMs;
54
+ maxUndo;
55
+ confirmed;
56
+ view;
57
+ buffer = [];
58
+ bufferStartedAt = 0;
59
+ timer;
60
+ lockTimer;
61
+ queue = [];
62
+ inflight = false;
63
+ undoStack = [];
64
+ redoStack = [];
65
+ error;
66
+ conflict;
67
+ lockedUntil;
68
+ deferredRemote;
69
+ event;
70
+ seq = 0;
71
+ disposed = false;
72
+ listeners = new Set();
73
+ idleWaiters = [];
74
+ snapshot;
75
+ constructor(options) {
76
+ this.options = options;
77
+ this.windowMs = options.groupingWindowMs ?? 600;
78
+ this.maxGroupingMs = options.maxGroupingMs ?? 5000;
79
+ this.maxUndo = options.maxUndo ?? 100;
80
+ this.confirmed = options.artifact;
81
+ this.view = envelopeOf(options.artifact);
82
+ this.snapshot = this.buildSnapshot();
83
+ }
84
+ // -- subscription ---------------------------------------------------------------------------------
85
+ subscribe = (listener) => {
86
+ this.listeners.add(listener);
87
+ return () => this.listeners.delete(listener);
88
+ };
89
+ getSnapshot = () => this.snapshot;
90
+ /** Resolves once nothing is buffered, queued or in flight (or a conflict is waiting for the user). */
91
+ whenIdle() {
92
+ if (this.isIdle())
93
+ return Promise.resolve();
94
+ return new Promise((resolve) => this.idleWaiters.push(resolve));
95
+ }
96
+ isIdle() {
97
+ return (this.buffer.length === 0 && !this.inflight && (this.queue.length === 0 || this.conflict !== undefined));
98
+ }
99
+ buildSnapshot() {
100
+ const pendingEdits = this.queue.filter((item) => item.type === 'ops' && item.origin !== 'undo' && item.origin !== 'redo').length;
101
+ const queuedUndo = this.queue.filter((item) => item.type === 'undo').length;
102
+ const queuedRedo = this.queue.filter((item) => item.type === 'redo').length;
103
+ const dirty = this.buffer.length > 0 || this.queue.length > 0 || this.inflight;
104
+ let status = 'idle';
105
+ if (this.conflict)
106
+ status = 'conflict';
107
+ else if (this.inflight || this.queue.length > 0)
108
+ status = 'saving';
109
+ else if (this.buffer.length > 0)
110
+ status = 'editing';
111
+ const blocked = this.conflict !== undefined || this.isLocked();
112
+ return {
113
+ confirmed: this.confirmed,
114
+ view: this.view,
115
+ status,
116
+ dirty,
117
+ canUndo: !blocked && this.undoStack.length + pendingEdits + (this.buffer.length > 0 ? 1 : 0) > queuedUndo,
118
+ canRedo: !blocked && this.buffer.length === 0 && pendingEdits === 0 && this.redoStack.length > queuedRedo,
119
+ ...(this.error ? { error: this.error } : {}),
120
+ ...(this.conflict
121
+ ? {
122
+ conflict: {
123
+ reason: this.conflict.reason,
124
+ changes: this.conflict.changes,
125
+ operations: this.conflict.operations,
126
+ latest: this.conflict.latest,
127
+ },
128
+ }
129
+ : {}),
130
+ ...(this.lockedUntil ? { lockedUntil: this.lockedUntil } : {}),
131
+ ...(this.event ? { event: this.event } : {}),
132
+ };
133
+ }
134
+ notify() {
135
+ this.snapshot = this.buildSnapshot();
136
+ for (const listener of [...this.listeners])
137
+ listener();
138
+ if (this.isIdle() && this.idleWaiters.length > 0) {
139
+ const waiters = this.idleWaiters;
140
+ this.idleWaiters = [];
141
+ for (const resolve of waiters)
142
+ resolve();
143
+ }
144
+ }
145
+ announce(event) {
146
+ this.seq += 1;
147
+ this.event = { ...event, seq: this.seq };
148
+ }
149
+ isLocked() {
150
+ return this.lockedUntil !== undefined && Date.parse(this.lockedUntil) > Date.now();
151
+ }
152
+ // -- local application -----------------------------------------------------------------------------
153
+ applyLocal(state, ops) {
154
+ const result = applyOperations(this.options.registry, { kind: this.confirmed.kind, ...state }, ops, this.options.locale ? { locale: this.options.locale } : {});
155
+ return { content: result.content, title: result.title, themeId: result.themeId, locale: result.locale };
156
+ }
157
+ pendingOperations() {
158
+ const ops = [];
159
+ for (const item of this.queue)
160
+ if (item.type === 'ops')
161
+ ops.push(...item.ops);
162
+ ops.push(...this.buffer);
163
+ return ops;
164
+ }
165
+ /**
166
+ * Recomputes the optimistic view from the confirmed version. When the unconfirmed operations no
167
+ * longer apply, they move into a `rebase` conflict and the view falls back to the confirmed version.
168
+ */
169
+ rebaseView(previous) {
170
+ let state = envelopeOf(this.confirmed);
171
+ try {
172
+ for (const item of this.queue)
173
+ if (item.type === 'ops')
174
+ state = this.applyLocal(state, item.ops);
175
+ if (this.buffer.length > 0)
176
+ state = this.applyLocal(state, this.buffer);
177
+ this.view = state;
178
+ }
179
+ catch {
180
+ const operations = this.pendingOperations();
181
+ this.clearTimer();
182
+ this.buffer = [];
183
+ // The in-flight batch (if any) is already at the server and settles on its own.
184
+ this.queue = this.inflight ? this.queue.slice(0, 1) : [];
185
+ this.view = envelopeOf(this.confirmed);
186
+ this.conflict = {
187
+ reason: 'rebase',
188
+ changes: this.changesBetween(previous, this.confirmed),
189
+ operations,
190
+ latest: this.confirmed,
191
+ origin: 'edit',
192
+ };
193
+ this.announce({ type: 'conflict', reason: 'rebase' });
194
+ }
195
+ }
196
+ changesBetween(before, after) {
197
+ const changes = [];
198
+ if (before.title !== after.title)
199
+ changes.push({
200
+ type: 'changed',
201
+ target: 'envelope:title',
202
+ summary: `'${before.title}' → '${after.title}'`,
203
+ });
204
+ if (before.themeId !== after.themeId)
205
+ changes.push({
206
+ type: 'changed',
207
+ target: 'envelope:themeId',
208
+ summary: `${before.themeId} → ${after.themeId}`,
209
+ });
210
+ if (before.locale !== after.locale)
211
+ changes.push({
212
+ type: 'changed',
213
+ target: 'envelope:locale',
214
+ summary: `${before.locale} → ${after.locale}`,
215
+ });
216
+ try {
217
+ changes.push(...this.options.registry.get(this.confirmed.kind).diff(before.content, after.content));
218
+ }
219
+ catch {
220
+ // A diff failure must not hide the conflict itself.
221
+ }
222
+ return changes;
223
+ }
224
+ // -- editing ---------------------------------------------------------------------------------------
225
+ /**
226
+ * Called by the kind editor. Operations are applied optimistically right away; invalid ones are
227
+ * rejected locally (returns false) and never reach the server.
228
+ */
229
+ emit = (operations, options = {}) => {
230
+ if (this.disposed ||
231
+ this.conflict ||
232
+ this.isLocked() ||
233
+ !Array.isArray(operations) ||
234
+ operations.length === 0)
235
+ return false;
236
+ try {
237
+ this.view = this.applyLocal(this.view, operations);
238
+ }
239
+ catch (error) {
240
+ this.error = toArtifactError(error);
241
+ this.announce({ type: 'rejected', error: this.error });
242
+ this.notify();
243
+ return false;
244
+ }
245
+ this.error = undefined;
246
+ this.redoStack = [];
247
+ const maxOps = this.options.registry.batch.maxOperations;
248
+ if (options.kind === 'typing') {
249
+ if (this.buffer.length + operations.length > maxOps)
250
+ this.flushBuffer();
251
+ if (this.buffer.length === 0)
252
+ this.bufferStartedAt = Date.now();
253
+ this.buffer.push(...operations);
254
+ if (Date.now() - this.bufferStartedAt >= this.maxGroupingMs)
255
+ this.flushBuffer();
256
+ else
257
+ this.schedule();
258
+ }
259
+ else {
260
+ // Discrete operations and the end of continuous gestures flush right away, after pending typing.
261
+ this.flushBuffer();
262
+ this.queue.push({ type: 'ops', ops: operations, key: this.key(), origin: 'edit' });
263
+ }
264
+ this.pump();
265
+ this.notify();
266
+ return true;
267
+ };
268
+ /** Sends buffered typing operations now (e.g. on blur or before navigation). */
269
+ flush() {
270
+ if (this.buffer.length === 0)
271
+ return;
272
+ this.flushBuffer();
273
+ this.pump();
274
+ this.notify();
275
+ }
276
+ key() {
277
+ return this.options.createKey?.() ?? defaultKey();
278
+ }
279
+ schedule() {
280
+ this.clearTimer();
281
+ this.timer = setTimeout(() => {
282
+ this.timer = undefined;
283
+ this.flush();
284
+ }, this.windowMs);
285
+ }
286
+ clearTimer() {
287
+ if (this.timer !== undefined)
288
+ clearTimeout(this.timer);
289
+ this.timer = undefined;
290
+ }
291
+ flushBuffer() {
292
+ this.clearTimer();
293
+ if (this.buffer.length === 0)
294
+ return;
295
+ this.queue.push({ type: 'ops', ops: this.buffer, key: this.key(), origin: 'edit' });
296
+ this.buffer = [];
297
+ }
298
+ undo = () => {
299
+ if (!this.snapshot.canUndo)
300
+ return;
301
+ this.flushBuffer();
302
+ this.queue.push({ type: 'undo' });
303
+ this.pump();
304
+ this.notify();
305
+ };
306
+ redo = () => {
307
+ if (!this.snapshot.canRedo)
308
+ return;
309
+ this.queue.push({ type: 'redo' });
310
+ this.pump();
311
+ this.notify();
312
+ };
313
+ dismissError = () => {
314
+ if (!this.error)
315
+ return;
316
+ this.error = undefined;
317
+ this.notify();
318
+ };
319
+ // -- sending ---------------------------------------------------------------------------------------
320
+ pump() {
321
+ if (this.inflight || this.conflict)
322
+ return;
323
+ const item = this.queue[0];
324
+ if (!item)
325
+ return;
326
+ if (item.type === 'undo' || item.type === 'redo') {
327
+ this.resolveHistoryCommand(item.type);
328
+ return;
329
+ }
330
+ this.inflight = true;
331
+ const base = this.confirmed;
332
+ this.options
333
+ .send({ baseVersion: base.version, operations: item.ops, idempotencyKey: item.key })
334
+ .then((result) => this.onCommitted(item, base, result), (error) => this.onRejected(item, base, error))
335
+ .finally(() => this.notify());
336
+ }
337
+ resolveHistoryCommand(direction) {
338
+ const stack = direction === 'undo' ? this.undoStack : this.redoStack;
339
+ const entry = stack.pop();
340
+ if (!entry) {
341
+ this.queue.shift();
342
+ this.pump();
343
+ return;
344
+ }
345
+ if (!entry.before) {
346
+ // Rebased commit: the version before it is only known by the server.
347
+ this.inflight = true;
348
+ this.options
349
+ .load(entry.beforeVersion)
350
+ .then((artifact) => {
351
+ entry.before = envelopeOf(artifact);
352
+ stack.push(entry);
353
+ }, (error) => {
354
+ this.queue.shift();
355
+ this.error = toArtifactError(error);
356
+ this.announce({ type: 'rolled_back', error: this.error });
357
+ })
358
+ .finally(() => {
359
+ this.inflight = false;
360
+ this.applyDeferred();
361
+ this.pump();
362
+ this.notify();
363
+ });
364
+ return;
365
+ }
366
+ const current = envelopeOf(this.confirmed);
367
+ const expected = direction === 'undo' ? entry.after : entry.before;
368
+ const target = direction === 'undo' ? entry.before : entry.after;
369
+ this.queue.shift();
370
+ if (!sameEnvelope(current, expected)) {
371
+ // Someone else changed the artifact after this edit: undoing blindly would discard their work.
372
+ this.conflict = {
373
+ reason: direction,
374
+ changes: this.changesBetween(expected, current),
375
+ operations: operationsBetween(current, target),
376
+ latest: this.confirmed,
377
+ origin: direction,
378
+ entry,
379
+ };
380
+ this.view = current;
381
+ this.announce({ type: 'conflict', reason: direction });
382
+ return;
383
+ }
384
+ const ops = operationsBetween(current, target);
385
+ if (ops.length === 0) {
386
+ (direction === 'undo' ? this.redoStack : this.undoStack).push(entry);
387
+ this.pump();
388
+ return;
389
+ }
390
+ this.queue.unshift({ type: 'ops', ops, key: this.key(), origin: direction, entry });
391
+ this.rebaseView(this.confirmed);
392
+ this.pump();
393
+ }
394
+ onCommitted(item, base, result) {
395
+ this.inflight = false;
396
+ this.queue.shift();
397
+ const previous = this.confirmed;
398
+ if (result.artifact.version > this.confirmed.version)
399
+ this.confirmed = result.artifact;
400
+ const after = envelopeOf(result.artifact);
401
+ if (item.origin === 'undo' && item.entry) {
402
+ this.redoStack.push(item.entry);
403
+ this.announce({ type: 'undone', version: result.version });
404
+ }
405
+ else if (item.origin === 'redo' && item.entry) {
406
+ this.pushUndo(item.entry);
407
+ this.announce({ type: 'redone', version: result.version });
408
+ }
409
+ else {
410
+ this.pushUndo({
411
+ ...(result.rebased ? {} : { before: envelopeOf(base) }),
412
+ beforeVersion: result.version - 1,
413
+ after,
414
+ });
415
+ this.announce({ type: 'saved', version: result.version });
416
+ }
417
+ try {
418
+ this.options.onCommitted?.(result);
419
+ }
420
+ catch {
421
+ // A failing host callback must not break the session.
422
+ }
423
+ if (!this.disposed)
424
+ this.rebaseView(previous);
425
+ this.applyDeferred();
426
+ this.pump();
427
+ }
428
+ /** Incorporates a version that arrived while a request was in flight. */
429
+ applyDeferred() {
430
+ const remote = this.deferredRemote;
431
+ this.deferredRemote = undefined;
432
+ if (remote && remote.version > this.confirmed.version)
433
+ this.incorporate(remote);
434
+ }
435
+ pushUndo(entry) {
436
+ this.undoStack.push(entry);
437
+ if (this.undoStack.length > this.maxUndo)
438
+ this.undoStack.splice(0, this.undoStack.length - this.maxUndo);
439
+ }
440
+ onRejected(item, base, raw) {
441
+ const error = toArtifactError(raw);
442
+ this.queue.shift();
443
+ if (error.code === 'VERSION_CONFLICT') {
444
+ const operations = [...item.ops, ...this.pendingOperations()];
445
+ this.clearTimer();
446
+ this.queue = [];
447
+ this.buffer = [];
448
+ const changes = Array.isArray(error.details.changesSinceBase)
449
+ ? error.details.changesSinceBase
450
+ : undefined;
451
+ // Keep `inflight` set while loading so nothing else is sent against a stale base.
452
+ return this.options
453
+ .load()
454
+ .then((latest) => {
455
+ if (latest.version > this.confirmed.version)
456
+ this.confirmed = latest;
457
+ }, () => undefined)
458
+ .then(() => {
459
+ this.inflight = false;
460
+ const remote = this.deferredRemote;
461
+ this.deferredRemote = undefined;
462
+ if (remote && remote.version > this.confirmed.version)
463
+ this.confirmed = remote;
464
+ const reason = item.origin === 'undo' || item.origin === 'redo' ? item.origin : 'server';
465
+ this.conflict = {
466
+ reason,
467
+ changes: changes ?? this.changesBetween(base, this.confirmed),
468
+ operations: item.origin === 'undo' || item.origin === 'redo' ? item.ops : operations,
469
+ latest: this.confirmed,
470
+ origin: item.origin,
471
+ ...(item.entry ? { entry: item.entry } : {}),
472
+ };
473
+ this.view = envelopeOf(this.confirmed);
474
+ this.announce({ type: 'conflict', reason });
475
+ });
476
+ }
477
+ this.inflight = false;
478
+ // Any other rejection rolls back to the last confirmed version (spec §13.6).
479
+ this.clearTimer();
480
+ this.queue = [];
481
+ this.buffer = [];
482
+ if (item.entry)
483
+ (item.origin === 'undo' ? this.undoStack : this.redoStack).push(item.entry);
484
+ if (error.code === 'LOCKED')
485
+ this.setLocked(error);
486
+ this.error = error;
487
+ this.view = envelopeOf(this.confirmed);
488
+ this.announce({ type: 'rolled_back', error });
489
+ const remote = this.deferredRemote;
490
+ this.deferredRemote = undefined;
491
+ if (remote && remote.version > this.confirmed.version) {
492
+ this.confirmed = remote;
493
+ this.view = envelopeOf(remote);
494
+ }
495
+ }
496
+ setLocked(error) {
497
+ const expiresAt = typeof error.details.expiresAt === 'string'
498
+ ? error.details.expiresAt
499
+ : new Date(Date.now() + 60_000).toISOString();
500
+ this.lockedUntil = expiresAt;
501
+ if (this.lockTimer !== undefined)
502
+ clearTimeout(this.lockTimer);
503
+ const delay = Math.max(0, Date.parse(expiresAt) - Date.now());
504
+ this.lockTimer = setTimeout(() => {
505
+ this.lockTimer = undefined;
506
+ this.lockedUntil = undefined;
507
+ this.notify();
508
+ }, delay);
509
+ }
510
+ // -- remote versions ---------------------------------------------------------------------------------
511
+ /**
512
+ * A version arrived from outside the session (refetch, agent commit, prop). Pending local operations
513
+ * are rebased on it; when they no longer apply, a `rebase` conflict asks the user what to keep.
514
+ */
515
+ receive = (artifact) => {
516
+ if (this.disposed || artifact.id !== this.confirmed.id)
517
+ return;
518
+ if (artifact.version < this.confirmed.version)
519
+ return;
520
+ if (artifact.version === this.confirmed.version) {
521
+ if (artifact.status !== this.confirmed.status ||
522
+ artifact.meta.publishedVersion !== this.confirmed.meta.publishedVersion) {
523
+ this.confirmed = { ...this.confirmed, status: artifact.status, meta: artifact.meta };
524
+ this.notify();
525
+ }
526
+ return;
527
+ }
528
+ if (this.inflight) {
529
+ // Wait for the in-flight batch: applying it on top of a version that may already contain it
530
+ // would show its operations twice.
531
+ if (!this.deferredRemote || artifact.version > this.deferredRemote.version)
532
+ this.deferredRemote = artifact;
533
+ return;
534
+ }
535
+ this.incorporate(artifact);
536
+ this.notify();
537
+ };
538
+ incorporate(artifact) {
539
+ const previous = this.confirmed;
540
+ this.confirmed = artifact;
541
+ if (this.conflict) {
542
+ this.conflict.latest = artifact;
543
+ this.view = envelopeOf(artifact);
544
+ }
545
+ else {
546
+ this.rebaseView(previous);
547
+ if (!this.conflict)
548
+ this.announce({ type: 'rebased', version: artifact.version });
549
+ }
550
+ }
551
+ resolveConflict = (choice) => {
552
+ const conflict = this.conflict;
553
+ if (!conflict)
554
+ return;
555
+ this.conflict = undefined;
556
+ this.error = undefined;
557
+ this.view = envelopeOf(this.confirmed);
558
+ if (choice === 'reapply') {
559
+ if (conflict.origin === 'undo' || conflict.origin === 'redo') {
560
+ const entry = conflict.entry;
561
+ const target = entry ? (conflict.origin === 'undo' ? entry.before : entry.after) : undefined;
562
+ const ops = target ? operationsBetween(envelopeOf(this.confirmed), target) : [];
563
+ if (ops.length > 0) {
564
+ this.queue.unshift({
565
+ type: 'ops',
566
+ ops,
567
+ key: this.key(),
568
+ origin: conflict.origin,
569
+ ...(entry ? { entry } : {}),
570
+ });
571
+ }
572
+ }
573
+ else {
574
+ try {
575
+ this.applyLocal(envelopeOf(this.confirmed), conflict.operations);
576
+ this.queue.unshift({ type: 'ops', ops: conflict.operations, key: this.key(), origin: 'reapply' });
577
+ }
578
+ catch (error) {
579
+ this.error = toArtifactError(error);
580
+ this.announce({ type: 'rolled_back', error: this.error });
581
+ this.pump();
582
+ this.notify();
583
+ return;
584
+ }
585
+ }
586
+ this.rebaseView(this.confirmed);
587
+ }
588
+ this.announce({ type: 'conflict_resolved', choice });
589
+ this.pump();
590
+ this.notify();
591
+ };
592
+ /**
593
+ * Stops timers and listeners. Buffered typing is still sent unless `discard` is set, so closing the
594
+ * editor right after typing does not lose the last keystrokes.
595
+ */
596
+ dispose(options = {}) {
597
+ if (this.disposed)
598
+ return;
599
+ if (options.discard) {
600
+ this.buffer = [];
601
+ this.queue = this.inflight ? this.queue.slice(0, 1) : [];
602
+ }
603
+ else {
604
+ this.flushBuffer();
605
+ this.pump();
606
+ }
607
+ this.clearTimer();
608
+ if (this.lockTimer !== undefined)
609
+ clearTimeout(this.lockTimer);
610
+ this.disposed = true;
611
+ this.listeners.clear();
612
+ }
613
+ }
614
+ //# sourceMappingURL=editor-session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"editor-session.js","sourceRoot":"","sources":["../src/editor-session.ts"],"names":[],"mappings":"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"}