@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.
- package/README.md +42 -7
- package/dist/board/editor/animation.d.ts +3 -0
- package/dist/board/editor/animation.js +16 -1
- package/dist/board/editor/clipboard.js +7 -0
- package/dist/board/editor/copy.js +23 -18
- package/dist/board/editor/creation.d.ts +7 -3
- package/dist/board/editor/creation.js +5 -4
- package/dist/board/editor/deletion.js +3 -3
- package/dist/board/editor/document.d.ts +8 -2
- package/dist/board/editor/document.js +54 -7
- package/dist/board/editor/editor.d.ts +22 -7
- package/dist/board/editor/editor.js +12 -2
- package/dist/board/editor/index.d.ts +2 -2
- package/dist/board/editor/interaction.d.ts +8 -2
- package/dist/board/editor/interaction.js +34 -1
- package/dist/board/editor/query.d.ts +5 -5
- package/dist/board/editor/query.js +14 -12
- package/dist/board/editor/selection.js +2 -1
- package/dist/board/editor/snapshots.d.ts +0 -2
- package/dist/board/editor/snapshots.js +4 -20
- package/dist/board/export/index.d.ts +25 -4
- package/dist/board/export/index.js +45 -12
- package/dist/board/export/node/index.d.ts +5 -4
- package/dist/board/export/node/index.js +16 -11
- package/dist/board/export/node/scripts.d.ts +16 -0
- package/dist/board/export/node/scripts.js +258 -0
- package/dist/board/export/scene.d.ts +2 -1
- package/dist/board/export/scene.js +24 -7
- package/dist/board/model/animation.d.ts +4 -1
- package/dist/board/model/animation.js +34 -7
- package/dist/board/model/authoring.d.ts +20 -0
- package/dist/board/model/authoring.js +185 -0
- package/dist/board/model/export-plan.js +1 -0
- package/dist/board/model/file-preview.js +1 -1
- package/dist/board/model/file-snapshot.js +3 -2
- package/dist/board/model/image-key.js +7 -3
- package/dist/board/model/index.d.ts +15 -7
- package/dist/board/model/index.js +16 -9
- package/dist/board/model/items/builtin.js +2 -2
- package/dist/board/model/items/create.d.ts +19 -4
- package/dist/board/model/items/create.js +130 -9
- package/dist/board/model/items/index.d.ts +2 -2
- package/dist/board/model/items/index.js +2 -2
- package/dist/board/model/media-playback.d.ts +2 -1
- package/dist/board/model/media-playback.js +15 -5
- package/dist/board/model/media.js +7 -1
- package/dist/board/model/overlay-placement.d.ts +25 -0
- package/dist/board/model/overlay-placement.js +35 -0
- package/dist/board/model/replay.d.ts +1 -1
- package/dist/board/model/replay.js +1 -0
- package/dist/board/model/sampling.d.ts +19 -0
- package/dist/board/model/sampling.js +96 -0
- package/dist/board/model/script-example.d.ts +4 -0
- package/dist/board/model/script-example.js +21 -0
- package/dist/board/model/script-hit.d.ts +27 -0
- package/dist/board/model/script-hit.js +109 -0
- package/dist/board/model/script-index.d.ts +7 -0
- package/dist/board/model/script-index.js +15 -0
- package/dist/board/model/script-observers.d.ts +18 -0
- package/dist/board/model/script-observers.js +92 -0
- package/dist/board/model/script-scene.d.ts +24 -0
- package/dist/board/model/script-scene.js +294 -0
- package/dist/board/model/script.d.ts +149 -0
- package/dist/board/model/script.js +1 -0
- package/dist/board/render/board-background.js +5 -4
- package/dist/board/render/css-color.d.ts +6 -1
- package/dist/board/render/css-color.js +34 -20
- package/dist/board/render/diagnostics.d.ts +20 -0
- package/dist/board/render/diagnostics.js +117 -0
- package/dist/board/render/index.d.ts +9 -6
- package/dist/board/render/index.js +10 -7
- package/dist/board/render/media-interaction.js +1 -1
- package/dist/board/render/palette.d.ts +2 -1
- package/dist/board/render/palette.js +6 -2
- package/dist/board/render/renderers/arrow-card-renderer.js +3 -2
- package/dist/board/render/renderers/audio-card-renderer.js +2 -1
- package/dist/board/render/renderers/board-renderer-registry.d.ts +25 -5
- package/dist/board/render/renderers/board-renderer-registry.js +11 -4
- package/dist/board/render/renderers/custom-card-renderer.d.ts +5 -0
- package/dist/board/render/renderers/{sketch-card-renderer.js → custom-card-renderer.js} +18 -16
- package/dist/board/render/renderers/draw-card-renderer.js +3 -2
- package/dist/board/render/renderers/effect-card-renderer.js +22 -5
- package/dist/board/render/renderers/frame-card-renderer.js +30 -14
- package/dist/board/render/renderers/image-card-renderer.js +43 -4
- package/dist/board/render/renderers/shape-card-renderer.js +10 -27
- package/dist/board/render/renderers/task-card-renderer.d.ts +2 -1
- package/dist/board/render/renderers/task-card-renderer.js +220 -71
- package/dist/board/render/renderers/text-card-renderer.js +5 -3
- package/dist/board/render/renderers/unknown-card-renderer.js +1 -0
- package/dist/board/render/renderers/video-card-renderer.js +2 -1
- package/dist/board/render/sampling.d.ts +22 -0
- package/dist/board/render/sampling.js +21 -0
- package/dist/board/render/script-export.d.ts +11 -0
- package/dist/board/render/script-export.js +86 -0
- package/dist/board/render/script-host.d.ts +31 -0
- package/dist/board/render/script-host.js +446 -0
- package/dist/board/render/script-modules.d.ts +2 -0
- package/dist/board/render/script-modules.js +2 -0
- package/dist/board/render/script-runtime.d.ts +29 -0
- package/dist/board/render/script-runtime.js +223 -0
- package/dist/board/render/script-sandbox.d.ts +4 -0
- package/dist/board/render/script-sandbox.js +173 -0
- package/dist/board/render/script-texture.d.ts +11 -0
- package/dist/board/render/script-texture.js +33 -0
- package/dist/board/render/stroke.d.ts +2 -1
- package/dist/board/render/stroke.js +22 -1
- package/dist/board/render/text-measurement.js +1 -1
- package/dist/board/stage/assets.js +7 -2
- package/dist/board/stage/maintenance.d.ts +5 -0
- package/dist/board/stage/maintenance.js +11 -0
- package/dist/board/stage/scene.d.ts +2 -0
- package/dist/board/stage/scene.js +21 -2
- package/dist/board/stage/script-pointer.d.ts +20 -0
- package/dist/board/stage/script-pointer.js +41 -0
- package/dist/board/stage/stage.d.ts +21 -3
- package/dist/board/stage/stage.js +350 -47
- package/dist/board/stage/texture-pool.js +2 -3
- package/dist/chunks/environment.d.ts +305 -27
- package/dist/chunks/environment.js +12 -4
- package/dist/chunks/host-bridge.d.ts +2 -2
- package/dist/chunks/http.d.ts +90 -7
- package/dist/chunks/http.js +157 -64
- package/dist/chunks/transport.js +4 -2
- package/dist/chunks/websocket.d.ts +9 -1
- package/dist/chunks/websocket.js +16 -2
- package/dist/host-bridge.js +2 -1
- package/dist/http.d.ts +3 -3
- package/dist/index.d.ts +182 -4
- package/dist/index.js +1559 -299
- package/dist/protocol/dist/board-assets.d.ts +1 -0
- package/dist/protocol/dist/board-constants.js +2 -2
- package/dist/protocol/dist/board-model.d.ts +236 -11
- package/dist/protocol/dist/board-model.js +46 -17
- package/dist/protocol/dist/board-patch.js +2 -1
- package/dist/protocol/dist/board-schema.d.ts +4 -2
- package/dist/protocol/dist/board-schema.js +18 -4
- package/dist/protocol/dist/board-script-modules.d.ts +25 -0
- package/dist/protocol/dist/board-script-modules.js +127 -0
- package/dist/protocol/dist/board-task.d.ts +22 -0
- package/dist/{board/model/task.js → protocol/dist/board-task.js} +34 -7
- package/dist/protocol/dist/display/index.d.ts +1 -0
- package/dist/protocol/dist/generation/blocks.d.ts +8 -0
- package/dist/{generation-blocks.js → protocol/dist/generation/blocks.js} +14 -15
- package/dist/protocol/dist/index.d.ts +7 -2
- package/dist/protocol/dist/realtime/types.d.ts +1 -0
- package/dist/protocol/dist/rtc/index.d.ts +1 -0
- package/dist/protocol/dist/task/index.d.ts +4 -0
- package/package.json +2 -1
- package/dist/board/export/node/sketch.d.ts +0 -19
- package/dist/board/export/node/sketch.js +0 -146
- package/dist/board/model/task.d.ts +0 -11
- package/dist/board/render/renderers/sketch-card-renderer.d.ts +0 -5
- package/dist/board/render/sketch-host.d.ts +0 -14
- package/dist/board/render/sketch-host.js +0 -216
- 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
|
|
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:
|
|
222
|
+
src: BoardMediaSourceSchema,
|
|
201
223
|
snapshot: BoardMediaSnapshotSchema.optional()
|
|
202
224
|
};
|
|
203
|
-
const
|
|
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
|
-
...
|
|
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
|
|
404
|
+
const BoardCustomItemSchema = z.object({
|
|
373
405
|
...boxed(480, 320),
|
|
374
|
-
type: z.literal("
|
|
375
|
-
|
|
376
|
-
|
|
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
|
-
|
|
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(
|
|
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(
|
|
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,
|
|
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 };
|
|
@@ -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" | "
|
|
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
|
-
|
|
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(
|
|
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 "
|
|
2
|
-
import { blockDurationMs, blockIdentity, blockMimeType, blockNaturalSize, blockPreviewUrl, blockText, blockTitle, blockUrl, cleanExcerpt, generationCovers, generationOutput, generationPrompt, taskData } from "
|
|
3
|
-
//#region
|
|
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 =
|
|
146
|
-
const artifacts =
|
|
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,8 +1,7 @@
|
|
|
1
|
-
import { normalizeBoardRemoteUrl } from "
|
|
2
|
-
//#region
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
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) =>
|
|
38
|
+
return Array.isArray(value) ? value.filter((item) => asRecord(item)) : [];
|
|
40
39
|
}
|
|
41
40
|
function taskData(run) {
|
|
42
|
-
const payload =
|
|
43
|
-
return
|
|
41
|
+
const payload = asRecord(run.payload);
|
|
42
|
+
return asRecord(payload?.data) ?? payload;
|
|
44
43
|
}
|
|
45
44
|
function generationOutput(run) {
|
|
46
|
-
return contentBlocks(
|
|
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
|
|
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 =
|
|
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 =
|
|
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,
|
|
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,
|
|
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,
|
|
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 };
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import { z } from "zod";
|