@neta-art/cohub 9.0.0 → 10.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 (178) hide show
  1. package/README.md +100 -103
  2. package/dist/board/editor/align.d.ts +11 -0
  3. package/dist/board/editor/align.js +72 -0
  4. package/dist/board/editor/animation.d.ts +14 -0
  5. package/dist/board/editor/animation.js +172 -0
  6. package/dist/board/editor/camera.d.ts +32 -0
  7. package/dist/board/editor/camera.js +137 -0
  8. package/dist/board/editor/clipboard.d.ts +41 -0
  9. package/dist/board/editor/clipboard.js +122 -0
  10. package/dist/board/editor/connection-ports.d.ts +19 -0
  11. package/dist/board/editor/connection-ports.js +85 -0
  12. package/dist/board/editor/context.d.ts +111 -0
  13. package/dist/board/editor/context.js +30 -0
  14. package/dist/board/editor/copy.d.ts +17 -0
  15. package/dist/board/editor/copy.js +116 -0
  16. package/dist/board/editor/creation.d.ts +47 -0
  17. package/dist/board/editor/creation.js +224 -0
  18. package/dist/board/editor/deletion.d.ts +9 -0
  19. package/dist/board/editor/deletion.js +90 -0
  20. package/dist/board/editor/document-edits.d.ts +22 -0
  21. package/dist/board/editor/document-edits.js +193 -0
  22. package/dist/board/editor/document.d.ts +35 -0
  23. package/dist/board/editor/document.js +255 -0
  24. package/dist/board/editor/editor.d.ts +210 -0
  25. package/dist/board/editor/editor.js +429 -0
  26. package/dist/board/editor/index.d.ts +18 -0
  27. package/dist/board/editor/index.js +12 -0
  28. package/dist/board/editor/interaction.d.ts +115 -0
  29. package/dist/board/editor/interaction.js +584 -0
  30. package/dist/board/editor/query.d.ts +27 -0
  31. package/dist/board/editor/query.js +201 -0
  32. package/dist/board/editor/remote.d.ts +11 -0
  33. package/dist/board/editor/remote.js +55 -0
  34. package/dist/board/editor/selection-transform.d.ts +24 -0
  35. package/dist/board/editor/selection-transform.js +81 -0
  36. package/dist/board/editor/selection.d.ts +33 -0
  37. package/dist/board/editor/selection.js +196 -0
  38. package/dist/board/editor/snapping.d.ts +33 -0
  39. package/dist/board/editor/snapping.js +75 -0
  40. package/dist/board/editor/snapshots.d.ts +27 -0
  41. package/dist/board/editor/snapshots.js +132 -0
  42. package/dist/board/editor/spatial.d.ts +41 -0
  43. package/dist/board/editor/spatial.js +191 -0
  44. package/dist/board/editor/state.d.ts +12 -0
  45. package/dist/board/editor/state.js +49 -0
  46. package/dist/board/editor/tool.d.ts +10 -0
  47. package/dist/board/editor/tool.js +19 -0
  48. package/dist/board/editor/wheel.d.ts +5 -0
  49. package/dist/board/editor/wheel.js +17 -0
  50. package/dist/board/export/index.d.ts +5 -4
  51. package/dist/board/export/index.js +4 -3
  52. package/dist/board/export/node/index.d.ts +55 -0
  53. package/dist/board/{headless → export/node}/index.js +12 -12
  54. package/dist/board/export/node/sketch.d.ts +19 -0
  55. package/dist/board/{headless → export/node}/sketch.js +6 -6
  56. package/dist/board/export/scene.d.ts +6 -4
  57. package/dist/board/export/scene.js +4 -3
  58. package/dist/board/{animation.d.ts → model/animation.d.ts} +4 -4
  59. package/dist/board/{animation.js → model/animation.js} +3 -3
  60. package/dist/board/{core → model}/arrow-geometry.d.ts +2 -2
  61. package/dist/board/{core → model}/arrow-geometry.js +2 -2
  62. package/dist/board/{core → model}/draw-geometry.d.ts +2 -2
  63. package/dist/board/{core → model}/draw-geometry.js +1 -1
  64. package/dist/board/model/draw-input.d.ts +14 -0
  65. package/dist/board/model/draw-input.js +28 -0
  66. package/dist/board/{core → model}/export-assets.d.ts +1 -1
  67. package/dist/board/{core → model}/export-assets.js +1 -1
  68. package/dist/board/{core → model}/export-plan.d.ts +2 -2
  69. package/dist/board/{core → model}/export-plan.js +2 -2
  70. package/dist/board/{core → model}/file-preview.d.ts +1 -1
  71. package/dist/board/{core → model}/file-preview.js +1 -1
  72. package/dist/board/{core → model}/file-snapshot.d.ts +1 -1
  73. package/dist/board/{core → model}/file-snapshot.js +1 -1
  74. package/dist/board/{geometry.d.ts → model/geometry.d.ts} +3 -3
  75. package/dist/board/{geometry.js → model/geometry.js} +1 -1
  76. package/dist/board/{image-key.d.ts → model/image-key.d.ts} +2 -2
  77. package/dist/board/{image-key.js → model/image-key.js} +1 -1
  78. package/dist/board/model/index.d.ts +35 -0
  79. package/dist/board/{index.js → model/index.js} +26 -22
  80. package/dist/board/model/items/builtin.d.ts +5 -0
  81. package/dist/board/model/items/builtin.js +119 -0
  82. package/dist/board/model/items/create.d.ts +59 -0
  83. package/dist/board/model/items/create.js +271 -0
  84. package/dist/board/model/items/definition.d.ts +35 -0
  85. package/dist/board/model/items/definition.js +18 -0
  86. package/dist/board/model/items/id.d.ts +5 -0
  87. package/dist/board/model/items/id.js +11 -0
  88. package/dist/board/model/items/index.d.ts +6 -0
  89. package/dist/board/model/items/index.js +6 -0
  90. package/dist/board/model/items/registry.d.ts +35 -0
  91. package/dist/board/model/items/registry.js +84 -0
  92. package/dist/board/{media-playback.d.ts → model/media-playback.d.ts} +2 -2
  93. package/dist/board/{media-playback.js → model/media-playback.js} +1 -1
  94. package/dist/board/{media.d.ts → model/media.d.ts} +1 -1
  95. package/dist/board/{media.js → model/media.js} +1 -1
  96. package/dist/board/{core → model}/palette.d.ts +1 -1
  97. package/dist/board/{core → model}/palette.js +1 -1
  98. package/dist/board/{presets.d.ts → model/presets.d.ts} +3 -3
  99. package/dist/board/{presets.js → model/presets.js} +1 -1
  100. package/dist/board/{replay.d.ts → model/replay.d.ts} +5 -5
  101. package/dist/board/{replay.js → model/replay.js} +2 -2
  102. package/dist/board/{core → model}/scene.d.ts +1 -1
  103. package/dist/board/{core → model}/scene.js +1 -1
  104. package/dist/board/model/shape-types.d.ts +8 -0
  105. package/dist/board/model/shape-types.js +8 -0
  106. package/dist/board/{task.d.ts → model/task.d.ts} +4 -4
  107. package/dist/board/{task.js → model/task.js} +3 -3
  108. package/dist/board/{core → model}/text-metrics.d.ts +1 -1
  109. package/dist/board/{core → model}/text-metrics.js +1 -1
  110. package/dist/board/{core → model}/tool-styles.d.ts +1 -1
  111. package/dist/board/{core → model}/tool-styles.js +1 -1
  112. package/dist/board/{runtime/board-player.d.ts → player/index.d.ts} +2 -2
  113. package/dist/board/{runtime/board-player.js → player/index.js} +5 -4
  114. package/dist/board/render/board-background.d.ts +1 -1
  115. package/dist/board/render/clip.d.ts +1 -1
  116. package/dist/board/render/index.d.ts +2 -2
  117. package/dist/board/render/index.js +2 -2
  118. package/dist/board/render/media-interaction.d.ts +2 -2
  119. package/dist/board/render/media-interaction.js +1 -1
  120. package/dist/board/render/palette.d.ts +1 -1
  121. package/dist/board/render/palette.js +1 -1
  122. package/dist/board/render/renderers/arrow-card-renderer.js +1 -1
  123. package/dist/board/render/renderers/board-renderer-registry.d.ts +11 -6
  124. package/dist/board/render/renderers/board-renderer-registry.js +15 -15
  125. package/dist/board/render/renderers/draw-card-renderer.js +1 -1
  126. package/dist/board/render/renderers/far-plate.js +1 -1
  127. package/dist/board/render/renderers/file-card-renderer.d.ts +1 -1
  128. package/dist/board/render/renderers/file-card-renderer.js +2 -2
  129. package/dist/board/render/renderers/image-card-renderer.d.ts +1 -1
  130. package/dist/board/render/renderers/shape-card-renderer.js +1 -1
  131. package/dist/board/render/renderers/task-card-renderer.js +1 -1
  132. package/dist/board/render/renderers/text-card-renderer.js +1 -1
  133. package/dist/board/render/renderers/video-card-renderer.d.ts +1 -1
  134. package/dist/board/render/stroke.d.ts +1 -1
  135. package/dist/board/render/stroke.js +1 -1
  136. package/dist/board/render/text-measurement.js +1 -1
  137. package/dist/board/replica/index.d.ts +70 -0
  138. package/dist/board/replica/index.js +276 -0
  139. package/dist/board/stage/assets.d.ts +41 -0
  140. package/dist/board/stage/assets.js +350 -0
  141. package/dist/board/stage/index.d.ts +8 -0
  142. package/dist/board/stage/index.js +8 -0
  143. package/dist/board/stage/lru.d.ts +32 -0
  144. package/dist/board/stage/lru.js +29 -0
  145. package/dist/board/stage/pointer.d.ts +8 -0
  146. package/dist/board/stage/pointer.js +33 -0
  147. package/dist/board/stage/scene.d.ts +85 -0
  148. package/dist/board/stage/scene.js +512 -0
  149. package/dist/board/stage/stage.d.ts +66 -0
  150. package/dist/board/stage/stage.js +568 -0
  151. package/dist/board/stage/texture-pool.d.ts +24 -0
  152. package/dist/board/stage/texture-pool.js +154 -0
  153. package/dist/board/stage/views.d.ts +38 -0
  154. package/dist/board/stage/views.js +93 -0
  155. package/dist/chunks/environment.d.ts +25 -1
  156. package/dist/chunks/http.d.ts +99 -66
  157. package/dist/chunks/http.js +214 -207
  158. package/dist/chunks/websocket.d.ts +1 -1
  159. package/dist/http.d.ts +2 -2
  160. package/dist/index.d.ts +3 -3
  161. package/dist/index.js +20 -4
  162. package/dist/media.d.ts +1 -10
  163. package/dist/media.js +16 -27
  164. package/dist/protocol/dist/board-patch.js +1 -1
  165. package/dist/protocol/dist/board.d.ts +28 -2
  166. package/dist/protocol/dist/board.js +3 -1
  167. package/dist/protocol/dist/core/media.d.ts +5 -0
  168. package/dist/protocol/dist/core/media.js +39 -0
  169. package/dist/protocol/dist/index.d.ts +5 -5
  170. package/dist/types.d.ts +1 -1
  171. package/package.json +26 -14
  172. package/dist/board/core/shape-definition.d.ts +0 -23
  173. package/dist/board/core/shape-definition.js +0 -45
  174. package/dist/board/core/shape-types.d.ts +0 -38
  175. package/dist/board/core/shape-types.js +0 -22
  176. package/dist/board/headless/index.d.ts +0 -55
  177. package/dist/board/headless/sketch.d.ts +0 -19
  178. package/dist/board/index.d.ts +0 -30
