@neta-art/cohub 10.0.0 → 11.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/README.md +42 -7
  2. package/dist/board/editor/animation.d.ts +3 -0
  3. package/dist/board/editor/animation.js +16 -1
  4. package/dist/board/editor/clipboard.js +7 -0
  5. package/dist/board/editor/copy.js +23 -18
  6. package/dist/board/editor/creation.d.ts +7 -3
  7. package/dist/board/editor/creation.js +5 -4
  8. package/dist/board/editor/deletion.js +3 -3
  9. package/dist/board/editor/document.d.ts +8 -2
  10. package/dist/board/editor/document.js +54 -7
  11. package/dist/board/editor/editor.d.ts +22 -7
  12. package/dist/board/editor/editor.js +12 -2
  13. package/dist/board/editor/index.d.ts +2 -2
  14. package/dist/board/editor/interaction.d.ts +8 -2
  15. package/dist/board/editor/interaction.js +34 -1
  16. package/dist/board/editor/query.d.ts +5 -5
  17. package/dist/board/editor/query.js +14 -12
  18. package/dist/board/editor/selection.js +2 -1
  19. package/dist/board/editor/snapshots.d.ts +0 -2
  20. package/dist/board/editor/snapshots.js +4 -20
  21. package/dist/board/export/index.d.ts +25 -4
  22. package/dist/board/export/index.js +45 -12
  23. package/dist/board/export/node/index.d.ts +5 -4
  24. package/dist/board/export/node/index.js +16 -11
  25. package/dist/board/export/node/scripts.d.ts +16 -0
  26. package/dist/board/export/node/scripts.js +258 -0
  27. package/dist/board/export/scene.d.ts +2 -1
  28. package/dist/board/export/scene.js +24 -7
  29. package/dist/board/model/animation.d.ts +4 -1
  30. package/dist/board/model/animation.js +34 -7
  31. package/dist/board/model/authoring.d.ts +20 -0
  32. package/dist/board/model/authoring.js +185 -0
  33. package/dist/board/model/export-plan.js +1 -0
  34. package/dist/board/model/file-preview.js +1 -1
  35. package/dist/board/model/file-snapshot.js +3 -2
  36. package/dist/board/model/image-key.js +7 -3
  37. package/dist/board/model/index.d.ts +15 -7
  38. package/dist/board/model/index.js +16 -9
  39. package/dist/board/model/items/builtin.js +2 -2
  40. package/dist/board/model/items/create.d.ts +19 -4
  41. package/dist/board/model/items/create.js +130 -9
  42. package/dist/board/model/items/index.d.ts +2 -2
  43. package/dist/board/model/items/index.js +2 -2
  44. package/dist/board/model/media-playback.d.ts +2 -1
  45. package/dist/board/model/media-playback.js +15 -5
  46. package/dist/board/model/media.js +7 -1
  47. package/dist/board/model/overlay-placement.d.ts +25 -0
  48. package/dist/board/model/overlay-placement.js +35 -0
  49. package/dist/board/model/replay.d.ts +1 -1
  50. package/dist/board/model/replay.js +1 -0
  51. package/dist/board/model/sampling.d.ts +19 -0
  52. package/dist/board/model/sampling.js +96 -0
  53. package/dist/board/model/script-example.d.ts +4 -0
  54. package/dist/board/model/script-example.js +21 -0
  55. package/dist/board/model/script-hit.d.ts +27 -0
  56. package/dist/board/model/script-hit.js +109 -0
  57. package/dist/board/model/script-index.d.ts +7 -0
  58. package/dist/board/model/script-index.js +15 -0
  59. package/dist/board/model/script-observers.d.ts +18 -0
  60. package/dist/board/model/script-observers.js +92 -0
  61. package/dist/board/model/script-scene.d.ts +24 -0
  62. package/dist/board/model/script-scene.js +294 -0
  63. package/dist/board/model/script.d.ts +149 -0
  64. package/dist/board/model/script.js +1 -0
  65. package/dist/board/render/board-background.js +5 -4
  66. package/dist/board/render/css-color.d.ts +6 -1
  67. package/dist/board/render/css-color.js +34 -20
  68. package/dist/board/render/diagnostics.d.ts +20 -0
  69. package/dist/board/render/diagnostics.js +117 -0
  70. package/dist/board/render/index.d.ts +9 -6
  71. package/dist/board/render/index.js +10 -7
  72. package/dist/board/render/media-interaction.js +1 -1
  73. package/dist/board/render/palette.d.ts +2 -1
  74. package/dist/board/render/palette.js +6 -2
  75. package/dist/board/render/renderers/arrow-card-renderer.js +3 -2
  76. package/dist/board/render/renderers/audio-card-renderer.js +2 -1
  77. package/dist/board/render/renderers/board-renderer-registry.d.ts +25 -5
  78. package/dist/board/render/renderers/board-renderer-registry.js +11 -4
  79. package/dist/board/render/renderers/custom-card-renderer.d.ts +5 -0
  80. package/dist/board/render/renderers/{sketch-card-renderer.js → custom-card-renderer.js} +18 -16
  81. package/dist/board/render/renderers/draw-card-renderer.js +3 -2
  82. package/dist/board/render/renderers/effect-card-renderer.js +22 -5
  83. package/dist/board/render/renderers/frame-card-renderer.js +30 -14
  84. package/dist/board/render/renderers/image-card-renderer.js +43 -4
  85. package/dist/board/render/renderers/shape-card-renderer.js +10 -27
  86. package/dist/board/render/renderers/task-card-renderer.d.ts +2 -1
  87. package/dist/board/render/renderers/task-card-renderer.js +220 -71
  88. package/dist/board/render/renderers/text-card-renderer.js +5 -3
  89. package/dist/board/render/renderers/unknown-card-renderer.js +1 -0
  90. package/dist/board/render/renderers/video-card-renderer.js +2 -1
  91. package/dist/board/render/sampling.d.ts +22 -0
  92. package/dist/board/render/sampling.js +21 -0
  93. package/dist/board/render/script-export.d.ts +11 -0
  94. package/dist/board/render/script-export.js +86 -0
  95. package/dist/board/render/script-host.d.ts +31 -0
  96. package/dist/board/render/script-host.js +446 -0
  97. package/dist/board/render/script-modules.d.ts +2 -0
  98. package/dist/board/render/script-modules.js +2 -0
  99. package/dist/board/render/script-runtime.d.ts +29 -0
  100. package/dist/board/render/script-runtime.js +223 -0
  101. package/dist/board/render/script-sandbox.d.ts +4 -0
  102. package/dist/board/render/script-sandbox.js +173 -0
  103. package/dist/board/render/script-texture.d.ts +11 -0
  104. package/dist/board/render/script-texture.js +33 -0
  105. package/dist/board/render/stroke.d.ts +2 -1
  106. package/dist/board/render/stroke.js +22 -1
  107. package/dist/board/render/text-measurement.js +1 -1
  108. package/dist/board/stage/assets.js +7 -2
  109. package/dist/board/stage/maintenance.d.ts +5 -0
  110. package/dist/board/stage/maintenance.js +11 -0
  111. package/dist/board/stage/scene.d.ts +2 -0
  112. package/dist/board/stage/scene.js +21 -2
  113. package/dist/board/stage/script-pointer.d.ts +20 -0
  114. package/dist/board/stage/script-pointer.js +41 -0
  115. package/dist/board/stage/stage.d.ts +21 -3
  116. package/dist/board/stage/stage.js +350 -47
  117. package/dist/board/stage/texture-pool.js +2 -3
  118. package/dist/chunks/environment.d.ts +305 -27
  119. package/dist/chunks/environment.js +12 -4
  120. package/dist/chunks/host-bridge.d.ts +2 -2
  121. package/dist/chunks/http.d.ts +90 -7
  122. package/dist/chunks/http.js +157 -64
  123. package/dist/chunks/transport.js +4 -2
  124. package/dist/chunks/websocket.d.ts +9 -1
  125. package/dist/chunks/websocket.js +16 -2
  126. package/dist/host-bridge.js +2 -1
  127. package/dist/http.d.ts +3 -3
  128. package/dist/index.d.ts +182 -4
  129. package/dist/index.js +1559 -299
  130. package/dist/protocol/dist/board-assets.d.ts +1 -0
  131. package/dist/protocol/dist/board-constants.js +2 -2
  132. package/dist/protocol/dist/board-model.d.ts +236 -11
  133. package/dist/protocol/dist/board-model.js +46 -17
  134. package/dist/protocol/dist/board-patch.js +2 -1
  135. package/dist/protocol/dist/board-schema.d.ts +4 -2
  136. package/dist/protocol/dist/board-schema.js +18 -4
  137. package/dist/protocol/dist/board-script-modules.d.ts +25 -0
  138. package/dist/protocol/dist/board-script-modules.js +127 -0
  139. package/dist/protocol/dist/board-task.d.ts +22 -0
  140. package/dist/{board/model/task.js → protocol/dist/board-task.js} +34 -7
  141. package/dist/protocol/dist/display/index.d.ts +1 -0
  142. package/dist/protocol/dist/generation/blocks.d.ts +8 -0
  143. package/dist/{generation-blocks.js → protocol/dist/generation/blocks.js} +14 -15
  144. package/dist/protocol/dist/index.d.ts +7 -2
  145. package/dist/protocol/dist/realtime/types.d.ts +1 -0
  146. package/dist/protocol/dist/rtc/index.d.ts +1 -0
  147. package/dist/protocol/dist/task/index.d.ts +4 -0
  148. package/package.json +2 -1
  149. package/dist/board/export/node/sketch.d.ts +0 -19
  150. package/dist/board/export/node/sketch.js +0 -146
  151. package/dist/board/model/task.d.ts +0 -11
  152. package/dist/board/render/renderers/sketch-card-renderer.d.ts +0 -5
  153. package/dist/board/render/sketch-host.d.ts +0 -14
  154. package/dist/board/render/sketch-host.js +0 -216
  155. package/dist/types.d.ts +0 -36
