@neta-art/cohub 12.5.0 → 13.0.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 (76) hide show
  1. package/README.md +35 -13
  2. package/dist/board/editor/editor.d.ts +7 -5
  3. package/dist/board/editor/index.js +1 -1
  4. package/dist/board/editor/interaction.js +1 -1
  5. package/dist/board/export/index.d.ts +1 -6
  6. package/dist/board/export/index.js +16 -10
  7. package/dist/board/export/node/index.d.ts +2 -7
  8. package/dist/board/export/node/index.js +2 -5
  9. package/dist/board/export/scene.d.ts +3 -7
  10. package/dist/board/export/scene.js +22 -26
  11. package/dist/board/model/asset-key.d.ts +5 -2
  12. package/dist/board/model/asset-key.js +13 -5
  13. package/dist/board/model/index.d.ts +5 -4
  14. package/dist/board/model/index.js +4 -3
  15. package/dist/board/model/media-playback.d.ts +4 -6
  16. package/dist/board/model/media-playback.js +4 -4
  17. package/dist/board/model/read.d.ts +7 -0
  18. package/dist/board/model/read.js +18 -0
  19. package/dist/board/model/themes.d.ts +50 -0
  20. package/dist/board/model/themes.js +44 -6
  21. package/dist/board/render/backdrop-layer.d.ts +21 -0
  22. package/dist/board/render/backdrop-layer.js +227 -0
  23. package/dist/board/render/backdrop.d.ts +45 -0
  24. package/dist/board/render/backdrop.js +62 -0
  25. package/dist/board/render/index.d.ts +3 -2
  26. package/dist/board/render/index.js +7 -6
  27. package/dist/board/render/renderers/arrow-card-renderer.js +1 -1
  28. package/dist/board/render/renderers/audio-card-renderer.js +2 -2
  29. package/dist/board/render/renderers/file-card-renderer.js +1 -1
  30. package/dist/board/render/renderers/frame-card-renderer.js +1 -1
  31. package/dist/board/render/renderers/model-card-renderer.js +1 -1
  32. package/dist/board/render/renderers/shape-card-renderer.js +1 -1
  33. package/dist/board/render/renderers/task-card-renderer.js +2 -2
  34. package/dist/board/render/renderers/text-card-renderer.js +2 -2
  35. package/dist/board/render/renderers/video-card-renderer.js +1 -1
  36. package/dist/board/render/theme.d.ts +2 -0
  37. package/dist/board/render/theme.js +4 -2
  38. package/dist/board/replica/index.d.ts +3 -2
  39. package/dist/board/replica/index.js +34 -24
  40. package/dist/board/replica/indexeddb.js +14 -85
  41. package/dist/board/stage/assets.d.ts +4 -3
  42. package/dist/board/stage/assets.js +186 -83
  43. package/dist/board/stage/backdrop.d.ts +25 -0
  44. package/dist/board/stage/backdrop.js +104 -0
  45. package/dist/board/stage/index.d.ts +2 -1
  46. package/dist/board/stage/scene.js +12 -5
  47. package/dist/board/stage/stage.d.ts +7 -2
  48. package/dist/board/stage/stage.js +44 -24
  49. package/dist/board/stage/texture-pool.d.ts +1 -1
  50. package/dist/board/stage/texture-pool.js +4 -5
  51. package/dist/chunks/app-realtime.js +1 -1
  52. package/dist/chunks/environment.d.ts +34 -21
  53. package/dist/chunks/environment.js +4 -3
  54. package/dist/chunks/http-error.js +28 -5
  55. package/dist/chunks/http.d.ts +87 -18
  56. package/dist/chunks/http.js +1855 -59
  57. package/dist/chunks/websocket.d.ts +9 -1
  58. package/dist/http.d.ts +2 -2
  59. package/dist/http.js +1 -1
  60. package/dist/index.d.ts +9 -3
  61. package/dist/index.js +6 -1080
  62. package/dist/indexeddb.js +79 -0
  63. package/dist/media.d.ts +18 -32
  64. package/dist/media.js +81 -67
  65. package/dist/protocol/dist/board-model.d.ts +33 -26
  66. package/dist/protocol/dist/board-model.js +21 -18
  67. package/dist/protocol/dist/board.d.ts +21 -1
  68. package/dist/protocol/dist/board.js +5 -1
  69. package/dist/protocol/dist/core/media.d.ts +32 -9
  70. package/dist/protocol/dist/core/media.js +203 -48
  71. package/dist/protocol/dist/index.d.ts +3 -3
  72. package/dist/voice-input.js +1 -1
  73. package/dist/websocket.js +37 -5
  74. package/package.json +1 -1
  75. package/dist/board/render/board-background.d.ts +0 -18
  76. package/dist/board/render/board-background.js +0 -104
package/README.md CHANGED
@@ -95,6 +95,14 @@ await session.messages.send({
95
95
  });
96
96
  ```
97
97
 
98
+ ## Space files
99
+
100
+ `space.files.read(path)` and `space.files.resolve(path)` share requests: reads
101
+ made in the same task become one batched read, and concurrent reads of a file
102
+ share one request. In browsers with realtime, resolved URLs are remembered per
103
+ user across reloads, confirmed in the background and dropped when the file
104
+ changes; call `clearFileUrlCache()` on sign-out.
105
+
98
106
  ## Boards
99
107
 
100
108
  A Board is one document of `board` settings, `items` and `animations`. Bind
@@ -122,6 +130,14 @@ const stop = board.subscribe({
122
130
  });
123
131
  ```
124
132
 
133
+ Keep a cached copy current with `sync`: one request that carries only the
134
+ changes since the cached version, or the whole Board when they are unavailable.
135
+ With `changed: false` the cached `document` is returned as is.
136
+
137
+ ```ts
138
+ const { version, document, changed } = await board.sync(cached); // cached: { version, document } | null
139
+ ```
140
+
125
141
  Task Items show a run by its `taskRunId`. Write only the id; the server fills
126
142
  the display snapshot from the run and rewrites it when the run finishes, on
127
143
  every Board in the Space that shows it. Lay a run's results out as media with
@@ -197,16 +213,14 @@ editor.addMedia("https://cdn.example.com/media?id=42", worldPoint(400, 0), {
197
213
  snapshot: { title: "Launch", naturalWidth: 1920, naturalHeight: 1080 },
198
214
  });
199
215
 