@@ -1,4 +1,4 @@
1
- //#region src/board/media.ts
1
+ //#region src/board/model/media.ts
2
2
  const IMAGE_EXTENSIONS = /* @__PURE__ */ new Set([
3
3
  "png",
4
4
  "jpg",
@@ -1,6 +1,6 @@
1
1
  import { BoardColor, BoardColorToken } from "../../protocol/dist/board-model.js";
2
2
  import "../../protocol/dist/index.js";
3
- //#region src/board/core/palette.d.ts
3
+ //#region src/board/model/palette.d.ts
4
4
  type BoardColorId = BoardColorToken;
5
5
  type BoardColorValue = {
6
6
  stroke: number;
@@ -1,4 +1,4 @@
1
- //#region src/board/core/palette.ts
1
+ //#region src/board/model/palette.ts
2
2
  const LABEL_DARK = 16053492;
3
3
  const LABEL_LIGHT = 1579035;
4
4
  const BOARD_COLORS = [
@@ -1,6 +1,6 @@
1
- import { BoardTrack } from "../protocol/dist/board-model.js";
2
- import "../protocol/dist/index.js";
3
- //#region src/board/presets.d.ts
1
+ import { BoardTrack } from "../../protocol/dist/board-model.js";
2
+ import "../../protocol/dist/index.js";
3
+ //#region src/board/model/presets.d.ts
4
4
  declare const PRESETS: {
5
5
  "fade-in": {
6
6
  description: string;
@@ -1,4 +1,4 @@
1
- //#region src/board/presets.ts
1
+ //#region src/board/model/presets.ts
2
2
  const OUT = "cubic-bezier(0.22, 1, 0.36, 1)";
3
3
  const IN_OUT = "ease-in-out";
4
4
  const PRESETS = {
@@ -1,8 +1,8 @@
1
- import { BoardDocument } from "../protocol/dist/board-model.js";
2
- import { RequestSource } from "../protocol/dist/provenance.js";
3
- import { BoardHistoryPage } from "../protocol/dist/board.js";
4
- import "../protocol/dist/index.js";
5
- //#region src/board/replay.d.ts
1
+ import { BoardDocument } from "../../protocol/dist/board-model.js";
2
+ import { RequestSource } from "../../protocol/dist/provenance.js";
3
+ import { BoardHistoryPage } from "../../protocol/dist/board.js";
4
+ import "../../protocol/dist/index.js";
5
+ //#region src/board/model/replay.d.ts
6
6
  type BoardReplayActorKind = "human" | "cli" | "agent";
7
7
  type BoardReplayEntry = {
8
8
  version: number;
@@ -1,5 +1,5 @@
1
- import { applyBoardDelta } from "../protocol/dist/board-patch.js";
2
- //#region src/board/replay.ts
1
+ import { applyBoardDelta } from "../../protocol/dist/board-patch.js";
2
+ //#region src/board/model/replay.ts
3
3
  function boardReplayActorKind(source) {
4
4
  if (!source) return "human";
5
5
  if (source.toolCallId) return "agent";
@@ -1,7 +1,7 @@
1
1
  import { BoardDocument, BoardItem } from "../../protocol/dist/board-model.js";
2
2
  import { BoardFrame, BoardItemLookup, BoardLayout, BoardMatrix, BoardRect } from "../../protocol/dist/board-layout.js";
3
3
  import "../../protocol/dist/index.js";
4
- //#region src/board/core/scene.d.ts
4
+ //#region src/board/model/scene.d.ts
5
5
  type SceneItem<T extends BoardItem = BoardItem> = T & {
6
6
  readonly id: string;
7
7
  readonly frame: BoardFrame;
@@ -1,5 +1,5 @@
1
1
  import { IDENTITY_MATRIX, applyMatrix, arrowBindings, clampBoardFontSize, createBoardLayout, drawPointsBounds, invertMatrix, layoutBoardText, scaleVector } from "../../protocol/dist/board-layout.js";
2
- //#region src/board/core/scene.ts
2
+ //#region src/board/model/scene.ts
3
3
  const EPSILON = 1e-6;
4
4
  function stripScene(item) {
5
5
  if (!("frame" in item) && !("id" in item)) return item;
@@ -0,0 +1,8 @@
1
+ import { BoardShapeGeometry } from "../../protocol/dist/board-model.js";
2
+ import "../../protocol/dist/index.js";
3
+ //#region src/board/model/shape-types.d.ts
4
+ type ShapeKind = Exclude<BoardShapeGeometry, "path">;
5
+ declare const SHAPE_KINDS: ShapeKind[];
6
+ declare function isShapeKind(value: unknown): value is ShapeKind;
7
+ //#endregion
8
+ export { SHAPE_KINDS, ShapeKind, isShapeKind };
@@ -0,0 +1,8 @@
1
+ import { BOARD_SHAPE_GEOMETRIES } from "../../protocol/dist/board-model.js";
2
+ //#region src/board/model/shape-types.ts
3
+ const SHAPE_KINDS = BOARD_SHAPE_GEOMETRIES.filter((kind) => kind !== "path");
4
+ function isShapeKind(value) {
5
+ return typeof value === "string" && SHAPE_KINDS.includes(value);
6
+ }
7
+ //#endregion
8
+ export { SHAPE_KINDS, isShapeKind };
@@ -1,7 +1,7 @@
1
- import { BoardTaskArtifact, BoardTaskSnapshot } from "../protocol/dist/board-model.js";
2
- import "../protocol/dist/index.js";
3
- import { TaskRunRecord } from "../types.js";
4
- //#region src/board/task.d.ts
1
+ import { BoardTaskArtifact, BoardTaskSnapshot } from "../../protocol/dist/board-model.js";
2
+ import "../../protocol/dist/index.js";
3
+ import { TaskRunRecord } from "../../types.js";
4
+ //#region src/board/model/task.d.ts
5
5
  declare function taskArtifacts(blocks: Record<string, unknown>[]): BoardTaskArtifact[];
6
6
  declare function rankedTaskArtifacts(artifacts: readonly BoardTaskArtifact[]): BoardTaskArtifact[];
7
7
  declare function featuredTaskArtifact(artifacts: readonly BoardTaskArtifact[]): BoardTaskArtifact | undefined;
@@ -1,6 +1,6 @@
1
- import "../protocol/dist/board-model.js";
2
- import { blockDurationMs, blockIdentity, blockMimeType, blockNaturalSize, blockPreviewUrl, blockText, blockTitle, blockUrl, cleanExcerpt, generationCovers, generationOutput, generationPrompt, taskData } from "../generation-blocks.js";
3
- //#region src/board/task.ts
1
+ import "../../protocol/dist/board-model.js";
2
+ import { blockDurationMs, blockIdentity, blockMimeType, blockNaturalSize, blockPreviewUrl, blockText, blockTitle, blockUrl, cleanExcerpt, generationCovers, generationOutput, generationPrompt, taskData } from "../../generation-blocks.js";
3
+ //#region src/board/model/task.ts
4
4
  function artifactId(base, used, suffix) {
5
5
  const stem = cleanExcerpt(base, 220) ?? "output";
6
6
  let candidate = suffix ? `${stem}-${suffix}` : stem;
@@ -1,6 +1,6 @@
1
1
  import { clampBoardFontSize } from "../../protocol/dist/board-layout.js";
2
2
  import "../../protocol/dist/index.js";
3
- //#region src/board/core/text-metrics.d.ts
3
+ //#region src/board/model/text-metrics.d.ts
4
4
  declare const TEXT_FONT_FAMILY = "Geist";
5
5
  declare const TEXT_FONT_SIZE = 24;
6
6
  declare const TEXT_LINE_HEIGHT = 32;
@@ -1,6 +1,6 @@
1
1
  import { BOARD_TEXT_FONT_FAMILY } from "../../protocol/dist/board-constants.js";
2
2
  import { clampBoardFontSize } from "../../protocol/dist/board-layout.js";
3
- //#region src/board/core/text-metrics.ts
3
+ //#region src/board/model/text-metrics.ts
4
4
  const TEXT_FONT_FAMILY = BOARD_TEXT_FONT_FAMILY;
5
5
  const TEXT_FONT_SIZE = 24;
6
6
  const TEXT_LINE_HEIGHT = 32;
@@ -1,7 +1,7 @@
1
1
  import { BOARD_STROKE_MAX_SIZE, BOARD_STROKE_MIN_SIZE, clampBoardStrokeSize } from "../../protocol/dist/board-constants.js";
2
2
  import { BoardColorId } from "./palette.js";
3
3
  import { ShapeKind } from "./shape-types.js";
4
- //#region src/board/core/tool-styles.d.ts
4
+ //#region src/board/model/tool-styles.d.ts
5
5
  type BoardToolStyleMap = {
6
6
  text: {
7
7
  color: BoardColorId;
@@ -1,7 +1,7 @@
1
1
  import { BOARD_ARROW_STROKE_SIZE, BOARD_STROKE_MAX_SIZE, BOARD_STROKE_MIN_SIZE, clampBoardStrokeSize } from "../../protocol/dist/board-constants.js";
2
2
  import { isBoardColorId } from "./palette.js";
3
3
  import { isShapeKind } from "./shape-types.js";
4
- //#region src/board/core/tool-styles.ts
4
+ //#region src/board/model/tool-styles.ts
5
5
  const DEFAULT_BOARD_TOOL_STYLES = {
6
6
  text: { color: "neutral" },
7
7
  shape: {
@@ -1,8 +1,8 @@
1
1
  import { BoardDocument, BoardItem } from "../../protocol/dist/board-model.js";
2
2
  import { BoardPlaybackCommand, BoardPlaybackSnapshot } from "../../protocol/dist/board.js";
3
3
  import "../../protocol/dist/index.js";
4
- import { BoardCameraOverride, BoardColorResolver } from "../animation.js";
5
- //#region src/board/runtime/board-player.d.ts
4
+ import { BoardCameraOverride, BoardColorResolver } from "../model/animation.js";
5
+ //#region src/board/player/index.d.ts
6
6
  type BoardPlayerFrame = {
7
7
  items: ReadonlyMap<string, BoardItem>;
8
8
  camera: BoardCameraOverride;
@@ -1,6 +1,7 @@
1
- import { boardAnimationTime, compileBoardAnimations, evaluateBoardAnimations } from "../animation.js";
2
- import { boardPresetTracks, isBoardPresetName } from "../presets.js";
3
- //#region src/board/runtime/board-player.ts
1
+ import { boardAnimationTime, compileBoardAnimations, evaluateBoardAnimations } from "../model/animation.js";
2
+ import { boardPresetTracks, isBoardPresetName } from "../model/presets.js";
3
+ import { createBoardEntityId } from "../model/items/id.js";
4
+ //#region src/board/player/index.ts
4
5
  const ENTER_ANIMATION = "\0enter";
5
6
  const ENTER_STAGGER_MS = 45;
6
7
  const ENTER_MAX_ITEMS = 80;
@@ -118,7 +119,7 @@ function nextLocalPlayback(current, command, document, now = Date.now()) {
118
119
  };
119
120
  switch (command.type) {
120
121
  case "play": return {
121
- playbackId: crypto.randomUUID(),
122
+ playbackId: createBoardEntityId(),
122
123
  animationId: command.animationId,
123
124
  animationRevision: 0,
124
125
  status: "playing",
@@ -1,6 +1,6 @@
1
1
  import { BoardSettings } from "../../protocol/dist/board-model.js";
2
2
  import "../../protocol/dist/index.js";
3
- import { BoardViewport } from "../geometry.js";
3
+ import { BoardViewport } from "../model/geometry.js";
4
4
  import { BoardRenderPalette } from "./renderers/board-renderer-registry.js";
5
5
  import { Application, Container } from "pixi.js";
6
6
  //#region src/board/render/board-background.d.ts
@@ -1,4 +1,4 @@
1
- import { BoardScene, BoardSceneItem } from "../core/scene.js";
1
+ import { BoardScene, BoardSceneItem } from "../model/scene.js";
2
2
  import { Container, Graphics } from "pixi.js";
3
3
  //#region src/board/render/clip.d.ts
4
4
  declare function isClippingFrame(item: BoardSceneItem): boolean;
@@ -1,4 +1,4 @@
1
- import { BoardCardRenderer, BoardRenderContext, BoardRenderPalette, BoardSketchHost, boardCardRenderersForTest, getBoardCardRenderer, registerBoardCardRenderer } from "./renderers/board-renderer-registry.js";
1
+ import { BoardCardRenderer, BoardCardRendererResolver, BoardRenderContext, BoardRenderPalette, BoardSketchHost, createBoardCardRendererResolver, getBoardCardRenderer } from "./renderers/board-renderer-registry.js";
2
2
  import { BoardBackgroundContext, createBoardBackground, updateBoardBackground } from "./board-background.js";
3
3
  import { ClipGroup, clippingAncestor, isClippingFrame, syncClipGroup, traceFrameOutline } from "./clip.js";
4
4
  import { parseBoardCssColor } from "./css-color.js";
@@ -11,4 +11,4 @@ import { TASK_CARD_FULL_DETAIL_ZOOM } from "./renderers/task-card-renderer.js";
11
11
  import { BOARD_FONT_STACKS, ensureBoardTextMeasurement, installBoardTextMeasurement } from "./text-measurement.js";
12
12
  import { getBoardResolution, syncTextResolution, syncTextWrapWidth, textResolutionForZoom, textZoomBucket } from "./text-resolution.js";
13
13
  import { VIDEO_THUMBNAIL_MAX_EDGE, VideoNaturalSize, loadVideoThumbnailTexture, videoTextureNaturalSize, videoThumbnailSize } from "./video-thumbnail.js";
14
- export { BOARD_EFFECT_MAX_PARTICLES, BOARD_FONT_STACKS, BoardBackgroundContext, BoardCardRenderer, BoardMediaAction, BoardRenderContext, BoardRenderPalette, BoardSketchHost, BoardSketchHostOptions, BrowserBoardSketchHost, ClipGroup, TASK_CARD_FULL_DETAIL_ZOOM, VIDEO_THUMBNAIL_MAX_EDGE, VideoNaturalSize, boardCardRenderersForTest, boardMediaActionAt, clippingAncestor, createBoardBackground, createBoardSketchHost, dashPattern, defaultBoardPalette, endAngle, ensureBoardTextMeasurement, getBoardCardRenderer, getBoardResolution, installBoardTextMeasurement, isClippingFrame, itemColor, loadVideoThumbnailTexture, mediaPlayBadgeHit, mediaPlayBadgeVisible, parseBoardCssColor, registerBoardCardRenderer, syncClipGroup, syncTextResolution, syncTextWrapWidth, textResolutionForZoom, textZoomBucket, traceArrowhead, traceFrameOutline, tracePolyline, trimPolyline, updateBoardBackground, videoTextureNaturalSize, videoThumbnailSize };
14
+ export { BOARD_EFFECT_MAX_PARTICLES, BOARD_FONT_STACKS, BoardBackgroundContext, BoardCardRenderer, BoardCardRendererResolver, BoardMediaAction, BoardRenderContext, BoardRenderPalette, BoardSketchHost, BoardSketchHostOptions, BrowserBoardSketchHost, ClipGroup, TASK_CARD_FULL_DETAIL_ZOOM, VIDEO_THUMBNAIL_MAX_EDGE, VideoNaturalSize, boardMediaActionAt, clippingAncestor, createBoardBackground, createBoardCardRendererResolver, createBoardSketchHost, dashPattern, defaultBoardPalette, endAngle, ensureBoardTextMeasurement, getBoardCardRenderer, getBoardResolution, installBoardTextMeasurement, isClippingFrame, itemColor, loadVideoThumbnailTexture, mediaPlayBadgeHit, mediaPlayBadgeVisible, parseBoardCssColor, syncClipGroup, syncTextResolution, syncTextWrapWidth, textResolutionForZoom, textZoomBucket, traceArrowhead, traceFrameOutline, tracePolyline, trimPolyline, updateBoardBackground, videoTextureNaturalSize, videoThumbnailSize };
@@ -8,7 +8,7 @@ import { defaultBoardPalette, itemColor } from "./palette.js";
8
8
  import { BOARD_FONT_STACKS, ensureBoardTextMeasurement, installBoardTextMeasurement } from "./text-measurement.js";
9
9
  import { dashPattern, endAngle, traceArrowhead, tracePolyline, trimPolyline } from "./stroke.js";
10
10
  import { BOARD_EFFECT_MAX_PARTICLES } from "./renderers/effect-card-renderer.js";
11
- import { boardCardRenderersForTest, getBoardCardRenderer, registerBoardCardRenderer } from "./renderers/board-renderer-registry.js";
11
+ import { createBoardCardRendererResolver, getBoardCardRenderer } from "./renderers/board-renderer-registry.js";
12
12
  import { createBoardSketchHost } from "./sketch-host.js";
13
13
  import { VIDEO_THUMBNAIL_MAX_EDGE, loadVideoThumbnailTexture, videoTextureNaturalSize, videoThumbnailSize } from "./video-thumbnail.js";
14
- export { BOARD_EFFECT_MAX_PARTICLES, BOARD_FONT_STACKS, TASK_CARD_FULL_DETAIL_ZOOM, VIDEO_THUMBNAIL_MAX_EDGE, boardCardRenderersForTest, boardMediaActionAt, clippingAncestor, createBoardBackground, createBoardSketchHost, dashPattern, defaultBoardPalette, endAngle, ensureBoardTextMeasurement, getBoardCardRenderer, getBoardResolution, installBoardTextMeasurement, isClippingFrame, itemColor, loadVideoThumbnailTexture, mediaPlayBadgeHit, mediaPlayBadgeVisible, parseBoardCssColor, registerBoardCardRenderer, syncClipGroup, syncTextResolution, syncTextWrapWidth, textResolutionForZoom, textZoomBucket, traceArrowhead, traceFrameOutline, tracePolyline, trimPolyline, updateBoardBackground, videoTextureNaturalSize, videoThumbnailSize };
14
+ export { BOARD_EFFECT_MAX_PARTICLES, BOARD_FONT_STACKS, TASK_CARD_FULL_DETAIL_ZOOM, VIDEO_THUMBNAIL_MAX_EDGE, boardMediaActionAt, clippingAncestor, createBoardBackground, createBoardCardRendererResolver, createBoardSketchHost, dashPattern, defaultBoardPalette, endAngle, ensureBoardTextMeasurement, getBoardCardRenderer, getBoardResolution, installBoardTextMeasurement, isClippingFrame, itemColor, loadVideoThumbnailTexture, mediaPlayBadgeHit, mediaPlayBadgeVisible, parseBoardCssColor, syncClipGroup, syncTextResolution, syncTextWrapWidth, textResolutionForZoom, textZoomBucket, traceArrowhead, traceFrameOutline, tracePolyline, trimPolyline, updateBoardBackground, videoTextureNaturalSize, videoThumbnailSize };
@@ -1,5 +1,5 @@
1
- import { WorldPoint } from "../geometry.js";
2
- import { BoardSceneItem } from "../core/scene.js";
1
+ import { WorldPoint } from "../model/geometry.js";
2
+ import { BoardSceneItem } from "../model/scene.js";
3
3
  //#region src/board/render/media-interaction.d.ts
4
4
  type BoardMediaAction = {
5
5
  action: "play-media";
@@ -1,4 +1,4 @@
1
- import { featuredTaskArtifact } from "../task.js";
1
+ import { featuredTaskArtifact } from "../model/task.js";
2
2
  import "./renderers/task-card-renderer.js";
3
3
  //#region src/board/render/media-interaction.ts
4
4
  function mediaPlayBadgeVisible(item, zoom, options) {
@@ -1,6 +1,6 @@
1
1
  import { BoardColor } from "../../protocol/dist/board-model.js";
2
2
  import "../../protocol/dist/index.js";
3
- import { BoardColorId } from "../core/palette.js";
3
+ import { BoardColorId } from "../model/palette.js";
4
4
  import { BoardRenderContext, BoardRenderPalette } from "./renderers/board-renderer-registry.js";
5
5
  //#region src/board/render/palette.d.ts
6
6
  declare function defaultBoardPalette(mode: "dark" | "light"): BoardRenderPalette;
@@ -1,4 +1,4 @@
1
- import { resolveItemColor } from "../core/palette.js";
1
+ import { resolveItemColor } from "../model/palette.js";
2
2
  import { parseBoardCssColor } from "./css-color.js";
3
3
  //#region src/board/render/palette.ts
4
4
  const DARK = {
@@ -1,5 +1,5 @@
1
1
  import { BOARD_FONT_STACK } from "../../../protocol/dist/board-constants.js";
2
- import { pathPointAt, resolveSceneArrow } from "../../core/arrow-geometry.js";
2
+ import { pathPointAt, resolveSceneArrow } from "../../model/arrow-geometry.js";
3
3
  import { syncTextResolution, textResolutionForZoom } from "../text-resolution.js";
4
4
  import { drawFarStroke } from "./far-plate.js";
5
5
  import { itemColor } from "../palette.js";
@@ -1,7 +1,7 @@
1
1
  import { BoardSettings, BoardSketchItem } from "../../../protocol/dist/board-model.js";
2
2
  import "../../../protocol/dist/index.js";
3
- import { BoardScene, BoardSceneItem, SceneItem } from "../../core/scene.js";
4
- import { BoardShapeColors } from "../../core/palette.js";
3
+ import { BoardScene, BoardSceneItem, SceneItem } from "../../model/scene.js";
4
+ import { BoardShapeColors } from "../../model/palette.js";
5
5
  import { Container, Graphics, Texture } from "pixi.js";
6
6
  //#region src/board/render/renderers/board-renderer-registry.d.ts
7
7
  type BoardRenderPalette = {
@@ -50,8 +50,13 @@ type BoardCardRenderer = {
50
50
  renderFar?: (graphics: Graphics, item: BoardSceneItem, context: BoardRenderContext) => void;
51
51
  destroy?: (container: Container, context: BoardRenderContext) => void;
52
52
  };
53
- declare function boardCardRenderersForTest(): readonly BoardCardRenderer[];
54
- declare function getBoardCardRenderer(item: BoardSceneItem, context: BoardRenderContext): BoardCardRenderer;
55
- declare function registerBoardCardRenderer(renderer: BoardCardRenderer): void;
53
+ type BoardCardRendererResolver = (item: BoardSceneItem, context: BoardRenderContext) => BoardCardRenderer;
54
+ /**
55
+ * Pick a renderer per item: `renderers` first, then the built-ins. Items no
56
+ * renderer claims draw as a labelled placeholder box.
57
+ */
58
+ declare function createBoardCardRendererResolver(renderers?: Iterable<BoardCardRenderer>): BoardCardRendererResolver;
59
+ /** The built-in renderers alone. */
60
+ declare const getBoardCardRenderer: BoardCardRendererResolver;
56
61
  //#endregion
57
- export { BoardCardRenderer, BoardRenderContext, BoardRenderPalette, BoardSketchHost, boardCardRenderersForTest, getBoardCardRenderer, registerBoardCardRenderer };
62
+ export { BoardCardRenderer, BoardCardRendererResolver, BoardRenderContext, BoardRenderPalette, BoardSketchHost, createBoardCardRendererResolver, getBoardCardRenderer };
@@ -13,7 +13,7 @@ import { textCardRenderer } from "./text-card-renderer.js";
13
13
  import { unknownCardRenderer } from "./unknown-card-renderer.js";
14
14
  import { videoCardRenderer } from "./video-card-renderer.js";
15
15
  //#region src/board/render/renderers/board-renderer-registry.ts
16
- const boardCardRenderers = [
16
+ const builtinCardRenderers = [
17
17
  textCardRenderer,
18
18
  imageCardRenderer,
19
19
  videoCardRenderer,
@@ -25,20 +25,20 @@ const boardCardRenderers = [
25
25
  arrowCardRenderer,
26
26
  frameCardRenderer,
27
27
  effectCardRenderer,
28
- sketchCardRenderer,
29
- unknownCardRenderer
28
+ sketchCardRenderer
30
29
  ];
31
- function boardCardRenderersForTest() {
32
- return boardCardRenderers;
33
- }
34
- function getBoardCardRenderer(item, context) {
35
- ensureBoardTextMeasurement();
36
- return boardCardRenderers.find((renderer) => renderer.canRender(item, context)) ?? unknownCardRenderer;
37
- }
38
- function registerBoardCardRenderer(renderer) {
39
- const existingIndex = boardCardRenderers.findIndex((candidate) => candidate.id === renderer.id);
40
- if (existingIndex >= 0) boardCardRenderers.splice(existingIndex, 1, renderer);
41
- else boardCardRenderers.unshift(renderer);
30
+ /**
31
+ * Pick a renderer per item: `renderers` first, then the built-ins. Items no
32
+ * renderer claims draw as a labelled placeholder box.
33
+ */
34
+ function createBoardCardRendererResolver(renderers = []) {
35
+ const candidates = [...renderers, ...builtinCardRenderers];
36
+ return (item, context) => {
37
+ ensureBoardTextMeasurement();
38
+ return candidates.find((renderer) => renderer.canRender(item, context)) ?? unknownCardRenderer;
39
+ };
42
40
  }
41
+ /** The built-in renderers alone. */
42
+ const getBoardCardRenderer = createBoardCardRendererResolver();
43
43
  //#endregion
44
- export { boardCardRenderersForTest, getBoardCardRenderer, registerBoardCardRenderer };
44
+ export { createBoardCardRendererResolver, getBoardCardRenderer };
@@ -1,5 +1,5 @@
1
1
  import { applyMatrix } from "../../../protocol/dist/board-layout.js";
2
- import { computeDrawBounds, createStrokeRibbonBuilder, trimDrawPoints } from "../../core/draw-geometry.js";
2
+ import { computeDrawBounds, createStrokeRibbonBuilder, trimDrawPoints } from "../../model/draw-geometry.js";
3
3
  import { positionShell } from "./base-card-renderer.js";
4
4
  import { drawFarStroke, farStrokeSamples } from "./far-plate.js";
5
5
  import { itemColor } from "../palette.js";
@@ -1,4 +1,4 @@
1
- import { degToRad } from "../../geometry.js";
1
+ import { degToRad } from "../../model/geometry.js";
2
2
  //#region src/board/render/renderers/far-plate.ts
3
3
  const FAR_STROKE_MAX_POINTS = 24;
4
4
  const ACCENT_RATIO = .14;
@@ -1,6 +1,6 @@
1
1
  import { BoardFileItem } from "../../../protocol/dist/board-model.js";
2
2
  import "../../../protocol/dist/index.js";
3
- import { BoardSceneItem, SceneItem } from "../../core/scene.js";
3
+ import { BoardSceneItem, SceneItem } from "../../model/scene.js";
4
4
  import { BoardCardRenderer } from "./board-renderer-registry.js";
5
5
  import { Text } from "pixi.js";
6
6
  //#region src/board/render/renderers/file-card-renderer.d.ts
@@ -1,6 +1,6 @@
1
1
  import { BOARD_FONT_STACK, BOARD_MONO_FONT_STACK } from "../../../protocol/dist/board-constants.js";
2
- import { fileCategory, fileStem } from "../../core/file-snapshot.js";
3
- import { fileCategoryAccent, filePreviewKind, fileTypeLabel } from "../../core/file-preview.js";
2
+ import { fileCategory, fileStem } from "../../model/file-snapshot.js";
3
+ import { fileCategoryAccent, filePreviewKind, fileTypeLabel } from "../../model/file-preview.js";
4
4
  import { syncTextResolution } from "../text-resolution.js";
5
5
  import { positionShell } from "./base-card-renderer.js";
6
6
  import { drawFarPlate } from "./far-plate.js";
@@ -1,6 +1,6 @@
1
1
  import { BoardImageItem } from "../../../protocol/dist/board-model.js";
2
2
  import "../../../protocol/dist/index.js";
3
- import { BoardSceneItem, SceneItem } from "../../core/scene.js";
3
+ import { BoardSceneItem, SceneItem } from "../../model/scene.js";
4
4
  import { BoardCardRenderer } from "./board-renderer-registry.js";
5
5
  //#region src/board/render/renderers/image-card-renderer.d.ts
6
6
  declare const imageCardRenderer: BoardCardRenderer;
@@ -1,5 +1,5 @@
1
1
  import { BOARD_FONT_STACK } from "../../../protocol/dist/board-constants.js";
2
- import { worldPoint } from "../../geometry.js";
2
+ import { worldPoint } from "../../model/geometry.js";
3
3
  import { syncTextResolution, syncTextWrapWidth, textResolutionForZoom } from "../text-resolution.js";
4
4
  import { positionShell } from "./base-card-renderer.js";
5
5
  import { drawFarPlate } from "./far-plate.js";
@@ -1,5 +1,5 @@
1
1
  import { BOARD_FONT_STACK, BOARD_MONO_FONT_STACK } from "../../../protocol/dist/board-constants.js";
2
- import { featuredTaskArtifact } from "../../task.js";
2
+ import { featuredTaskArtifact } from "../../model/task.js";
3
3
  import { drawAudioWaveform } from "../audio-waveform.js";
4
4
  import { syncTextResolution, textResolutionForZoom } from "../text-resolution.js";
5
5
  import { positionShell } from "./base-card-renderer.js";
@@ -1,5 +1,5 @@
1
1
  import { layoutBoardText } from "../../../protocol/dist/board-layout.js";
2
- import { boardFontFamily } from "../../core/text-metrics.js";
2
+ import { boardFontFamily } from "../../model/text-metrics.js";
3
3
  import { syncTextResolution, textResolutionForZoom } from "../text-resolution.js";
4
4
  import { positionShell } from "./base-card-renderer.js";
5
5
  import { drawFarPlate } from "./far-plate.js";
@@ -1,6 +1,6 @@
1
1
  import { BoardVideoItem } from "../../../protocol/dist/board-model.js";
2
2
  import "../../../protocol/dist/index.js";
3
- import { BoardSceneItem, SceneItem } from "../../core/scene.js";
3
+ import { BoardSceneItem, SceneItem } from "../../model/scene.js";
4
4
  import { BoardCardRenderer } from "./board-renderer-registry.js";
5
5
  //#region src/board/render/renderers/video-card-renderer.d.ts
6
6
  declare const videoCardRenderer: BoardCardRenderer;
@@ -1,6 +1,6 @@
1
1
  import { BoardDash } from "../../protocol/dist/board-model.js";
2
2
  import "../../protocol/dist/index.js";
3
- import { WorldPoint } from "../geometry.js";
3
+ import { WorldPoint } from "../model/geometry.js";
4
4
  import { Graphics } from "pixi.js";
5
5
  //#region src/board/render/stroke.d.ts
6
6
  declare function dashPattern(dash: BoardDash | undefined, width: number): [number, number] | null;
@@ -1,4 +1,4 @@
1
- import { worldPoint } from "../geometry.js";
1
+ import { worldPoint } from "../model/geometry.js";
2
2
  //#region src/board/render/stroke.ts
3
3
  const HEAD_SPREAD = Math.PI / 6;
4
4
  function dashPattern(dash, width) {
@@ -1,6 +1,6 @@
1
1
  import { BOARD_FONT_STACK, BOARD_MONO_FONT_STACK } from "../../protocol/dist/board-constants.js";
2
2
  import { setBoardTextMeasurer } from "../../protocol/dist/board-layout.js";
3
- import { boardFontFamily } from "../core/text-metrics.js";
3
+ import { boardFontFamily } from "../model/text-metrics.js";
4
4
  import { DOMAdapter } from "pixi.js";
5
5
  //#region src/board/render/text-measurement.ts
6
6
  const BOARD_FONT_STACKS = {
@@ -0,0 +1,70 @@
1
+ import { BoardDelta, BoardDocument, BoardPatch } from "../../protocol/dist/board-model.js";
2
+ import { BoardApplyResult, BoardPlaybackSnapshot, BoardReadResult } from "../../protocol/dist/board.js";
3
+ import "../../protocol/dist/index.js";
4
+ //#region src/board/replica/index.d.ts
5
+ type BoardPendingPatch = {
6
+ mutationId: string;
7
+ patch: BoardPatch;
8
+ };
9
+ type BoardChangedPayload = {
10
+ mutationId: string;
11
+ baseVersion: number;
12
+ version: number;
13
+ after?: BoardDelta;
14
+ };
15
+ type BoardRemote = {
16
+ get(): Promise<BoardReadResult>;
17
+ apply(patch: BoardPatch, options: {
18
+ mutationId: string;
19
+ clientId?: string;
20
+ }): Promise<BoardApplyResult>;
21
+ subscribe?(handlers: {
22
+ changed?: (event: {
23
+ payload: BoardChangedPayload;
24
+ }) => void;
25
+ playback?: (event: {
26
+ payload: {
27
+ playback: BoardPlaybackSnapshot | null;
28
+ };
29
+ }) => void;
30
+ }): () => void;
31
+ };
32
+ type BoardReplicaStorage = {
33
+ listPending(): Promise<BoardPendingPatch[]>;
34
+ putPending(entry: BoardPendingPatch): Promise<void>;
35
+ deletePending(mutationId: string): Promise<void>;
36
+ readDocument(): Promise<{
37
+ version: number;
38
+ document: Record<string, unknown>;
39
+ } | null>;
40
+ writeDocument(version: number, document: BoardDocument): Promise<void>;
41
+ };
42
+ type BoardReplicaState = {
43
+ document: BoardDocument | null;
44
+ version: number;
45
+ title: string | null;
46
+ playback: BoardPlaybackSnapshot | null;
47
+ loaded: boolean;
48
+ pending: number;
49
+ error: string | null;
50
+ };
51
+ type BoardReplicaOptions = {
52
+ remote: BoardRemote;
53
+ storage?: BoardReplicaStorage;
54
+ clientId?: string;
55
+ persistIntervalMs?: number;
56
+ };
57
+ declare function createBoardReplica(options: BoardReplicaOptions): {
58
+ readonly state: BoardReplicaState;
59
+ subscribe(listener: (state: BoardReplicaState) => void): () => void;
60
+ start(): Promise<void>;
61
+ apply(patch: BoardPatch): Promise<void>;
62
+ receive: (payload: BoardChangedPayload) => void;
63
+ receivePlayback: (next: BoardPlaybackSnapshot | null) => void;
64
+ refresh: () => Promise<void>;
65
+ retry(): Promise<void>;
66
+ dispose(): void;
67
+ };
68
+ type BoardReplica = ReturnType<typeof createBoardReplica>;
69
+ //#endregion
70
+ export { BoardChangedPayload, BoardPendingPatch, BoardRemote, BoardReplica, BoardReplicaOptions, BoardReplicaState, BoardReplicaStorage, createBoardReplica };