@elytracms/studio 0.0.100 → 0.0.102

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 (170) hide show
  1. package/convex/analytics-cost.test.ts +1 -1
  2. package/convex/asset-meta-patch.test.ts +7 -27
  3. package/convex/assets.ts +6 -41
  4. package/convex/cms.ts +2 -29
  5. package/convex/delivery.ts +2 -2
  6. package/convex/record-functions.ts +15 -82
  7. package/convex/redirects.ts +11 -116
  8. package/convex/schema.ts +4 -23
  9. package/convex/shared-capture.convex.test.ts +165 -0
  10. package/convex/triggers.ts +7 -14
  11. package/dist/components/ai/ai-chat-panel-lazy.js +7 -2
  12. package/dist/components/ai/ai-chat-panel-lazy.js.map +1 -1
  13. package/dist/components/ai/ai-chat-panel.js +8 -5
  14. package/dist/components/ai/ai-chat-panel.js.map +1 -1
  15. package/dist/components/ai/proposal-card.js +2 -1
  16. package/dist/components/ai/proposal-card.js.map +1 -1
  17. package/dist/components/ai/proposal-unfilled.d.ts +14 -0
  18. package/dist/components/ai/proposal-unfilled.js +33 -0
  19. package/dist/components/ai/proposal-unfilled.js.map +1 -0
  20. package/dist/components/ai/translate-document-action.js +8 -6
  21. package/dist/components/ai/translate-document-action.js.map +1 -1
  22. package/dist/components/ai/translate-skipped.js +1 -0
  23. package/dist/components/ai/translate-skipped.js.map +1 -1
  24. package/dist/components/app-views/studio-config.d.ts +12 -12
  25. package/dist/components/app-views/studio-config.js.map +1 -1
  26. package/dist/components/assets/asset-detail.js +1 -2
  27. package/dist/components/assets/asset-detail.js.map +1 -1
  28. package/dist/components/assets/asset-metadata.d.ts +2 -9
  29. package/dist/components/assets/asset-metadata.js +3 -10
  30. package/dist/components/assets/asset-metadata.js.map +1 -1
  31. package/dist/components/assets/asset-search.js +1 -1
  32. package/dist/components/assets/asset-search.js.map +1 -1
  33. package/dist/components/assets/asset-selection.js +2 -2
  34. package/dist/components/assets/asset-selection.js.map +1 -1
  35. package/dist/components/assets/assets-collection-view-source.d.ts +2 -3
  36. package/dist/components/assets/assets-collection-view-source.js +2 -3
  37. package/dist/components/assets/assets-collection-view-source.js.map +1 -1
  38. package/dist/components/builder/__fixtures__/reuse-race.d.ts +30 -0
  39. package/dist/components/builder/__fixtures__/reuse-race.js +77 -0
  40. package/dist/components/builder/__fixtures__/reuse-race.js.map +1 -0
  41. package/dist/components/builder/builder-store.d.ts +37 -1
  42. package/dist/components/builder/builder-store.js +21 -6
  43. package/dist/components/builder/builder-store.js.map +1 -1
  44. package/dist/components/builder/canvas-chrome-css.d.ts +1 -1
  45. package/dist/components/builder/canvas-chrome-css.js +1 -1
  46. package/dist/components/builder/canvas-chrome-css.js.map +1 -1
  47. package/dist/components/builder/canvas-chrome.d.ts +1 -1
  48. package/dist/components/builder/canvas-chrome.js +1 -1
  49. package/dist/components/builder/canvas-chrome.js.map +1 -1
  50. package/dist/components/builder/canvas-rebase.d.ts +4 -4
  51. package/dist/components/builder/canvas-rebase.js +3 -2
  52. package/dist/components/builder/canvas-rebase.js.map +1 -1
  53. package/dist/components/builder/canvas-render-context.d.ts +1 -1
  54. package/dist/components/builder/canvas-render-context.js +1 -1
  55. package/dist/components/builder/canvas-render-context.js.map +1 -1
  56. package/dist/components/builder/composition-field-editor-lazy.js +2 -1
  57. package/dist/components/builder/composition-field-editor-lazy.js.map +1 -1
  58. package/dist/components/builder/composition-field-editor.js +3 -3
  59. package/dist/components/builder/composition-field-editor.js.map +1 -1
  60. package/dist/components/builder/reuse-context.d.ts +9 -2
  61. package/dist/components/builder/reuse-context.js +46 -6
  62. package/dist/components/builder/reuse-context.js.map +1 -1
  63. package/dist/components/builder/reuse.d.ts +113 -70
  64. package/dist/components/builder/reuse.js +123 -108
  65. package/dist/components/builder/reuse.js.map +1 -1
  66. package/dist/components/cms/asset-field.js +1 -3
  67. package/dist/components/cms/asset-field.js.map +1 -1
  68. package/dist/components/cms/cell.d.ts +2 -2
  69. package/dist/components/cms/cell.js +8 -18
  70. package/dist/components/cms/cell.js.map +1 -1
  71. package/dist/components/cms/cms-store.d.ts +9 -1
  72. package/dist/components/cms/cms-store.js +1 -0
  73. package/dist/components/cms/cms-store.js.map +1 -1
  74. package/dist/components/cms/detail-editor.js +15 -14
  75. package/dist/components/cms/detail-editor.js.map +1 -1
  76. package/dist/components/cms/field-control.js +13 -1
  77. package/dist/components/cms/field-control.js.map +1 -1
  78. package/dist/components/cms/prop-fields.js +1 -1
  79. package/dist/components/cms/prop-fields.js.map +1 -1
  80. package/dist/components/cms/rich-text/lazy.js +2 -1
  81. package/dist/components/cms/rich-text/lazy.js.map +1 -1
  82. package/dist/components/cms/rich-text/toolbar-state.d.ts +1 -1
  83. package/dist/components/cms/rich-text/toolbar-state.js +1 -1
  84. package/dist/components/cms/rich-text/toolbar-state.js.map +1 -1
  85. package/dist/components/cms/use-field-focus.js +3 -3
  86. package/dist/components/cms/use-field-focus.js.map +1 -1
  87. package/dist/components/cms/version-compare-lazy.js +2 -1
  88. package/dist/components/cms/version-compare-lazy.js.map +1 -1
  89. package/dist/components/components/components-index.js +1 -1
  90. package/dist/components/components/components-index.js.map +1 -1
  91. package/dist/components/deployment-setup-gate.d.ts +1 -1
  92. package/dist/components/deployment-setup-gate.js +1 -1
  93. package/dist/components/deployment-setup-gate.js.map +1 -1
  94. package/dist/components/load-failure.d.ts +62 -0
  95. package/dist/components/load-failure.js +110 -0
  96. package/dist/components/load-failure.js.map +1 -0
  97. package/dist/components/notifications/shell-findings.js +3 -3
  98. package/dist/components/notifications/shell-findings.js.map +1 -1
  99. package/dist/customization.d.ts +3 -3
  100. package/dist/customization.js.map +1 -1
  101. package/dist/lib/ai/apply-content.js +99 -28
  102. package/dist/lib/ai/apply-content.js.map +1 -1
  103. package/dist/lib/ai/chat-context.d.ts +77 -7
  104. package/dist/lib/ai/chat-context.js +139 -14
  105. package/dist/lib/ai/chat-context.js.map +1 -1
  106. package/dist/lib/ai/chat-state.d.ts +7 -1
  107. package/dist/lib/ai/chat-state.js.map +1 -1
  108. package/dist/lib/ai/constraints.d.ts +5 -0
  109. package/dist/lib/ai/constraints.js +21 -6
  110. package/dist/lib/ai/constraints.js.map +1 -1
  111. package/dist/lib/ai/fake-provider.d.ts +76 -26
  112. package/dist/lib/ai/fake-provider.js +210 -66
  113. package/dist/lib/ai/fake-provider.js.map +1 -1
  114. package/dist/lib/ai/index.d.ts +1 -0
  115. package/dist/lib/ai/index.js +1 -0
  116. package/dist/lib/ai/index.js.map +1 -1
  117. package/dist/lib/ai/keyless-assistant.d.ts +37 -0
  118. package/dist/lib/ai/keyless-assistant.js +193 -0
  119. package/dist/lib/ai/keyless-assistant.js.map +1 -0
  120. package/dist/lib/ai/knowledge.d.ts +9 -9
  121. package/dist/lib/ai/knowledge.js +22 -0
  122. package/dist/lib/ai/knowledge.js.map +1 -1
  123. package/dist/lib/ai/shape.d.ts +25 -2
  124. package/dist/lib/ai/shape.js +58 -7
  125. package/dist/lib/ai/shape.js.map +1 -1
  126. package/dist/lib/ai/tools.d.ts +18 -1
  127. package/dist/lib/ai/tools.js +74 -11
  128. package/dist/lib/ai/tools.js.map +1 -1
  129. package/dist/lib/ai/translate-document.d.ts +8 -1
  130. package/dist/lib/ai/translate-document.js +25 -9
  131. package/dist/lib/ai/translate-document.js.map +1 -1
  132. package/dist/lib/ai/types.d.ts +22 -7
  133. package/dist/lib/ai/types.js.map +1 -1
  134. package/dist/lib/ai/update-fields.js +13 -17
  135. package/dist/lib/ai/update-fields.js.map +1 -1
  136. package/dist/lib/ai/writer-form.d.ts +72 -3
  137. package/dist/lib/ai/writer-form.js +320 -42
  138. package/dist/lib/ai/writer-form.js.map +1 -1
  139. package/dist/lib/assets/upload.d.ts +1 -2
  140. package/dist/lib/assets/upload.js +1 -2
  141. package/dist/lib/assets/upload.js.map +1 -1
  142. package/dist/lib/auth-errors.d.ts +1 -1
  143. package/dist/lib/auth-errors.js +1 -1
  144. package/dist/lib/auth-errors.js.map +1 -1
  145. package/dist/lib/engine-version.d.ts +1 -1
  146. package/dist/lib/engine-version.js +1 -1
  147. package/dist/lib/engine-version.js.map +1 -1
  148. package/dist/lib/i18n/messages.de.d.ts +1 -1
  149. package/dist/lib/i18n/messages.de.js +32 -8
  150. package/dist/lib/i18n/messages.de.js.map +1 -1
  151. package/dist/lib/i18n/messages.en.d.ts +25 -3
  152. package/dist/lib/i18n/messages.en.js +40 -10
  153. package/dist/lib/i18n/messages.en.js.map +1 -1
  154. package/dist/lib/operations/cms-persistence.d.ts +28 -0
  155. package/dist/lib/operations/cms-persistence.js +55 -0
  156. package/dist/lib/operations/cms-persistence.js.map +1 -1
  157. package/dist/lib/persistence/convex-adapter.js +7 -2
  158. package/dist/lib/persistence/convex-adapter.js.map +1 -1
  159. package/dist/lib/workspace/index.d.ts +3 -3
  160. package/dist/lib/workspace/index.js +3 -3
  161. package/dist/lib/workspace/index.js.map +1 -1
  162. package/dist/router/navigate-once.d.ts +1 -1
  163. package/dist/router/navigate-once.js.map +1 -1
  164. package/dist/router/root.d.ts +3 -2
  165. package/dist/router/root.js +25 -4
  166. package/dist/router/root.js.map +1 -1
  167. package/package.json +3 -3
  168. package/convex/asset-alt-migration.test.ts +0 -127
  169. package/convex/redirect-migration.test.ts +0 -205
  170. package/convex/version-kind-stamping.test.ts +0 -118