200
- // Media URLs load directly; these callbacks only receive Space paths.
201
- // A published copy can resolve paths against captured artifacts instead.
202
- const source = {
203
- resolveFileUrl: (path: string) => space.files.resolveUrl(path, { purpose: "preview" }),
204
- resolvePlaybackUrl: (path: string) => space.files.resolveUrl(path, { purpose: "playback" }),
205
- };
216
+ // Media URLs load directly; Space paths resolve through the Space's file URLs,
217
+ // which reload pictures when their file changes. A published copy can resolve
218
+ // paths against captured artifacts instead.
219
+ const source = space.boards.assetSource();
206
220
  const stage = mountBoardStage(element, {
207
221
  editor,
208
222
  source,
209
- assets: createBoardAssetManager({ resolveFileUrl: source.resolveFileUrl }),
223
+ assets: createBoardAssetManager(source),
210
224
  views: [{
211
225
  type: "acme.order",
212
226
  // Mount anything: a React root, a Vue app, plain DOM.
@@ -245,13 +259,14 @@ Pictures your own items show go through `itemAsset`. They share the built-in
245
259
  loader: CDN variants sized to the screen, loads ordered by where the view is
246
260
  heading, prefetch, compact copies when panned away, device budgets, one cache
247
261
  and exports. `src` is a Space path, resolved like an image item's, or a URL;
248
- `fit: "cover"` sizes pictures cropped to fill their box by the short edge. Call
249
- `invalidateItemAssets()` when the data it reads changes, and `invalidatePath`
250
- when a file changes:
262
+ `fit: "cover"` sizes pictures cropped to fill their box by the short edge. When
263
+ the data it reads changes for some items, call `invalidateItemAssets(ids)` and
264
+ `stage.invalidate({ items: ids })` (omit `ids` when everything changed); call
265
+ `invalidatePath` when a file changes:
251
266
 
252
267
  ```ts
253
268
  const assets = createBoardAssetManager({
254
- resolveFileUrl: source.resolveFileUrl,
269
+ resolveFile: source.resolveFile,
255
270
  // undefined keeps the built-in rule; null shows no picture.
256
271
  itemAsset: (item) => {
257
272
  if (item.type !== "acme.order") return undefined;
@@ -285,8 +300,9 @@ const assets = createBoardAssetManager({
285
300
  `touchRotation: false` to `createBoardEditor` to move and resize by touch and pen
286
301
  without a rotation handle.
287
302
  - **DOM views.** `viewLayer: "below"` puts them under the canvas, so selection and
288
- strokes draw over them; views there get no input. Use a theme with `imageBackground`
289
- and paint the Board background behind the host, or the canvas covers them.
303
+ strokes draw over them; views there get no input. It needs `transparent: true`:
304
+ the canvas then draws no backdrop, and the host paints `resolveBoardBackdrop(...)`
305
+ behind it.
290
306
  - **Previews.** Write `preview: { title, excerpt, cover, src }` on your items so
291
307
  clients without your renderer, exports and agents show them as cards. Keep it out
292
308
  of undo with `editor.commitPatch(patch, { record: false })`.
@@ -302,6 +318,12 @@ const assets = createBoardAssetManager({
302
318
  - **Themes.** Start from a built-in theme and override what differs:
303
319
  `{ key: "neta-pixel", ...boardRenderTheme("neta-pixel") }`. `style.frameLabelSize`
304
320
  sets frame titles; the editor's title hit box and text editor follow it.
321
+ - **Backdrop.** A theme's `backdrop` is the Board's look until the document sets a
322
+ color or image: a `pattern` (`{ kind: "dots", pitch: 24, color }`) and an `image`
323
+ (`{ src, fit: "repeat", tile }`). The stage draws it on the GPU, patterns at a
324
+ constant screen size that merge as the view zooms out, and reports the image's load
325
+ through `onBackdropChange`. `resolveBoardBackdrop(settings, theme)` gives the result
326
+ for previews and exports; the canvas is opaque unless `transparent` is set.
305
327
  - **Fonts.** Board text measures in `"Geist Variable"`; load
306
328
  `@fontsource-variable/geist` so lines match the CLI export.
307
329
  - **Agent context.** `onViewStateChange` on the editor reports `visibleRect` and
@@ -29,18 +29,20 @@ declare function createBoardEditor(options: BoardEditorOptions): {
29
29
  readonly settings: {
30
30
  title?: string | undefined;
31
31
  background: {
32
- kind: "dots" | "grid" | "image" | "solid";
33
32
  color?: string | {
34
33
  light: string;
35
34
  dark: string;
36
35
  } | undefined;
37
- imageUrl?: string | undefined;
38
- fit?: "contain" | "cover" | "repeat" | undefined;
39
- opacity?: number | undefined;
36
+ pattern?: "dots" | "grid" | "none" | undefined;
37
+ image?: {
38
+ src: string;
39
+ fit: "contain" | "cover" | "repeat";
40
+ opacity?: number | undefined;
41
+ } | undefined;
40
42
  };
41
43
  grid?: {
42
- visible: boolean;
43
44
  size: number;
45
+ snap: boolean;
44
46
  } | undefined;
45
47
  enter?: {
46
48
  preset: "deal" | "drop" | "fade-in" | "pop" | "rise";
@@ -1,6 +1,6 @@
1
1
  import { BOARD_CLIPBOARD_MIME } from "../../protocol/dist/board.js";
2
- import { alignFrames, distributeFrames, framesBounds } from "./align.js";
3
2
  import { sameJson } from "../model/json.js";
3
+ import { alignFrames, distributeFrames, framesBounds } from "./align.js";
4
4
  import { diffBoardEdits, isEmptyBoardPatch, readPath, routeBoardEdits, writePath } from "./document-edits.js";
5
5
  import { normalizeWheelDelta, wheelZoomFactor } from "./wheel.js";
6
6
  import { BOARD_CLIPBOARD_VERSION, DUPLICATE_OFFSET, MAX_CLIPBOARD_CHARS, MAX_CLIPBOARD_ITEMS, defaultPasteOffset, encodeClipboard, materializeClipboard, parseClipboard, remapItems } from "./clipboard.js";
@@ -65,7 +65,7 @@ function createInteractionModule(ctx) {
65
65
  ], (interaction, tool, hoverPoint, pointerType, zoom, transform, outset) => interaction.type === "idle" && !pinch && tool === "select" && hoverPoint ? selectionTransformControlAt(transform, hoverPoint, zoom, pointerType, outset) : null);
66
66
  function gridSnapSize() {
67
67
  const grid = state.base.board.grid;
68
- return grid?.visible === true ? grid.size ?? 0 : 0;
68
+ return grid?.snap ? grid.size : 0;
69
69
  }
70
70
  function snapThreshold() {
71
71
  return SNAP_THRESHOLD / Math.max(state.camera.zoom, 1e-4);
@@ -35,12 +35,7 @@ type BoardExportOptions = {
35
35
  scripts?: BoardScriptHost;
36
36
  assetKey?: (item: BoardSceneItem) => string | null;
37
37
  renderers?: BoardCardRendererResolver;
38
- backgroundImage?: {
39
- texture: Texture;
40
- fit: "cover" | "contain" | "repeat";
41
- position: "center" | "top" | "bottom" | "left" | "right";
42
- opacity: number;
43
- };
38
+ backgroundTexture?: Texture;
44
39
  maxEdge?: number;
45
40
  maxPixels?: number;
46
41
  };
@@ -1,19 +1,21 @@
1
1
  import { buildBoardScene } from "../model/scene.js";
2
2
  import { resolveBoardAnimationCamera } from "../model/sampling.js";
3
3
  import { normalizeBoardDocument, planBoardExport } from "../model/export-plan.js";
4
- import { parseBoardCssColor } from "../render/css-color.js";
4
+ import { buildFallbackShapeColors } from "../model/palette.js";
5
+ import { resolveBoardBackdrop } from "../render/backdrop.js";
6
+ import { ensureBoardTextMeasurement } from "../render/text-measurement.js";
5
7
  import { defaultBoardPalette } from "../render/palette.js";
6
8
  import { createBoardRenderSampler } from "../render/sampling.js";
7
- import { ensureBoardTextMeasurement } from "../render/text-measurement.js";
8
9
  import { createBoardExportScene } from "./scene.js";
9
10
  import { Rectangle, RendererType } from "pixi.js";
10
11
  //#region src/board/export/index.ts
11
- function resolveBackground(background, palette, document, colorScheme) {
12
- if (background === "transparent") return null;
13
- if (typeof background === "number") return background;
14
- const declared = document.board.background.color;
15
- const css = typeof declared === "object" ? declared[colorScheme] : declared;
16
- return css ? parseBoardCssColor(css) ?? palette.bg : palette.bg;
12
+ function resolveBackdrop(options, document, theme) {
13
+ if (options.background === "transparent") return null;
14
+ const backdrop = resolveBoardBackdrop(document.board, theme, "export");
15
+ return typeof options.background === "number" ? {
16
+ ...backdrop,
17
+ color: options.background
18
+ } : backdrop;
17
19
  }
18
20
  function prepareBoardExport(input, options = {}) {
19
21
  ensureBoardTextMeasurement();
@@ -81,8 +83,12 @@ function renderBoardExport(renderer, input, options = {}) {
81
83
  scripts: options.scripts,
82
84
  assetKey: options.assetKey,
83
85
  renderers: options.renderers,
84
- background: resolveBackground(options.background, palette, document, colorScheme),
85
- backgroundImage: options.backgroundImage
86
+ backdrop: resolveBackdrop(options, document, {
87
+ palette,
88
+ colors: options.colors ?? buildFallbackShapeColors(colorScheme),
89
+ colorScheme
90
+ }),
91
+ backdropTexture: options.backgroundTexture
86
92
  });
87
93
  try {
88
94
  const texture = renderer.textureGenerator.generateTexture({
@@ -31,14 +31,9 @@ type BoardNodeRenderer = {
31
31
  };
32
32
  declare function createNodeBoardRenderer(options?: BoardNodeRendererOptions): Promise<BoardNodeRenderer>;
33
33
  type BoardNodeExportFormat = "png" | "jpeg" | "webp";
34
- type BoardNodeExportOptions = Omit<BoardExportOptions, "textures" | "backgroundImage"> & {
34
+ type BoardNodeExportOptions = Omit<BoardExportOptions, "textures" | "backgroundTexture"> & {
35
35
  textures?: Map<string, BoardNodeTexture>;
36
- backgroundImage?: {
37
- texture: BoardNodeTexture;
38
- fit: "cover" | "contain" | "repeat";
39
- position: "center" | "top" | "bottom" | "left" | "right";
40
- opacity: number;
41
- };
36
+ backgroundTexture?: BoardNodeTexture;
42
37
  scripts?: BoardScriptHost;
43
38
  format?: BoardNodeExportFormat;
44
39
  quality?: number;
@@ -135,15 +135,12 @@ function boardImageMimeType(format) {
135
135
  return MIME[format];
136
136
  }
137
137
  function exportBoardImageBytes(renderer, document, options = {}) {
138
- const { format = "png", quality = .92, textures, scripts, backgroundImage, ...rest } = options;
138
+ const { format = "png", quality = .92, textures, scripts, backgroundTexture, ...rest } = options;
139
139
  const result = renderBoardExport(renderer.renderer, document, {
140
140
  ...rest,
141
141
  ...scripts ? { scripts } : {},
142
142
  ...textures ? { textures } : {},
143
- ...backgroundImage ? { backgroundImage: {
144
- ...backgroundImage,
145
- texture: backgroundImage.texture
146
- } } : {}
143
+ ...backgroundTexture ? { backgroundTexture } : {}
147
144
  });
148
145
  if (!result) return null;
149
146
  const canvas = result.canvas;
@@ -5,6 +5,7 @@ import { BoardScene, BoardSceneItem } from "../model/scene.js";
5
5
  import { BoardShapeColors } from "../model/palette.js";
6
6
  import { BoardRenderStyleInput } from "../render/style.js";
7
7
  import { BoardCardRendererResolver, BoardRenderContext, BoardRenderPalette } from "../render/renderers/board-renderer-registry.js";
8
+ import { BoardBackdrop } from "../render/backdrop.js";
8
9
  import "../render/index.js";
9
10
  import { Container, Texture } from "pixi.js";
10
11
  //#region src/board/export/scene.d.ts
@@ -25,13 +26,8 @@ type BoardExportSceneInput = {
25
26
  assetKey?: (item: BoardSceneItem) => string | null;
26
27
  /** Renderers for item types beyond the built-ins. */
27
28
  renderers?: BoardCardRendererResolver;
28
- background?: number | null;
29
- backgroundImage?: {
30
- texture: Texture;
31
- fit: "cover" | "contain" | "repeat";
32
- position: "center" | "top" | "bottom" | "left" | "right";
33
- opacity: number;
34
- };
29
+ backdrop?: BoardBackdrop | null;
30
+ backdropTexture?: Texture;
35
31
  };
36
32
  type BoardExportScene = {
37
33
  root: Container;
@@ -1,10 +1,11 @@
1
1
  import { boardAssetKey } from "../model/asset-key.js";
2
2
  import { buildFallbackShapeColors } from "../model/palette.js";
3
- import { defaultBoardPalette } from "../render/palette.js";
3
+ import { createBoardBackdropLayer } from "../render/backdrop-layer.js";
4
4
  import { clippingAncestor, isClippingFrame, syncClipGroup } from "../render/clip.js";
5
+ import { defaultBoardPalette } from "../render/palette.js";
5
6
  import { DEFAULT_BOARD_RENDER_LABELS, getBoardCardRenderer } from "../render/renderers/board-renderer-registry.js";
6
7
  import { resolveBoardRenderStyle } from "../render/style.js";
7
- import { Container, Graphics, Sprite, TilingSprite } from "pixi.js";
8
+ import { Container, Graphics } from "pixi.js";
8
9
  //#region src/board/export/scene.ts
9
10
  function buildContext(input) {
10
11
  const missing = /* @__PURE__ */ new Set();
@@ -52,31 +53,23 @@ function createBoardExportScene(input) {
52
53
  const root = new Container({ label: "board-export-root" });
53
54
  const outputWidth = input.world.width * input.scale;
54
55
  const outputHeight = input.world.height * input.scale;
55
- if (input.background != null) root.addChild(new Graphics().rect(0, 0, outputWidth, outputHeight).fill({
56
- color: input.background,
57
- alpha: 1
58
- }));
59
- if (input.backgroundImage) {
60
- const { texture, fit, position, opacity } = input.backgroundImage;
61
- if (fit === "repeat") root.addChild(new TilingSprite({
62
- texture,
56
+ let backdrop = null;
57
+ if (input.backdrop) {
58
+ root.addChild(new Graphics().rect(0, 0, outputWidth, outputHeight).fill({
59
+ color: input.backdrop.color,
60
+ alpha: 1
61
+ }));
62
+ backdrop = createBoardBackdropLayer({ patterns: false });
63
+ const view = {
64
+ x: -input.world.x * input.scale,
65
+ y: -input.world.y * input.scale,
66
+ zoom: input.scale,
63
67
  width: outputWidth,
64
68
  height: outputHeight,
65
- alpha: opacity
66
- }));
67
- else {
68
- const sprite = new Sprite({
69
- texture,
70
- alpha: opacity
71
- });
72
- const scale = fit === "cover" ? Math.max(outputWidth / texture.width, outputHeight / texture.height) : Math.min(outputWidth / texture.width, outputHeight / texture.height);
73
- sprite.width = texture.width * scale;
74
- sprite.height = texture.height * scale;
75
- const x = position === "left" ? 0 : position === "right" ? outputWidth - sprite.width : (outputWidth - sprite.width) / 2;
76
- const y = position === "top" ? 0 : position === "bottom" ? outputHeight - sprite.height : (outputHeight - sprite.height) / 2;
77
- sprite.position.set(x, y);
78
- root.addChild(sprite);
79
- }
69
+ density: 1
70
+ };
71
+ backdrop.sync(input.backdrop, view, input.backdropTexture ?? null);
72
+ root.addChild(backdrop.container);
80
73
  }
81
74
  const world = new Container({
82
75
  isRenderGroup: true,
@@ -115,7 +108,10 @@ function createBoardExportScene(input) {
115
108
  return {
116
109
  root,
117
110
  missingImageKeys: [...missing],
118
- destroy: () => root.destroy({ children: true })
111
+ destroy: () => {
112
+ backdrop?.destroy();
113
+ root.destroy({ children: true });
114
+ }
119
115
  };
120
116
  }
121
117
  //#endregion
@@ -1,3 +1,4 @@
1
+ import { MediaSize } from "../../protocol/dist/core/media.js";
1
2
  import { BoardSceneItem } from "./scene.js";
2
3
  //#region src/board/model/asset-key.d.ts
3
4
  type BoardAssetMedia = "image" | "video" | "model";
@@ -7,18 +8,20 @@ type BoardAssetKeySource = {
7
8
  value: string;
8
9
  fit?: "cover";
9
10
  };
10
- /** `src` is a Space file path or a URL; `fit: "cover"` sizes an image by its short edge. */
11
+ /** `natural` is the media's own pixel size, never a scaled copy's; it replaces the item's recorded size. */
11
12
  type BoardAssetRef = {
12
13
  src: string;
13
14
  media?: "image" | "video";
14
15
  fit?: "contain" | "cover";
16
+ natural?: MediaSize;
15
17
  };
16
18
  declare function boardAssetRefKey({ src, media, fit }: BoardAssetRef): string | null;
17
19
  declare function imageAssetKey(item: BoardSceneItem): string | null;
20
+ declare function boardMediaNaturalSize(item: BoardSceneItem): MediaSize | null;
18
21
  declare function boardAssetKey(item: BoardSceneItem): string | null;
19
22
  declare function boardAssetKeySource(key: string): BoardAssetKeySource | null;
20
23
  declare function boardTexturePixels(item: BoardSceneItem, scale: number): number;
21
24
  declare const BOARD_THUMBNAIL_EDGE = 64;
22
25
  declare function boardTextureEdge(item: BoardSceneItem, scale: number): number;
23
26
  //#endregion
24
- export { BOARD_THUMBNAIL_EDGE, BoardAssetKeySource, BoardAssetMedia, BoardAssetRef, boardAssetKey, boardAssetKeySource, boardAssetRefKey, boardTextureEdge, boardTexturePixels, imageAssetKey };
27
+ export { BOARD_THUMBNAIL_EDGE, BoardAssetKeySource, BoardAssetMedia, BoardAssetRef, boardAssetKey, boardAssetKeySource, boardAssetRefKey, boardMediaNaturalSize, boardTextureEdge, boardTexturePixels, imageAssetKey };
@@ -1,4 +1,4 @@
1
- import { mediaVariantSize, videoFrameUrl } from "../../media.js";
1
+ import { mediaVariantSize } from "../../protocol/dist/core/media.js";
2
2
  import { boardItemPreview, isSafeBoardSourcePath, parseBoardMediaSource } from "../../protocol/dist/board-model.js";
3
3
  import { featuredTaskArtifact, taskArtifactPreviewUrl } from "../../protocol/dist/board-task.js";
4
4
  import { isBoardModelItem } from "./media.js";
@@ -42,9 +42,17 @@ function taskPreviewKey(item) {
42
42
  const artifact = featuredTaskArtifact(item.props.snapshot.artifacts);
43
43
  const cover = taskArtifactPreviewUrl(artifact);
44
44
  if (cover) return `url:${cover}`;
45
- if (artifact?.type !== "video") return null;
46
- const frame = videoFrameUrl(artifact.url, 768);
47
- return frame ? `url:${frame}` : `video-url:${encodeURIComponent(artifact.url)}`;
45
+ return artifact?.type === "video" ? stillKey("video", {
46
+ kind: "url",
47
+ value: artifact.url
48
+ }, void 0) : null;
49
+ }
50
+ function boardMediaNaturalSize(item) {
51
+ const recorded = item.type === "task" ? featuredTaskArtifact(item.props.snapshot.artifacts) : item.type === "image" || item.type === "video" ? item.props.snapshot : null;
52
+ return recorded && "naturalWidth" in recorded && recorded.naturalWidth && recorded.naturalHeight ? {
53
+ width: recorded.naturalWidth,
54
+ height: recorded.naturalHeight
55
+ } : null;
48
56
  }
49
57
  function boardAssetKey(item) {
50
58
  if (item.type === "task") return taskPreviewKey(item);
@@ -109,4 +117,4 @@ function boardTextureEdge(item, scale) {
109
117
  return pixels > 1536 ? Number.POSITIVE_INFINITY : mediaVariantSize(pixels);
110
118
  }
111
119
  //#endregion
112
- export { BOARD_THUMBNAIL_EDGE, boardAssetKey, boardAssetKeySource, boardAssetRefKey, boardTextureEdge, boardTexturePixels, imageAssetKey };
120
+ export { BOARD_THUMBNAIL_EDGE, boardAssetKey, boardAssetKeySource, boardAssetRefKey, boardMediaNaturalSize, boardTextureEdge, boardTexturePixels, imageAssetKey };
@@ -1,4 +1,4 @@
1
- import { BOARD_ANCHOR_SIDES, BOARD_ARROW_ROUTES, BOARD_CAMERA_TARGET, BOARD_COLOR_TOKENS, BOARD_DASHES, BOARD_DERIVED_SIZE_TYPES, BOARD_EFFECT_KINDS, BOARD_EFFECT_KIND_INFO, BOARD_ENTER_PRESETS, BOARD_EXTENSION_TYPE_PATTERN, BOARD_GRID_DEFAULT_SIZE, BOARD_GRID_MAX_SIZE, BOARD_GRID_MIN_SIZE, BOARD_ID_MAX_LENGTH, BOARD_ITEM_SCHEMAS, BOARD_ITEM_TYPES, BOARD_PLAY_MODES, BOARD_SHAPE_GEOMETRIES, BOARD_TASK_ARTIFACT_LIMIT, BOARD_TEXT_ALIGNS, BoardAnchorSide, BoardAnimation, BoardAnimationHeader, BoardAnimationHeaderSchema, BoardAnimationSchema, BoardArrowAnchor, BoardArrowAnchorSchema, BoardArrowBinding, BoardArrowBindingSchema, BoardArrowEnd, BoardArrowEndSchema, BoardArrowItem, BoardArrowItemSchema, BoardArrowRoute, BoardAudioItem, BoardAudioItemSchema, BoardBackgroundSchema, BoardBuiltinItem, BoardBuiltinItemType, BoardColor, BoardColorSchema, BoardColorToken, BoardCropSchema, BoardCustomItem, BoardCustomItemSchema, BoardDash, BoardDelta, BoardDiagnostic, BoardDocument, BoardDrawItem, BoardDrawItemSchema, BoardDrawPoint, BoardDrawPointSchema, BoardEaseSchema, BoardEffectItem, BoardEffectItemSchema, BoardEffectKind, BoardEnterPreset, BoardExtensionItem, BoardExtensionItemSchema, BoardFileBackedItem, BoardFileItem, BoardFileItemSchema, BoardFrameItem, BoardFrameItemSchema, BoardIdSchema, BoardImageItem, BoardImageItemSchema, BoardItem, BoardItemPreview, BoardItemPreviewSchema, BoardItemType, BoardKeySchema, BoardKeyframe, BoardKeyframeSchema, BoardMarker, BoardMarkerSchema, BoardMediaOrigin, BoardMediaOriginSchema, BoardMediaSnapshot, BoardMediaSnapshotSchema, BoardMediaSource, BoardMediaSourceSchema, BoardPatch, BoardPatchSchema, BoardPlayMode, BoardScript, BoardScriptSchema, BoardSettings, BoardSettingsSchema, BoardShapeGeometry, BoardShapeItem, BoardShapeItemSchema, BoardSize, BoardSizeSchema, BoardStyle, BoardStyleSchema, BoardTaskArtifact, BoardTaskArtifactSchema, BoardTaskItem, BoardTaskItemSchema, BoardTaskSnapshot, BoardTaskSnapshotSchema, BoardTextItem, BoardTextItemSchema, BoardTrack, BoardTrackSchema, BoardVec2, BoardVec2Schema, BoardVideoItem, BoardVideoItemSchema, boardItemPreview, boardItemSchema, emptyBoardDocument, hasAuthoredSize, isBoardColorString, isBoardEase, isBuiltinItem, isBuiltinItemType, isEmptyBoardDelta, isFileBackedItem, isMediaItem, isSafeBoardSourcePath, parseBoardItem, parseBoardMediaSource } from "../../protocol/dist/board-model.js";
1
+ import { BOARD_ANCHOR_SIDES, BOARD_ARROW_ROUTES, BOARD_BACKGROUND_FITS, BOARD_BACKGROUND_PATTERNS, BOARD_CAMERA_TARGET, BOARD_COLOR_TOKENS, BOARD_DASHES, BOARD_DERIVED_SIZE_TYPES, BOARD_EFFECT_KINDS, BOARD_EFFECT_KIND_INFO, BOARD_ENTER_PRESETS, BOARD_EXTENSION_TYPE_PATTERN, BOARD_GRID_DEFAULT_SIZE, BOARD_GRID_MAX_SIZE, BOARD_GRID_MIN_SIZE, BOARD_ID_MAX_LENGTH, BOARD_ITEM_SCHEMAS, BOARD_ITEM_TYPES, BOARD_PLAY_MODES, BOARD_SHAPE_GEOMETRIES, BOARD_TASK_ARTIFACT_LIMIT, BOARD_TEXT_ALIGNS, BoardAnchorSide, BoardAnimation, BoardAnimationHeader, BoardAnimationHeaderSchema, BoardAnimationSchema, BoardArrowAnchor, BoardArrowAnchorSchema, BoardArrowBinding, BoardArrowBindingSchema, BoardArrowEnd, BoardArrowEndSchema, BoardArrowItem, BoardArrowItemSchema, BoardArrowRoute, BoardAudioItem, BoardAudioItemSchema, BoardBackground, BoardBackgroundFit, BoardBackgroundPattern, BoardBackgroundSchema, BoardBuiltinItem, BoardBuiltinItemType, BoardColor, BoardColorSchema, BoardColorToken, BoardCropSchema, BoardCustomItem, BoardCustomItemSchema, BoardDash, BoardDelta, BoardDiagnostic, BoardDocument, BoardDrawItem, BoardDrawItemSchema, BoardDrawPoint, BoardDrawPointSchema, BoardEaseSchema, BoardEffectItem, BoardEffectItemSchema, BoardEffectKind, BoardEnterPreset, BoardExtensionItem, BoardExtensionItemSchema, BoardFileBackedItem, BoardFileItem, BoardFileItemSchema, BoardFrameItem, BoardFrameItemSchema, BoardIdSchema, BoardImageItem, BoardImageItemSchema, BoardItem, BoardItemPreview, BoardItemPreviewSchema, BoardItemType, BoardKeySchema, BoardKeyframe, BoardKeyframeSchema, BoardMarker, BoardMarkerSchema, BoardMediaOrigin, BoardMediaOriginSchema, BoardMediaSnapshot, BoardMediaSnapshotSchema, BoardMediaSource, BoardMediaSourceSchema, BoardPatch, BoardPatchSchema, BoardPlayMode, BoardScript, BoardScriptSchema, BoardSettings, BoardSettingsSchema, BoardShapeGeometry, BoardShapeItem, BoardShapeItemSchema, BoardSize, BoardSizeSchema, BoardStyle, BoardStyleSchema, BoardTaskArtifact, BoardTaskArtifactSchema, BoardTaskItem, BoardTaskItemSchema, BoardTaskSnapshot, BoardTaskSnapshotSchema, BoardTextItem, BoardTextItemSchema, BoardTrack, BoardTrackSchema, BoardVec2, BoardVec2Schema, BoardVideoItem, BoardVideoItemSchema, boardItemPreview, boardItemSchema, emptyBoardDocument, hasAuthoredSize, isBoardColorString, isBoardEase, isBuiltinItem, isBuiltinItemType, isEmptyBoardDelta, isFileBackedItem, isMediaItem, isSafeBoardSourcePath, parseBoardItem, parseBoardMediaSource } from "../../protocol/dist/board-model.js";
2
2
  import { BoardFrame, BoardItemLookup, BoardLayout, BoardMatrix, BoardRect, BoardTextFont, BoardTextLayout, BoardTextLayouter, BoardTextLines, IDENTITY_MATRIX, adoptBoardNaturalSize, anchorPoint, applyMatrix, arrowBindings, autoAnchorSide, bendControl, clampBoardFontSize, createBoardLayout, createDocumentLayout, drawPointsBounds, drawSampleRadius, estimateTextWidth, fitBoardMediaSize, framePoint, invertMatrix, isArrowBinding, layoutBoardText, multiplyMatrix, pointsRect, rotateAround, scaleVector, setBoardTextLayouter, sideAnchor } from "../../protocol/dist/board-layout.js";
3
3
  import { BoardApplyOptions, BoardPatchResult, BoardPropertySpec, BoardState, BoardValueKind, applyBoardDelta, applyBoardPatch, applyBoardPatchToDocument, boardPatchTouches, createDocumentState, diffBoardDocuments, diffMergePatch, isEmptyBoardPatch, listBoardProperties, mergePatch, parseBoardDocument, pruneBoardTrack, resolveBoardProperty, trackReferences } from "../../protocol/dist/board-patch.js";
4
4
  import { isBoardPath, parseBoardManifest, serializeBoardManifest } from "../../protocol/dist/board.js";
@@ -33,7 +33,7 @@ import { SHAPE_KINDS, ShapeKind, isShapeKind } from "./shape-types.js";
33
33
  import { BOARD_FRAME_LABEL_LINE_HEIGHT, BOARD_FRAME_LABEL_SIZE, SHAPE_LABEL_PADDING, TEXT_FONT_FAMILY, TEXT_FONT_SIZE, TEXT_LINE_HEIGHT, TEXT_MAX_FONT_SIZE, TEXT_MIN_FONT_SIZE, boardEditableText, boardFontFamily, frameLabelHitRect, frameLabelOffset, layoutShapeLabel } from "./text-metrics.js";
34
34
  import { BoardStyledToolId, BoardToolStyleMap, BoardToolStylePatch, DEFAULT_BOARD_TOOL_STYLES, createBoardToolStyles } from "./tool-styles.js";
35
35
  import { ClientToLocalInput, clientToLocal, elementClientToLocal } from "./client-geometry.js";
36
- import { BOARD_THUMBNAIL_EDGE, BoardAssetKeySource, BoardAssetMedia, BoardAssetRef, boardAssetKey, boardAssetKeySource, boardAssetRefKey, boardTextureEdge, boardTexturePixels, imageAssetKey } from "./asset-key.js";
36
+ import { BOARD_THUMBNAIL_EDGE, BoardAssetKeySource, BoardAssetMedia, BoardAssetRef, boardAssetKey, boardAssetKeySource, boardAssetRefKey, boardMediaNaturalSize, boardTextureEdge, boardTexturePixels, imageAssetKey } from "./asset-key.js";
37
37
  import { BoardMediaFileResolver, BoardMediaSize, BoardMediaSizeOptions, BoardMediaTarget, boardMediaTarget, probeBoardMediaSize, settleBoardMediaSizes } from "./media-sizes.js";
38
38
  import { BoardItemActivation, BoardItemCapabilities, BoardItemDefinition, BoardItemOf, BoardItemResizeMode, FULL_CAPABILITIES, defineBoardItem } from "./items/definition.js";
39
39
  import { builtinBoardItems } from "./items/builtin.js";
@@ -42,6 +42,7 @@ import { createBoardEntityId, createBoardItemId } from "./items/id.js";
42
42
  import { BoardItemInput, BoardRegistry, createBoardRegistry, defaultBoardRegistry } from "./items/registry.js";
43
43
  import "./items/index.js";
44
44
  import { BoardMediaKind, boardModelFormat, getMediaExtension, getMediaResourceTitle, inferBoardMediaKind, isBoardModelItem } from "./media.js";
45
- import { BoardAssetSource, BoardAssetUrlOptions, BoardPlayableMedia, playableBoardMedia, playableBoardMediaList, resetBoardPlaybackUrlCache, resolveBoardMediaUrl } from "./media-playback.js";
45
+ import { BoardAssetSource, BoardPlayableMedia, playableBoardMedia, playableBoardMediaList, resetBoardPlaybackUrlCache, resolveBoardMediaUrl } from "./media-playback.js";
46
+ import { readBoardDocument } from "./read.js";
46
47
  import { BoardReplayActorKind, BoardReplayEntry, BoardReplayPlayer, boardReplayActorKind, createBoardReplayPlayer } from "./replay.js";
47
- export { ARROW_BINDING_GAP, ArrowFrameLookup, BOARD_ANCHOR_SIDES, BOARD_ARROW_ROUTES, BOARD_CAMERA_TARGET, BOARD_COLORS, BOARD_COLOR_TOKENS, BOARD_DASHES, BOARD_DERIVED_SIZE_TYPES, BOARD_EFFECT_KINDS, BOARD_EFFECT_KIND_INFO, BOARD_ENTER_PRESETS, BOARD_EXPORT_DEFAULT_PADDING, BOARD_EXPORT_DEFAULT_SCALE, BOARD_EXPORT_ITEM_WARN_THRESHOLD, BOARD_EXPORT_MAX_EDGE, BOARD_EXPORT_MAX_PIXELS, BOARD_EXPORT_TEXTURE_BYTES, BOARD_EXTENSION_TYPE_PATTERN, BOARD_FRAME_LABEL_LINE_HEIGHT, BOARD_FRAME_LABEL_SIZE, BOARD_GRID_DEFAULT_SIZE, BOARD_GRID_MAX_SIZE, BOARD_GRID_MIN_SIZE, BOARD_ID_MAX_LENGTH, BOARD_ITEM_SCHEMAS, BOARD_ITEM_TYPES, BOARD_PLAY_MODES, BOARD_PRESET_NAMES, BOARD_SCHEMA_TARGETS, BOARD_SCRIPT_API, BOARD_SCRIPT_DRAWING_EXAMPLE, BOARD_SHAPE_GEOMETRIES, BOARD_STROKE_MAX_SIZE, BOARD_STROKE_MIN_SIZE, BOARD_TASK_ARTIFACT_LIMIT, BOARD_TASK_SOURCE_PREFIX, BOARD_TEXT_ALIGNS, BOARD_THEME_IDS, BOARD_THUMBNAIL_EDGE, BoardAnchorSide, BoardAnimation, BoardAnimationHeader, BoardAnimationHeaderSchema, BoardAnimationSampler, BoardAnimationSchema, BoardAppMetadata, BoardApplyOptions, BoardArrowAnchor, BoardArrowAnchorSchema, BoardArrowBinding, BoardArrowBindingSchema, BoardArrowEnd, BoardArrowEndSchema, BoardArrowItem, BoardArrowItemSchema, BoardArrowRoute, BoardAssetKeySource, BoardAssetMedia, BoardAssetRef, BoardAssetSource, BoardAssetUrlOptions, BoardAudioItem, BoardAudioItemSchema, BoardBackgroundSchema, BoardBuiltinItem, BoardBuiltinItemType, BoardCameraFit, BoardCameraFocus, BoardCameraOverride, BoardCameraState, BoardChapter, BoardColor, BoardColorEntry, BoardColorId, BoardColorResolver, BoardColorSchema, BoardColorToken, BoardColorValue, BoardCropSchema, BoardCustomItem, BoardCustomItemSchema, BoardDash, BoardDelta, BoardDiagnostic, BoardDocument, BoardDrawInputSample, BoardDrawItem, BoardDrawItemSchema, BoardDrawPoint, BoardDrawPointSchema, BoardEaseFunction, BoardEaseSchema, BoardEffectItem, BoardEffectItemSchema, BoardEffectKind, BoardEnterPreset, BoardEvaluateOptions, BoardEvaluation, BoardExportAssetSelection, BoardExportPlan, BoardExportPlanInput, BoardExportRegion, BoardExtensionItem, BoardExtensionItemSchema, BoardFileBackedItem, BoardFileItem, BoardFileItemSchema, type BoardFileSnapshotFacts, BoardFrame, BoardFrameItem, BoardFrameItemSchema, BoardIdSchema, BoardImageItem, BoardImageItemSchema, BoardItem, BoardItemActivation, BoardItemCapabilities, BoardItemDefinition, BoardItemEntry, BoardItemInput, BoardItemLookup, BoardItemOf, BoardItemPreview, BoardItemPreviewSchema, BoardItemResizeMode, BoardItemType, BoardKeySchema, BoardKeyframe, BoardKeyframeSchema, BoardLayout, BoardMarker, BoardMarkerSchema, BoardMatrix, BoardMediaFileResolver, BoardMediaItemKind, BoardMediaKind, BoardMediaOrigin, BoardMediaOriginSchema, BoardMediaSize, BoardMediaSizeOptions, BoardMediaSnapshot, BoardMediaSnapshotSchema, BoardMediaSource, BoardMediaSourceSchema, BoardMediaTarget, BoardNestedAnimationOptions, BoardNormalizedPoint, BoardPatch, BoardPatchResult, BoardPatchSchema, BoardPlacement, BoardPlayMode, BoardPlayableMedia, BoardPresetName, BoardPresetOptions, BoardPropertySpec, BoardRect, BoardRegistry, BoardReplayActorKind, BoardReplayEntry, BoardReplayPlayer, BoardScene, BoardSceneItem, BoardScreenOffset, BoardScreenPoint, BoardScript, BoardScriptAnchor, BoardScriptContext, BoardScriptEvent, BoardScriptEventOf, BoardScriptFrame, BoardScriptHit, BoardScriptHostEvents, BoardScriptItemPatch, BoardScriptModule, BoardScriptOutput, BoardScriptParameter, BoardScriptSceneOptions, BoardScriptSchema, BoardScriptSnapshot, BoardScriptView, BoardSettings, BoardSettingsSchema, BoardShapeColors, BoardShapeGeometry, BoardShapeItem, BoardShapeItemSchema, BoardSize, BoardSizeSchema, BoardState, BoardStyle, BoardStyleSchema, BoardStyledToolId, BoardTaskArtifact, BoardTaskArtifactSchema, BoardTaskItem, BoardTaskItemSchema, type BoardTaskRunSource, BoardTaskSnapshot, BoardTaskSnapshotSchema, BoardTextFont, BoardTextItem, BoardTextItemSchema, BoardTextLayout, BoardTextLayouter, BoardTextLines, type BoardThemeId, BoardToolStyleMap, BoardToolStylePatch, BoardTrack, BoardTrackSchema, BoardValueKind, BoardVec2, BoardVec2Schema, BoardVideoItem, BoardVideoItemSchema, BoardViewport, BoardWorldOffset, BoardWorldPoint, BoardWorldRect, type BuildSnapshotInput, CORNER_RESIZE_HANDLES, CORNER_ROTATION_ZONE_WIDTH, ClientToLocalInput, CompiledAnimation, CompiledBoardAnimations, CompiledTrack, CornerResizeHandle, DEFAULT_BOARD_COLOR, DEFAULT_BOARD_TOOL_STYLES, EDGE_RESIZE_HANDLES, FILE_EXCERPT_MAX_BYTES, FILE_EXCERPT_MAX_CHARS, FIT_PADDING, FULL_CAPABILITIES, FileAvailability, type FileCategory, FilePreviewKind, HANDLE_DIRECTION, HANDLE_HIT_RADIUS, IDENTITY_MATRIX, MAX_BOARD_ZOOM, MIN_BOARD_ZOOM, MIN_ITEM_SIZE, Point, RESIZE_HANDLES, ROTATION_HANDLE_OFFSET, Rect, ResizeHandle, ResolvedArrow, ResolvedArrowEnd, type ResolvedCover, SHAPE_KINDS, SHAPE_LABEL_PADDING, SceneItem, ScreenPoint, ShapeKind, Size, StrokeRibbonBuilder, StrokeRibbonGeometry, StrokeRibbonMesh, TEXT_FONT_FAMILY, TEXT_FONT_SIZE, TEXT_LINE_HEIGHT, TEXT_MAX_FONT_SIZE, TEXT_MIN_FONT_SIZE, VIEWPORT_MARGIN_RATIO, WorldPoint, adoptBoardNaturalSize, anchorPoint, angleFromCenter, appendBoardDrawSamples, applyBoardDelta, applyBoardEvaluation, applyBoardPatch, applyBoardPatchToDocument, applyMatrix, arrowBindings, arrowHitRadius, arrowPathBounds, autoAnchorSide, availabilityFromError, bendControl, boardAnimationTime, boardAssetKey, boardAssetKeySource, boardAssetRefKey, boardColorCssVar, boardDocumentAt, boardEase, boardEditableText, boardFontFamily, boardItemOrigin, boardItemPreview, boardItemSchema, boardJsonSchema, boardMediaTarget, boardModelFormat, boardNestedAnimation, boardNestedAnimationTrack, boardOriginKey, boardPatchTouches, boardPathTrack, boardPresetTracks, boardReplayActorKind, boardSchemaOverview, boardScriptHitVisible, boardScriptItems, boardScriptScope, boardScriptTarget, boardSequence, boardSequencePatch, boardTaskCardSize, boardTaskSource, boardTextureBytes, boardTextureEdge, boardTexturePixels, buildBoardScene, buildCodeExcerpt, buildFallbackShapeColors, buildFileExcerpt, buildFileSnapshot, buildStrokeOutline, buildStrokeRibbonGeometry, builtinBoardItems, cameraForFocus, cameraForRect, cameraForState, clamp, clampBoardFontSize, clampBoardStrokeSize, clampBoardFontSize as clampBoardTextFontSize, clampZoom, clientToLocal, compileBoardAnimations, composeBoardScriptItems, computeDrawBounds, createAppBoardItem, createArrowBoardItem, createBoardAnimationSampler, createBoardEntityId, createBoardItemId, createBoardLayout, createBoardRegistry, createBoardReplayPlayer, createBoardToolStyles, createDocumentLayout, createDocumentState, createDrawBoardItem, createFileNodeForPath, createFrameBoardItem, createMediaBoardItem, createShapeBoardItem, createStrokeRibbonBuilder, createTaskBoardItem, createTaskResultItems, createTextBoardItem, defaultBoardRegistry, defineBoardItem, degToRad, diffBoardDocuments, diffMergePatch, distanceToArrow, distanceToStroke, drawPointsBounds, drawSampleRadius, elementClientToLocal, emptyBoardDocument, estimateTextWidth, evaluateBoardAnimations, expandRect, exportItemBounds, featuredTaskArtifact, fileBaseName, fileCategory, fileCategoryAccent, fileMetaLine, filePreviewKind, filePreviewMemoKey, filePreviewScope, fileStem, fileTypeLabel, fitBoardMediaSize, fitToContent, formatFileSize, frameContainsPoint, frameCornerRotationHandleAt, frameCorners, frameEdgeHandleAt, frameHandlePosition, frameLabelHitRect, frameLabelOffset, framePoint, frameRayIntersection, frameRect, getMediaExtension, getMediaResourceTitle, handlePosition, hasAuthoredSize, hasBoardScripts, imageAssetKey, inferBoardMediaKind, invertMatrix, isArrowBinding, isBoardColorId, isBoardColorString, isBoardEase, isBoardModelItem, isBoardPath, isBoardPresetName, isBuiltinItem, isBuiltinItemType, isEmptyBoardDelta, isEmptyBoardPatch, isFileBackedItem, isFileSnapshotFresh, isMediaItem, isPublicBoardRemoteAddress, isSafeBoardSourcePath, isShapeKind, isStrokeCorner, itemBounds, layoutBoardText, layoutShapeLabel, listBoardPresets, listBoardProperties, mediaFrameSize, mergeFileSnapshot, mergePatch, multiplyMatrix, normalizeBoardDocument, normalizeBoardRemoteUrl, normalizeRotation, normalizeViewport, normalizedPoint, orderBoardItems, panBy, parseBoardDocument, parseBoardItem, parseBoardManifest, parseBoardMediaSource, parseHexColor, pathMidpoint, pathPointAt, pickBoardColor, placeBoardOverlay, placeItem, planBoardExport, playableBoardMedia, playableBoardMediaList, pointToWorld, pointsBounds, pointsRect, prepareBoardScriptOutput, probeBoardMediaSize, pruneBoardTrack, quantizeDrawCoordinate, radToDeg, rankedTaskArtifacts, readCoverFromFrontmatter, readFrontmatterScalars, readTitleFromFrontmatter, rectCenter, rectContainsPoint, rectForCameraFocus, rectsIntersect, refreshBoardScene, resetBoardPlaybackUrlCache, resizeFrame, resizeFrameToSize, resolveAnchor, resolveArrow, resolveBoardAnimationCamera, resolveBoardColor, resolveBoardMediaUrl, resolveBoardProperty, resolveBoardScriptHit, resolveCoverRef, resolveFileTitle, resolveItemColor, resolveSceneArrow, resolveSpacePath, rotateAround, rotateFrames, rotatePointAround, rotationHandleAnchor, rotationHandlePosition, sampleBoardTrack, sampleRadius, scaleFrames, scaleVector, sceneItemToItem, sceneItemsToRecord, screenOffset, screenPoint, screenToWorld, scriptTemporaryPrefix, selectBoardExportAssets, selectionBounds, serializeBoardManifest, setBoardTextLayouter, settleBoardMediaSizes, shouldFetchFileExcerpt, sideAnchor, simplifyDrawIndices, splitFrontmatter, stableCullRect, taskArtifactPreviewUrl, taskArtifacts, taskRunArtifacts, taskRunToBoardTaskSnapshot, titleForBoardItem, toSceneItem, trackReferences, trimDrawPoints, unionRects, validateBoardScriptCommit, validateBoardScriptOutput, visibleWorldRect, withObservedArtifactFacts, worldOffset, worldPoint, worldRect, worldToScreen, zoomAround };
48
+ export { ARROW_BINDING_GAP, ArrowFrameLookup, BOARD_ANCHOR_SIDES, BOARD_ARROW_ROUTES, BOARD_BACKGROUND_FITS, BOARD_BACKGROUND_PATTERNS, BOARD_CAMERA_TARGET, BOARD_COLORS, BOARD_COLOR_TOKENS, BOARD_DASHES, BOARD_DERIVED_SIZE_TYPES, BOARD_EFFECT_KINDS, BOARD_EFFECT_KIND_INFO, BOARD_ENTER_PRESETS, BOARD_EXPORT_DEFAULT_PADDING, BOARD_EXPORT_DEFAULT_SCALE, BOARD_EXPORT_ITEM_WARN_THRESHOLD, BOARD_EXPORT_MAX_EDGE, BOARD_EXPORT_MAX_PIXELS, BOARD_EXPORT_TEXTURE_BYTES, BOARD_EXTENSION_TYPE_PATTERN, BOARD_FRAME_LABEL_LINE_HEIGHT, BOARD_FRAME_LABEL_SIZE, BOARD_GRID_DEFAULT_SIZE, BOARD_GRID_MAX_SIZE, BOARD_GRID_MIN_SIZE, BOARD_ID_MAX_LENGTH, BOARD_ITEM_SCHEMAS, BOARD_ITEM_TYPES, BOARD_PLAY_MODES, BOARD_PRESET_NAMES, BOARD_SCHEMA_TARGETS, BOARD_SCRIPT_API, BOARD_SCRIPT_DRAWING_EXAMPLE, BOARD_SHAPE_GEOMETRIES, BOARD_STROKE_MAX_SIZE, BOARD_STROKE_MIN_SIZE, BOARD_TASK_ARTIFACT_LIMIT, BOARD_TASK_SOURCE_PREFIX, BOARD_TEXT_ALIGNS, BOARD_THEME_IDS, BOARD_THUMBNAIL_EDGE, BoardAnchorSide, BoardAnimation, BoardAnimationHeader, BoardAnimationHeaderSchema, BoardAnimationSampler, BoardAnimationSchema, BoardAppMetadata, BoardApplyOptions, BoardArrowAnchor, BoardArrowAnchorSchema, BoardArrowBinding, BoardArrowBindingSchema, BoardArrowEnd, BoardArrowEndSchema, BoardArrowItem, BoardArrowItemSchema, BoardArrowRoute, BoardAssetKeySource, BoardAssetMedia, BoardAssetRef, BoardAssetSource, BoardAudioItem, BoardAudioItemSchema, BoardBackground, BoardBackgroundFit, BoardBackgroundPattern, BoardBackgroundSchema, BoardBuiltinItem, BoardBuiltinItemType, BoardCameraFit, BoardCameraFocus, BoardCameraOverride, BoardCameraState, BoardChapter, BoardColor, BoardColorEntry, BoardColorId, BoardColorResolver, BoardColorSchema, BoardColorToken, BoardColorValue, BoardCropSchema, BoardCustomItem, BoardCustomItemSchema, BoardDash, BoardDelta, BoardDiagnostic, BoardDocument, BoardDrawInputSample, BoardDrawItem, BoardDrawItemSchema, BoardDrawPoint, BoardDrawPointSchema, BoardEaseFunction, BoardEaseSchema, BoardEffectItem, BoardEffectItemSchema, BoardEffectKind, BoardEnterPreset, BoardEvaluateOptions, BoardEvaluation, BoardExportAssetSelection, BoardExportPlan, BoardExportPlanInput, BoardExportRegion, BoardExtensionItem, BoardExtensionItemSchema, BoardFileBackedItem, BoardFileItem, BoardFileItemSchema, type BoardFileSnapshotFacts, BoardFrame, BoardFrameItem, BoardFrameItemSchema, BoardIdSchema, BoardImageItem, BoardImageItemSchema, BoardItem, BoardItemActivation, BoardItemCapabilities, BoardItemDefinition, BoardItemEntry, BoardItemInput, BoardItemLookup, BoardItemOf, BoardItemPreview, BoardItemPreviewSchema, BoardItemResizeMode, BoardItemType, BoardKeySchema, BoardKeyframe, BoardKeyframeSchema, BoardLayout, BoardMarker, BoardMarkerSchema, BoardMatrix, BoardMediaFileResolver, BoardMediaItemKind, BoardMediaKind, BoardMediaOrigin, BoardMediaOriginSchema, BoardMediaSize, BoardMediaSizeOptions, BoardMediaSnapshot, BoardMediaSnapshotSchema, BoardMediaSource, BoardMediaSourceSchema, BoardMediaTarget, BoardNestedAnimationOptions, BoardNormalizedPoint, BoardPatch, BoardPatchResult, BoardPatchSchema, BoardPlacement, BoardPlayMode, BoardPlayableMedia, BoardPresetName, BoardPresetOptions, BoardPropertySpec, BoardRect, BoardRegistry, BoardReplayActorKind, BoardReplayEntry, BoardReplayPlayer, BoardScene, BoardSceneItem, BoardScreenOffset, BoardScreenPoint, BoardScript, BoardScriptAnchor, BoardScriptContext, BoardScriptEvent, BoardScriptEventOf, BoardScriptFrame, BoardScriptHit, BoardScriptHostEvents, BoardScriptItemPatch, BoardScriptModule, BoardScriptOutput, BoardScriptParameter, BoardScriptSceneOptions, BoardScriptSchema, BoardScriptSnapshot, BoardScriptView, BoardSettings, BoardSettingsSchema, BoardShapeColors, BoardShapeGeometry, BoardShapeItem, BoardShapeItemSchema, BoardSize, BoardSizeSchema, BoardState, BoardStyle, BoardStyleSchema, BoardStyledToolId, BoardTaskArtifact, BoardTaskArtifactSchema, BoardTaskItem, BoardTaskItemSchema, type BoardTaskRunSource, BoardTaskSnapshot, BoardTaskSnapshotSchema, BoardTextFont, BoardTextItem, BoardTextItemSchema, BoardTextLayout, BoardTextLayouter, BoardTextLines, type BoardThemeId, BoardToolStyleMap, BoardToolStylePatch, BoardTrack, BoardTrackSchema, BoardValueKind, BoardVec2, BoardVec2Schema, BoardVideoItem, BoardVideoItemSchema, BoardViewport, BoardWorldOffset, BoardWorldPoint, BoardWorldRect, type BuildSnapshotInput, CORNER_RESIZE_HANDLES, CORNER_ROTATION_ZONE_WIDTH, ClientToLocalInput, CompiledAnimation, CompiledBoardAnimations, CompiledTrack, CornerResizeHandle, DEFAULT_BOARD_COLOR, DEFAULT_BOARD_TOOL_STYLES, EDGE_RESIZE_HANDLES, FILE_EXCERPT_MAX_BYTES, FILE_EXCERPT_MAX_CHARS, FIT_PADDING, FULL_CAPABILITIES, FileAvailability, type FileCategory, FilePreviewKind, HANDLE_DIRECTION, HANDLE_HIT_RADIUS, IDENTITY_MATRIX, MAX_BOARD_ZOOM, MIN_BOARD_ZOOM, MIN_ITEM_SIZE, Point, RESIZE_HANDLES, ROTATION_HANDLE_OFFSET, Rect, ResizeHandle, ResolvedArrow, ResolvedArrowEnd, type ResolvedCover, SHAPE_KINDS, SHAPE_LABEL_PADDING, SceneItem, ScreenPoint, ShapeKind, Size, StrokeRibbonBuilder, StrokeRibbonGeometry, StrokeRibbonMesh, TEXT_FONT_FAMILY, TEXT_FONT_SIZE, TEXT_LINE_HEIGHT, TEXT_MAX_FONT_SIZE, TEXT_MIN_FONT_SIZE, VIEWPORT_MARGIN_RATIO, WorldPoint, adoptBoardNaturalSize, anchorPoint, angleFromCenter, appendBoardDrawSamples, applyBoardDelta, applyBoardEvaluation, applyBoardPatch, applyBoardPatchToDocument, applyMatrix, arrowBindings, arrowHitRadius, arrowPathBounds, autoAnchorSide, availabilityFromError, bendControl, boardAnimationTime, boardAssetKey, boardAssetKeySource, boardAssetRefKey, boardColorCssVar, boardDocumentAt, boardEase, boardEditableText, boardFontFamily, boardItemOrigin, boardItemPreview, boardItemSchema, boardJsonSchema, boardMediaNaturalSize, boardMediaTarget, boardModelFormat, boardNestedAnimation, boardNestedAnimationTrack, boardOriginKey, boardPatchTouches, boardPathTrack, boardPresetTracks, boardReplayActorKind, boardSchemaOverview, boardScriptHitVisible, boardScriptItems, boardScriptScope, boardScriptTarget, boardSequence, boardSequencePatch, boardTaskCardSize, boardTaskSource, boardTextureBytes, boardTextureEdge, boardTexturePixels, buildBoardScene, buildCodeExcerpt, buildFallbackShapeColors, buildFileExcerpt, buildFileSnapshot, buildStrokeOutline, buildStrokeRibbonGeometry, builtinBoardItems, cameraForFocus, cameraForRect, cameraForState, clamp, clampBoardFontSize, clampBoardStrokeSize, clampBoardFontSize as clampBoardTextFontSize, clampZoom, clientToLocal, compileBoardAnimations, composeBoardScriptItems, computeDrawBounds, createAppBoardItem, createArrowBoardItem, createBoardAnimationSampler, createBoardEntityId, createBoardItemId, createBoardLayout, createBoardRegistry, createBoardReplayPlayer, createBoardToolStyles, createDocumentLayout, createDocumentState, createDrawBoardItem, createFileNodeForPath, createFrameBoardItem, createMediaBoardItem, createShapeBoardItem, createStrokeRibbonBuilder, createTaskBoardItem, createTaskResultItems, createTextBoardItem, defaultBoardRegistry, defineBoardItem, degToRad, diffBoardDocuments, diffMergePatch, distanceToArrow, distanceToStroke, drawPointsBounds, drawSampleRadius, elementClientToLocal, emptyBoardDocument, estimateTextWidth, evaluateBoardAnimations, expandRect, exportItemBounds, featuredTaskArtifact, fileBaseName, fileCategory, fileCategoryAccent, fileMetaLine, filePreviewKind, filePreviewMemoKey, filePreviewScope, fileStem, fileTypeLabel, fitBoardMediaSize, fitToContent, formatFileSize, frameContainsPoint, frameCornerRotationHandleAt, frameCorners, frameEdgeHandleAt, frameHandlePosition, frameLabelHitRect, frameLabelOffset, framePoint, frameRayIntersection, frameRect, getMediaExtension, getMediaResourceTitle, handlePosition, hasAuthoredSize, hasBoardScripts, imageAssetKey, inferBoardMediaKind, invertMatrix, isArrowBinding, isBoardColorId, isBoardColorString, isBoardEase, isBoardModelItem, isBoardPath, isBoardPresetName, isBuiltinItem, isBuiltinItemType, isEmptyBoardDelta, isEmptyBoardPatch, isFileBackedItem, isFileSnapshotFresh, isMediaItem, isPublicBoardRemoteAddress, isSafeBoardSourcePath, isShapeKind, isStrokeCorner, itemBounds, layoutBoardText, layoutShapeLabel, listBoardPresets, listBoardProperties, mediaFrameSize, mergeFileSnapshot, mergePatch, multiplyMatrix, normalizeBoardDocument, normalizeBoardRemoteUrl, normalizeRotation, normalizeViewport, normalizedPoint, orderBoardItems, panBy, parseBoardDocument, parseBoardItem, parseBoardManifest, parseBoardMediaSource, parseHexColor, pathMidpoint, pathPointAt, pickBoardColor, placeBoardOverlay, placeItem, planBoardExport, playableBoardMedia, playableBoardMediaList, pointToWorld, pointsBounds, pointsRect, prepareBoardScriptOutput, probeBoardMediaSize, pruneBoardTrack, quantizeDrawCoordinate, radToDeg, rankedTaskArtifacts, readBoardDocument, readCoverFromFrontmatter, readFrontmatterScalars, readTitleFromFrontmatter, rectCenter, rectContainsPoint, rectForCameraFocus, rectsIntersect, refreshBoardScene, resetBoardPlaybackUrlCache, resizeFrame, resizeFrameToSize, resolveAnchor, resolveArrow, resolveBoardAnimationCamera, resolveBoardColor, resolveBoardMediaUrl, resolveBoardProperty, resolveBoardScriptHit, resolveCoverRef, resolveFileTitle, resolveItemColor, resolveSceneArrow, resolveSpacePath, rotateAround, rotateFrames, rotatePointAround, rotationHandleAnchor, rotationHandlePosition, sampleBoardTrack, sampleRadius, scaleFrames, scaleVector, sceneItemToItem, sceneItemsToRecord, screenOffset, screenPoint, screenToWorld, scriptTemporaryPrefix, selectBoardExportAssets, selectionBounds, serializeBoardManifest, setBoardTextLayouter, settleBoardMediaSizes, shouldFetchFileExcerpt, sideAnchor, simplifyDrawIndices, splitFrontmatter, stableCullRect, taskArtifactPreviewUrl, taskArtifacts, taskRunArtifacts, taskRunToBoardTaskSnapshot, titleForBoardItem, toSceneItem, trackReferences, trimDrawPoints, unionRects, validateBoardScriptCommit, validateBoardScriptOutput, visibleWorldRect, withObservedArtifactFacts, worldOffset, worldPoint, worldRect, worldToScreen, zoomAround };
@@ -1,6 +1,6 @@
1
1
  import { BOARD_STROKE_MAX_SIZE, BOARD_STROKE_MIN_SIZE, clampBoardStrokeSize } from "../../protocol/dist/board-constants.js";
2
2
  import { isPublicBoardRemoteAddress, normalizeBoardRemoteUrl } from "../../protocol/dist/board-url.js";
3
- import { BOARD_ANCHOR_SIDES, BOARD_ARROW_ROUTES, BOARD_CAMERA_TARGET, BOARD_COLOR_TOKENS, BOARD_DASHES, BOARD_DERIVED_SIZE_TYPES, BOARD_EFFECT_KINDS, BOARD_EFFECT_KIND_INFO, BOARD_ENTER_PRESETS, BOARD_EXTENSION_TYPE_PATTERN, BOARD_GRID_DEFAULT_SIZE, BOARD_GRID_MAX_SIZE, BOARD_GRID_MIN_SIZE, BOARD_ID_MAX_LENGTH, BOARD_ITEM_SCHEMAS, BOARD_ITEM_TYPES, BOARD_PLAY_MODES, BOARD_SHAPE_GEOMETRIES, BOARD_TASK_ARTIFACT_LIMIT, BOARD_TEXT_ALIGNS, BoardAnimationHeaderSchema, BoardAnimationSchema, BoardArrowAnchorSchema, BoardArrowBindingSchema, BoardArrowEndSchema, BoardArrowItemSchema, BoardAudioItemSchema, BoardBackgroundSchema, BoardColorSchema, BoardCropSchema, BoardCustomItemSchema, BoardDrawItemSchema, BoardDrawPointSchema, BoardEaseSchema, BoardEffectItemSchema, BoardExtensionItemSchema, BoardFileItemSchema, BoardFrameItemSchema, BoardIdSchema, BoardImageItemSchema, BoardItemPreviewSchema, BoardKeySchema, BoardKeyframeSchema, BoardMarkerSchema, BoardMediaOriginSchema, BoardMediaSnapshotSchema, BoardMediaSourceSchema, BoardPatchSchema, BoardScriptSchema, BoardSettingsSchema, BoardShapeItemSchema, BoardSizeSchema, BoardStyleSchema, BoardTaskArtifactSchema, BoardTaskItemSchema, BoardTaskSnapshotSchema, BoardTextItemSchema, BoardTrackSchema, BoardVec2Schema, BoardVideoItemSchema, boardItemPreview, boardItemSchema, emptyBoardDocument, hasAuthoredSize, isBoardColorString, isBoardEase, isBuiltinItem, isBuiltinItemType, isEmptyBoardDelta, isFileBackedItem, isMediaItem, isSafeBoardSourcePath, parseBoardItem, parseBoardMediaSource } from "../../protocol/dist/board-model.js";
3
+ import { BOARD_ANCHOR_SIDES, BOARD_ARROW_ROUTES, BOARD_BACKGROUND_FITS, BOARD_BACKGROUND_PATTERNS, BOARD_CAMERA_TARGET, BOARD_COLOR_TOKENS, BOARD_DASHES, BOARD_DERIVED_SIZE_TYPES, BOARD_EFFECT_KINDS, BOARD_EFFECT_KIND_INFO, BOARD_ENTER_PRESETS, BOARD_EXTENSION_TYPE_PATTERN, BOARD_GRID_DEFAULT_SIZE, BOARD_GRID_MAX_SIZE, BOARD_GRID_MIN_SIZE, BOARD_ID_MAX_LENGTH, BOARD_ITEM_SCHEMAS, BOARD_ITEM_TYPES, BOARD_PLAY_MODES, BOARD_SHAPE_GEOMETRIES, BOARD_TASK_ARTIFACT_LIMIT, BOARD_TEXT_ALIGNS, BoardAnimationHeaderSchema, BoardAnimationSchema, BoardArrowAnchorSchema, BoardArrowBindingSchema, BoardArrowEndSchema, BoardArrowItemSchema, BoardAudioItemSchema, BoardBackgroundSchema, BoardColorSchema, BoardCropSchema, BoardCustomItemSchema, BoardDrawItemSchema, BoardDrawPointSchema, BoardEaseSchema, BoardEffectItemSchema, BoardExtensionItemSchema, BoardFileItemSchema, BoardFrameItemSchema, BoardIdSchema, BoardImageItemSchema, BoardItemPreviewSchema, BoardKeySchema, BoardKeyframeSchema, BoardMarkerSchema, BoardMediaOriginSchema, BoardMediaSnapshotSchema, BoardMediaSourceSchema, BoardPatchSchema, BoardScriptSchema, BoardSettingsSchema, BoardShapeItemSchema, BoardSizeSchema, BoardStyleSchema, BoardTaskArtifactSchema, BoardTaskItemSchema, BoardTaskSnapshotSchema, BoardTextItemSchema, BoardTrackSchema, BoardVec2Schema, BoardVideoItemSchema, boardItemPreview, boardItemSchema, emptyBoardDocument, hasAuthoredSize, isBoardColorString, isBoardEase, isBuiltinItem, isBuiltinItemType, isEmptyBoardDelta, isFileBackedItem, isMediaItem, isSafeBoardSourcePath, parseBoardItem, parseBoardMediaSource } from "../../protocol/dist/board-model.js";
4
4
  import { BOARD_TASK_SOURCE_PREFIX, boardTaskSource, featuredTaskArtifact, rankedTaskArtifacts, taskArtifactPreviewUrl, taskArtifacts, taskRunArtifacts, taskRunToBoardTaskSnapshot, withObservedArtifactFacts } from "../../protocol/dist/board-task.js";
5
5
  import { IDENTITY_MATRIX, adoptBoardNaturalSize, anchorPoint, applyMatrix, arrowBindings, autoAnchorSide, bendControl, clampBoardFontSize, createBoardLayout, createDocumentLayout, drawPointsBounds, drawSampleRadius, estimateTextWidth, fitBoardMediaSize, framePoint, invertMatrix, isArrowBinding, layoutBoardText, multiplyMatrix, pointsRect, rotateAround, scaleVector, setBoardTextLayouter, sideAnchor } from "../../protocol/dist/board-layout.js";
6
6
  import { applyBoardDelta, applyBoardPatch, applyBoardPatchToDocument, boardPatchTouches, createDocumentState, diffBoardDocuments, diffMergePatch, isEmptyBoardPatch, listBoardProperties, mergePatch, parseBoardDocument, pruneBoardTrack, resolveBoardProperty, trackReferences } from "../../protocol/dist/board-patch.js";
@@ -22,7 +22,7 @@ import { ARROW_BINDING_GAP, arrowHitRadius, arrowPathBounds, distanceToArrow, pa
22
22
  import { buildStrokeOutline, buildStrokeRibbonGeometry, computeDrawBounds, createStrokeRibbonBuilder, distanceToStroke, isStrokeCorner, sampleRadius, simplifyDrawIndices, trimDrawPoints } from "./draw-geometry.js";
23
23
  import { appendBoardDrawSamples, quantizeDrawCoordinate } from "./draw-input.js";
24
24
  import { boardModelFormat, getMediaExtension, getMediaResourceTitle, inferBoardMediaKind, isBoardModelItem } from "./media.js";
25
- import { BOARD_THUMBNAIL_EDGE, boardAssetKey, boardAssetKeySource, boardAssetRefKey, boardTextureEdge, boardTexturePixels, imageAssetKey } from "./asset-key.js";
25
+ import { BOARD_THUMBNAIL_EDGE, boardAssetKey, boardAssetKeySource, boardAssetRefKey, boardMediaNaturalSize, boardTextureEdge, boardTexturePixels, imageAssetKey } from "./asset-key.js";
26
26
  import { BOARD_EXPORT_TEXTURE_BYTES, boardTextureBytes, selectBoardExportAssets } from "./export-assets.js";
27
27
  import { BOARD_EXPORT_DEFAULT_PADDING, BOARD_EXPORT_DEFAULT_SCALE, BOARD_EXPORT_ITEM_WARN_THRESHOLD, BOARD_EXPORT_MAX_EDGE, BOARD_EXPORT_MAX_PIXELS, exportItemBounds, normalizeBoardDocument, planBoardExport } from "./export-plan.js";
28
28
  import { FILE_EXCERPT_MAX_BYTES, FILE_EXCERPT_MAX_CHARS, buildCodeExcerpt, buildFileExcerpt, buildFileSnapshot, fileBaseName, fileCategory, fileStem, readCoverFromFrontmatter, readFrontmatterScalars, readTitleFromFrontmatter, resolveCoverRef, resolveFileTitle, resolveSpacePath, shouldFetchFileExcerpt, splitFrontmatter } from "./file-snapshot.js";
@@ -40,5 +40,6 @@ import { createBoardEntityId, createBoardItemId } from "./items/id.js";
40
40
  import { boardItemOrigin, boardOriginKey, boardTaskCardSize, createAppBoardItem, createArrowBoardItem, createDrawBoardItem, createFileNodeForPath, createFrameBoardItem, createMediaBoardItem, createShapeBoardItem, createTaskBoardItem, createTaskResultItems, createTextBoardItem, mediaFrameSize, titleForBoardItem } from "./items/create.js";
41
41
  import { createBoardRegistry, defaultBoardRegistry } from "./items/registry.js";
42
42
  import { playableBoardMedia, playableBoardMediaList, resetBoardPlaybackUrlCache, resolveBoardMediaUrl } from "./media-playback.js";
43
+ import { readBoardDocument } from "./read.js";
43
44
  import { boardReplayActorKind, createBoardReplayPlayer } from "./replay.js";
44
- export { ARROW_BINDING_GAP, BOARD_ANCHOR_SIDES, BOARD_ARROW_ROUTES, BOARD_CAMERA_TARGET, BOARD_COLORS, BOARD_COLOR_TOKENS, BOARD_DASHES, BOARD_DERIVED_SIZE_TYPES, BOARD_EFFECT_KINDS, BOARD_EFFECT_KIND_INFO, BOARD_ENTER_PRESETS, BOARD_EXPORT_DEFAULT_PADDING, BOARD_EXPORT_DEFAULT_SCALE, BOARD_EXPORT_ITEM_WARN_THRESHOLD, BOARD_EXPORT_MAX_EDGE, BOARD_EXPORT_MAX_PIXELS, BOARD_EXPORT_TEXTURE_BYTES, BOARD_EXTENSION_TYPE_PATTERN, BOARD_FRAME_LABEL_LINE_HEIGHT, BOARD_FRAME_LABEL_SIZE, BOARD_GRID_DEFAULT_SIZE, BOARD_GRID_MAX_SIZE, BOARD_GRID_MIN_SIZE, BOARD_ID_MAX_LENGTH, BOARD_ITEM_SCHEMAS, BOARD_ITEM_TYPES, BOARD_PLAY_MODES, BOARD_PRESET_NAMES, BOARD_SCHEMA_TARGETS, BOARD_SCRIPT_API, BOARD_SCRIPT_DRAWING_EXAMPLE, BOARD_SHAPE_GEOMETRIES, BOARD_STROKE_MAX_SIZE, BOARD_STROKE_MIN_SIZE, BOARD_TASK_ARTIFACT_LIMIT, BOARD_TASK_SOURCE_PREFIX, BOARD_TEXT_ALIGNS, BOARD_THEME_IDS, BOARD_THUMBNAIL_EDGE, BoardAnimationHeaderSchema, BoardAnimationSchema, BoardArrowAnchorSchema, BoardArrowBindingSchema, BoardArrowEndSchema, BoardArrowItemSchema, BoardAudioItemSchema, BoardBackgroundSchema, BoardColorSchema, BoardCropSchema, BoardCustomItemSchema, BoardDrawItemSchema, BoardDrawPointSchema, BoardEaseSchema, BoardEffectItemSchema, BoardExtensionItemSchema, BoardFileItemSchema, BoardFrameItemSchema, BoardIdSchema, BoardImageItemSchema, BoardItemPreviewSchema, BoardKeySchema, BoardKeyframeSchema, BoardMarkerSchema, BoardMediaOriginSchema, BoardMediaSnapshotSchema, BoardMediaSourceSchema, BoardPatchSchema, BoardScriptSchema, BoardSettingsSchema, BoardShapeItemSchema, BoardSizeSchema, BoardStyleSchema, BoardTaskArtifactSchema, BoardTaskItemSchema, BoardTaskSnapshotSchema, BoardTextItemSchema, BoardTrackSchema, BoardVec2Schema, BoardVideoItemSchema, CORNER_RESIZE_HANDLES, CORNER_ROTATION_ZONE_WIDTH, DEFAULT_BOARD_COLOR, DEFAULT_BOARD_TOOL_STYLES, EDGE_RESIZE_HANDLES, FILE_EXCERPT_MAX_BYTES, FILE_EXCERPT_MAX_CHARS, FIT_PADDING, FULL_CAPABILITIES, HANDLE_DIRECTION, HANDLE_HIT_RADIUS, IDENTITY_MATRIX, MAX_BOARD_ZOOM, MIN_BOARD_ZOOM, MIN_ITEM_SIZE, RESIZE_HANDLES, ROTATION_HANDLE_OFFSET, SHAPE_KINDS, SHAPE_LABEL_PADDING, TEXT_FONT_FAMILY, TEXT_FONT_SIZE, TEXT_LINE_HEIGHT, TEXT_MAX_FONT_SIZE, TEXT_MIN_FONT_SIZE, VIEWPORT_MARGIN_RATIO, adoptBoardNaturalSize, anchorPoint, angleFromCenter, appendBoardDrawSamples, applyBoardDelta, applyBoardEvaluation, applyBoardPatch, applyBoardPatchToDocument, applyMatrix, arrowBindings, arrowHitRadius, arrowPathBounds, autoAnchorSide, availabilityFromError, bendControl, boardAnimationTime, boardAssetKey, boardAssetKeySource, boardAssetRefKey, boardColorCssVar, boardDocumentAt, boardEase, boardEditableText, boardFontFamily, boardItemOrigin, boardItemPreview, boardItemSchema, boardJsonSchema, boardMediaTarget, boardModelFormat, boardNestedAnimation, boardNestedAnimationTrack, boardOriginKey, boardPatchTouches, boardPathTrack, boardPresetTracks, boardReplayActorKind, boardSchemaOverview, boardScriptHitVisible, boardScriptItems, boardScriptScope, boardScriptTarget, boardSequence, boardSequencePatch, boardTaskCardSize, boardTaskSource, boardTextureBytes, boardTextureEdge, boardTexturePixels, buildBoardScene, buildCodeExcerpt, buildFallbackShapeColors, buildFileExcerpt, buildFileSnapshot, buildStrokeOutline, buildStrokeRibbonGeometry, builtinBoardItems, cameraForFocus, cameraForRect, cameraForState, clamp, clampBoardFontSize, clampBoardStrokeSize, clampBoardFontSize as clampBoardTextFontSize, clampZoom, clientToLocal, compileBoardAnimations, composeBoardScriptItems, computeDrawBounds, createAppBoardItem, createArrowBoardItem, createBoardAnimationSampler, createBoardEntityId, createBoardItemId, createBoardLayout, createBoardRegistry, createBoardReplayPlayer, createBoardToolStyles, createDocumentLayout, createDocumentState, createDrawBoardItem, createFileNodeForPath, createFrameBoardItem, createMediaBoardItem, createShapeBoardItem, createStrokeRibbonBuilder, createTaskBoardItem, createTaskResultItems, createTextBoardItem, defaultBoardRegistry, defineBoardItem, degToRad, diffBoardDocuments, diffMergePatch, distanceToArrow, distanceToStroke, drawPointsBounds, drawSampleRadius, elementClientToLocal, emptyBoardDocument, estimateTextWidth, evaluateBoardAnimations, expandRect, exportItemBounds, featuredTaskArtifact, fileBaseName, fileCategory, fileCategoryAccent, fileMetaLine, filePreviewKind, filePreviewMemoKey, filePreviewScope, fileStem, fileTypeLabel, fitBoardMediaSize, fitToContent, formatFileSize, frameContainsPoint, frameCornerRotationHandleAt, frameCorners, frameEdgeHandleAt, frameHandlePosition, frameLabelHitRect, frameLabelOffset, framePoint, frameRayIntersection, frameRect, getMediaExtension, getMediaResourceTitle, handlePosition, hasAuthoredSize, hasBoardScripts, imageAssetKey, inferBoardMediaKind, invertMatrix, isArrowBinding, isBoardColorId, isBoardColorString, isBoardEase, isBoardModelItem, isBoardPath, isBoardPresetName, isBuiltinItem, isBuiltinItemType, isEmptyBoardDelta, isEmptyBoardPatch, isFileBackedItem, isFileSnapshotFresh, isMediaItem, isPublicBoardRemoteAddress, isSafeBoardSourcePath, isShapeKind, isStrokeCorner, itemBounds, layoutBoardText, layoutShapeLabel, listBoardPresets, listBoardProperties, mediaFrameSize, mergeFileSnapshot, mergePatch, multiplyMatrix, normalizeBoardDocument, normalizeBoardRemoteUrl, normalizeRotation, normalizeViewport, normalizedPoint, orderBoardItems, panBy, parseBoardDocument, parseBoardItem, parseBoardManifest, parseBoardMediaSource, parseHexColor, pathMidpoint, pathPointAt, pickBoardColor, placeBoardOverlay, placeItem, planBoardExport, playableBoardMedia, playableBoardMediaList, pointToWorld, pointsBounds, pointsRect, prepareBoardScriptOutput, probeBoardMediaSize, pruneBoardTrack, quantizeDrawCoordinate, radToDeg, rankedTaskArtifacts, readCoverFromFrontmatter, readFrontmatterScalars, readTitleFromFrontmatter, rectCenter, rectContainsPoint, rectForCameraFocus, rectsIntersect, refreshBoardScene, resetBoardPlaybackUrlCache, resizeFrame, resizeFrameToSize, resolveAnchor, resolveArrow, resolveBoardAnimationCamera, resolveBoardColor, resolveBoardMediaUrl, resolveBoardProperty, resolveBoardScriptHit, resolveCoverRef, resolveFileTitle, resolveItemColor, resolveSceneArrow, resolveSpacePath, rotateAround, rotateFrames, rotatePointAround, rotationHandleAnchor, rotationHandlePosition, sampleBoardTrack, sampleRadius, scaleFrames, scaleVector, sceneItemToItem, sceneItemsToRecord, screenOffset, screenPoint, screenToWorld, scriptTemporaryPrefix, selectBoardExportAssets, selectionBounds, serializeBoardManifest, setBoardTextLayouter, settleBoardMediaSizes, shouldFetchFileExcerpt, sideAnchor, simplifyDrawIndices, splitFrontmatter, stableCullRect, taskArtifactPreviewUrl, taskArtifacts, taskRunArtifacts, taskRunToBoardTaskSnapshot, titleForBoardItem, toSceneItem, trackReferences, trimDrawPoints, unionRects, validateBoardScriptCommit, validateBoardScriptOutput, visibleWorldRect, withObservedArtifactFacts, worldOffset, worldPoint, worldRect, worldToScreen, zoomAround };
45
+ export { ARROW_BINDING_GAP, BOARD_ANCHOR_SIDES, BOARD_ARROW_ROUTES, BOARD_BACKGROUND_FITS, BOARD_BACKGROUND_PATTERNS, BOARD_CAMERA_TARGET, BOARD_COLORS, BOARD_COLOR_TOKENS, BOARD_DASHES, BOARD_DERIVED_SIZE_TYPES, BOARD_EFFECT_KINDS, BOARD_EFFECT_KIND_INFO, BOARD_ENTER_PRESETS, BOARD_EXPORT_DEFAULT_PADDING, BOARD_EXPORT_DEFAULT_SCALE, BOARD_EXPORT_ITEM_WARN_THRESHOLD, BOARD_EXPORT_MAX_EDGE, BOARD_EXPORT_MAX_PIXELS, BOARD_EXPORT_TEXTURE_BYTES, BOARD_EXTENSION_TYPE_PATTERN, BOARD_FRAME_LABEL_LINE_HEIGHT, BOARD_FRAME_LABEL_SIZE, BOARD_GRID_DEFAULT_SIZE, BOARD_GRID_MAX_SIZE, BOARD_GRID_MIN_SIZE, BOARD_ID_MAX_LENGTH, BOARD_ITEM_SCHEMAS, BOARD_ITEM_TYPES, BOARD_PLAY_MODES, BOARD_PRESET_NAMES, BOARD_SCHEMA_TARGETS, BOARD_SCRIPT_API, BOARD_SCRIPT_DRAWING_EXAMPLE, BOARD_SHAPE_GEOMETRIES, BOARD_STROKE_MAX_SIZE, BOARD_STROKE_MIN_SIZE, BOARD_TASK_ARTIFACT_LIMIT, BOARD_TASK_SOURCE_PREFIX, BOARD_TEXT_ALIGNS, BOARD_THEME_IDS, BOARD_THUMBNAIL_EDGE, BoardAnimationHeaderSchema, BoardAnimationSchema, BoardArrowAnchorSchema, BoardArrowBindingSchema, BoardArrowEndSchema, BoardArrowItemSchema, BoardAudioItemSchema, BoardBackgroundSchema, BoardColorSchema, BoardCropSchema, BoardCustomItemSchema, BoardDrawItemSchema, BoardDrawPointSchema, BoardEaseSchema, BoardEffectItemSchema, BoardExtensionItemSchema, BoardFileItemSchema, BoardFrameItemSchema, BoardIdSchema, BoardImageItemSchema, BoardItemPreviewSchema, BoardKeySchema, BoardKeyframeSchema, BoardMarkerSchema, BoardMediaOriginSchema, BoardMediaSnapshotSchema, BoardMediaSourceSchema, BoardPatchSchema, BoardScriptSchema, BoardSettingsSchema, BoardShapeItemSchema, BoardSizeSchema, BoardStyleSchema, BoardTaskArtifactSchema, BoardTaskItemSchema, BoardTaskSnapshotSchema, BoardTextItemSchema, BoardTrackSchema, BoardVec2Schema, BoardVideoItemSchema, CORNER_RESIZE_HANDLES, CORNER_ROTATION_ZONE_WIDTH, DEFAULT_BOARD_COLOR, DEFAULT_BOARD_TOOL_STYLES, EDGE_RESIZE_HANDLES, FILE_EXCERPT_MAX_BYTES, FILE_EXCERPT_MAX_CHARS, FIT_PADDING, FULL_CAPABILITIES, HANDLE_DIRECTION, HANDLE_HIT_RADIUS, IDENTITY_MATRIX, MAX_BOARD_ZOOM, MIN_BOARD_ZOOM, MIN_ITEM_SIZE, RESIZE_HANDLES, ROTATION_HANDLE_OFFSET, SHAPE_KINDS, SHAPE_LABEL_PADDING, TEXT_FONT_FAMILY, TEXT_FONT_SIZE, TEXT_LINE_HEIGHT, TEXT_MAX_FONT_SIZE, TEXT_MIN_FONT_SIZE, VIEWPORT_MARGIN_RATIO, adoptBoardNaturalSize, anchorPoint, angleFromCenter, appendBoardDrawSamples, applyBoardDelta, applyBoardEvaluation, applyBoardPatch, applyBoardPatchToDocument, applyMatrix, arrowBindings, arrowHitRadius, arrowPathBounds, autoAnchorSide, availabilityFromError, bendControl, boardAnimationTime, boardAssetKey, boardAssetKeySource, boardAssetRefKey, boardColorCssVar, boardDocumentAt, boardEase, boardEditableText, boardFontFamily, boardItemOrigin, boardItemPreview, boardItemSchema, boardJsonSchema, boardMediaNaturalSize, boardMediaTarget, boardModelFormat, boardNestedAnimation, boardNestedAnimationTrack, boardOriginKey, boardPatchTouches, boardPathTrack, boardPresetTracks, boardReplayActorKind, boardSchemaOverview, boardScriptHitVisible, boardScriptItems, boardScriptScope, boardScriptTarget, boardSequence, boardSequencePatch, boardTaskCardSize, boardTaskSource, boardTextureBytes, boardTextureEdge, boardTexturePixels, buildBoardScene, buildCodeExcerpt, buildFallbackShapeColors, buildFileExcerpt, buildFileSnapshot, buildStrokeOutline, buildStrokeRibbonGeometry, builtinBoardItems, cameraForFocus, cameraForRect, cameraForState, clamp, clampBoardFontSize, clampBoardStrokeSize, clampBoardFontSize as clampBoardTextFontSize, clampZoom, clientToLocal, compileBoardAnimations, composeBoardScriptItems, computeDrawBounds, createAppBoardItem, createArrowBoardItem, createBoardAnimationSampler, createBoardEntityId, createBoardItemId, createBoardLayout, createBoardRegistry, createBoardReplayPlayer, createBoardToolStyles, createDocumentLayout, createDocumentState, createDrawBoardItem, createFileNodeForPath, createFrameBoardItem, createMediaBoardItem, createShapeBoardItem, createStrokeRibbonBuilder, createTaskBoardItem, createTaskResultItems, createTextBoardItem, defaultBoardRegistry, defineBoardItem, degToRad, diffBoardDocuments, diffMergePatch, distanceToArrow, distanceToStroke, drawPointsBounds, drawSampleRadius, elementClientToLocal, emptyBoardDocument, estimateTextWidth, evaluateBoardAnimations, expandRect, exportItemBounds, featuredTaskArtifact, fileBaseName, fileCategory, fileCategoryAccent, fileMetaLine, filePreviewKind, filePreviewMemoKey, filePreviewScope, fileStem, fileTypeLabel, fitBoardMediaSize, fitToContent, formatFileSize, frameContainsPoint, frameCornerRotationHandleAt, frameCorners, frameEdgeHandleAt, frameHandlePosition, frameLabelHitRect, frameLabelOffset, framePoint, frameRayIntersection, frameRect, getMediaExtension, getMediaResourceTitle, handlePosition, hasAuthoredSize, hasBoardScripts, imageAssetKey, inferBoardMediaKind, invertMatrix, isArrowBinding, isBoardColorId, isBoardColorString, isBoardEase, isBoardModelItem, isBoardPath, isBoardPresetName, isBuiltinItem, isBuiltinItemType, isEmptyBoardDelta, isEmptyBoardPatch, isFileBackedItem, isFileSnapshotFresh, isMediaItem, isPublicBoardRemoteAddress, isSafeBoardSourcePath, isShapeKind, isStrokeCorner, itemBounds, layoutBoardText, layoutShapeLabel, listBoardPresets, listBoardProperties, mediaFrameSize, mergeFileSnapshot, mergePatch, multiplyMatrix, normalizeBoardDocument, normalizeBoardRemoteUrl, normalizeRotation, normalizeViewport, normalizedPoint, orderBoardItems, panBy, parseBoardDocument, parseBoardItem, parseBoardManifest, parseBoardMediaSource, parseHexColor, pathMidpoint, pathPointAt, pickBoardColor, placeBoardOverlay, placeItem, planBoardExport, playableBoardMedia, playableBoardMediaList, pointToWorld, pointsBounds, pointsRect, prepareBoardScriptOutput, probeBoardMediaSize, pruneBoardTrack, quantizeDrawCoordinate, radToDeg, rankedTaskArtifacts, readBoardDocument, readCoverFromFrontmatter, readFrontmatterScalars, readTitleFromFrontmatter, rectCenter, rectContainsPoint, rectForCameraFocus, rectsIntersect, refreshBoardScene, resetBoardPlaybackUrlCache, resizeFrame, resizeFrameToSize, resolveAnchor, resolveArrow, resolveBoardAnimationCamera, resolveBoardColor, resolveBoardMediaUrl, resolveBoardProperty, resolveBoardScriptHit, resolveCoverRef, resolveFileTitle, resolveItemColor, resolveSceneArrow, resolveSpacePath, rotateAround, rotateFrames, rotatePointAround, rotationHandleAnchor, rotationHandlePosition, sampleBoardTrack, sampleRadius, scaleFrames, scaleVector, sceneItemToItem, sceneItemsToRecord, screenOffset, screenPoint, screenToWorld, scriptTemporaryPrefix, selectBoardExportAssets, selectionBounds, serializeBoardManifest, setBoardTextLayouter, settleBoardMediaSizes, shouldFetchFileExcerpt, sideAnchor, simplifyDrawIndices, splitFrontmatter, stableCullRect, taskArtifactPreviewUrl, taskArtifacts, taskRunArtifacts, taskRunToBoardTaskSnapshot, titleForBoardItem, toSceneItem, trackReferences, trimDrawPoints, unionRects, validateBoardScriptCommit, validateBoardScriptOutput, visibleWorldRect, withObservedArtifactFacts, worldOffset, worldPoint, worldRect, worldToScreen, zoomAround };
@@ -1,11 +1,9 @@
1
1
  import { BoardSceneItem } from "./scene.js";
2
+ import { ResolveFileOptions, ResolvedFile } from "../../media.js";
2
3
  //#region src/board/model/media-playback.d.ts
3
- type BoardAssetUrlOptions = {
4
- fresh?: boolean;
5
- };
6
4
  type BoardAssetSource = {
7
- resolveFileUrl: (path: string, options?: BoardAssetUrlOptions) => Promise<string | null>;
8
- resolvePlaybackUrl?: (path: string, options?: BoardAssetUrlOptions) => Promise<string | null>;
5
+ resolveFile: (path: string, options?: ResolveFileOptions) => Promise<ResolvedFile | null>;
6
+ subscribe?: (listener: (path: string) => void) => () => void;
9
7
  };
10
8
  declare function resolveBoardMediaUrl(src: string, source: BoardAssetSource, purpose?: "preview" | "playback"): Promise<string | null>;
11
9
  type BoardPlayableMedia = {
@@ -20,4 +18,4 @@ declare function playableBoardMediaList(item: BoardSceneItem | null, assetSource
20
18
  declare function playableBoardMedia(item: BoardSceneItem | null, assetSource: BoardAssetSource, artifactId?: string | null): BoardPlayableMedia | null;
21
19
  declare function resetBoardPlaybackUrlCache(): void;
22
20
  //#endregion
23
- export { BoardAssetSource, BoardAssetUrlOptions, BoardPlayableMedia, playableBoardMedia, playableBoardMediaList, resetBoardPlaybackUrlCache, resolveBoardMediaUrl };
21
+ export { BoardAssetSource, BoardPlayableMedia, playableBoardMedia, playableBoardMediaList, resetBoardPlaybackUrlCache, resolveBoardMediaUrl };
@@ -2,11 +2,11 @@ import { parseBoardMediaSource } from "../../protocol/dist/board-model.js";
2
2
  import { rankedTaskArtifacts } from "../../protocol/dist/board-task.js";
3
3
  import { getMediaResourceTitle } from "./media.js";
4
4
  //#region src/board/model/media-playback.ts
5
- function resolveBoardMediaUrl(src, source, purpose = "preview") {
5
+ async function resolveBoardMediaUrl(src, source, purpose = "preview") {
6
6
  const parsed = parseBoardMediaSource(src);
7
- if (!parsed) return Promise.resolve(null);
8
- if (parsed.kind === "url") return Promise.resolve(parsed.value);
9
- return purpose === "playback" && source.resolvePlaybackUrl ? source.resolvePlaybackUrl(parsed.value) : source.resolveFileUrl(parsed.value);
7
+ if (!parsed) return null;
8
+ if (parsed.kind === "url") return parsed.value;
9
+ return (await source.resolveFile(parsed.value, { purpose }))?.url ?? null;
10
10
  }
11
11
  const resolvedUrls = /* @__PURE__ */ new Map();
12
12
  const sourceIds = /* @__PURE__ */ new WeakMap();
@@ -0,0 +1,7 @@
1
+ import { BoardDocument } from "../../protocol/dist/board-model.js";
2
+ import { BoardReadResult } from "../../protocol/dist/board.js";
3
+ import "../../protocol/dist/index.js";
4
+ //#region src/board/model/read.d.ts
5
+ declare function readBoardDocument(result: BoardReadResult, base?: BoardDocument | null): BoardDocument;
6
+ //#endregion
7
+ export { readBoardDocument };
@@ -0,0 +1,18 @@
1
+ import { applyBoardDelta, parseBoardDocument } from "../../protocol/dist/board-patch.js";
2
+ import { shareBoardDocument } from "./document-share.js";
3
+ //#region src/board/model/read.ts
4
+ function readBoardDocument(result, base = null) {
5
+ if (result.changes) {
6
+ if (!base) throw new Error(`Board ${result.id} returned changes without a document to apply them to.`);
7
+ return result.changes.reduce(applyBoardDelta, base);
8
+ }
9
+ const parsed = parseBoardDocument({
10
+ board: result.board,
11
+ items: result.items ?? {},
12
+ animations: result.animations ?? {}
13
+ });
14
+ if (!parsed.ok) throw new Error(`Board ${result.id} could not be read.`);
15
+ return shareBoardDocument(base, parsed.document);
16
+ }
17
+ //#endregion
18
+ export { readBoardDocument };