@storystick/preview 0.0.0-stage → 0.2.0-rc.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 (245) hide show
  1. package/LICENSE +112 -0
  2. package/PUBLIC-API.md +55 -0
  3. package/README.md +42 -2
  4. package/dist/.source-hash +1 -0
  5. package/dist/authoring/runtime-contract.d.ts +89 -0
  6. package/dist/authoring/runtime-contract.js +28 -0
  7. package/dist/channel-taxonomy.d.ts +17 -0
  8. package/dist/channel-taxonomy.js +46 -0
  9. package/dist/context-command.d.ts +18 -0
  10. package/dist/context-command.js +38 -0
  11. package/dist/dev/suspicious-codeword-detector.d.ts +15 -0
  12. package/dist/dev/suspicious-codeword-detector.js +220 -0
  13. package/dist/dev/suspicious-codeword-detector.noop.d.ts +3 -0
  14. package/dist/dev/suspicious-codeword-detector.noop.js +4 -0
  15. package/dist/framework/browser-context.d.ts +2 -0
  16. package/dist/framework/browser-context.js +2 -0
  17. package/dist/framework/generation-refresh.d.ts +23 -0
  18. package/dist/framework/generation-refresh.js +82 -0
  19. package/dist/framework/generation-signal.d.ts +8 -0
  20. package/dist/framework/generation-signal.js +17 -0
  21. package/dist/framework/projection-generation-watch.d.ts +5 -0
  22. package/dist/framework/projection-generation-watch.js +53 -0
  23. package/dist/framework/render-receipt.d.ts +8 -0
  24. package/dist/framework/render-receipt.js +10 -0
  25. package/dist/framework/runtime-adapter-store.d.ts +30 -0
  26. package/dist/framework/runtime-adapter-store.js +81 -0
  27. package/dist/grant-coordinator.d.ts +53 -0
  28. package/dist/grant-coordinator.js +329 -0
  29. package/dist/grant-lifecycle.d.ts +52 -0
  30. package/dist/grant-lifecycle.js +74 -0
  31. package/dist/identity/__test-adapter.d.ts +34 -0
  32. package/dist/identity/__test-adapter.js +59 -0
  33. package/dist/identity/browser-context-gate.d.ts +4 -0
  34. package/dist/identity/browser-context-gate.js +22 -0
  35. package/dist/identity/browser-context.d.ts +13 -0
  36. package/dist/identity/browser-context.js +22 -0
  37. package/dist/identity/carriers/postmessage.d.ts +84 -0
  38. package/dist/identity/carriers/postmessage.js +177 -0
  39. package/dist/identity/carriers/storage-state.d.ts +41 -0
  40. package/dist/identity/carriers/storage-state.js +99 -0
  41. package/dist/identity/carriers/storage.d.ts +39 -0
  42. package/dist/identity/carriers/storage.js +182 -0
  43. package/dist/identity/carriers/url.d.ts +19 -0
  44. package/dist/identity/carriers/url.js +38 -0
  45. package/dist/identity/identity-state-machine.d.ts +70 -0
  46. package/dist/identity/identity-state-machine.js +244 -0
  47. package/dist/identity/identity-types.d.ts +192 -0
  48. package/dist/identity/identity-types.js +22 -0
  49. package/dist/identity/index.d.ts +18 -0
  50. package/dist/identity/index.js +16 -0
  51. package/dist/identity/preview-cookie.d.ts +9 -0
  52. package/dist/identity/preview-cookie.js +12 -0
  53. package/dist/identity/preview-draft.d.ts +6 -0
  54. package/dist/identity/preview-draft.js +25 -0
  55. package/dist/identity/preview-identity.d.ts +28 -0
  56. package/dist/identity/preview-identity.js +84 -0
  57. package/dist/identity/preview-scope.d.ts +28 -0
  58. package/dist/identity/preview-scope.js +47 -0
  59. package/dist/identity/resolver.d.ts +110 -0
  60. package/dist/identity/resolver.js +334 -0
  61. package/dist/identity/session-query.d.ts +4 -0
  62. package/dist/identity/session-query.js +19 -0
  63. package/dist/index.d.ts +90 -0
  64. package/dist/index.js +788 -0
  65. package/dist/interaction-mode.d.ts +58 -0
  66. package/dist/interaction-mode.js +93 -0
  67. package/dist/nav-handler.d.ts +95 -0
  68. package/dist/nav-handler.js +84 -0
  69. package/dist/overlay-label.d.ts +79 -0
  70. package/dist/overlay-label.js +73 -0
  71. package/dist/provenance/anchor-map.d.ts +95 -0
  72. package/dist/provenance/anchor-map.js +177 -0
  73. package/dist/provenance/carrier-plan.d.ts +51 -0
  74. package/dist/provenance/carrier-plan.js +90 -0
  75. package/dist/provenance/coded-text.d.ts +20 -0
  76. package/dist/provenance/coded-text.js +302 -0
  77. package/dist/provenance/direct-edit-locator.d.ts +29 -0
  78. package/dist/provenance/direct-edit-locator.js +218 -0
  79. package/dist/provenance/editable-leaf.d.ts +134 -0
  80. package/dist/provenance/editable-leaf.js +483 -0
  81. package/dist/provenance/editor-target.d.ts +29 -0
  82. package/dist/provenance/editor-target.js +46 -0
  83. package/dist/provenance/field-leaf-walker.d.ts +21 -0
  84. package/dist/provenance/field-leaf-walker.js +98 -0
  85. package/dist/provenance/frame-dependencies.d.ts +212 -0
  86. package/dist/provenance/frame-dependencies.js +550 -0
  87. package/dist/provenance/index.d.ts +26 -0
  88. package/dist/provenance/index.js +26 -0
  89. package/dist/provenance/local-events.d.ts +1 -0
  90. package/dist/provenance/local-events.js +1 -0
  91. package/dist/provenance/markers.d.ts +21 -0
  92. package/dist/provenance/markers.js +70 -0
  93. package/dist/provenance/multi-frame-anchor-map.d.ts +54 -0
  94. package/dist/provenance/multi-frame-anchor-map.js +109 -0
  95. package/dist/provenance/normalize.d.ts +2 -0
  96. package/dist/provenance/normalize.js +19 -0
  97. package/dist/provenance/overlay-focus-echo.d.ts +17 -0
  98. package/dist/provenance/overlay-focus-echo.js +16 -0
  99. package/dist/provenance/overlay-projection.d.ts +65 -0
  100. package/dist/provenance/overlay-projection.js +201 -0
  101. package/dist/provenance/owner-map.d.ts +55 -0
  102. package/dist/provenance/owner-map.js +239 -0
  103. package/dist/provenance/read-carrier.d.ts +22 -0
  104. package/dist/provenance/read-carrier.js +92 -0
  105. package/dist/provenance/recorder.d.ts +38 -0
  106. package/dist/provenance/recorder.js +82 -0
  107. package/dist/provenance/render-context.d.ts +106 -0
  108. package/dist/provenance/render-context.js +338 -0
  109. package/dist/provenance/reveal-contract.d.ts +44 -0
  110. package/dist/provenance/reveal-contract.js +1 -0
  111. package/dist/provenance/richtext-slice-embed-address.d.ts +20 -0
  112. package/dist/provenance/richtext-slice-embed-address.js +35 -0
  113. package/dist/provenance/runtime-script.d.ts +1 -0
  114. package/dist/provenance/runtime-script.js +2217 -0
  115. package/dist/provenance/sidecar-store.d.ts +63 -0
  116. package/dist/provenance/sidecar-store.js +151 -0
  117. package/dist/provenance/sidecar.d.ts +34 -0
  118. package/dist/provenance/sidecar.js +227 -0
  119. package/dist/provenance/slice-model.d.ts +28 -0
  120. package/dist/provenance/slice-model.js +86 -0
  121. package/dist/provenance/source-identity.d.ts +3 -0
  122. package/dist/provenance/source-identity.js +7 -0
  123. package/dist/provenance/source-map-materializer.d.ts +76 -0
  124. package/dist/provenance/source-map-materializer.js +286 -0
  125. package/dist/provenance/source-registry.d.ts +103 -0
  126. package/dist/provenance/source-registry.js +562 -0
  127. package/dist/provenance/transformed-output-gate.d.ts +161 -0
  128. package/dist/provenance/transformed-output-gate.js +171 -0
  129. package/dist/provenance/types.d.ts +102 -0
  130. package/dist/provenance/types.js +1 -0
  131. package/dist/refresh-policy.d.ts +11 -0
  132. package/dist/refresh-policy.js +14 -0
  133. package/dist/reveal-target.d.ts +8 -0
  134. package/dist/reveal-target.js +47 -0
  135. package/dist/route-paths.d.ts +11 -0
  136. package/dist/route-paths.js +14 -0
  137. package/dist/router-subscriber.d.ts +92 -0
  138. package/dist/router-subscriber.js +44 -0
  139. package/dist/runtime/anchor-types.d.ts +5 -0
  140. package/dist/runtime/anchor-types.js +1 -0
  141. package/dist/runtime/authority-store.d.ts +31 -0
  142. package/dist/runtime/authority-store.js +56 -0
  143. package/dist/runtime/boot.d.ts +52 -0
  144. package/dist/runtime/boot.js +379 -0
  145. package/dist/runtime/content-refresh.d.ts +30 -0
  146. package/dist/runtime/content-refresh.js +68 -0
  147. package/dist/runtime/emit-runtime-error.d.ts +51 -0
  148. package/dist/runtime/emit-runtime-error.js +64 -0
  149. package/dist/runtime/field-proxy.d.ts +112 -0
  150. package/dist/runtime/field-proxy.js +471 -0
  151. package/dist/runtime/form-contract-reporter.d.ts +99 -0
  152. package/dist/runtime/form-contract-reporter.js +391 -0
  153. package/dist/runtime/invalidation-adapter.d.ts +17 -0
  154. package/dist/runtime/invalidation-adapter.js +42 -0
  155. package/dist/runtime/live-query-overlay.d.ts +39 -0
  156. package/dist/runtime/live-query-overlay.js +345 -0
  157. package/dist/runtime/momentary-navigate.d.ts +16 -0
  158. package/dist/runtime/momentary-navigate.js +106 -0
  159. package/dist/runtime/observation-scheduler.d.ts +15 -0
  160. package/dist/runtime/observation-scheduler.js +42 -0
  161. package/dist/runtime/perf-metrics.d.ts +28 -0
  162. package/dist/runtime/perf-metrics.js +90 -0
  163. package/dist/runtime/preview-interaction-policy.d.ts +1 -0
  164. package/dist/runtime/preview-interaction-policy.js +103 -0
  165. package/dist/runtime/preview-overlay-painter.d.ts +27 -0
  166. package/dist/runtime/preview-overlay-painter.js +1732 -0
  167. package/dist/runtime/preview-overlay-sidecar.d.ts +26 -0
  168. package/dist/runtime/preview-overlay-sidecar.js +45 -0
  169. package/dist/runtime/preview-perspective-alignment.d.ts +15 -0
  170. package/dist/runtime/preview-perspective-alignment.js +40 -0
  171. package/dist/runtime/preview-perspective-intent-state.d.ts +23 -0
  172. package/dist/runtime/preview-perspective-intent-state.js +5 -0
  173. package/dist/runtime/preview-transition-state.d.ts +142 -0
  174. package/dist/runtime/preview-transition-state.js +257 -0
  175. package/dist/runtime/render-mode-state.d.ts +51 -0
  176. package/dist/runtime/render-mode-state.js +76 -0
  177. package/dist/runtime/request-id.d.ts +4 -0
  178. package/dist/runtime/request-id.js +8 -0
  179. package/dist/runtime/resolve-schema-field.d.ts +99 -0
  180. package/dist/runtime/resolve-schema-field.js +356 -0
  181. package/dist/runtime/runtime-error-dispatch.d.ts +23 -0
  182. package/dist/runtime/runtime-error-dispatch.js +75 -0
  183. package/dist/runtime/schema-store.d.ts +121 -0
  184. package/dist/runtime/schema-store.js +667 -0
  185. package/dist/runtime/snapshot-assembly.d.ts +104 -0
  186. package/dist/runtime/snapshot-assembly.js +553 -0
  187. package/dist/runtime/snapshot-reporter.d.ts +55 -0
  188. package/dist/runtime/snapshot-reporter.js +375 -0
  189. package/dist/runtime/standalone-overlay-controller.d.ts +33 -0
  190. package/dist/runtime/standalone-overlay-controller.js +281 -0
  191. package/dist/runtime/store.d.ts +307 -0
  192. package/dist/runtime/store.js +1026 -0
  193. package/dist/runtime/windowed-minimap-projection.d.ts +28 -0
  194. package/dist/runtime/windowed-minimap-projection.js +189 -0
  195. package/dist/runtime/workspace-shortcuts.d.ts +30 -0
  196. package/dist/runtime/workspace-shortcuts.js +188 -0
  197. package/dist/sdk-error-copy.d.ts +48 -0
  198. package/dist/sdk-error-copy.js +182 -0
  199. package/dist/select-cursor.d.ts +2 -0
  200. package/dist/select-cursor.js +23 -0
  201. package/dist/server/admission-cookie.d.ts +38 -0
  202. package/dist/server/admission-cookie.js +122 -0
  203. package/dist/server/control-client.d.ts +29 -0
  204. package/dist/server/control-client.js +22 -0
  205. package/dist/server/control-errors.d.ts +22 -0
  206. package/dist/server/control-errors.js +165 -0
  207. package/dist/server/draft-route.d.ts +12 -0
  208. package/dist/server/draft-route.js +45 -0
  209. package/dist/server/extract-token.d.ts +30 -0
  210. package/dist/server/extract-token.js +98 -0
  211. package/dist/server/grant.d.ts +128 -0
  212. package/dist/server/grant.js +395 -0
  213. package/dist/server/ordinary-read-provenance.d.ts +11 -0
  214. package/dist/server/ordinary-read-provenance.js +124 -0
  215. package/dist/server/preview-read-metadata.d.ts +10 -0
  216. package/dist/server/preview-read-metadata.js +27 -0
  217. package/dist/server/provenance-frame-builder.d.ts +53 -0
  218. package/dist/server/provenance-frame-builder.js +102 -0
  219. package/dist/server/provenance-runtime.d.ts +70 -0
  220. package/dist/server/provenance-runtime.js +46 -0
  221. package/dist/server/read-context-command.d.ts +11 -0
  222. package/dist/server/read-context-command.js +53 -0
  223. package/dist/server/read-identity.d.ts +3 -0
  224. package/dist/server/read-identity.js +63 -0
  225. package/dist/server/read-lifecycle.d.ts +17 -0
  226. package/dist/server/read-lifecycle.js +52 -0
  227. package/dist/server/render-frame-provenance.d.ts +133 -0
  228. package/dist/server/render-frame-provenance.js +676 -0
  229. package/dist/server/render-id.d.ts +15 -0
  230. package/dist/server/render-id.js +22 -0
  231. package/dist/server/route-document-provenance.d.ts +77 -0
  232. package/dist/server/route-document-provenance.js +1327 -0
  233. package/dist/server/route-session-cookie.d.ts +33 -0
  234. package/dist/server/route-session-cookie.js +54 -0
  235. package/dist/session-projections.d.ts +33 -0
  236. package/dist/session-projections.js +43 -0
  237. package/dist/session-subscriber.d.ts +124 -0
  238. package/dist/session-subscriber.js +79 -0
  239. package/dist/sha256-fallback.d.ts +30 -0
  240. package/dist/sha256-fallback.js +126 -0
  241. package/dist/types.d.ts +446 -0
  242. package/dist/types.js +85 -0
  243. package/dist/validators.d.ts +61 -0
  244. package/dist/validators.js +110 -0
  245. package/package.json +206 -3