@@ -129,6 +129,21 @@ export type CommitOutcome = {
129
129
  readonly status: 'failed';
130
130
  readonly error: OperationError;
131
131
  };
132
+ /**
133
+ * EC-728 — what {@link CmsPersister.deleteCreated} did: `deleted`; `gone` (already deleted);
134
+ * `changed` (written since the create — edited or published); `referenced` (a document
135
+ * references it — any relation, weak or strict, draft or published, EC-739); `not-created`
136
+ * (this session holds no create receipt for it); `failed`.
137
+ */
138
+ export type DeleteCreatedOutcome = 'deleted' | 'gone' | 'changed' | 'referenced' | 'not-created' | 'failed';
139
+ /**
140
+ * EC-728 — the refusal of a conditional delete, read off the operation's error (pure). EC-739:
141
+ * `referenced` when the conflict names referrers (the unreferenced guard's refusal, before the
142
+ * store or re-judged after it refused); `changed` only for a REVISION conflict — one carrying
143
+ * the current row; `gone` when that row is absent. A conflict carrying neither (a referrer that
144
+ * refused the store's step and was gone again by the re-judge) is `failed`: it was never an edit.
145
+ */
146
+ export declare function deleteCreatedRefusal(error: OperationError): Exclude<DeleteCreatedOutcome, 'deleted' | 'not-created'>;
132
147
  export interface CmsPersister {
133
148
  /** Adopt a server row as this session's base for its document (hydration, a create result). */
134
149
  track(row: TrackedRow): void;
@@ -193,6 +208,19 @@ export interface CmsPersister {
193
208
  */
194
209
  replace(document: CmsDocument, revision: number | undefined, authoredOn?: CmsDocument): void;
195
210
  deleteDocument(ref: DocumentRef): void;
211
+ /**
212
+ * EC-728 — delete a document THIS session created, only while it is exactly as created and
213
+ * nobody else has it: `documents.delete` with the precondition `{ revision, unreferenced }`.
214
+ * `revision` = the revision this session's own create landed at (its receipt — never a later
215
+ * read), so a write by anyone since (an edit, a publish — "never published" needs nothing
216
+ * more) refuses it in the store's own step; `unreferenced` (EC-739) refuses it while ANY
217
+ * document references it — weak or strict, draft or published — judged by the operation and
218
+ * re-checked by the store in that same step, so a reference saved since the guard's read
219
+ * refuses it too. One write, every condition. Sent after every write queued before it.
220
+ * Nothing is reported on the session's error surface — a refusal is an expected answer the
221
+ * caller words; the session drops the document only once the store has deleted it.
222
+ */
223
+ deleteCreated(ref: DocumentRef): Promise<DeleteCreatedOutcome>;
196
224
  unpublishDocument(ref: DocumentRef): void;
197
225
  /**
198
226
  * Adopt a server row pushed by the document subscription (EC-595 point 7): applied
@@ -1,5 +1,23 @@
1
1
  import { applyDocumentPatches, documentKey, expandValuePath, fieldPositionPatches, formatValuePath, isValuePathPrefix, readValueAt, selfTypeDocument, semanticValueEqual, touchedPaths, touchedPathsOfEntry, valuePathsOverlap, } from '@elytracms/core/cms-core';
2
2
  import { createPersistQueue } from './persist-queue.js';
3
+ /**
4
+ * EC-728 — the refusal of a conditional delete, read off the operation's error (pure). EC-739:
5
+ * `referenced` when the conflict names referrers (the unreferenced guard's refusal, before the
6
+ * store or re-judged after it refused); `changed` only for a REVISION conflict — one carrying
7
+ * the current row; `gone` when that row is absent. A conflict carrying neither (a referrer that
8
+ * refused the store's step and was gone again by the re-judge) is `failed`: it was never an edit.
9
+ */
10
+ export function deleteCreatedRefusal(error) {
11
+ if (error.code === 'not-found')
12
+ return 'gone';
13
+ if (error.code !== 'conflict')
14
+ return 'failed';
15
+ if ((error.referrers?.length ?? 0) > 0)
16
+ return 'referenced';
17
+ if (error.current === null)
18
+ return 'gone';
19
+ return error.current ? 'changed' : 'failed';
20
+ }
3
21
  /** EC-686 — a decomposed alias is re-sent at most this often (each time a colleague wrote the document in between). */
4
22
  const ALIAS_ATTEMPTS = 3;
5
23
  /** How many own writes a document's ledger keeps (an older base just stops lifting — a conflict, never a borrow). */
@@ -1182,6 +1200,43 @@ export function createCmsPersister(options) {
1182
1200
  emitDocument(entry);
1183
1201
  schedule(entry);
1184
1202
  },
1203
+ deleteCreated(ref) {
1204
+ const entry = entryOf(ref);
1205
+ return new Promise((resolve) => {
1206
+ // Queued like every write: whatever was committed before it is sent first.
1207
+ queue.push(async () => {
1208
+ if (entry.deleted)
1209
+ return resolve('gone');
1210
+ if (entry.created === undefined)
1211
+ return resolve('not-created');
1212
+ // A write of ours committed and not sent yet is an edit since the create.
1213
+ if (entry.queue.length > 0)
1214
+ return resolve('changed');
1215
+ const operations = await options.getOperations();
1216
+ entry.busy = true;
1217
+ try {
1218
+ const result = await operations.documents.delete({
1219
+ projectId: options.projectId,
1220
+ ref: entry.ref,
1221
+ precondition: { revision: entry.created, unreferenced: true },
1222
+ });
1223
+ if (result.ok) {
1224
+ markGone(entry);
1225
+ resolve('deleted');
1226
+ }
1227
+ else
1228
+ resolve(deleteCreatedRefusal(result.error));
1229
+ }
1230
+ catch {
1231
+ resolve('failed');
1232
+ }
1233
+ finally {
1234
+ entry.busy = false;
1235
+ adoptHeld(entry);
1236
+ }
1237
+ });
1238
+ });
1239
+ },
1185
1240
  deleteDocument(ref) {
1186
1241
  const entry = entryOf(ref);
1187
1242
  dropQueued(entry, { status: 'failed', error: goneError(ref) });