@@ -1,8 +1,10 @@
1
+ import { normalizeBoardRemoteUrl } from "./board-url.js";
1
2
  import { z } from "zod";
2
3
  //#region ../protocol/dist/board-model.js
3
4
  const BOARD_ID_MAX_LENGTH = 160;
4
5
  const BOARD_CAMERA_TARGET = "camera";
5
- const BoardIdSchema = z.string().min(1).max(160).regex(/^[^\s/]+$/, "ids must not contain whitespace or '/'").refine((value) => value !== BOARD_CAMERA_TARGET, "\"camera\" is reserved");
6
+ const BoardKeySchema = z.string().min(1).max(160).regex(/^[^\s/]+$/, "ids must not contain whitespace or '/'");
7
+ const BoardIdSchema = BoardKeySchema.refine((value) => value !== BOARD_CAMERA_TARGET, "\"camera\" is reserved");
6
8
  const finite = z.number().finite();
7
9
  const nonNegative = finite.nonnegative();
8
10
  const ratio = finite.min(0).max(1);
@@ -50,10 +52,29 @@ const BoardStyleSchema = z.object({
50
52
  trim: ratio.optional()
51
53
  }).strict();
52
54
  function isSafeBoardSourcePath(value) {
53
- return value.length > 0 && value.length <= 4096 && !value.startsWith("/") && !value.includes("\\") && value.split("/").every((part) => part.length > 0 && part !== "." && part !== "..");
55
+ return value.length > 0 && value.length <= 4096 && !value.startsWith("/") && !/^[a-z][a-z\d+.-]*:/i.test(value.trimStart()) && !value.includes("\\") && value.split("/").every((part) => part.length > 0 && part !== "." && part !== "..");
54
56
  }
55
57
  const srcSchema = z.string().refine(isSafeBoardSourcePath, "src must be a relative Space file path");