@@ -0,0 +1,550 @@
1
+ import { getPreviewReadDependencies, setPreviewReadDependencies } from '@storystick/types';
2
+ import { isPreviewReadContext } from '@storystick/types/preview-query-targeting';
3
+ export const PREVIEW_CONTENT_CHANGE_OPERATIONS = [
4
+ 'create',
5
+ 'update',
6
+ 'delete',
7
+ 'publish',
8
+ 'unpublish',
9
+ 'rollback',
10
+ 'restore-draft',
11
+ 'archive',
12
+ 'unarchive',
13
+ 'shape-migration',
14
+ 'snapshot-shape-migration',
15
+ 'template-create',
16
+ 'template-update',
17
+ 'template-archive',
18
+ 'template-delete',
19
+ 'variant-create',
20
+ 'variant-update',
21
+ 'variant-discard',
22
+ 'variant-promote',
23
+ 'variant-switch',
24
+ 'unknown',
25
+ ];
26
+ const PREVIEW_CONTENT_CHANGE_OPERATION_SET = new Set(PREVIEW_CONTENT_CHANGE_OPERATIONS);
27
+ export const PREVIEW_CONTENT_PLANE_OUTBOX_KIND_TO_OPERATION = {
28
+ 'document.create': 'create',
29
+ 'document.update': 'update',
30
+ 'document.delete': 'delete',
31
+ 'document.publish': 'publish',
32
+ 'document.unpublish': 'unpublish',
33
+ 'document.rollback': 'rollback',
34
+ 'document.restoreDraft': 'restore-draft',
35
+ 'document.archive': 'archive',
36
+ 'document.unarchive': 'unarchive',
37
+ 'document.shapeMigration': 'shape-migration',
38
+ 'snapshot.shapeMigration': 'snapshot-shape-migration',
39
+ 'asset.create': 'update',
40
+ 'asset.update': 'update',
41
+ 'asset.archive': 'archive',
42
+ 'template.create': 'template-create',
43
+ 'template.update': 'template-update',
44
+ 'template.archive': 'template-archive',
45
+ 'template.delete': 'template-delete',
46
+ 'template.default.update': 'template-update',
47
+ 'release.create': 'unknown',
48
+ 'release.update': 'unknown',
49
+ 'release.schedule': 'unknown',
50
+ 'release.unschedule': 'unknown',
51
+ 'release.archive': 'unknown',
52
+ 'locale.settings.update': 'unknown',
53
+ 'variant.create': 'variant-create',
54
+ 'variant.update': 'variant-update',
55
+ 'variant.discard': 'variant-discard',
56
+ 'variant.promote': 'variant-promote',
57
+ 'project.wipe': 'unknown',
58
+ 'refs.backfill': 'unknown',
59
+ 'richtextEmbeds.migrate': 'unknown',
60
+ 'contentShape.epoch': 'unknown',
61
+ 'schema.push': 'unknown',
62
+ 'schema.generation.project': 'unknown',
63
+ };
64
+ export const PREVIEW_CONTENT_PLANE_OUTBOX_UNKNOWN_REASONS = {
65
+ 'release.create': 'release mutations are not preview-rendered document/template writes',
66
+ 'release.update': 'release mutations are not preview-rendered document/template writes',
67
+ 'release.schedule': 'release scheduling has no route-specific preview dependency identity',
68
+ 'release.unschedule': 'release scheduling has no route-specific preview dependency identity',
69
+ 'release.archive': 'release mutations are not preview-rendered document/template writes',
70
+ 'locale.settings.update': 'locale settings can change fallback/read semantics project-wide',
71
+ 'project.wipe': 'project wipe is destructive and must refresh fail-open if observed',
72
+ 'refs.backfill': 'backfills do not carry a user mutation target identity',
73
+ 'richtextEmbeds.migrate': 'embed extraction can change every rendered content family project-wide',
74
+ 'contentShape.epoch': 'an epoch switch changes project-wide content composition semantics',
75
+ 'schema.push': 'schema pushes can change renderer shape outside document identity',
76
+ 'schema.generation.project': 'schema-generation projection can change renderer shape project-wide',
77
+ };
78
+ export function mapContentPlaneOutboxKindToPreviewContentChangeOperation(kind) {
79
+ const operation = PREVIEW_CONTENT_PLANE_OUTBOX_KIND_TO_OPERATION[kind] ?? 'unknown';
80
+ const unknownReason = operation === 'unknown'
81
+ ? (PREVIEW_CONTENT_PLANE_OUTBOX_UNKNOWN_REASONS[kind] ?? 'unrecognized Content Plane outbox kind')
82
+ : undefined;
83
+ return unknownReason ? { operation, unknownReason } : { operation };
84
+ }
85
+ export function createPreviewFrameDependencySet(input) {
86
+ return {
87
+ type: 'storystick.preview.frame-dependency-set',
88
+ version: 1,
89
+ ...(input.sessionId ? { sessionId: input.sessionId } : {}),
90
+ ...(input.readContext ? { readContext: input.readContext } : {}),
91
+ ...(input.receiptIds ? { receiptIds: [...new Set(input.receiptIds)] } : {}),
92
+ routeHash: input.routeHash,
93
+ codeVersion: input.codeVersion,
94
+ ...(input.variantId ? { variantId: input.variantId } : {}),
95
+ frameId: input.frameId,
96
+ renderId: input.renderId,
97
+ generation: input.generation,
98
+ ...(normalizeOptionalString(input.observationId)
99
+ ? { observationId: normalizeOptionalString(input.observationId) }
100
+ : {}),
101
+ ...(typeof input.renderWatermark === 'number' &&
102
+ Number.isFinite(input.renderWatermark)
103
+ ? { renderWatermark: input.renderWatermark }
104
+ : {}),
105
+ dependencies: dedupePreviewFrameDependencies(input.dependencies),
106
+ };
107
+ }
108
+ export function attachPreviewFrameDependencies(target, dependencies) {
109
+ if (!isRecord(target) && !Array.isArray(target))
110
+ return target;
111
+ const existing = getPreviewFrameDependencies(target);
112
+ const next = dedupePreviewFrameDependencies([
113
+ ...existing,
114
+ ...dependencies,
115
+ ]);
116
+ setPreviewReadDependencies(target, next);
117
+ return target;
118
+ }
119
+ export function getPreviewFrameDependencies(value) {
120
+ if (!isRecord(value) && !Array.isArray(value))
121
+ return [];
122
+ const dependencies = getPreviewReadDependencies(value);
123
+ return dedupePreviewFrameDependencies(dependencies.filter(isPreviewFrameDependency));
124
+ }
125
+ export function collectPreviewFrameDependencies(...roots) {
126
+ const dependencies = [];
127
+ const seen = new WeakSet();
128
+ const visit = (value) => {
129
+ if (!isRecord(value) && !Array.isArray(value))
130
+ return;
131
+ if (seen.has(value))
132
+ return;
133
+ seen.add(value);
134
+ dependencies.push(...getPreviewFrameDependencies(value));
135
+ if (Array.isArray(value)) {
136
+ for (const item of value)
137
+ visit(item);
138
+ return;
139
+ }
140
+ for (const child of Object.values(value))
141
+ visit(child);
142
+ };
143
+ for (const root of roots)
144
+ visit(root);
145
+ return dedupePreviewFrameDependencies(dependencies);
146
+ }
147
+ export function createDocumentPreviewContentChange(input) {
148
+ return {
149
+ type: 'storystick.preview.content-change',
150
+ version: 1,
151
+ source: {
152
+ kind: 'document',
153
+ documentId: input.documentId,
154
+ operation: input.operation ?? 'update',
155
+ ...(normalizeOptionalString(input.storyType)
156
+ ? { storyType: normalizeOptionalString(input.storyType) }
157
+ : {}),
158
+ },
159
+ };
160
+ }
161
+ export function createTemplatePreviewContentChange(input) {
162
+ return {
163
+ type: 'storystick.preview.content-change',
164
+ version: 1,
165
+ source: {
166
+ kind: 'template',
167
+ templateId: input.templateId,
168
+ operation: input.operation ?? 'template-update',
169
+ },
170
+ };
171
+ }
172
+ export function createAssetPreviewContentChange(input) {
173
+ return {
174
+ type: 'storystick.preview.content-change',
175
+ version: 1,
176
+ source: {
177
+ kind: 'asset',
178
+ assetId: input.assetId,
179
+ operation: input.operation ?? 'update',
180
+ },
181
+ };
182
+ }
183
+ export function createStoryTypePreviewContentChange(input) {
184
+ return {
185
+ type: 'storystick.preview.content-change',
186
+ version: 1,
187
+ source: {
188
+ kind: 'storyType',
189
+ storyType: input.storyType,
190
+ operation: input.operation ?? 'update',
191
+ },
192
+ };
193
+ }
194
+ export function createVariantSwitchPreviewContentChange() {
195
+ return {
196
+ type: 'storystick.preview.content-change',
197
+ version: 1,
198
+ source: {
199
+ kind: 'session',
200
+ operation: 'variant-switch',
201
+ },
202
+ };
203
+ }
204
+ export function createProjectPreviewContentChange(operation = 'update') {
205
+ return {
206
+ type: 'storystick.preview.content-change',
207
+ version: 1,
208
+ source: {
209
+ kind: 'project',
210
+ operation,
211
+ },
212
+ };
213
+ }
214
+ export function createUnknownPreviewContentChange(operation = 'unknown') {
215
+ return {
216
+ type: 'storystick.preview.content-change',
217
+ version: 1,
218
+ source: {
219
+ kind: 'unknown',
220
+ operation,
221
+ },
222
+ };
223
+ }
224
+ export function createPreviewContentRefreshDecision(input) {
225
+ return {
226
+ type: 'storystick.preview.content-refresh-decision',
227
+ version: 1,
228
+ refresh: input.refresh,
229
+ affectedFrameIds: dedupeStrings(input.affectedFrameIds ?? []),
230
+ reason: input.reason,
231
+ };
232
+ }
233
+ export function dedupePreviewFrameDependencies(dependencies) {
234
+ const seen = new Set();
235
+ const normalized = [];
236
+ for (const dependency of dependencies) {
237
+ const next = normalizePreviewFrameDependency(dependency);
238
+ if (!next)
239
+ continue;
240
+ const key = previewFrameDependencyKey(next);
241
+ if (seen.has(key))
242
+ continue;
243
+ seen.add(key);
244
+ normalized.push(next);
245
+ }
246
+ return normalized;
247
+ }
248
+ export function doesPreviewContentChangeAffectFrame(dependencySet, change) {
249
+ if (!dependencySet || dependencySet.dependencies.length === 0)
250
+ return true;
251
+ if (!change)
252
+ return true;
253
+ if (change.source.kind === 'unknown')
254
+ return true;
255
+ if (change.source.kind === 'session')
256
+ return true;
257
+ if (change.source.kind === 'project')
258
+ return true;
259
+ return dependencySet.dependencies.some((dependency) => doesPreviewContentChangeAffectDependency(dependency, change));
260
+ }
261
+ export function getAffectedPreviewFrameIds(dependencySets, change) {
262
+ return dedupeStrings(dependencySets
263
+ .filter((dependencySet) => doesPreviewContentChangeAffectFrame(dependencySet, change))
264
+ .map((dependencySet) => dependencySet.frameId));
265
+ }
266
+ export function doesPreviewContentChangeAffectDependency(dependency, change) {
267
+ if (change.source.kind === 'unknown')
268
+ return true;
269
+ if (change.source.kind === 'session')
270
+ return true;
271
+ if (change.source.kind === 'project')
272
+ return true;
273
+ if (change.source.kind === 'template') {
274
+ return dependency.kind === 'template'
275
+ ? dependency.templateId === change.source.templateId
276
+ : false;
277
+ }
278
+ if (change.source.kind === 'asset') {
279
+ return dependency.kind === 'asset'
280
+ ? dependency.assetId === change.source.assetId
281
+ : false;
282
+ }
283
+ if (change.source.kind === 'storyType') {
284
+ return dependency.kind === 'list' ||
285
+ dependency.kind === 'get-by-slug' ||
286
+ dependency.kind === 'get-by-pathname'
287
+ ? dependency.storyType === change.source.storyType
288
+ : dependency.kind === 'route-lookup'
289
+ ? (dependency.storyTypes ?? []).includes(change.source.storyType)
290
+ : dependency.kind === 'document'
291
+ ? dependency.storyType === change.source.storyType
292
+ : false;
293
+ }
294
+ const source = change.source;
295
+ switch (dependency.kind) {
296
+ case 'document':
297
+ return dependency.documentId === source.documentId;
298
+ case 'batch-get':
299
+ return dependency.documentIds.includes(source.documentId);
300
+ case 'list':
301
+ return storyTypesMayOverlap(dependency.storyType, source.storyType);
302
+ case 'get-by-slug':
303
+ case 'get-by-pathname':
304
+ return storyTypesMayOverlap(dependency.storyType, source.storyType);
305
+ case 'route-lookup':
306
+ return storyTypeListMayOverlap(dependency.storyTypes, source.storyType);
307
+ case 'asset':
308
+ case 'template':
309
+ case 'custom-read':
310
+ return false;
311
+ }
312
+ }
313
+ export function normalizePreviewFrameDependency(dependency) {
314
+ switch (dependency.kind) {
315
+ case 'document': {
316
+ const documentId = normalizeRequiredString(dependency.documentId);
317
+ if (!documentId)
318
+ return null;
319
+ const storyType = normalizeOptionalString(dependency.storyType);
320
+ const reason = normalizeOptionalString(dependency.reason);
321
+ return {
322
+ kind: 'document',
323
+ documentId,
324
+ ...(storyType ? { storyType } : {}),
325
+ ...(reason ? { reason: reason } : {}),
326
+ };
327
+ }
328
+ case 'asset': {
329
+ const assetId = normalizeRequiredString(dependency.assetId);
330
+ return assetId ? { kind: 'asset', assetId } : null;
331
+ }
332
+ case 'route-lookup': {
333
+ const pathname = normalizeRequiredString(dependency.pathname);
334
+ if (!pathname)
335
+ return null;
336
+ const storyTypes = dedupeStrings(dependency.storyTypes ?? []);
337
+ return {
338
+ kind: 'route-lookup',
339
+ pathname,
340
+ ...(storyTypes.length > 0 ? { storyTypes } : {}),
341
+ };
342
+ }
343
+ case 'list': {
344
+ const storyType = normalizeRequiredString(dependency.storyType);
345
+ if (!storyType)
346
+ return null;
347
+ return {
348
+ kind: 'list',
349
+ storyType,
350
+ ...(dependency.where !== undefined ? { where: dependency.where } : {}),
351
+ ...(dependency.orderBy ? { orderBy: dependency.orderBy } : {}),
352
+ ...(typeof dependency.limit === 'number'
353
+ ? { limit: dependency.limit }
354
+ : {}),
355
+ };
356
+ }
357
+ case 'get-by-slug': {
358
+ const storyType = normalizeRequiredString(dependency.storyType);
359
+ const slug = normalizeRequiredString(dependency.slug);
360
+ if (!storyType || !slug)
361
+ return null;
362
+ return { kind: 'get-by-slug', storyType, slug };
363
+ }
364
+ case 'get-by-pathname': {
365
+ const storyType = normalizeRequiredString(dependency.storyType);
366
+ const pathname = normalizeRequiredString(dependency.pathname);
367
+ if (!storyType || !pathname)
368
+ return null;
369
+ return { kind: 'get-by-pathname', storyType, pathname };
370
+ }
371
+ case 'batch-get': {
372
+ const documentIds = dedupeStrings(dependency.documentIds);
373
+ if (documentIds.length === 0)
374
+ return null;
375
+ return { kind: 'batch-get', documentIds };
376
+ }
377
+ case 'template': {
378
+ const templateId = normalizeRequiredString(dependency.templateId);
379
+ if (!templateId)
380
+ return null;
381
+ return { kind: 'template', templateId };
382
+ }
383
+ case 'custom-read': {
384
+ const key = normalizeRequiredString(dependency.key);
385
+ if (!key)
386
+ return null;
387
+ return { kind: 'custom-read', key };
388
+ }
389
+ }
390
+ }
391
+ export function isPreviewFrameDependencySet(value) {
392
+ if (!isRecord(value))
393
+ return false;
394
+ if (value.type !== 'storystick.preview.frame-dependency-set')
395
+ return false;
396
+ if (value.version !== 1)
397
+ return false;
398
+ if (value.sessionId !== undefined && typeof value.sessionId !== 'string')
399
+ return false;
400
+ if (value.readContext !== undefined && !isPreviewReadContext(value.readContext))
401
+ return false;
402
+ if (!value.sessionId && !value.readContext)
403
+ return false;
404
+ if (value.receiptIds !== undefined && (!Array.isArray(value.receiptIds) ||
405
+ value.receiptIds.length > 64 || !value.receiptIds.every((id) => typeof id === 'string' && /^pqr_[a-f0-9]{64}$/.test(id))))
406
+ return false;
407
+ if (typeof value.routeHash !== 'string')
408
+ return false;
409
+ if (typeof value.codeVersion !== 'string')
410
+ return false;
411
+ if (typeof value.frameId !== 'string')
412
+ return false;
413
+ if (typeof value.renderId !== 'string')
414
+ return false;
415
+ if (typeof value.generation !== 'number')
416
+ return false;
417
+ if (value.observationId !== undefined &&
418
+ typeof value.observationId !== 'string')
419
+ return false;
420
+ if (value.renderWatermark !== undefined &&
421
+ (typeof value.renderWatermark !== 'number' ||
422
+ !Number.isFinite(value.renderWatermark)))
423
+ return false;
424
+ if (!Array.isArray(value.dependencies))
425
+ return false;
426
+ return value.dependencies.every(isPreviewFrameDependency);
427
+ }
428
+ export function isPreviewContentChangeIdentity(value) {
429
+ if (!isRecord(value))
430
+ return false;
431
+ if (value.type !== 'storystick.preview.content-change')
432
+ return false;
433
+ if (value.version !== 1)
434
+ return false;
435
+ if (!isRecord(value.source))
436
+ return false;
437
+ switch (value.source.kind) {
438
+ case 'document':
439
+ return (typeof value.source.documentId === 'string' &&
440
+ isPreviewContentChangeOperation(value.source.operation));
441
+ case 'storyType':
442
+ return (typeof value.source.storyType === 'string' &&
443
+ isPreviewContentChangeOperation(value.source.operation));
444
+ case 'asset':
445
+ return (typeof value.source.assetId === 'string' &&
446
+ isPreviewContentChangeOperation(value.source.operation));
447
+ case 'template':
448
+ return (typeof value.source.templateId === 'string' &&
449
+ isPreviewContentChangeOperation(value.source.operation));
450
+ case 'session':
451
+ return isPreviewContentChangeOperation(value.source.operation);
452
+ case 'project':
453
+ return isPreviewContentChangeOperation(value.source.operation);
454
+ case 'unknown':
455
+ return isPreviewContentChangeOperation(value.source.operation);
456
+ default:
457
+ return false;
458
+ }
459
+ }
460
+ export function isPreviewContentRefreshDecision(value) {
461
+ if (!isRecord(value))
462
+ return false;
463
+ if (value.type !== 'storystick.preview.content-refresh-decision')
464
+ return false;
465
+ if (value.version !== 1)
466
+ return false;
467
+ if (typeof value.refresh !== 'boolean')
468
+ return false;
469
+ if (!Array.isArray(value.affectedFrameIds))
470
+ return false;
471
+ if (!value.affectedFrameIds.every((id) => typeof id === 'string'))
472
+ return false;
473
+ if (typeof value.reason !== 'string')
474
+ return false;
475
+ return true;
476
+ }
477
+ function isPreviewFrameDependency(value) {
478
+ if (!isRecord(value) || typeof value.kind !== 'string')
479
+ return false;
480
+ switch (value.kind) {
481
+ case 'document':
482
+ return typeof value.documentId === 'string';
483
+ case 'asset':
484
+ return typeof value.assetId === 'string';
485
+ case 'route-lookup':
486
+ return typeof value.pathname === 'string';
487
+ case 'list':
488
+ return typeof value.storyType === 'string';
489
+ case 'get-by-slug':
490
+ return (typeof value.storyType === 'string' && typeof value.slug === 'string');
491
+ case 'get-by-pathname':
492
+ return (typeof value.storyType === 'string' && typeof value.pathname === 'string');
493
+ case 'batch-get':
494
+ return (Array.isArray(value.documentIds) &&
495
+ value.documentIds.every((id) => typeof id === 'string'));
496
+ case 'template':
497
+ return typeof value.templateId === 'string';
498
+ case 'custom-read':
499
+ return typeof value.key === 'string';
500
+ default:
501
+ return false;
502
+ }
503
+ }
504
+ function previewFrameDependencyKey(dependency) {
505
+ return stableStringify(dependency);
506
+ }
507
+ function storyTypesMayOverlap(dependencyStoryType, changeStoryType) {
508
+ return !changeStoryType || dependencyStoryType === changeStoryType;
509
+ }
510
+ function storyTypeListMayOverlap(dependencyStoryTypes, changeStoryType) {
511
+ if (!dependencyStoryTypes || dependencyStoryTypes.length === 0)
512
+ return true;
513
+ if (!changeStoryType)
514
+ return true;
515
+ return dependencyStoryTypes.includes(changeStoryType);
516
+ }
517
+ function isPreviewContentChangeOperation(value) {
518
+ return (typeof value === 'string' &&
519
+ PREVIEW_CONTENT_CHANGE_OPERATION_SET.has(value));
520
+ }
521
+ function dedupeStrings(values) {
522
+ return Array.from(new Set(values
523
+ .map((value) => value.trim())
524
+ .filter((value) => value.length > 0))).sort();
525
+ }
526
+ function normalizeRequiredString(value) {
527
+ const normalized = value.trim();
528
+ return normalized.length > 0 ? normalized : null;
529
+ }
530
+ function normalizeOptionalString(value) {
531
+ if (typeof value !== 'string')
532
+ return undefined;
533
+ const normalized = value.trim();
534
+ return normalized.length > 0 ? normalized : undefined;
535
+ }
536
+ function stableStringify(value) {
537
+ if (Array.isArray(value)) {
538
+ return `[${value.map((item) => stableStringify(item)).join(',')}]`;
539
+ }
540
+ if (isRecord(value)) {
541
+ return `{${Object.keys(value)
542
+ .sort()
543
+ .map((key) => `${JSON.stringify(key)}:${stableStringify(value[key])}`)
544
+ .join(',')}}`;
545
+ }
546
+ return JSON.stringify(value);
547
+ }
548
+ function isRecord(value) {
549
+ return typeof value === 'object' && value !== null;
550
+ }
@@ -0,0 +1,26 @@
1
+ export * from './anchor-map.js';
2
+ export * from './carrier-plan.js';
3
+ export * from './coded-text.js';
4
+ export * from './read-carrier.js';
5
+ export * from './direct-edit-locator.js';
6
+ export * from './editable-leaf.js';
7
+ export * from './frame-dependencies.js';
8
+ export * from './local-events.js';
9
+ export * from './markers.js';
10
+ export * from './multi-frame-anchor-map.js';
11
+ export * from './normalize.js';
12
+ export * from './overlay-projection.js';
13
+ export * from './owner-map.js';
14
+ export * from './recorder.js';
15
+ export * from './runtime-script.js';
16
+ export * from './richtext-slice-embed-address.js';
17
+ export * from './sidecar.js';
18
+ export * from './sidecar-store.js';
19
+ export * from './source-map-materializer.js';
20
+ export * from './source-identity.js';
21
+ export * from './transformed-output-gate.js';
22
+ export * from './types.js';
23
+ export { enumerateSchemaCoverageOccurrences, enumerateSchemaFieldDeclarations, resolveSchemaField, splitFieldPath, type ResolvedSchemaField, type SchemaCoverageDocument, type SchemaCoverageOccurrence, type SchemaFieldDeclaration, type SchemaStoriesInput, } from '../runtime/resolve-schema-field.js';
24
+ export * from './editor-target.js';
25
+ export * from './reveal-contract.js';
26
+ export * from './overlay-focus-echo.js';
@@ -0,0 +1,26 @@
1
+ export * from './anchor-map.js';
2
+ export * from './carrier-plan.js';
3
+ export * from './coded-text.js';
4
+ export * from './read-carrier.js';
5
+ export * from './direct-edit-locator.js';
6
+ export * from './editable-leaf.js';
7
+ export * from './frame-dependencies.js';
8
+ export * from './local-events.js';
9
+ export * from './markers.js';
10
+ export * from './multi-frame-anchor-map.js';
11
+ export * from './normalize.js';
12
+ export * from './overlay-projection.js';
13
+ export * from './owner-map.js';
14
+ export * from './recorder.js';
15
+ export * from './runtime-script.js';
16
+ export * from './richtext-slice-embed-address.js';
17
+ export * from './sidecar.js';
18
+ export * from './sidecar-store.js';
19
+ export * from './source-map-materializer.js';
20
+ export * from './source-identity.js';
21
+ export * from './transformed-output-gate.js';
22
+ export * from './types.js';
23
+ export { enumerateSchemaCoverageOccurrences, enumerateSchemaFieldDeclarations, resolveSchemaField, splitFieldPath, } from '../runtime/resolve-schema-field.js';
24
+ export * from './editor-target.js';
25
+ export * from './reveal-contract.js';
26
+ export * from './overlay-focus-echo.js';
@@ -0,0 +1 @@
1
+ export declare const PREVIEW_PROVENANCE_ANCHOR_MAP_EVENT = "storystick.preview.provenance-anchor-map-local";
@@ -0,0 +1 @@
1
+ export const PREVIEW_PROVENANCE_ANCHOR_MAP_EVENT = 'storystick.preview.provenance-anchor-map-local';
@@ -0,0 +1,21 @@
1
+ import type { PreviewReadContext } from '@storystick/types/preview-query-targeting';
2
+ import type { AuthoritativeSet, ProvenanceFrame } from './types.js';
3
+ export interface MarkerInput {
4
+ readonly sessionId?: string;
5
+ readonly readContext?: PreviewReadContext;
6
+ readonly routeHash: string;
7
+ readonly codeVersion: string;
8
+ readonly variantId?: string | null;
9
+ readonly renderId: string;
10
+ readonly sourceSetId: string;
11
+ }
12
+ export interface FrameValidationOk {
13
+ readonly ok: true;
14
+ }
15
+ export interface FrameValidationError {
16
+ readonly ok: false;
17
+ readonly reason: 'route-mismatch' | 'code-version-mismatch' | 'variant-mismatch' | 'marker-source-missing' | 'source-not-authoritative' | 'source-variant-mismatch' | 'source-path-missing' | 'composite-no-primary';
18
+ }
19
+ export type FrameValidationResult = FrameValidationOk | FrameValidationError;
20
+ export declare function createDirectEditMarkerId(input: MarkerInput): Promise<string>;
21
+ export declare function validateProvenanceFrame(frame: ProvenanceFrame, authoritativeSet: AuthoritativeSet): FrameValidationResult;