@neta-art/cohub 5.7.0 → 5.8.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 +18 -5
- package/dist/board/core/palette.d.ts +3 -2
- package/dist/board/core/shape-types.d.ts +3 -1
- package/dist/board/core/shape-types.js +3 -7
- package/dist/board/core/tool-styles.d.ts +2 -1
- package/dist/board/image-key.js +3 -5
- package/dist/board/index.d.ts +9 -4
- package/dist/board/index.js +7 -3
- package/dist/board/media-playback.d.ts +22 -0
- package/dist/board/media-playback.js +67 -0
- package/dist/board/media.d.ts +7 -0
- package/dist/board/media.js +70 -0
- package/dist/board/nodes.d.ts +113 -0
- package/dist/board/nodes.js +154 -0
- package/dist/board/render/index.d.ts +3 -1
- package/dist/board/render/index.js +4 -2
- package/dist/board/render/media-interaction.d.ts +19 -0
- package/dist/board/render/media-interaction.js +26 -0
- package/dist/board/render/renderers/audio-card-renderer.js +1 -1
- package/dist/board/render/renderers/board-renderer-registry.js +2 -2
- package/dist/board/render/renderers/draw-card-renderer.js +1 -1
- package/dist/board/render/renderers/file-card-renderer.js +1 -1
- package/dist/board/render/renderers/frame-card-renderer.js +1 -1
- package/dist/board/render/renderers/geo-card-renderer.js +1 -1
- package/dist/board/render/renderers/image-card-renderer.js +1 -1
- package/dist/board/render/renderers/task-card-renderer.js +16 -13
- package/dist/board/render/renderers/text-card-renderer.js +1 -1
- package/dist/board/render/renderers/unknown-card-renderer.js +1 -1
- package/dist/board/render/renderers/video-card-renderer.js +1 -1
- package/dist/board/render/video-thumbnail.d.ts +16 -0
- package/dist/board/render/video-thumbnail.js +86 -0
- package/dist/board/task.d.ts +10 -5
- package/dist/board/task.js +159 -103
- package/dist/chunks/environment.d.ts +6 -6
- package/dist/chunks/environment.js +6 -6
- package/dist/chunks/http.d.ts +71 -5
- package/dist/chunks/http.js +1535 -167
- package/dist/chunks/transport.js +8 -1
- package/dist/chunks/websocket.d.ts +138 -2
- package/dist/http.d.ts +3 -3
- package/dist/index.d.ts +245 -4
- package/dist/index.js +438 -788
- package/dist/protocol/dist/board-document.d.ts +155 -48
- package/dist/protocol/dist/board-document.js +40 -19
- package/dist/protocol/dist/board-node.d.ts +18 -0
- package/dist/protocol/dist/board-node.js +239 -0
- package/dist/protocol/dist/board-url.d.ts +12 -0
- package/dist/protocol/dist/board-url.js +83 -0
- package/dist/protocol/dist/board.d.ts +5 -0
- package/dist/protocol/dist/index.d.ts +2 -1
- package/dist/protocol/dist/index.js +2 -1
- package/dist/protocol/dist/provenance.js +1 -0
- package/docs/work-runtime-guide.md +7 -7
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -23,8 +23,8 @@ const content: ContentBlock[] = [{ type: "text", text: "Hello" }];
|
|
|
23
23
|
|
|
24
24
|
The SDK connects to production by default:
|
|
25
25
|
|
|
26
|
-
- API: `https://api.cohub.
|
|
27
|
-
- WebSocket: `wss://gateway.cohub.
|
|
26
|
+
- API: `https://api.cohub.live`
|
|
27
|
+
- WebSocket: `wss://gateway.cohub.live/ws`
|
|
28
28
|
|
|
29
29
|
Use development with `ENV=dev` in Node.js:
|
|
30
30
|
|
|
@@ -43,8 +43,8 @@ const client = createCohubClient({
|
|
|
43
43
|
|
|
44
44
|
Development uses:
|
|
45
45
|
|
|
46
|
-
- API: `https://api-dev.cohub.
|
|
47
|
-
- WebSocket: `wss://gateway-dev.cohub.
|
|
46
|
+
- API: `https://api-dev.cohub.live`
|
|
47
|
+
- WebSocket: `wss://gateway-dev.cohub.live/ws`
|
|
48
48
|
|
|
49
49
|
Custom endpoints are still supported when needed:
|
|
50
50
|
|
|
@@ -80,15 +80,28 @@ Use `space.boards` for collection operations and bind an ID with
|
|
|
80
80
|
`space.board(boardId)` for entity operations:
|
|
81
81
|
|
|
82
82
|
```ts
|
|
83
|
+
import { createBoardNode } from "@neta-art/cohub";
|
|
84
|
+
|
|
83
85
|
const created = await space.boards.create({
|
|
84
86
|
path: "boards/plan.board",
|
|
85
87
|
title: "Plan",
|
|
86
|
-
nodes: [
|
|
88
|
+
nodes: [
|
|
89
|
+
createBoardNode({
|
|
90
|
+
id: "goal",
|
|
91
|
+
type: "geo",
|
|
92
|
+
frame: { x: 80, y: 80, width: 240, height: 120 },
|
|
93
|
+
text: "Ship",
|
|
94
|
+
color: "green",
|
|
95
|
+
}),
|
|
96
|
+
],
|
|
87
97
|
});
|
|
88
98
|
|
|
89
99
|
const board = space.board(created.board.id);
|
|
90
100
|
// Equivalent: space.boards.byId(created.board.id)
|
|
91
101
|
|
|
102
|
+
// Machine-readable types, enums and coordinate spaces for dynamic clients.
|
|
103
|
+
const capabilities = await board.capabilities();
|
|
104
|
+
|
|
92
105
|
const snapshot = await board.inspect({
|
|
93
106
|
include: ["nodes", "effects", "sequences", "clips", "playback"],
|
|
94
107
|
});
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { BoardColorId } from "../../protocol/dist/board-node.js";
|
|
2
|
+
import "../../protocol/dist/index.js";
|
|
1
3
|
//#region src/board/core/palette.d.ts
|
|
2
4
|
/**
|
|
3
5
|
* Board color palette — a small, named set of shape colors shared by text,
|
|
@@ -9,7 +11,6 @@
|
|
|
9
11
|
* --board-color-{id}-stroke | -fill | -label
|
|
10
12
|
* with hard-coded light/dark tables as offline / export fallbacks.
|
|
11
13
|
*/
|
|
12
|
-
type BoardColorId = "brand" | "neutral" | "black" | "white" | "blue" | "green" | "amber" | "violet" | "rose";
|
|
13
14
|
type BoardColorValue = {
|
|
14
15
|
/** Stroke / accent color (sRGB hex). */
|
|
15
16
|
stroke: number;
|
|
@@ -39,4 +40,4 @@ declare function buildFallbackShapeColors(mode: "dark" | "light"): BoardShapeCol
|
|
|
39
40
|
*/
|
|
40
41
|
declare function pickBoardColor(colors: BoardShapeColors | null | undefined, id: unknown, mode?: "dark" | "light"): BoardColorValue;
|
|
41
42
|
//#endregion
|
|
42
|
-
export { BOARD_COLORS, BoardColorEntry, BoardColorId, BoardColorValue, BoardShapeColors, DEFAULT_BOARD_COLOR, boardColorCssVar, buildFallbackShapeColors, isBoardColorId, pickBoardColor, resolveBoardColor };
|
|
43
|
+
export { BOARD_COLORS, BoardColorEntry, type BoardColorId, BoardColorValue, BoardShapeColors, DEFAULT_BOARD_COLOR, boardColorCssVar, buildFallbackShapeColors, isBoardColorId, pickBoardColor, resolveBoardColor };
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { BoardGeoKind } from "../../protocol/dist/board-node.js";
|
|
2
|
+
import "../../protocol/dist/index.js";
|
|
1
3
|
import { BoardFrame } from "../../protocol/dist/board-document.js";
|
|
2
4
|
import { Rect, WorldPoint } from "../geometry.js";
|
|
3
5
|
//#region src/board/core/shape-types.d.ts
|
|
@@ -87,7 +89,7 @@ type DrawShapeProps = {
|
|
|
87
89
|
/** Stroke width in world units. */
|
|
88
90
|
size: number;
|
|
89
91
|
};
|
|
90
|
-
type GeoKind =
|
|
92
|
+
type GeoKind = BoardGeoKind;
|
|
91
93
|
declare const GEO_KINDS: readonly GeoKind[];
|
|
92
94
|
declare function isGeoKind(value: unknown): value is GeoKind;
|
|
93
95
|
type GeoShapeProps = {
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { BOARD_GEO_KINDS } from "../../protocol/dist/board-node.js";
|
|
2
|
+
import "../../protocol/dist/index.js";
|
|
1
3
|
//#region src/board/core/shape-types.ts
|
|
2
4
|
function resizeModeForCapabilities(capabilities) {
|
|
3
5
|
if (!capabilities.canResize) return "none";
|
|
@@ -13,13 +15,7 @@ const FULL_CAPABILITIES = {
|
|
|
13
15
|
canSnap: true,
|
|
14
16
|
canLock: true
|
|
15
17
|
};
|
|
16
|
-
const GEO_KINDS =
|
|
17
|
-
"rectangle",
|
|
18
|
-
"rounded",
|
|
19
|
-
"ellipse",
|
|
20
|
-
"diamond",
|
|
21
|
-
"triangle"
|
|
22
|
-
];
|
|
18
|
+
const GEO_KINDS = BOARD_GEO_KINDS;
|
|
23
19
|
function isGeoKind(value) {
|
|
24
20
|
return typeof value === "string" && GEO_KINDS.includes(value);
|
|
25
21
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { BOARD_STROKE_MAX_SIZE, BOARD_STROKE_MIN_SIZE, clampBoardStrokeSize } from "../../protocol/dist/board-constants.js";
|
|
2
|
-
import { BoardColorId } from "
|
|
2
|
+
import { BoardColorId } from "../../protocol/dist/board-node.js";
|
|
3
|
+
import "./palette.js";
|
|
3
4
|
import { GeoKind } from "./shape-types.js";
|
|
4
5
|
//#region src/board/core/tool-styles.d.ts
|
|
5
6
|
type BoardToolStyleMap = {
|
package/dist/board/image-key.js
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { featuredTaskArtifact, taskArtifactPreviewUrl } from "./task.js";
|
|
1
2
|
//#region src/board/image-key.ts
|
|
2
3
|
/**
|
|
3
4
|
* Stable cache key for an item's image resource, or null when it has none.
|
|
@@ -17,11 +18,8 @@ function imageAssetKey(item) {
|
|
|
17
18
|
return null;
|
|
18
19
|
}
|
|
19
20
|
if (item.type === "task") {
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
const url = output.url;
|
|
23
|
-
return url ? `url:${url}` : null;
|
|
24
|
-
}
|
|
21
|
+
const url = taskArtifactPreviewUrl(featuredTaskArtifact(item.snapshot.artifacts));
|
|
22
|
+
return url ? `url:${url}` : null;
|
|
25
23
|
}
|
|
26
24
|
return null;
|
|
27
25
|
}
|
package/dist/board/index.d.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { BOARD_STROKE_MAX_SIZE, BOARD_STROKE_MIN_SIZE, clampBoardStrokeSize } from "../protocol/dist/board-constants.js";
|
|
2
2
|
import { AUTO_BOARD_CONNECTION_ANCHOR, BOARD_CONNECTION_DIRECTIONS, BOARD_CONNECTION_LINES, BOARD_CONNECTION_ROUTINGS, BOARD_CONNECTION_SIDES, BoardConnection, BoardConnectionAnchor, BoardConnectionAnchorSchema, BoardConnectionDirection, BoardConnectionEndpoint, BoardConnectionEndpointSchema, BoardConnectionInput, BoardConnectionLine, BoardConnectionPatch, BoardConnectionPatchSchema, BoardConnectionRecord, BoardConnectionRouting, BoardConnectionRoutingConfig, BoardConnectionRoutingSchema, BoardConnectionSchema, BoardConnectionSide, BoardConnectionStyle, BoardConnectionStyleSchema, BoardConnectionWaypointSchema, BoardRelationSchema, DEFAULT_BOARD_CONNECTION_ROUTING, DEFAULT_BOARD_CONNECTION_STYLE, DEFAULT_BOARD_RELATION, connectionNodeIds, connectionOtherNodeId, connectionTouchesNode, createBoardConnection, flipBoardConnection, normalizeBoardConnectionStyle } from "../protocol/dist/board-connection.js";
|
|
3
|
+
import { BoardColorId } from "../protocol/dist/board-node.js";
|
|
3
4
|
import { BOARD_DOCUMENT_KIND, BOARD_EXTENSION, BoardManifest, BoardNodeRecord, BoardRecord, InvalidBoardFileError, isBoardPath, parseBoardManifest, serializeBoardManifest } from "../protocol/dist/board.js";
|
|
4
5
|
import { BoardExtensionDefinition, BoardExtensionRegistry, BoardPresetDefinition, CompiledSequence, DEFAULT_BOARD_LIMITS, QualityProfile, RenderBounds, TimelineClipInput, TimelineInput, clip, compileSequence, createBoardExtensionRegistry, timeline } from "./animation.js";
|
|
5
|
-
import {
|
|
6
|
+
import { BOARD_REMOTE_URL_MAX_LENGTH, BoardRemoteUrlSchema, normalizeBoardRemoteUrl } from "../protocol/dist/board-url.js";
|
|
7
|
+
import { BOARD_TASK_ARTIFACT_LIMIT, BoardAppearance, BoardAppearanceSchema, BoardArrowItem, BoardArrowItemSchema, BoardAudioItem, BoardAudioItemSchema, BoardDocument, BoardDocumentSchema, BoardDrawItem, BoardDrawItemSchema, BoardFileItem, BoardFileItemSchema, BoardFileSnapshot, BoardFileSnapshotSchema, BoardFrame, BoardFrameItem, BoardFrameItemSchema, BoardFrameSchema, BoardGeoItem, BoardGeoItemSchema, BoardImageItem, BoardImageItemSchema, BoardItem, BoardItemSchema, BoardItemStyle, BoardItemStyleSchema, BoardKnownItem, BoardMediaSnapshot, BoardMediaSnapshotSchema, BoardPoint, BoardPointSchema, BoardTaskArtifact, BoardTaskArtifactSchema, BoardTaskItem, BoardTaskItemSchema, BoardTaskSnapshot, BoardTaskSnapshotSchema, BoardTextItem, BoardTextItemSchema, BoardUnknownItem, BoardVideoItem, BoardVideoItemSchema, BoardViewport, BoardViewportSchema, DrawPoint, DrawPointSchema, KNOWN_BOARD_ITEM_TYPES, KnownBoardItemType, SpaceFileRef, SpaceFileRefSchema, UNKNOWN_BOARD_ITEM_TYPE, isFileBackedItem, isMediaItem, isUnknownItem, parseBoardDocument, parseBoardItemLoose, unknownRealType, withResolvedConnections } from "../protocol/dist/board-document.js";
|
|
6
8
|
import { BOARD_NODE_SOURCE, DEFAULT_BOARD_APPEARANCE, ITEM_BASE_KEYS, WireBackedBoardItem, boardBootstrapToDocument, boardNodeToItem, isRecord, nodeInputFromRecord, sourceForItem } from "./codec.js";
|
|
7
9
|
import { CORNER_RESIZE_HANDLES, CORNER_ROTATION_ZONE_WIDTH, CornerResizeHandle, EDGE_RESIZE_HANDLES, FIT_PADDING, HANDLE_DIRECTION, HANDLE_HIT_RADIUS, MAX_BOARD_ZOOM, MIN_BOARD_ZOOM, MIN_ITEM_SIZE, Point, RESIZE_HANDLES, ROTATION_HANDLE_OFFSET, Rect, ResizeHandle, ScreenPoint, Size, VIEWPORT_MARGIN_RATIO, WorldPoint, angleFromCenter, clamp, clampZoom, degToRad, expandRect, fitToContent, frameContainsPoint, frameCornerRotationHandleAt, frameCorners, frameEdgeHandleAt, frameHandlePosition, frameRayIntersection, frameRect, handlePosition, itemBounds, normalizeRotation, normalizeViewport, panBy, pointToWorld, radToDeg, rectCenter, rectContainsPoint, rectsIntersect, resizeFrame, resizeFrameToSize, rotateFrames, rotatePointAround, rotationHandleAnchor, rotationHandlePosition, scaleFrames, screenPoint, screenToWorld, selectionBounds, unionRects, visibleWorldRect, worldPoint, worldToScreen, zoomAround } from "./geometry.js";
|
|
8
10
|
import { ResolvedArrow, arrowBounds, arrowFrame, distanceToArrow, resolveArrow, sampleArrow, translateArrow } from "./core/arrow-geometry.js";
|
|
@@ -11,11 +13,14 @@ import { buildStrokeOutline, computeDrawBounds, distanceToStroke, sampleRadius,
|
|
|
11
13
|
import { BOARD_EXPORT_MAX_TEXTURES, BoardExportAssetSelection, selectBoardExportAssets } from "./core/export-assets.js";
|
|
12
14
|
import { BOARD_EXPORT_DEFAULT_PADDING, BOARD_EXPORT_DEFAULT_SCALE, BOARD_EXPORT_ITEM_WARN_THRESHOLD, BOARD_EXPORT_MAX_EDGE, BOARD_EXPORT_MAX_PIXELS, BoardExportPlan, BoardExportPlanInput, BoardExportRegion, boardFrameLookup, exportConnectionBounds, exportItemBounds, normalizeBoardDocument, planBoardExport } from "./core/export-plan.js";
|
|
13
15
|
import { BoardFileSnapshotFacts, BuildSnapshotInput, FILE_EXCERPT_MAX_BYTES, FILE_EXCERPT_MAX_CHARS, FileAvailability, FilePreviewKind, ResolvedCover, availabilityFromError, buildFileExcerpt, buildFileSnapshot, fileBaseName, filePreviewKind, filePreviewMemoKey, filePreviewScope, fileTypeLabel, formatFileSize, isFileSnapshotFresh, mergeFileSnapshot, readCoverFromFrontmatter, readTitleFromFrontmatter, resolveCoverRef, resolveSpacePath, shouldFetchFileExcerpt, splitFrontmatter } from "./core/file-preview.js";
|
|
14
|
-
import { BOARD_COLORS, BoardColorEntry,
|
|
16
|
+
import { BOARD_COLORS, BoardColorEntry, BoardColorValue, BoardShapeColors, DEFAULT_BOARD_COLOR, boardColorCssVar, buildFallbackShapeColors, isBoardColorId, pickBoardColor, resolveBoardColor } from "./core/palette.js";
|
|
15
17
|
import { ArrowShapeProps, AudioShapeProps, DrawShapeProps, FULL_CAPABILITIES, GEO_KINDS, GeoKind, GeoShapeProps, HandleDragResult, ImageShapeProps, ShapeCapabilities, ShapeGeometry, ShapeHandle, ShapeHandleId, ShapeResizeMode, TextShapeProps, VideoShapeProps, isGeoKind, resizeModeForCapabilities } from "./core/shape-types.js";
|
|
16
18
|
import { ShapeDefinition, definitionForItem, getShapeDefinition, registerShapeDefinition, shapeBounds, shapeCapabilities, shapeHandles, shapeHitTest, shapeResizeMode, unknownShapeDefinition } from "./core/shape-definition.js";
|
|
17
19
|
import { TEXT_FONT_FAMILY, TEXT_FONT_SIZE, TEXT_LINE_HEIGHT, TEXT_MAX_FONT_SIZE, TEXT_MIN_FONT_SIZE, boardTextLineHeight, clampBoardTextFontSize, measureBoardText, setBoardTextMeasurer } from "./core/text-metrics.js";
|
|
18
20
|
import { BoardStyledToolId, BoardToolStyleMap, BoardToolStylePatch, DEFAULT_BOARD_TOOL_STYLES, createBoardToolStyles } from "./core/tool-styles.js";
|
|
19
21
|
import { boardImageKeySource, imageAssetKey } from "./image-key.js";
|
|
20
|
-
import {
|
|
21
|
-
|
|
22
|
+
import { BoardMediaKind, getMediaExtension, getMediaResourceTitle, inferBoardMediaKind } from "./media.js";
|
|
23
|
+
import { BoardAssetSource, BoardPlayableMedia, playableBoardMedia, playableBoardMediaList, resetBoardPlaybackUrlCache } from "./media-playback.js";
|
|
24
|
+
import { BoardInputError, BoardNodeFrameInput, BoardNodeSpec, assertBoardNodes, assertBoardTransactionNodeCreates, createBoardNode, validateBoardNodes } from "./nodes.js";
|
|
25
|
+
import { featuredTaskArtifact, rankedTaskArtifacts, taskArtifactPreviewUrl, taskArtifacts, taskRunToBoardTaskSnapshot } from "./task.js";
|
|
26
|
+
export { AUTO_BOARD_CONNECTION_ANCHOR, type ArrowShapeProps, type AudioShapeProps, BOARD_COLORS, BOARD_CONNECTION_DIRECTIONS, BOARD_CONNECTION_LINES, BOARD_CONNECTION_ROUTINGS, BOARD_CONNECTION_SIDES, BOARD_DOCUMENT_KIND, BOARD_EXPORT_DEFAULT_PADDING, BOARD_EXPORT_DEFAULT_SCALE, BOARD_EXPORT_ITEM_WARN_THRESHOLD, BOARD_EXPORT_MAX_EDGE, BOARD_EXPORT_MAX_PIXELS, BOARD_EXPORT_MAX_TEXTURES, BOARD_EXTENSION, BOARD_NODE_SOURCE, BOARD_REMOTE_URL_MAX_LENGTH, BOARD_STROKE_MAX_SIZE, BOARD_STROKE_MIN_SIZE, BOARD_TASK_ARTIFACT_LIMIT, BoardAppearance, BoardAppearanceSchema, BoardArrowItem, BoardArrowItemSchema, BoardAssetSource, BoardAudioItem, BoardAudioItemSchema, BoardColorEntry, type BoardColorId, BoardColorValue, BoardConnection, BoardConnectionAnchor, BoardConnectionAnchorSchema, BoardConnectionDirection, BoardConnectionEndpoint, BoardConnectionEndpointSchema, BoardConnectionInput, BoardConnectionLine, BoardConnectionPatch, BoardConnectionPatchSchema, BoardConnectionRecord, BoardConnectionRouting, BoardConnectionRoutingConfig, BoardConnectionRoutingSchema, BoardConnectionSchema, BoardConnectionSide, BoardConnectionStyle, BoardConnectionStyleSchema, BoardConnectionWaypointSchema, BoardDocument, BoardDocumentSchema, BoardDrawItem, BoardDrawItemSchema, BoardExportAssetSelection, BoardExportPlan, BoardExportPlanInput, BoardExportRegion, BoardExtensionDefinition, BoardExtensionRegistry, BoardFileItem, BoardFileItemSchema, BoardFileSnapshot, BoardFileSnapshotFacts, BoardFileSnapshotSchema, BoardFrame, BoardFrameItem, BoardFrameItemSchema, BoardFrameSchema, BoardGeoItem, BoardGeoItemSchema, BoardImageItem, BoardImageItemSchema, BoardInputError, BoardItem, BoardItemSchema, BoardItemStyle, BoardItemStyleSchema, BoardKnownItem, type BoardManifest, BoardMediaKind, BoardMediaSnapshot, BoardMediaSnapshotSchema, BoardNodeFrameInput, type BoardNodeRecord, BoardNodeSpec, BoardPlayableMedia, BoardPoint, BoardPointSchema, BoardPresetDefinition, type BoardRecord, BoardRelationSchema, BoardRemoteUrlSchema, BoardShapeColors, BoardStyledToolId, BoardTaskArtifact, BoardTaskArtifactSchema, BoardTaskItem, BoardTaskItemSchema, BoardTaskSnapshot, BoardTaskSnapshotSchema, BoardTextItem, BoardTextItemSchema, BoardToolStyleMap, BoardToolStylePatch, BoardUnknownItem, BoardVideoItem, BoardVideoItemSchema, BoardViewport, BoardViewportSchema, BuildSnapshotInput, CONNECTION_ENDPOINT_GAP, CORNER_RESIZE_HANDLES, CORNER_ROTATION_ZONE_WIDTH, CompiledSequence, ConnectionIndex, CornerResizeHandle, DEFAULT_BOARD_APPEARANCE, DEFAULT_BOARD_COLOR, DEFAULT_BOARD_CONNECTION_ROUTING, DEFAULT_BOARD_CONNECTION_STYLE, DEFAULT_BOARD_LIMITS, DEFAULT_BOARD_RELATION, DEFAULT_BOARD_TOOL_STYLES, DrawPoint, DrawPointSchema, type DrawShapeProps, EDGE_RESIZE_HANDLES, FILE_EXCERPT_MAX_BYTES, FILE_EXCERPT_MAX_CHARS, FIT_PADDING, FULL_CAPABILITIES, FileAvailability, FilePreviewKind, FrameLookup, GEO_KINDS, type GeoKind, type GeoShapeProps, HANDLE_DIRECTION, HANDLE_HIT_RADIUS, type HandleDragResult, ITEM_BASE_KEYS, type ImageShapeProps, InvalidBoardFileError, KNOWN_BOARD_ITEM_TYPES, KnownBoardItemType, MAX_BOARD_ZOOM, MIN_BOARD_ZOOM, MIN_ITEM_SIZE, Point, QualityProfile, RESIZE_HANDLES, ROTATION_HANDLE_OFFSET, Rect, RenderBounds, ResizeHandle, ResolvedArrow, ResolvedConnection, ResolvedConnectionEndpoint, ResolvedCover, ScreenPoint, type ShapeCapabilities, ShapeDefinition, type ShapeGeometry, type ShapeHandle, type ShapeHandleId, type ShapeResizeMode, Size, SpaceFileRef, SpaceFileRefSchema, TEXT_FONT_FAMILY, TEXT_FONT_SIZE, TEXT_LINE_HEIGHT, TEXT_MAX_FONT_SIZE, TEXT_MIN_FONT_SIZE, type TextShapeProps, TimelineClipInput, TimelineInput, UNKNOWN_BOARD_ITEM_TYPE, VIEWPORT_MARGIN_RATIO, type VideoShapeProps, WireBackedBoardItem, WorldPoint, anchorPointOnFrame, anchorToWorld, angleFromCenter, arrowBounds, arrowFrame, assertBoardNodes, assertBoardTransactionNodeCreates, autoConnectionSide, availabilityFromError, boardBootstrapToDocument, boardColorCssVar, boardFrameLookup, boardImageKeySource, boardNodeToItem, boardTextLineHeight, buildFallbackShapeColors, buildFileExcerpt, buildFileSnapshot, buildStrokeOutline, clamp, clampBoardStrokeSize, clampBoardTextFontSize, clampZoom, clip, compileSequence, computeDrawBounds, connectionArrowheads, connectionBounds, connectionHitTest, connectionNodeIds, connectionOtherNodeId, connectionTouchesNode, createBoardConnection, createBoardExtensionRegistry, createBoardNode, createBoardToolStyles, createConnectionIndex, definitionForItem, degToRad, distanceToArrow, distanceToConnection, distanceToStroke, expandRect, exportConnectionBounds, exportItemBounds, featuredTaskArtifact, fileBaseName, filePreviewKind, filePreviewMemoKey, filePreviewScope, fileTypeLabel, fitToContent, flipBoardConnection, formatFileSize, frameContainsPoint, frameCornerRotationHandleAt, frameCorners, frameEdgeHandleAt, frameHandlePosition, frameRayIntersection, frameRect, getMediaExtension, getMediaResourceTitle, getShapeDefinition, handlePosition, imageAssetKey, inferBoardMediaKind, isBoardColorId, isBoardPath, isFileBackedItem, isFileSnapshotFresh, isGeoKind, isMediaItem, isRecord, isUnknownItem, itemBounds, measureBoardText, mergeFileSnapshot, nodeInputFromRecord, normalizeBoardConnectionStyle, normalizeBoardDocument, normalizeBoardRemoteUrl, normalizeRotation, normalizeViewport, panBy, parseBoardDocument, parseBoardItemLoose, parseBoardManifest, pathMidpoint, pickBoardColor, planBoardExport, playableBoardMedia, playableBoardMediaList, pointToWorld, radToDeg, rankedTaskArtifacts, readCoverFromFrontmatter, readTitleFromFrontmatter, rectCenter, rectContainsPoint, rectsIntersect, registerShapeDefinition, resetBoardPlaybackUrlCache, resizeFrame, resizeFrameToSize, resizeModeForCapabilities, resolveArrow, resolveBoardColor, resolveConnection, resolveCoverRef, resolveSpacePath, rotateFrames, rotatePointAround, rotationHandleAnchor, rotationHandlePosition, sampleArrow, sampleRadius, scaleFrames, screenPoint, screenToWorld, selectBoardExportAssets, selectionBounds, serializeBoardManifest, setBoardTextMeasurer, shapeBounds, shapeCapabilities, shapeHandles, shapeHitTest, shapeResizeMode, shouldFetchFileExcerpt, simplifyDrawIndices, sourceForItem, splitFrontmatter, taskArtifactPreviewUrl, taskArtifacts, taskRunToBoardTaskSnapshot, timeline, translateArrow, unionRects, unknownRealType, unknownShapeDefinition, validateBoardNodes, visibleWorldRect, withResolvedConnections, worldPoint, worldToAnchor, worldToScreen, zoomAround };
|
package/dist/board/index.js
CHANGED
|
@@ -2,10 +2,12 @@ import { BOARD_STROKE_MAX_SIZE, BOARD_STROKE_MIN_SIZE, clampBoardStrokeSize } fr
|
|
|
2
2
|
import { BoardExtensionRegistry, DEFAULT_BOARD_LIMITS, clip, compileSequence, createBoardExtensionRegistry, timeline } from "./animation.js";
|
|
3
3
|
import { AUTO_BOARD_CONNECTION_ANCHOR, BOARD_CONNECTION_DIRECTIONS, BOARD_CONNECTION_LINES, BOARD_CONNECTION_ROUTINGS, BOARD_CONNECTION_SIDES, BoardConnectionAnchorSchema, BoardConnectionEndpointSchema, BoardConnectionPatchSchema, BoardConnectionRoutingSchema, BoardConnectionSchema, BoardConnectionStyleSchema, BoardConnectionWaypointSchema, BoardRelationSchema, DEFAULT_BOARD_CONNECTION_ROUTING, DEFAULT_BOARD_CONNECTION_STYLE, DEFAULT_BOARD_RELATION, connectionNodeIds, connectionOtherNodeId, connectionTouchesNode, createBoardConnection, flipBoardConnection, normalizeBoardConnectionStyle } from "../protocol/dist/board-connection.js";
|
|
4
4
|
import { BOARD_DOCUMENT_KIND, BOARD_EXTENSION, InvalidBoardFileError, isBoardPath, parseBoardManifest, serializeBoardManifest } from "../protocol/dist/board.js";
|
|
5
|
-
import {
|
|
5
|
+
import { BOARD_REMOTE_URL_MAX_LENGTH, BoardRemoteUrlSchema, normalizeBoardRemoteUrl } from "../protocol/dist/board-url.js";
|
|
6
|
+
import { BOARD_TASK_ARTIFACT_LIMIT, BoardAppearanceSchema, BoardArrowItemSchema, BoardAudioItemSchema, BoardDocumentSchema, BoardDrawItemSchema, BoardFileItemSchema, BoardFileSnapshotSchema, BoardFrameItemSchema, BoardFrameSchema, BoardGeoItemSchema, BoardImageItemSchema, BoardItemSchema, BoardItemStyleSchema, BoardMediaSnapshotSchema, BoardPointSchema, BoardTaskArtifactSchema, BoardTaskItemSchema, BoardTaskSnapshotSchema, BoardTextItemSchema, BoardVideoItemSchema, BoardViewportSchema, DrawPointSchema, KNOWN_BOARD_ITEM_TYPES, SpaceFileRefSchema, UNKNOWN_BOARD_ITEM_TYPE, isFileBackedItem, isMediaItem, isUnknownItem, parseBoardDocument, parseBoardItemLoose, unknownRealType, withResolvedConnections } from "../protocol/dist/board-document.js";
|
|
6
7
|
import { TEXT_FONT_FAMILY, TEXT_FONT_SIZE, TEXT_LINE_HEIGHT, TEXT_MAX_FONT_SIZE, TEXT_MIN_FONT_SIZE, boardTextLineHeight, clampBoardTextFontSize, measureBoardText, setBoardTextMeasurer } from "./core/text-metrics.js";
|
|
7
8
|
import { BOARD_NODE_SOURCE, DEFAULT_BOARD_APPEARANCE, ITEM_BASE_KEYS, boardBootstrapToDocument, boardNodeToItem, isRecord, nodeInputFromRecord, sourceForItem } from "./codec.js";
|
|
8
9
|
import { CORNER_RESIZE_HANDLES, CORNER_ROTATION_ZONE_WIDTH, EDGE_RESIZE_HANDLES, FIT_PADDING, HANDLE_DIRECTION, HANDLE_HIT_RADIUS, MAX_BOARD_ZOOM, MIN_BOARD_ZOOM, MIN_ITEM_SIZE, RESIZE_HANDLES, ROTATION_HANDLE_OFFSET, VIEWPORT_MARGIN_RATIO, angleFromCenter, clamp, clampZoom, degToRad, expandRect, fitToContent, frameContainsPoint, frameCornerRotationHandleAt, frameCorners, frameEdgeHandleAt, frameHandlePosition, frameRayIntersection, frameRect, handlePosition, itemBounds, normalizeRotation, normalizeViewport, panBy, pointToWorld, radToDeg, rectCenter, rectContainsPoint, rectsIntersect, resizeFrame, resizeFrameToSize, rotateFrames, rotatePointAround, rotationHandleAnchor, rotationHandlePosition, scaleFrames, screenPoint, screenToWorld, selectionBounds, unionRects, visibleWorldRect, worldPoint, worldToScreen, zoomAround } from "./geometry.js";
|
|
10
|
+
import { featuredTaskArtifact, rankedTaskArtifacts, taskArtifactPreviewUrl, taskArtifacts, taskRunToBoardTaskSnapshot } from "./task.js";
|
|
9
11
|
import { boardImageKeySource, imageAssetKey } from "./image-key.js";
|
|
10
12
|
import { arrowBounds, arrowFrame, distanceToArrow, resolveArrow, sampleArrow, translateArrow } from "./core/arrow-geometry.js";
|
|
11
13
|
import { CONNECTION_ENDPOINT_GAP, anchorPointOnFrame, anchorToWorld, autoConnectionSide, connectionArrowheads, connectionBounds, connectionHitTest, createConnectionIndex, distanceToConnection, pathMidpoint, resolveConnection, worldToAnchor } from "./core/connections.js";
|
|
@@ -17,5 +19,7 @@ import { BOARD_COLORS, DEFAULT_BOARD_COLOR, boardColorCssVar, buildFallbackShape
|
|
|
17
19
|
import { FULL_CAPABILITIES, GEO_KINDS, isGeoKind, resizeModeForCapabilities } from "./core/shape-types.js";
|
|
18
20
|
import { definitionForItem, getShapeDefinition, registerShapeDefinition, shapeBounds, shapeCapabilities, shapeHandles, shapeHitTest, shapeResizeMode, unknownShapeDefinition } from "./core/shape-definition.js";
|
|
19
21
|
import { DEFAULT_BOARD_TOOL_STYLES, createBoardToolStyles } from "./core/tool-styles.js";
|
|
20
|
-
import {
|
|
21
|
-
|
|
22
|
+
import { getMediaExtension, getMediaResourceTitle, inferBoardMediaKind } from "./media.js";
|
|
23
|
+
import { playableBoardMedia, playableBoardMediaList, resetBoardPlaybackUrlCache } from "./media-playback.js";
|
|
24
|
+
import { BoardInputError, assertBoardNodes, assertBoardTransactionNodeCreates, createBoardNode, validateBoardNodes } from "./nodes.js";
|
|
25
|
+
export { AUTO_BOARD_CONNECTION_ANCHOR, BOARD_COLORS, BOARD_CONNECTION_DIRECTIONS, BOARD_CONNECTION_LINES, BOARD_CONNECTION_ROUTINGS, BOARD_CONNECTION_SIDES, BOARD_DOCUMENT_KIND, BOARD_EXPORT_DEFAULT_PADDING, BOARD_EXPORT_DEFAULT_SCALE, BOARD_EXPORT_ITEM_WARN_THRESHOLD, BOARD_EXPORT_MAX_EDGE, BOARD_EXPORT_MAX_PIXELS, BOARD_EXPORT_MAX_TEXTURES, BOARD_EXTENSION, BOARD_NODE_SOURCE, BOARD_REMOTE_URL_MAX_LENGTH, BOARD_STROKE_MAX_SIZE, BOARD_STROKE_MIN_SIZE, BOARD_TASK_ARTIFACT_LIMIT, BoardAppearanceSchema, BoardArrowItemSchema, BoardAudioItemSchema, BoardConnectionAnchorSchema, BoardConnectionEndpointSchema, BoardConnectionPatchSchema, BoardConnectionRoutingSchema, BoardConnectionSchema, BoardConnectionStyleSchema, BoardConnectionWaypointSchema, BoardDocumentSchema, BoardDrawItemSchema, BoardExtensionRegistry, BoardFileItemSchema, BoardFileSnapshotSchema, BoardFrameItemSchema, BoardFrameSchema, BoardGeoItemSchema, BoardImageItemSchema, BoardInputError, BoardItemSchema, BoardItemStyleSchema, BoardMediaSnapshotSchema, BoardPointSchema, BoardRelationSchema, BoardRemoteUrlSchema, BoardTaskArtifactSchema, BoardTaskItemSchema, BoardTaskSnapshotSchema, BoardTextItemSchema, BoardVideoItemSchema, BoardViewportSchema, CONNECTION_ENDPOINT_GAP, CORNER_RESIZE_HANDLES, CORNER_ROTATION_ZONE_WIDTH, DEFAULT_BOARD_APPEARANCE, DEFAULT_BOARD_COLOR, DEFAULT_BOARD_CONNECTION_ROUTING, DEFAULT_BOARD_CONNECTION_STYLE, DEFAULT_BOARD_LIMITS, DEFAULT_BOARD_RELATION, DEFAULT_BOARD_TOOL_STYLES, DrawPointSchema, EDGE_RESIZE_HANDLES, FILE_EXCERPT_MAX_BYTES, FILE_EXCERPT_MAX_CHARS, FIT_PADDING, FULL_CAPABILITIES, GEO_KINDS, HANDLE_DIRECTION, HANDLE_HIT_RADIUS, ITEM_BASE_KEYS, InvalidBoardFileError, KNOWN_BOARD_ITEM_TYPES, MAX_BOARD_ZOOM, MIN_BOARD_ZOOM, MIN_ITEM_SIZE, RESIZE_HANDLES, ROTATION_HANDLE_OFFSET, SpaceFileRefSchema, TEXT_FONT_FAMILY, TEXT_FONT_SIZE, TEXT_LINE_HEIGHT, TEXT_MAX_FONT_SIZE, TEXT_MIN_FONT_SIZE, UNKNOWN_BOARD_ITEM_TYPE, VIEWPORT_MARGIN_RATIO, anchorPointOnFrame, anchorToWorld, angleFromCenter, arrowBounds, arrowFrame, assertBoardNodes, assertBoardTransactionNodeCreates, autoConnectionSide, availabilityFromError, boardBootstrapToDocument, boardColorCssVar, boardFrameLookup, boardImageKeySource, boardNodeToItem, boardTextLineHeight, buildFallbackShapeColors, buildFileExcerpt, buildFileSnapshot, buildStrokeOutline, clamp, clampBoardStrokeSize, clampBoardTextFontSize, clampZoom, clip, compileSequence, computeDrawBounds, connectionArrowheads, connectionBounds, connectionHitTest, connectionNodeIds, connectionOtherNodeId, connectionTouchesNode, createBoardConnection, createBoardExtensionRegistry, createBoardNode, createBoardToolStyles, createConnectionIndex, definitionForItem, degToRad, distanceToArrow, distanceToConnection, distanceToStroke, expandRect, exportConnectionBounds, exportItemBounds, featuredTaskArtifact, fileBaseName, filePreviewKind, filePreviewMemoKey, filePreviewScope, fileTypeLabel, fitToContent, flipBoardConnection, formatFileSize, frameContainsPoint, frameCornerRotationHandleAt, frameCorners, frameEdgeHandleAt, frameHandlePosition, frameRayIntersection, frameRect, getMediaExtension, getMediaResourceTitle, getShapeDefinition, handlePosition, imageAssetKey, inferBoardMediaKind, isBoardColorId, isBoardPath, isFileBackedItem, isFileSnapshotFresh, isGeoKind, isMediaItem, isRecord, isUnknownItem, itemBounds, measureBoardText, mergeFileSnapshot, nodeInputFromRecord, normalizeBoardConnectionStyle, normalizeBoardDocument, normalizeBoardRemoteUrl, normalizeRotation, normalizeViewport, panBy, parseBoardDocument, parseBoardItemLoose, parseBoardManifest, pathMidpoint, pickBoardColor, planBoardExport, playableBoardMedia, playableBoardMediaList, pointToWorld, radToDeg, rankedTaskArtifacts, readCoverFromFrontmatter, readTitleFromFrontmatter, rectCenter, rectContainsPoint, rectsIntersect, registerShapeDefinition, resetBoardPlaybackUrlCache, resizeFrame, resizeFrameToSize, resizeModeForCapabilities, resolveArrow, resolveBoardColor, resolveConnection, resolveCoverRef, resolveSpacePath, rotateFrames, rotatePointAround, rotationHandleAnchor, rotationHandlePosition, sampleArrow, sampleRadius, scaleFrames, screenPoint, screenToWorld, selectBoardExportAssets, selectionBounds, serializeBoardManifest, setBoardTextMeasurer, shapeBounds, shapeCapabilities, shapeHandles, shapeHitTest, shapeResizeMode, shouldFetchFileExcerpt, simplifyDrawIndices, sourceForItem, splitFrontmatter, taskArtifactPreviewUrl, taskArtifacts, taskRunToBoardTaskSnapshot, timeline, translateArrow, unionRects, unknownRealType, unknownShapeDefinition, validateBoardNodes, visibleWorldRect, withResolvedConnections, worldPoint, worldToAnchor, worldToScreen, zoomAround };
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { BoardItem } from "../protocol/dist/board-document.js";
|
|
2
|
+
//#region src/board/media-playback.d.ts
|
|
3
|
+
type BoardAssetSource = {
|
|
4
|
+
/** Displayable preview URL for a workspace-file reference. */
|
|
5
|
+
resolveFileUrl: (path: string) => Promise<string | null>;
|
|
6
|
+
/** Streamable URL for audio/video. Never return an inline data URL. */
|
|
7
|
+
resolvePlaybackUrl?: (path: string) => Promise<string | null>;
|
|
8
|
+
};
|
|
9
|
+
type BoardPlayableMedia = {
|
|
10
|
+
id: string;
|
|
11
|
+
kind: "video" | "audio";
|
|
12
|
+
title: string;
|
|
13
|
+
durationMs?: number;
|
|
14
|
+
resolveUrl: () => Promise<string | null>;
|
|
15
|
+
/** Drop a failed or expired resolved URL without affecting other media. */
|
|
16
|
+
invalidateUrl: () => void;
|
|
17
|
+
};
|
|
18
|
+
declare function playableBoardMediaList(item: BoardItem | null, assetSource: BoardAssetSource): BoardPlayableMedia[];
|
|
19
|
+
declare function playableBoardMedia(item: BoardItem | null, assetSource: BoardAssetSource, artifactId?: string | null): BoardPlayableMedia | null;
|
|
20
|
+
declare function resetBoardPlaybackUrlCache(): void;
|
|
21
|
+
//#endregion
|
|
22
|
+
export { BoardAssetSource, BoardPlayableMedia, playableBoardMedia, playableBoardMediaList, resetBoardPlaybackUrlCache };
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { rankedTaskArtifacts } from "./task.js";
|
|
2
|
+
//#region src/board/media-playback.ts
|
|
3
|
+
const resolvedUrls = /* @__PURE__ */ new Map();
|
|
4
|
+
const sourceIds = /* @__PURE__ */ new WeakMap();
|
|
5
|
+
const URL_CACHE_LIMIT = 64;
|
|
6
|
+
let nextSourceId = 1;
|
|
7
|
+
function sourceId(source) {
|
|
8
|
+
let id = sourceIds.get(source);
|
|
9
|
+
if (id === void 0) {
|
|
10
|
+
id = nextSourceId;
|
|
11
|
+
nextSourceId += 1;
|
|
12
|
+
sourceIds.set(source, id);
|
|
13
|
+
}
|
|
14
|
+
return id;
|
|
15
|
+
}
|
|
16
|
+
function invalidateCachedUrl(key) {
|
|
17
|
+
resolvedUrls.delete(key);
|
|
18
|
+
}
|
|
19
|
+
function cachedUrl(key, resolve) {
|
|
20
|
+
let pending = resolvedUrls.get(key);
|
|
21
|
+
if (!pending) {
|
|
22
|
+
if (resolvedUrls.size >= URL_CACHE_LIMIT) {
|
|
23
|
+
const oldest = resolvedUrls.keys().next().value;
|
|
24
|
+
if (oldest !== void 0) resolvedUrls.delete(oldest);
|
|
25
|
+
}
|
|
26
|
+
pending = resolve().catch(() => null).then((url) => {
|
|
27
|
+
if (!url) resolvedUrls.delete(key);
|
|
28
|
+
return url;
|
|
29
|
+
});
|
|
30
|
+
resolvedUrls.set(key, pending);
|
|
31
|
+
}
|
|
32
|
+
return pending;
|
|
33
|
+
}
|
|
34
|
+
function playableBoardMediaList(item, assetSource) {
|
|
35
|
+
if (item?.type === "video" || item?.type === "audio") {
|
|
36
|
+
const path = item.ref.path;
|
|
37
|
+
const version = item.snapshot?.mtimeMs ?? "unknown";
|
|
38
|
+
const cacheKey = `${sourceId(assetSource)}:${item.type}:file:${path}:${version}`;
|
|
39
|
+
const durationMs = item.type === "audio" ? item.snapshot?.durationMs : void 0;
|
|
40
|
+
return [{
|
|
41
|
+
id: item.id,
|
|
42
|
+
kind: item.type,
|
|
43
|
+
title: item.snapshot?.title ?? path.split("/").pop() ?? item.type,
|
|
44
|
+
...durationMs ? { durationMs } : {},
|
|
45
|
+
resolveUrl: () => cachedUrl(cacheKey, () => (assetSource.resolvePlaybackUrl ?? assetSource.resolveFileUrl)(path)),
|
|
46
|
+
invalidateUrl: () => invalidateCachedUrl(cacheKey)
|
|
47
|
+
}];
|
|
48
|
+
}
|
|
49
|
+
if (item?.type !== "task") return [];
|
|
50
|
+
return rankedTaskArtifacts(item.snapshot.artifacts).filter((artifact) => artifact.type === "video" || artifact.type === "audio").map((artifact) => ({
|
|
51
|
+
id: artifact.id,
|
|
52
|
+
kind: artifact.type,
|
|
53
|
+
title: artifact.title ?? item.snapshot.title,
|
|
54
|
+
...artifact.durationMs ? { durationMs: artifact.durationMs } : {},
|
|
55
|
+
resolveUrl: () => Promise.resolve(artifact.url),
|
|
56
|
+
invalidateUrl: () => {}
|
|
57
|
+
}));
|
|
58
|
+
}
|
|
59
|
+
function playableBoardMedia(item, assetSource, artifactId) {
|
|
60
|
+
const media = playableBoardMediaList(item, assetSource);
|
|
61
|
+
return media.find((entry) => entry.id === artifactId) ?? media[0] ?? null;
|
|
62
|
+
}
|
|
63
|
+
function resetBoardPlaybackUrlCache() {
|
|
64
|
+
resolvedUrls.clear();
|
|
65
|
+
}
|
|
66
|
+
//#endregion
|
|
67
|
+
export { playableBoardMedia, playableBoardMediaList, resetBoardPlaybackUrlCache };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
//#region src/board/media.d.ts
|
|
2
|
+
type BoardMediaKind = "image" | "video" | "audio" | "text" | "file";
|
|
3
|
+
declare function getMediaExtension(value: string): string;
|
|
4
|
+
declare function inferBoardMediaKind(value: string, mimeType?: string | null): BoardMediaKind;
|
|
5
|
+
declare function getMediaResourceTitle(value: string): string;
|
|
6
|
+
//#endregion
|
|
7
|
+
export { BoardMediaKind, getMediaExtension, getMediaResourceTitle, inferBoardMediaKind };
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
//#region src/board/media.ts
|
|
2
|
+
const IMAGE_EXTENSIONS = /* @__PURE__ */ new Set([
|
|
3
|
+
"png",
|
|
4
|
+
"jpg",
|
|
5
|
+
"jpeg",
|
|
6
|
+
"gif",
|
|
7
|
+
"webp",
|
|
8
|
+
"avif",
|
|
9
|
+
"svg"
|
|
10
|
+
]);
|
|
11
|
+
const VIDEO_EXTENSIONS = /* @__PURE__ */ new Set([
|
|
12
|
+
"mp4",
|
|
13
|
+
"webm",
|
|
14
|
+
"mov",
|
|
15
|
+
"m4v"
|
|
16
|
+
]);
|
|
17
|
+
const AUDIO_EXTENSIONS = /* @__PURE__ */ new Set([
|
|
18
|
+
"mp3",
|
|
19
|
+
"wav",
|
|
20
|
+
"ogg",
|
|
21
|
+
"m4a",
|
|
22
|
+
"aac",
|
|
23
|
+
"flac",
|
|
24
|
+
"opus"
|
|
25
|
+
]);
|
|
26
|
+
const TEXT_EXTENSIONS = /* @__PURE__ */ new Set([
|
|
27
|
+
"txt",
|
|
28
|
+
"md",
|
|
29
|
+
"json",
|
|
30
|
+
"yaml",
|
|
31
|
+
"yml",
|
|
32
|
+
"csv",
|
|
33
|
+
"ts",
|
|
34
|
+
"tsx",
|
|
35
|
+
"js",
|
|
36
|
+
"jsx",
|
|
37
|
+
"css",
|
|
38
|
+
"html",
|
|
39
|
+
"xml",
|
|
40
|
+
"py",
|
|
41
|
+
"sh"
|
|
42
|
+
]);
|
|
43
|
+
function getMediaExtension(value) {
|
|
44
|
+
const clean = value.split(/[?#]/, 1)[0] ?? value;
|
|
45
|
+
const name = clean.split("/").pop() ?? clean;
|
|
46
|
+
const index = name.lastIndexOf(".");
|
|
47
|
+
return index >= 0 ? name.slice(index + 1).toLowerCase() : "";
|
|
48
|
+
}
|
|
49
|
+
function inferBoardMediaKind(value, mimeType) {
|
|
50
|
+
if (mimeType?.startsWith("image/")) return "image";
|
|
51
|
+
if (mimeType?.startsWith("video/")) return "video";
|
|
52
|
+
if (mimeType?.startsWith("audio/")) return "audio";
|
|
53
|
+
if (mimeType?.startsWith("text/") || mimeType === "application/json") return "text";
|
|
54
|
+
const extension = getMediaExtension(value);
|
|
55
|
+
if (IMAGE_EXTENSIONS.has(extension)) return "image";
|
|
56
|
+
if (VIDEO_EXTENSIONS.has(extension)) return "video";
|
|
57
|
+
if (AUDIO_EXTENSIONS.has(extension)) return "audio";
|
|
58
|
+
if (TEXT_EXTENSIONS.has(extension)) return "text";
|
|
59
|
+
return "file";
|
|
60
|
+
}
|
|
61
|
+
function getMediaResourceTitle(value) {
|
|
62
|
+
try {
|
|
63
|
+
const url = new URL(value);
|
|
64
|
+
return decodeURIComponent(url.pathname.split("/").filter(Boolean).pop() || url.hostname);
|
|
65
|
+
} catch {
|
|
66
|
+
return value.split("/").filter(Boolean).pop() || value;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
//#endregion
|
|
70
|
+
export { getMediaExtension, getMediaResourceTitle, inferBoardMediaKind };
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { BoardColorId, BoardGeoKind, BoardNodeValidationDiagnostic } from "../protocol/dist/board-node.js";
|
|
2
|
+
import { BoardNodeInput } from "../protocol/dist/board.js";
|
|
3
|
+
import "../protocol/dist/index.js";
|
|
4
|
+
import { BoardAudioItem, BoardFileSnapshot, BoardMediaSnapshot, BoardTaskSnapshot } from "../protocol/dist/board-document.js";
|
|
5
|
+
//#region src/board/nodes.d.ts
|
|
6
|
+
type BoardNodeFrameInput = {
|
|
7
|
+
x: number;
|
|
8
|
+
y: number;
|
|
9
|
+
width: number;
|
|
10
|
+
height: number;
|
|
11
|
+
rotation?: number;
|
|
12
|
+
};
|
|
13
|
+
type BoardNodeSpecBase = {
|
|
14
|
+
id: string;
|
|
15
|
+
parentId?: string | null;
|
|
16
|
+
orderKey?: string | null;
|
|
17
|
+
style?: Record<string, unknown>;
|
|
18
|
+
};
|
|
19
|
+
type BoardBoxNodeSpec = BoardNodeSpecBase & {
|
|
20
|
+
frame: BoardNodeFrameInput;
|
|
21
|
+
};
|
|
22
|
+
type BoardMediaNodeSpec = BoardBoxNodeSpec & {
|
|
23
|
+
path: string;
|
|
24
|
+
snapshot?: BoardMediaSnapshot;
|
|
25
|
+
};
|
|
26
|
+
type BoardNodeSpec = (BoardBoxNodeSpec & {
|
|
27
|
+
type: "text";
|
|
28
|
+
text?: string;
|
|
29
|
+
color?: BoardColorId;
|
|
30
|
+
fontSize?: number;
|
|
31
|
+
}) | (BoardBoxNodeSpec & {
|
|
32
|
+
type: "geo";
|
|
33
|
+
geo?: BoardGeoKind;
|
|
34
|
+
text?: string;
|
|
35
|
+
color?: BoardColorId;
|
|
36
|
+
fillOpacity?: number;
|
|
37
|
+
}) | (BoardNodeSpecBase & {
|
|
38
|
+
type: "draw";
|
|
39
|
+
/** Raw world-space samples. Stored points are converted to frame-local space. */
|
|
40
|
+
points: Array<{
|
|
41
|
+
x: number;
|
|
42
|
+
y: number;
|
|
43
|
+
p?: number;
|
|
44
|
+
}>;
|
|
45
|
+
color?: BoardColorId;
|
|
46
|
+
size?: number;
|
|
47
|
+
}) | (BoardNodeSpecBase & {
|
|
48
|
+
type: "arrow";
|
|
49
|
+
start: {
|
|
50
|
+
x: number;
|
|
51
|
+
y: number;
|
|
52
|
+
};
|
|
53
|
+
end: {
|
|
54
|
+
x: number;
|
|
55
|
+
y: number;
|
|
56
|
+
};
|
|
57
|
+
bend?: number;
|
|
58
|
+
color?: BoardColorId;
|
|
59
|
+
size?: number;
|
|
60
|
+
arrowStart?: boolean;
|
|
61
|
+
arrowEnd?: boolean;
|
|
62
|
+
label?: string;
|
|
63
|
+
}) | (BoardBoxNodeSpec & {
|
|
64
|
+
type: "frame";
|
|
65
|
+
label?: string;
|
|
66
|
+
color?: BoardColorId;
|
|
67
|
+
}) | (BoardMediaNodeSpec & {
|
|
68
|
+
type: "image";
|
|
69
|
+
crop?: {
|
|
70
|
+
x: number;
|
|
71
|
+
y: number;
|
|
72
|
+
w: number;
|
|
73
|
+
h: number;
|
|
74
|
+
};
|
|
75
|
+
}) | (BoardMediaNodeSpec & {
|
|
76
|
+
type: "video";
|
|
77
|
+
}) | (Omit<BoardMediaNodeSpec, "snapshot"> & {
|
|
78
|
+
type: "audio";
|
|
79
|
+
snapshot?: BoardAudioItem["snapshot"];
|
|
80
|
+
}) | (BoardBoxNodeSpec & {
|
|
81
|
+
type: "file";
|
|
82
|
+
path: string;
|
|
83
|
+
snapshot?: BoardFileSnapshot;
|
|
84
|
+
}) | (BoardBoxNodeSpec & {
|
|
85
|
+
type: "task";
|
|
86
|
+
taskRunId: string;
|
|
87
|
+
snapshot: BoardTaskSnapshot;
|
|
88
|
+
});
|
|
89
|
+
declare class BoardInputError extends Error {
|
|
90
|
+
readonly code = "INVALID_BOARD_NODE";
|
|
91
|
+
readonly diagnostics: BoardNodeValidationDiagnostic[];
|
|
92
|
+
readonly body: {
|
|
93
|
+
code: "INVALID_BOARD_NODE";
|
|
94
|
+
message: string;
|
|
95
|
+
diagnostics: BoardNodeValidationDiagnostic[];
|
|
96
|
+
};
|
|
97
|
+
constructor(diagnostics: BoardNodeValidationDiagnostic[]);
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Create one validated wire node from semantic Board input.
|
|
101
|
+
*
|
|
102
|
+
* Box nodes take an explicit world-space frame. Draw samples and arrow endpoints
|
|
103
|
+
* take world coordinates; the builder derives their frame and local storage form.
|
|
104
|
+
*/
|
|
105
|
+
declare function createBoardNode(spec: BoardNodeSpec): BoardNodeInput;
|
|
106
|
+
declare function validateBoardNodes(nodes: readonly BoardNodeInput[], path?: string): BoardNodeValidationDiagnostic[];
|
|
107
|
+
declare function assertBoardNodes(nodes: readonly BoardNodeInput[], path?: string): void;
|
|
108
|
+
declare function assertBoardTransactionNodeCreates(operations: ReadonlyArray<{
|
|
109
|
+
type: string;
|
|
110
|
+
payload: unknown;
|
|
111
|
+
}>): void;
|
|
112
|
+
//#endregion
|
|
113
|
+
export { BoardInputError, BoardNodeFrameInput, BoardNodeSpec, assertBoardNodes, assertBoardTransactionNodeCreates, createBoardNode, validateBoardNodes };
|