58
+ function parseBoardMediaSource(src) {
59
+ if (isSafeBoardSourcePath(src)) return {
60
+ kind: "file",
61
+ value: src
62
+ };
63
+ return normalizeBoardRemoteUrl(src) ? {
64
+ kind: "url",
65
+ value: src
66
+ } : null;
67
+ }
68
+ const BoardMediaSourceSchema = z.string().max(4096).refine((src) => parseBoardMediaSource(src) !== null, "src must be a public HTTP(S) URL or relative Space file path").describe("Prefer a stable public HTTP(S) URL; relative Space file paths remain supported.");
69
+ const BoardScriptSchema = z.object({
70
+ src: srcSchema.refine((path) => /\.m?js$/.test(path), "script src must be a .js or .mjs module"),
71
+ params: z.record(z.string(), z.json()).default({}),
72
+ targets: z.record(z.string().min(1).max(80), BoardIdSchema).default({}),
73
+ seed: z.string().min(1).max(160).optional(),
74
+ enabled: z.boolean().default(true)
75
+ }).strict();
56
76
  const itemEnvelope = {
77
+ script: BoardScriptSchema.optional(),
57
78
  parent: BoardIdSchema.optional(),
58
79
  z: finite.optional(),
59
80
  position: BoardVec2Schema.default({
@@ -98,6 +119,7 @@ const BoardFrameItemSchema = z.object({
98
119
  type: z.literal("frame"),
99
120
  props: z.object({
100
121
  label: z.string().max(280).default(""),
122
+ decoration: z.enum(["frame", "none"]).optional(),
101
123
  clip: z.boolean().default(true)
102
124
  }).strict().prefault({})
103
125
  }).strict();
@@ -197,11 +219,19 @@ const BoardMediaSnapshotSchema = z.object({
197
219
  coverUrl: z.string().optional()
198
220
  }).strict();
199
221
  const fileProps = {
200
- src: srcSchema,
222
+ src: BoardMediaSourceSchema,
201
223
  snapshot: BoardMediaSnapshotSchema.optional()
202
224
  };
203
- const timedFileProps = {
225
+ const BoardMediaOriginSchema = z.object({
226
+ taskRunId: z.string().min(1).max(160),
227
+ artifactId: z.string().min(1).max(240)
228
+ }).strict();
229
+ const mediaProps = {
204
230
  ...fileProps,
231
+ origin: BoardMediaOriginSchema.optional()
232
+ };
233
+ const timedFileProps = {
234
+ ...mediaProps,
205
235
  time: nonNegative.optional()
206
236
  };
207
237
  const BoardCropSchema = z.object({
@@ -214,7 +244,7 @@ const BoardImageItemSchema = z.object({
214
244
  ...boxed(640, 360),
215
245
  type: z.literal("image"),
216
246
  props: z.object({
217
- ...fileProps,
247
+ ...mediaProps,
218
248
  crop: BoardCropSchema.optional()
219
249
  }).strict()
220
250
  }).strict();
@@ -280,8 +310,10 @@ const BoardTaskSnapshotSchema = z.object({
280
310
  title: z.string().min(1).max(240),
281
311
  model: z.string().max(160).optional(),
282
312
  promptExcerpt: z.string().max(480).optional(),
313
+ errorExcerpt: z.string().max(240).optional(),
283
314
  artifactCount: z.number().int().nonnegative(),
284
315
  artifacts: z.array(BoardTaskArtifactSchema).max(6).default([]),
316
+ startedAt: z.string().max(64).optional(),
285
317
  updatedAt: z.string().optional()
286
318
  }).strict();
287
319
  const BoardTaskItemSchema = z.object({
@@ -289,7 +321,7 @@ const BoardTaskItemSchema = z.object({
289
321
  type: z.literal("task"),
290
322
  props: z.object({
291
323
  taskRunId: z.string().min(1).max(160),
292
- snapshot: BoardTaskSnapshotSchema
324
+ snapshot: BoardTaskSnapshotSchema.describe("Maintained by the server for tasks in the Board's Space; writers may omit it.")
293
325
  }).strict()
294
326
  }).strict();
295
327
  const BOARD_EFFECT_KINDS = [
@@ -369,14 +401,11 @@ const BoardEffectItemSchema = z.object({
369
401
  seed: z.string().min(1).max(160).optional()
370
402
  }).strict()
371
403
  }).strict();
372
- const BoardSketchItemSchema = z.object({
404
+ const BoardCustomItemSchema = z.object({
373
405
  ...boxed(480, 320),
374
- type: z.literal("sketch"),
375
- props: z.object({
376
- src: srcSchema.refine((path) => /\.m?js$/.test(path), "sketch src must be a .js or .mjs module"),
377
- params: z.record(z.string(), z.unknown()).default({}),
378
- seed: z.string().min(1).max(160).optional()
379
- }).strict()
406
+ type: z.literal("custom"),
407
+ script: BoardScriptSchema,
408
+ props: z.object({}).strict().default({})
380
409
  }).strict();
381
410
  const BOARD_EXTENSION_TYPE_PATTERN = /^[a-z][a-z0-9]*(?:\.[a-z0-9-]+)+$/;
382
411
  const BoardExtensionItemSchema = z.object({
@@ -400,7 +429,7 @@ const BOARD_ITEM_SCHEMAS = {
400
429
  file: BoardFileItemSchema,
401
430
  task: BoardTaskItemSchema,
402
431
  effect: BoardEffectItemSchema,
403
- sketch: BoardSketchItemSchema
432
+ custom: BoardCustomItemSchema
404
433
  };
405
434
  const BOARD_ITEM_TYPES = Object.keys(BOARD_ITEM_SCHEMAS);
406
435
  function isBuiltinItemType(type) {
@@ -533,7 +562,7 @@ const BoardAnimationHeaderSchema = z.object({
533
562
  end: z.enum(["hold", "reset"]).default("hold"),
534
563
  markers: z.array(BoardMarkerSchema).max(1e4).default([])
535
564
  }).strict();
536
- const BoardAnimationSchema = BoardAnimationHeaderSchema.extend({ tracks: z.record(BoardIdSchema, BoardTrackSchema).default({}) }).strict();
565
+ const BoardAnimationSchema = BoardAnimationHeaderSchema.extend({ tracks: z.record(BoardKeySchema, BoardTrackSchema).default({}) }).strict();
537
566
  const BOARD_ENTER_PRESETS = [
538
567
  "fade-in",
539
568
  "rise",
@@ -583,10 +612,10 @@ const patchObject = z.record(z.string(), z.unknown());
583
612
  const BoardPatchSchema = z.object({
584
613
  board: patchObject.nullable().optional(),
585
614
  items: z.record(BoardIdSchema, patchObject.nullable()).optional(),
586
- animations: z.record(BoardIdSchema, patchObject.and(z.object({ tracks: z.record(BoardIdSchema, patchObject.nullable()).optional() })).nullable()).optional()
615
+ animations: z.record(BoardIdSchema, patchObject.and(z.object({ tracks: z.record(BoardKeySchema, patchObject.nullable()).optional() })).nullable()).optional()
587
616
  }).strict();
588
617
  function isEmptyBoardDelta(delta) {
589
618
  return !delta.board && Object.keys(delta.items ?? {}).length === 0 && Object.keys(delta.animations ?? {}).length === 0 && Object.keys(delta.tracks ?? {}).length === 0;
590
619
  }
591
620
  //#endregion
592
- export { 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, BoardDrawItemSchema, BoardDrawPointSchema, BoardEaseSchema, BoardEffectItemSchema, BoardExtensionItemSchema, BoardFileItemSchema, BoardFrameItemSchema, BoardIdSchema, BoardImageItemSchema, BoardKeyframeSchema, BoardMarkerSchema, BoardMediaSnapshotSchema, BoardPatchSchema, BoardSettingsSchema, BoardShapeItemSchema, BoardSizeSchema, BoardSketchItemSchema, BoardStyleSchema, BoardTaskArtifactSchema, BoardTaskItemSchema, BoardTaskSnapshotSchema, BoardTextItemSchema, BoardTrackSchema, BoardVec2Schema, BoardVideoItemSchema, boardItemSchema, emptyBoardDocument, hasAuthoredSize, isBoardColorString, isBoardEase, isBuiltinItem, isBuiltinItemType, isEmptyBoardDelta, isFileBackedItem, isMediaItem, isSafeBoardSourcePath, parseBoardItem };
621
+ export { 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, BoardKeySchema, BoardKeyframeSchema, BoardMarkerSchema, BoardMediaOriginSchema, BoardMediaSnapshotSchema, BoardMediaSourceSchema, BoardPatchSchema, BoardScriptSchema, BoardSettingsSchema, BoardShapeItemSchema, BoardSizeSchema, BoardStyleSchema, BoardTaskArtifactSchema, BoardTaskItemSchema, BoardTaskSnapshotSchema, BoardTextItemSchema, BoardTrackSchema, BoardVec2Schema, BoardVideoItemSchema, boardItemSchema, emptyBoardDocument, hasAuthoredSize, isBoardColorString, isBoardEase, isBuiltinItem, isBuiltinItemType, isEmptyBoardDelta, isFileBackedItem, isMediaItem, isSafeBoardSourcePath, parseBoardItem, parseBoardMediaSource };
@@ -82,7 +82,8 @@ const NOT_ANIMATABLE = /* @__PURE__ */ new Set([
82
82
  "parent",
83
83
  "z",
84
84
  "locked",
85
- "metadata"
85
+ "metadata",
86
+ "script"
86
87
  ]);
87
88
  const CAMERA_PROPERTIES = {
88
89
  focus: {
@@ -1,6 +1,6 @@
1
1
  //#region ../protocol/dist/board-schema.d.ts
2
2
  type JsonSchema = Record<string, unknown>;
3
- declare const BOARD_SCHEMA_TARGETS: readonly ["board", "animation", "track", "camera", ...("arrow" | "audio" | "draw" | "effect" | "file" | "frame" | "image" | "shape" | "sketch" | "task" | "text" | "video")[]];
3
+ declare const BOARD_SCHEMA_TARGETS: readonly ["board", "animation", "track", "camera", ...("arrow" | "audio" | "custom" | "draw" | "effect" | "file" | "frame" | "image" | "shape" | "task" | "text" | "video")[]];
4
4
  type BoardJsonSchemaResult = {
5
5
  schema?: JsonSchema;
6
6
  properties?: Array<{
@@ -11,6 +11,7 @@ type BoardJsonSchemaResult = {
11
11
  description: string;
12
12
  parameters: Record<string, string>;
13
13
  }>;
14
+ semantics?: Record<string, string>;
14
15
  };
15
16
  declare function boardJsonSchema(target: string): BoardJsonSchemaResult | null;
16
17
  declare function boardSchemaOverview(): {
@@ -19,7 +20,8 @@ declare function boardSchemaOverview(): {
19
20
  rotation: string;
20
21
  length: string;
21
22
  };
22
- types: ("arrow" | "audio" | "draw" | "effect" | "file" | "frame" | "image" | "shape" | "sketch" | "task" | "text" | "video")[];
23
+ coordinates: string;
24
+ types: ("arrow" | "audio" | "custom" | "draw" | "effect" | "file" | "frame" | "image" | "shape" | "task" | "text" | "video")[];
23
25
  colors: {
24
26
  tokens: readonly ["brand", "neutral", "black", "white", "blue", "green", "amber", "violet", "rose"];
25
27
  css: string;
@@ -1,4 +1,4 @@
1
- import { BOARD_CAMERA_TARGET, BOARD_COLOR_TOKENS, BOARD_EFFECT_KINDS, BOARD_EFFECT_KIND_INFO, BOARD_ITEM_SCHEMAS, BOARD_ITEM_TYPES, BoardAnimationHeaderSchema, BoardSettingsSchema, BoardTrackSchema, isBuiltinItemType } from "./board-model.js";
1
+ import { BOARD_CAMERA_TARGET, BOARD_COLOR_TOKENS, BOARD_EFFECT_KINDS, BOARD_EFFECT_KIND_INFO, BOARD_ITEM_SCHEMAS, BOARD_ITEM_TYPES, BoardAnimationHeaderSchema, BoardKeySchema, BoardSettingsSchema, BoardTrackSchema, isBuiltinItemType } from "./board-model.js";
2
2
  import { listBoardProperties } from "./board-patch.js";
3
3
  import { z } from "zod";
4
4
  //#region ../protocol/dist/board-schema.js
@@ -19,13 +19,26 @@ const BOARD_SCHEMA_TARGETS = [
19
19
  function boardJsonSchema(target) {
20
20
  if (target === "board") return { schema: toJsonSchema(BoardSettingsSchema) };
21
21
  if (target === "animation") return {
22
- schema: toJsonSchema(BoardAnimationHeaderSchema.extend({ tracks: z.record(z.string(), BoardTrackSchema).optional() })),
23
- properties: listBoardProperties("animation")
22
+ schema: toJsonSchema(BoardAnimationHeaderSchema.extend({ tracks: z.record(BoardKeySchema, BoardTrackSchema).optional() })),
23
+ properties: listBoardProperties("animation"),
24
+ semantics: { composition: "Target another animation's time property to drive its local clock. Parent markers control pauses; child markers are not automatically promoted." }
25
+ };
26
+ if (target === "track") return {
27
+ schema: toJsonSchema(BoardTrackSchema),
28
+ semantics: {
29
+ boundary: "Before the first keyframe and after the last, the value is held. Use opacity tracks to control visibility.",
30
+ easing: "Defaults to linear. The destination keyframe controls the incoming segment. Supports CSS easing keywords, cubic-bezier() and steps().",
31
+ composition: "replace: the most recently started track wins; ties use the lexicographically larger track ID. Before any start, the nearest upcoming track wins. add: numbers and positions add; opacity and scale multiply.",
32
+ interpolation: "auto interpolates numbers, colors and vectors; other values step. spline smooths vector motion. orient follows the position tangent."
33
+ }
24
34
  };
25
- if (target === "track") return { schema: toJsonSchema(BoardTrackSchema) };
26
35
  if (target === "effect") return {
27
36
  schema: toJsonSchema(BOARD_ITEM_SCHEMAS.effect),
28
37
  properties: listBoardProperties("effect"),
38
+ semantics: {
39
+ follow: "follow is used by trail only. Parent a particle effect to a decoration:none frame to move it with other items.",
40
+ time: "Effects use animation time in milliseconds. trail samples target history; seed makes procedural particles repeatable."
41
+ },
29
42
  kinds: Object.fromEntries(BOARD_EFFECT_KINDS.map((kind) => [kind, BOARD_EFFECT_KIND_INFO[kind]]))
30
43
  };
31
44
  if (target === "camera") return { properties: listBoardProperties(BOARD_CAMERA_TARGET) };
@@ -42,6 +55,7 @@ function boardSchemaOverview() {
42
55
  rotation: "degrees",
43
56
  length: "board units (1 = 1 CSS px at zoom 1)"
44
57
  },
58
+ coordinates: "Positions, draw points and unbound arrow endpoints are relative to their parent frame; without a parent they are world coordinates. Shape paths are fitted to the item size.",
45
59
  types: BOARD_ITEM_TYPES,
46
60
  colors: {
47
61
  tokens: BOARD_COLOR_TOKENS,
@@ -0,0 +1,25 @@
1
+ //#region ../protocol/dist/board-script-modules.d.ts
2
+ declare const BOARD_SCRIPT_MAX_BYTES = 2000000;
3
+ type BoardScriptSource = {
4
+ code: string;
5
+ imports: Array<{
6
+ start: number;
7
+ end: number;
8
+ path: string;
9
+ dynamic: boolean;
10
+ }>;
11
+ };
12
+ type BoardScriptSources = Record<string, BoardScriptSource>;
13
+ declare function createBoardScriptModuleReader(read: (path: string) => Promise<string>, timeoutMs?: number): {
14
+ read(path: string): Promise<string>;
15
+ invalidate(path?: string): void;
16
+ destroy(): void;
17
+ };
18
+ declare function resolveScriptImport(from: string, specifier: string): string;
19
+ declare function loadBoardScriptSources(src: string, read: (path: string) => Promise<string>, timeoutMs?: number): Promise<BoardScriptSources>;
20
+ declare function scriptModuleUrls(sources: BoardScriptSources): {
21
+ urls: Record<string, string>;
22
+ dispose(): void;
23
+ };
24
+ //#endregion
25
+ export { BOARD_SCRIPT_MAX_BYTES, BoardScriptSource, BoardScriptSources, createBoardScriptModuleReader, loadBoardScriptSources, resolveScriptImport, scriptModuleUrls };
@@ -0,0 +1,127 @@
1
+ import { isSafeBoardSourcePath } from "./board-model.js";
2
+ //#region ../protocol/dist/board-script-modules.js
3
+ const BOARD_SCRIPT_MAX_BYTES = 2e6;
4
+ function createBoardScriptModuleReader(read, timeoutMs = 15e3) {
5
+ const cache = /* @__PURE__ */ new Map();
6
+ const queue = [];
7
+ let active = 0;
8
+ let disposed = false;
9
+ function pump() {
10
+ while (active < 4 && queue.length) queue.shift()?.();
11
+ }
12
+ return {
13
+ read(path) {
14
+ if (disposed) return Promise.reject(/* @__PURE__ */ new Error("Module reader is disposed."));
15
+ const cached = cache.get(path);
16
+ if (cached) return cached;
17
+ const promise = new Promise((resolve, reject) => {
18
+ queue.push(() => {
19
+ if (disposed) {
20
+ reject(/* @__PURE__ */ new Error("Module reader is disposed."));
21
+ return;
22
+ }
23
+ active++;
24
+ let timer;
25
+ const timeout = new Promise((_resolve, rejectRead) => {
26
+ timer = setTimeout(() => rejectRead(/* @__PURE__ */ new Error(`Module read timed out: ${path}`)), timeoutMs);
27
+ });
28
+ Promise.race([Promise.resolve().then(() => read(path)), timeout]).then(resolve, reject).finally(() => {
29
+ clearTimeout(timer);
30
+ active--;
31
+ pump();
32
+ });
33
+ });
34
+ pump();
35
+ });
36
+ cache.set(path, promise);
37
+ promise.catch(() => {
38
+ if (cache.get(path) === promise) cache.delete(path);
39
+ });
40
+ return promise;
41
+ },
42
+ invalidate(path) {
43
+ if (path) cache.delete(path);
44
+ else cache.clear();
45
+ },
46
+ destroy() {
47
+ disposed = true;
48
+ cache.clear();
49
+ for (const job of queue.splice(0)) job();
50
+ }
51
+ };
52
+ }
53
+ function resolveScriptImport(from, specifier) {
54
+ if (!specifier.startsWith("./") && !specifier.startsWith("../")) throw new Error(`Only relative module imports are supported: ${specifier}`);
55
+ const parts = from.split("/").slice(0, -1);
56
+ for (const part of specifier.split("/")) {
57
+ if (part === ".") continue;
58
+ if (part === "..") {
59
+ if (!parts.length) throw new Error("Module import leaves the Space.");
60
+ parts.pop();
61
+ } else parts.push(part);
62
+ }
63
+ const path = parts.join("/");
64
+ if (!isSafeBoardSourcePath(path) || !/\.m?js$/.test(path)) throw new Error(`Invalid module path: ${path}`);
65
+ return path;
66
+ }
67
+ async function loadBoardScriptSources(src, read, timeoutMs = 15e3) {
68
+ if (!isSafeBoardSourcePath(src) || !/\.m?js$/.test(src)) throw new Error("Invalid script entry path.");
69
+ const { init, parse } = await import("es-module-lexer");
70
+ await init;
71
+ const sources = {};
72
+ const visiting = /* @__PURE__ */ new Set();
73
+ let bytes = 0;
74
+ async function visit(path) {
75
+ if (visiting.has(path)) throw new Error(`Circular module dependency: ${path}`);
76
+ if (sources[path]) return;
77
+ if (Object.keys(sources).length + visiting.size >= 64) throw new Error("A script may load at most 64 modules.");
78
+ visiting.add(path);
79
+ let timer;
80
+ const code = await Promise.race([Promise.resolve().then(() => read(path)), new Promise((_resolve, reject) => {
81
+ timer = setTimeout(() => reject(/* @__PURE__ */ new Error(`Module read timed out: ${path}`)), timeoutMs);
82
+ })]).finally(() => clearTimeout(timer));
83
+ bytes += new TextEncoder().encode(code).byteLength;
84
+ if (bytes > 2e6) throw new Error("Script modules exceed the 2 MB limit.");
85
+ const [imports] = parse(code, path);
86
+ const resolved = [];
87
+ for (const entry of imports) {
88
+ if (entry.d === -2) throw new Error("import.meta is not available in Board scripts.");
89
+ if (entry.n === void 0) throw new Error("Dynamic imports must use a literal relative path.");
90
+ const dependency = resolveScriptImport(path, entry.n);
91
+ await visit(dependency);
92
+ resolved.push({
93
+ start: entry.s,
94
+ end: entry.e,
95
+ path: dependency,
96
+ dynamic: entry.d >= 0
97
+ });
98
+ }
99
+ sources[path] = {
100
+ code,
101
+ imports: resolved
102
+ };
103
+ visiting.delete(path);
104
+ }
105
+ await visit(src);
106
+ return sources;
107
+ }
108
+ function scriptModuleUrls(sources) {
109
+ const urls = {};
110
+ for (const [path, source] of Object.entries(sources)) {
111
+ let code = source.code;
112
+ for (const entry of [...source.imports].reverse()) {
113
+ const url = urls[entry.path];
114
+ if (!url) throw new Error(`Unresolved module: ${entry.path}`);
115
+ code = code.slice(0, entry.start) + (entry.dynamic ? JSON.stringify(url) : url) + code.slice(entry.end);
116
+ }
117
+ urls[path] = URL.createObjectURL(new Blob([`${code}\n//# sourceURL=cohub-script/${path.split("/").map(encodeURIComponent).join("/")}`], { type: "text/javascript" }));
118
+ }
119
+ return {
120
+ urls,
121
+ dispose: () => {
122
+ for (const url of Object.values(urls)) URL.revokeObjectURL(url);
123
+ }
124
+ };
125
+ }
126
+ //#endregion
127
+ export { BOARD_SCRIPT_MAX_BYTES, createBoardScriptModuleReader, loadBoardScriptSources, resolveScriptImport, scriptModuleUrls };
@@ -0,0 +1,22 @@
1
+ import { BoardTaskArtifact, BoardTaskSnapshot } from "./board-model.js";
2
+ import { GenerationRunPayload } from "./generation/blocks.js";
3
+ import { TaskRunStatus } from "./task/index.js";
4
+ //#region ../protocol/dist/board-task.d.ts
5
+ type BoardTaskRunSource = GenerationRunPayload & {
6
+ taskType: string;
7
+ status: TaskRunStatus;
8
+ errorMessage?: string | null;
9
+ startedAt?: string | null;
10
+ updatedAt: string;
11
+ };
12
+ declare const BOARD_TASK_SOURCE_PREFIX = "cohub-task:";
13
+ declare const boardTaskSource: (taskRunId: string) => string;
14
+ declare function taskArtifacts(blocks: Record<string, unknown>[]): BoardTaskArtifact[];
15
+ declare function rankedTaskArtifacts(artifacts: readonly BoardTaskArtifact[]): BoardTaskArtifact[];
16
+ declare function featuredTaskArtifact(artifacts: readonly BoardTaskArtifact[]): BoardTaskArtifact | undefined;
17
+ declare function taskArtifactPreviewUrl(artifact: BoardTaskArtifact | undefined): string | undefined;
18
+ declare function taskRunArtifacts(run: Pick<BoardTaskRunSource, "taskType" | "result">): BoardTaskArtifact[];
19
+ declare function taskRunToBoardTaskSnapshot(run: BoardTaskRunSource): BoardTaskSnapshot;
20
+ declare function withObservedArtifactFacts(snapshot: BoardTaskSnapshot, observed: BoardTaskSnapshot | undefined): BoardTaskSnapshot;
21
+ //#endregion
22
+ export { BOARD_TASK_SOURCE_PREFIX, BoardTaskRunSource, boardTaskSource, featuredTaskArtifact, rankedTaskArtifacts, taskArtifactPreviewUrl, taskArtifacts, taskRunArtifacts, taskRunToBoardTaskSnapshot, withObservedArtifactFacts };
@@ -1,6 +1,8 @@
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
1
+ import "./board-model.js";
2
+ import { blockDurationMs, blockIdentity, blockMimeType, blockNaturalSize, blockPreviewUrl, blockText, blockTitle, blockUrl, cleanExcerpt, generationCovers, generationOutput, generationPrompt, taskData } from "./generation/blocks.js";
3
+ //#region ../protocol/dist/board-task.js
4
+ const BOARD_TASK_SOURCE_PREFIX = "cohub-task:";
5
+ const boardTaskSource = (taskRunId) => `${BOARD_TASK_SOURCE_PREFIX}${taskRunId}`;
4
6
  function artifactId(base, used, suffix) {
5
7
  const stem = cleanExcerpt(base, 220) ?? "output";
6
8
  let candidate = suffix ? `${stem}-${suffix}` : stem;
@@ -137,23 +139,48 @@ function taskArtifactPreviewUrl(artifact) {
137
139
  function taskTypeTitle(taskType) {
138
140
  return taskType.replace(/[._-]+/g, " ").replace(/\b\w/g, (letter) => letter.toUpperCase());
139
141
  }
142
+ function taskRunArtifacts(run) {
143
+ return run.taskType === "generation" ? rankedTaskArtifacts(taskArtifacts(generationOutput(run))) : [];
144
+ }
140
145
  function taskRunToBoardTaskSnapshot(run) {
141
146
  const data = taskData(run);
142
- const blocks = run.taskType === "generation" ? generationOutput(run) : [];
143
147
  const promptExcerpt = run.taskType === "generation" ? generationPrompt(run) : cleanExcerpt(data?.command ?? data?.prompt ?? data?.title);
144
148
  const model = typeof data?.model === "string" ? data.model : void 0;
145
- const allArtifacts = taskArtifacts(blocks);
146
- const artifacts = rankedTaskArtifacts(allArtifacts).slice(0, 6);
149
+ const allArtifacts = taskRunArtifacts(run);
150
+ const artifacts = allArtifacts.slice(0, 6);
151
+ const errorExcerpt = run.status === "failed" ? cleanExcerpt(run.errorMessage, 240) : void 0;
147
152
  return {
148
153
  taskType: run.taskType,
149
154
  status: run.status,
150
155
  title: promptExcerpt ?? taskTypeTitle(run.taskType),
151
156
  ...model ? { model } : {},
152
157
  ...promptExcerpt ? { promptExcerpt } : {},
158
+ ...errorExcerpt ? { errorExcerpt } : {},
153
159
  artifactCount: allArtifacts.length,
154
160
  artifacts,
161
+ ...run.startedAt ? { startedAt: run.startedAt } : {},
155
162
  updatedAt: run.updatedAt
156
163
  };
157
164
  }
165
+ function withObservedArtifactFacts(snapshot, observed) {
166
+ if (!observed?.artifacts.length) return snapshot;
167
+ let changed = false;
168
+ const artifacts = snapshot.artifacts.map((artifact) => {
169
+ if (artifact.type !== "image" && artifact.type !== "video") return artifact;
170
+ if (artifact.naturalWidth && artifact.naturalHeight) return artifact;
171
+ const match = observed.artifacts.find((candidate) => candidate.id === artifact.id && candidate.type === artifact.type && candidate.url === artifact.url);
172
+ if (!match || match.type !== "image" && match.type !== "video" || !match.naturalWidth || !match.naturalHeight) return artifact;
173
+ changed = true;
174
+ return {
175
+ ...artifact,
176
+ naturalWidth: match.naturalWidth,
177
+ naturalHeight: match.naturalHeight
178
+ };
179
+ });
180
+ return changed ? {
181
+ ...snapshot,
182
+ artifacts
183
+ } : snapshot;
184
+ }
158
185
  //#endregion
159
- export { featuredTaskArtifact, rankedTaskArtifacts, taskArtifactPreviewUrl, taskArtifacts, taskRunToBoardTaskSnapshot };
186
+ export { BOARD_TASK_SOURCE_PREFIX, boardTaskSource, featuredTaskArtifact, rankedTaskArtifacts, taskArtifactPreviewUrl, taskArtifacts, taskRunArtifacts, taskRunToBoardTaskSnapshot, withObservedArtifactFacts };
@@ -1,2 +1,3 @@
1
1
  import "./actions.js";
2
+ import "../rtc/index.js";
2
3
  import { z } from "zod";
@@ -0,0 +1,8 @@
1
+ //#region ../protocol/dist/generation/blocks.d.ts
2
+ /** Tolerant readers for generation payloads, shared by every task projection. */
3
+ type GenerationRunPayload = {
4
+ payload?: unknown;
5
+ result?: unknown;
6
+ };
7
+ //#endregion
8
+ export { GenerationRunPayload };
@@ -1,8 +1,7 @@
1
- import { normalizeBoardRemoteUrl } from "./protocol/dist/board-url.js";
2
- //#region src/generation-blocks.ts
3
- /** Tolerant readers for generation payloads, shared by every task projection. */
1
+ import { normalizeBoardRemoteUrl } from "../board-url.js";
2
+ //#region ../protocol/dist/generation/blocks.js
4
3
  const EXCERPT_LIMIT = 240;
5
- function record(value) {
4
+ function asRecord(value) {
6
5
  return value && typeof value === "object" && !Array.isArray(value) ? value : null;
7
6
  }
8
7
  function cleanExcerpt(value, limit = EXCERPT_LIMIT) {
@@ -15,11 +14,11 @@ function blockText(block) {
15
14
  return cleanExcerpt(block.text ?? block.content ?? block.value);
16
15
  }
17
16
  function blockUrl(block) {
18
- const source = record(block.source);
17
+ const source = asRecord(block.source);
19
18
  return normalizeBoardRemoteUrl(source?.url ?? source?.src ?? block.url ?? block.src);
20
19
  }
21
20
  function blockMimeType(block) {
22
- const source = record(block.source);
21
+ const source = asRecord(block.source);
23
22
  const value = source?.mediaType ?? source?.media_type ?? source?.mimeType ?? block.mediaType ?? block.media_type ?? block.mimeType;
24
23
  return typeof value === "string" ? value : void 0;
25
24
  }
@@ -27,7 +26,7 @@ function positiveNumber(value) {
27
26
  return typeof value === "number" && Number.isFinite(value) && value > 0 ? value : void 0;
28
27
  }
29
28
  function blockNaturalSize(block) {
30
- const source = record(block.source);
29
+ const source = asRecord(block.source);
31
30
  const naturalWidth = positiveNumber(source?.width ?? source?.naturalWidth ?? block.width ?? block.naturalWidth);
32
31
  const naturalHeight = positiveNumber(source?.height ?? source?.naturalHeight ?? block.height ?? block.naturalHeight);
33
32
  return {
@@ -36,14 +35,14 @@ function blockNaturalSize(block) {
36
35
  };
37
36
  }
38
37
  function contentBlocks(value) {
39
- return Array.isArray(value) ? value.filter((item) => record(item)) : [];
38
+ return Array.isArray(value) ? value.filter((item) => asRecord(item)) : [];
40
39
  }
41
40
  function taskData(run) {
42
- const payload = record(run.payload);
43
- return record(payload?.data) ?? payload;
41
+ const payload = asRecord(run.payload);
42
+ return asRecord(payload?.data) ?? payload;
44
43
  }
45
44
  function generationOutput(run) {
46
- return contentBlocks(record(run.result)?.output);
45
+ return contentBlocks(asRecord(run.result)?.output);
47
46
  }
48
47
  function generationPrompt(run) {
49
48
  for (const block of contentBlocks(taskData(run)?.content)) {
@@ -52,7 +51,7 @@ function generationPrompt(run) {
52
51
  }
53
52
  }
54
53
  function blockMeta(block) {
55
- return record(block.meta);
54
+ return asRecord(block.meta);
56
55
  }
57
56
  function blockIdentity(block) {
58
57
  const meta = blockMeta(block);
@@ -64,7 +63,7 @@ function blockTitle(block) {
64
63
  return cleanExcerpt(blockMeta(block)?.title ?? block.title ?? block.name, 240);
65
64
  }
66
65
  function blockDurationMs(block) {
67
- const source = record(block.source);
66
+ const source = asRecord(block.source);
68
67
  const meta = blockMeta(block);
69
68
  const milliseconds = positiveNumber(source?.durationMs ?? meta?.durationMs ?? block.durationMs);
70
69
  if (milliseconds) return Math.round(milliseconds);
@@ -72,7 +71,7 @@ function blockDurationMs(block) {
72
71
  return seconds ? Math.round(seconds * 1e3) : void 0;
73
72
  }
74
73
  function blockPreviewUrl(block) {
75
- const source = record(block.source);
74
+ const source = asRecord(block.source);
76
75
  return normalizeBoardRemoteUrl(source?.poster ?? source?.thumbnail ?? source?.previewUrl ?? block.poster ?? block.thumbnail ?? block.previewUrl);
77
76
  }
78
77
  /**
@@ -122,4 +121,4 @@ function generationCovers(blocks) {
122
121
  return covers;
123
122
  }
124
123
  //#endregion
125
- export { blockDurationMs, blockIdentity, blockMeta, blockMimeType, blockNaturalSize, blockPreviewUrl, blockText, blockTitle, blockUrl, cleanExcerpt, contentBlocks, generationCovers, generationOutput, generationPrompt, positiveNumber, record, taskData };
124
+ export { asRecord, blockDurationMs, blockIdentity, blockMeta, blockMimeType, blockNaturalSize, blockPreviewUrl, blockText, blockTitle, blockUrl, cleanExcerpt, contentBlocks, generationCovers, generationOutput, generationPrompt, positiveNumber, taskData };
@@ -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, BoardDash, BoardDelta, BoardDiagnostic, BoardDocument, BoardDrawItem, BoardDrawItemSchema, BoardDrawPoint, BoardDrawPointSchema, BoardEaseSchema, BoardEffectItem, BoardEffectItemSchema, BoardEffectKind, BoardEnterPreset, BoardExtensionItem, BoardExtensionItemSchema, BoardFileBackedItem, BoardFileItem, BoardFileItemSchema, BoardFrameItem, BoardFrameItemSchema, BoardIdSchema, BoardImageItem, BoardImageItemSchema, BoardItem, BoardItemType, BoardKeyframe, BoardKeyframeSchema, BoardMarker, BoardMarkerSchema, BoardMediaSnapshot, BoardMediaSnapshotSchema, BoardPatch, BoardPatchSchema, BoardPlayMode, BoardSettings, BoardSettingsSchema, BoardShapeGeometry, BoardShapeItem, BoardShapeItemSchema, BoardSize, BoardSizeSchema, BoardSketchItem, BoardSketchItemSchema, BoardStyle, BoardStyleSchema, BoardTaskArtifact, BoardTaskArtifactSchema, BoardTaskItem, BoardTaskItemSchema, BoardTaskSnapshot, BoardTaskSnapshotSchema, BoardTextItem, BoardTextItemSchema, BoardTrack, BoardTrackSchema, BoardVec2, BoardVec2Schema, BoardVideoItem, BoardVideoItemSchema, boardItemSchema, emptyBoardDocument, hasAuthoredSize, isBoardColorString, isBoardEase, isBuiltinItem, isBuiltinItemType, isEmptyBoardDelta, isFileBackedItem, isMediaItem, isSafeBoardSourcePath, parseBoardItem } from "./board-model.js";
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, 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, boardItemSchema, emptyBoardDocument, hasAuthoredSize, isBoardColorString, isBoardEase, isBuiltinItem, isBuiltinItemType, isEmptyBoardDelta, isFileBackedItem, isMediaItem, isSafeBoardSourcePath, parseBoardItem, parseBoardMediaSource } from "./board-model.js";
2
2
  import { BoardFrame, BoardItemLookup, BoardLayout, BoardMatrix, BoardRect, BoardTextLayout, BoardTextMeasurer, IDENTITY_MATRIX, anchorPoint, applyMatrix, arrowBindings, autoAnchorSide, bendControl, clampBoardFontSize, createBoardLayout, createDocumentLayout, drawPointsBounds, drawSampleRadius, estimateTextWidth, framePoint, invertMatrix, isArrowBinding, layoutBoardText, multiplyMatrix, pointsRect, rotateAround, scaleVector, setBoardTextMeasurer, sideAnchor } from "./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 "./board-patch.js";
4
4
  import "./app-authorization.js";
@@ -6,9 +6,14 @@ import { RequestSource, RequestSourceVia } from "./provenance.js";
6
6
  import { BOARD_CLIPBOARD_KIND, BOARD_CLIPBOARD_MIME, BoardApplyResult, BoardChangeSummary, BoardHistoryPage, BoardManifest, BoardManifestSchema, BoardPlaybackCommand, BoardPlaybackCommandSchema, BoardPlaybackSnapshot, BoardPlaybackStatus, BoardReadResult, BoardTransactionRecord, isBoardPath, parseBoardManifest, serializeBoardManifest } from "./board.js";
7
7
  import { BOARD_STROKE_MAX_SIZE, BOARD_STROKE_MIN_SIZE, clampBoardStrokeSize } from "./board-constants.js";
8
8
  import "./board-content.js";
9
+ import "./board-assets.js";
9
10
  import { BOARD_SCHEMA_TARGETS, BoardJsonSchemaResult, boardJsonSchema, boardSchemaOverview } from "./board-schema.js";
11
+ import { GenerationRunPayload } from "./generation/blocks.js";
12
+ import { TaskRunStatus } from "./task/index.js";
13
+ import { BOARD_TASK_SOURCE_PREFIX, BoardTaskRunSource, boardTaskSource, featuredTaskArtifact, rankedTaskArtifacts, taskArtifactPreviewUrl, taskArtifacts, taskRunArtifacts, taskRunToBoardTaskSnapshot, withObservedArtifactFacts } from "./board-task.js";
10
14
  import "./board-upgrade.js";
11
15
  import { isPublicBoardRemoteAddress, normalizeBoardRemoteUrl } from "./board-url.js";
16
+ import "./rtc/index.js";
12
17
  import "./display/index.js";
13
18
  import "./runtime/index.js";
14
19
  import "./model/turn.js";
@@ -18,4 +23,4 @@ import "./app.js";
18
23
  import "./realtime/types.js";
19
24
  import "./app-catalog.js";
20
25
  import "./host-bridge.js";
21
- export { BOARD_ANCHOR_SIDES, BOARD_ARROW_ROUTES, BOARD_CAMERA_TARGET, BOARD_CLIPBOARD_KIND, BOARD_CLIPBOARD_MIME, 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_SCHEMA_TARGETS, BOARD_SHAPE_GEOMETRIES, BOARD_STROKE_MAX_SIZE, BOARD_STROKE_MIN_SIZE, BOARD_TASK_ARTIFACT_LIMIT, BOARD_TEXT_ALIGNS, BoardAnchorSide, BoardAnimation, BoardAnimationHeader, BoardAnimationHeaderSchema, BoardAnimationSchema, BoardApplyOptions, BoardApplyResult, BoardArrowAnchor, BoardArrowAnchorSchema, BoardArrowBinding, BoardArrowBindingSchema, BoardArrowEnd, BoardArrowEndSchema, BoardArrowItem, BoardArrowItemSchema, BoardArrowRoute, BoardAudioItem, BoardAudioItemSchema, BoardBackgroundSchema, BoardBuiltinItem, BoardBuiltinItemType, BoardChangeSummary, BoardColor, BoardColorSchema, BoardColorToken, BoardCropSchema, BoardDash, BoardDelta, BoardDiagnostic, BoardDocument, BoardDrawItem, BoardDrawItemSchema, BoardDrawPoint, BoardDrawPointSchema, BoardEaseSchema, BoardEffectItem, BoardEffectItemSchema, BoardEffectKind, BoardEnterPreset, BoardExtensionItem, BoardExtensionItemSchema, BoardFileBackedItem, BoardFileItem, BoardFileItemSchema, BoardFrame, BoardFrameItem, BoardFrameItemSchema, BoardHistoryPage, BoardIdSchema, BoardImageItem, BoardImageItemSchema, BoardItem, BoardItemLookup, BoardItemType, BoardJsonSchemaResult, BoardKeyframe, BoardKeyframeSchema, BoardLayout, BoardManifest, BoardManifestSchema, BoardMarker, BoardMarkerSchema, BoardMatrix, BoardMediaSnapshot, BoardMediaSnapshotSchema, BoardPatch, BoardPatchResult, BoardPatchSchema, BoardPlayMode, BoardPlaybackCommand, BoardPlaybackCommandSchema, BoardPlaybackSnapshot, BoardPlaybackStatus, BoardPropertySpec, BoardReadResult, BoardRect, BoardSettings, BoardSettingsSchema, BoardShapeGeometry, BoardShapeItem, BoardShapeItemSchema, BoardSize, BoardSizeSchema, BoardSketchItem, BoardSketchItemSchema, BoardState, BoardStyle, BoardStyleSchema, BoardTaskArtifact, BoardTaskArtifactSchema, BoardTaskItem, BoardTaskItemSchema, BoardTaskSnapshot, BoardTaskSnapshotSchema, BoardTextItem, BoardTextItemSchema, BoardTextLayout, BoardTextMeasurer, BoardTrack, BoardTrackSchema, BoardTransactionRecord, BoardValueKind, BoardVec2, BoardVec2Schema, BoardVideoItem, BoardVideoItemSchema, IDENTITY_MATRIX, RequestSource, RequestSourceVia, anchorPoint, applyBoardDelta, applyBoardPatch, applyBoardPatchToDocument, applyMatrix, arrowBindings, autoAnchorSide, bendControl, boardItemSchema, boardJsonSchema, boardPatchTouches, boardSchemaOverview, clampBoardFontSize, clampBoardStrokeSize, createBoardLayout, createDocumentLayout, createDocumentState, diffBoardDocuments, diffMergePatch, drawPointsBounds, drawSampleRadius, emptyBoardDocument, estimateTextWidth, framePoint, hasAuthoredSize, invertMatrix, isArrowBinding, isBoardColorString, isBoardEase, isBoardPath, isBuiltinItem, isBuiltinItemType, isEmptyBoardDelta, isEmptyBoardPatch, isFileBackedItem, isMediaItem, isPublicBoardRemoteAddress, isSafeBoardSourcePath, layoutBoardText, listBoardProperties, mergePatch, multiplyMatrix, normalizeBoardRemoteUrl, parseBoardDocument, parseBoardItem, parseBoardManifest, pointsRect, pruneBoardTrack, resolveBoardProperty, rotateAround, scaleVector, serializeBoardManifest, setBoardTextMeasurer, sideAnchor, trackReferences };
26
+ export { BOARD_ANCHOR_SIDES, BOARD_ARROW_ROUTES, BOARD_CAMERA_TARGET, BOARD_CLIPBOARD_KIND, BOARD_CLIPBOARD_MIME, 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_SCHEMA_TARGETS, BOARD_SHAPE_GEOMETRIES, BOARD_STROKE_MAX_SIZE, BOARD_STROKE_MIN_SIZE, BOARD_TASK_ARTIFACT_LIMIT, BOARD_TASK_SOURCE_PREFIX, BOARD_TEXT_ALIGNS, BoardAnchorSide, BoardAnimation, BoardAnimationHeader, BoardAnimationHeaderSchema, BoardAnimationSchema, BoardApplyOptions, BoardApplyResult, BoardArrowAnchor, BoardArrowAnchorSchema, BoardArrowBinding, BoardArrowBindingSchema, BoardArrowEnd, BoardArrowEndSchema, BoardArrowItem, BoardArrowItemSchema, BoardArrowRoute, BoardAudioItem, BoardAudioItemSchema, BoardBackgroundSchema, BoardBuiltinItem, BoardBuiltinItemType, BoardChangeSummary, BoardColor, BoardColorSchema, BoardColorToken, BoardCropSchema, BoardCustomItem, BoardCustomItemSchema, BoardDash, BoardDelta, BoardDiagnostic, BoardDocument, BoardDrawItem, BoardDrawItemSchema, BoardDrawPoint, BoardDrawPointSchema, BoardEaseSchema, BoardEffectItem, BoardEffectItemSchema, BoardEffectKind, BoardEnterPreset, BoardExtensionItem, BoardExtensionItemSchema, BoardFileBackedItem, BoardFileItem, BoardFileItemSchema, BoardFrame, BoardFrameItem, BoardFrameItemSchema, BoardHistoryPage, BoardIdSchema, BoardImageItem, BoardImageItemSchema, BoardItem, BoardItemLookup, BoardItemType, BoardJsonSchemaResult, BoardKeySchema, BoardKeyframe, BoardKeyframeSchema, BoardLayout, BoardManifest, BoardManifestSchema, BoardMarker, BoardMarkerSchema, BoardMatrix, BoardMediaOrigin, BoardMediaOriginSchema, BoardMediaSnapshot, BoardMediaSnapshotSchema, BoardMediaSource, BoardMediaSourceSchema, BoardPatch, BoardPatchResult, BoardPatchSchema, BoardPlayMode, BoardPlaybackCommand, BoardPlaybackCommandSchema, BoardPlaybackSnapshot, BoardPlaybackStatus, BoardPropertySpec, BoardReadResult, BoardRect, BoardScript, BoardScriptSchema, BoardSettings, BoardSettingsSchema, BoardShapeGeometry, BoardShapeItem, BoardShapeItemSchema, BoardSize, BoardSizeSchema, BoardState, BoardStyle, BoardStyleSchema, BoardTaskArtifact, BoardTaskArtifactSchema, BoardTaskItem, BoardTaskItemSchema, BoardTaskRunSource, BoardTaskSnapshot, BoardTaskSnapshotSchema, BoardTextItem, BoardTextItemSchema, BoardTextLayout, BoardTextMeasurer, BoardTrack, BoardTrackSchema, BoardTransactionRecord, BoardValueKind, BoardVec2, BoardVec2Schema, BoardVideoItem, BoardVideoItemSchema, GenerationRunPayload, IDENTITY_MATRIX, RequestSource, RequestSourceVia, TaskRunStatus, anchorPoint, applyBoardDelta, applyBoardPatch, applyBoardPatchToDocument, applyMatrix, arrowBindings, autoAnchorSide, bendControl, boardItemSchema, boardJsonSchema, boardPatchTouches, boardSchemaOverview, boardTaskSource, clampBoardFontSize, clampBoardStrokeSize, createBoardLayout, createDocumentLayout, createDocumentState, diffBoardDocuments, diffMergePatch, drawPointsBounds, drawSampleRadius, emptyBoardDocument, estimateTextWidth, featuredTaskArtifact, framePoint, hasAuthoredSize, invertMatrix, isArrowBinding, isBoardColorString, isBoardEase, isBoardPath, isBuiltinItem, isBuiltinItemType, isEmptyBoardDelta, isEmptyBoardPatch, isFileBackedItem, isMediaItem, isPublicBoardRemoteAddress, isSafeBoardSourcePath, layoutBoardText, listBoardProperties, mergePatch, multiplyMatrix, normalizeBoardRemoteUrl, parseBoardDocument, parseBoardItem, parseBoardManifest, parseBoardMediaSource, pointsRect, pruneBoardTrack, rankedTaskArtifacts, resolveBoardProperty, rotateAround, scaleVector, serializeBoardManifest, setBoardTextMeasurer, sideAnchor, taskArtifactPreviewUrl, taskArtifacts, taskRunArtifacts, taskRunToBoardTaskSnapshot, trackReferences, withObservedArtifactFacts };
@@ -1,5 +1,6 @@
1
1
  import "../board-model.js";
2
2
  import "../board.js";
3
+ import "../rtc/index.js";
3
4
  import "../model/turn.js";
4
5
  import "../model/metrics.js";
5
6
  import "../model/session.js";
@@ -0,0 +1 @@
1
+ import { z } from "zod";
@@ -0,0 +1,4 @@
1
+ //#region ../protocol/dist/task/index.d.ts
2
+ type TaskRunStatus = "pending" | "running" | "completed" | "failed";
3
+ //#endregion
4
+ export { TaskRunStatus };