@neta-art/cohub 5.9.0 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/README.md +42 -46
  2. package/dist/board/animation.d.ts +156 -67
  3. package/dist/board/animation.js +162 -277
  4. package/dist/board/codec.js +1 -1
  5. package/dist/board/export/index.d.ts +6 -0
  6. package/dist/board/export/index.js +6 -3
  7. package/dist/board/export/scene.d.ts +6 -0
  8. package/dist/board/export/scene.js +26 -2
  9. package/dist/board/geometry.d.ts +27 -1
  10. package/dist/board/geometry.js +92 -1
  11. package/dist/board/headless/index.d.ts +7 -1
  12. package/dist/board/headless/index.js +6 -2
  13. package/dist/board/index.d.ts +8 -6
  14. package/dist/board/index.js +7 -6
  15. package/dist/board/mutation.d.ts +15 -0
  16. package/dist/board/mutation.js +67 -0
  17. package/dist/board/render/css-color.d.ts +4 -0
  18. package/dist/board/render/css-color.js +36 -0
  19. package/dist/board/render/index.d.ts +2 -1
  20. package/dist/board/render/index.js +2 -1
  21. package/dist/board/render/renderers/base-card-renderer.js +3 -20
  22. package/dist/board/render/themes/clean-theme.js +6 -3
  23. package/dist/chunks/http.d.ts +30 -7
  24. package/dist/chunks/http.js +785 -289
  25. package/dist/chunks/websocket.d.ts +2675 -187
  26. package/dist/http.d.ts +3 -3
  27. package/dist/index.d.ts +158 -299
  28. package/dist/index.js +164 -279
  29. package/dist/protocol/dist/board-authoring.d.ts +1 -0
  30. package/dist/protocol/dist/board-authoring.js +217 -0
  31. package/dist/protocol/dist/board-capability-registry.d.ts +2 -0
  32. package/dist/protocol/dist/board-capability-registry.js +74 -0
  33. package/dist/protocol/dist/board-codec.d.ts +2 -0
  34. package/dist/protocol/dist/board-codec.js +4 -0
  35. package/dist/protocol/dist/board-composition.d.ts +258 -0
  36. package/dist/protocol/dist/board-composition.js +318 -0
  37. package/dist/protocol/dist/board-constants.d.ts +2 -1
  38. package/dist/protocol/dist/board-constants.js +40 -10
  39. package/dist/protocol/dist/board-document.d.ts +28 -2
  40. package/dist/protocol/dist/board-document.js +16 -3
  41. package/dist/protocol/dist/board-node.d.ts +1 -11
  42. package/dist/protocol/dist/board-node.js +1 -81
  43. package/dist/protocol/dist/board-upgrade.d.ts +1 -0
  44. package/dist/protocol/dist/board-upgrade.js +2 -0
  45. package/dist/protocol/dist/board-url.d.ts +2 -1
  46. package/dist/protocol/dist/board-url.js +8 -3
  47. package/dist/protocol/dist/board.d.ts +135 -76
  48. package/dist/protocol/dist/board.js +50 -69
  49. package/dist/protocol/dist/index.d.ts +9 -4
  50. package/dist/protocol/dist/index.js +9 -4
  51. package/dist/types.d.ts +3 -2
  52. package/docs/work-runtime-guide.md +19 -3
  53. package/package.json +3 -2
  54. package/dist/board/nodes.d.ts +0 -113
  55. package/dist/board/nodes.js +0 -154
@@ -1,5 +1,6 @@
1
- import { BoardCapability, BoardRenderCost } from "./board-constants.js";
2
- import "./board-connection.js";
1
+ import { BoardCapability, BoardCoordinateSpace, BoardRenderCost } from "./board-constants.js";
2
+ import { BoardConnectionInput, BoardConnectionPatch } from "./board-connection.js";
3
+ import { BoardComposition } from "./board-composition.js";
3
4
  import "./board-node.js";
4
5
  import { z } from "zod";
5
6
  //#region ../protocol/dist/board.d.ts
@@ -18,17 +19,56 @@ declare class InvalidBoardFileError extends Error {
18
19
  }
19
20
  declare function parseBoardManifest(input: string | unknown): BoardManifest;
20
21
  declare function serializeBoardManifest(manifest: BoardManifest): string;
21
- declare const BoardTargetSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
22
- type: z.ZodLiteral<"node">;
23
- nodeId: z.ZodString;
22
+ declare const BoardCameraStateSchema: z.ZodObject<{
23
+ centerX: z.ZodNumber;
24
+ centerY: z.ZodNumber;
25
+ zoom: z.ZodNumber;
26
+ }, z.core.$strip>;
27
+ declare const BoardCameraFocusSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
28
+ type: z.ZodLiteral<"rect">;
29
+ rect: z.ZodObject<{
30
+ x: z.ZodNumber;
31
+ y: z.ZodNumber;
32
+ width: z.ZodNumber;
33
+ height: z.ZodNumber;
34
+ }, z.core.$strip>;
24
35
  }, z.core.$strip>, z.ZodObject<{
25
- type: z.ZodLiteral<"effect">;
26
- effectId: z.ZodString;
36
+ type: z.ZodLiteral<"item">;
37
+ itemId: z.ZodString;
27
38
  }, z.core.$strip>, z.ZodObject<{
28
- type: z.ZodLiteral<"board">;
39
+ type: z.ZodLiteral<"items">;
40
+ itemIds: z.ZodArray<z.ZodString>;
29
41
  }, z.core.$strip>, z.ZodObject<{
30
- type: z.ZodLiteral<"camera">;
42
+ type: z.ZodLiteral<"frame">;
43
+ frameId: z.ZodString;
31
44
  }, z.core.$strip>], "type">;
45
+ declare const BoardCameraFocusParamsSchema: z.ZodObject<{
46
+ focus: z.ZodDiscriminatedUnion<[z.ZodObject<{
47
+ type: z.ZodLiteral<"rect">;
48
+ rect: z.ZodObject<{
49
+ x: z.ZodNumber;
50
+ y: z.ZodNumber;
51
+ width: z.ZodNumber;
52
+ height: z.ZodNumber;
53
+ }, z.core.$strip>;
54
+ }, z.core.$strip>, z.ZodObject<{
55
+ type: z.ZodLiteral<"item">;
56
+ itemId: z.ZodString;
57
+ }, z.core.$strip>, z.ZodObject<{
58
+ type: z.ZodLiteral<"items">;
59
+ itemIds: z.ZodArray<z.ZodString>;
60
+ }, z.core.$strip>, z.ZodObject<{
61
+ type: z.ZodLiteral<"frame">;
62
+ frameId: z.ZodString;
63
+ }, z.core.$strip>], "type">;
64
+ fit: z.ZodDefault<z.ZodEnum<{
65
+ contain: "contain";
66
+ cover: "cover";
67
+ }>>;
68
+ padding: z.ZodDefault<z.ZodNumber>;
69
+ minZoom: z.ZodOptional<z.ZodNumber>;
70
+ maxZoom: z.ZodOptional<z.ZodNumber>;
71
+ }, z.core.$strip>;
32
72
  declare const BoardAssetRefSchema: z.ZodObject<{
33
73
  type: z.ZodEnum<{
34
74
  extension: "extension";
@@ -37,63 +77,15 @@ declare const BoardAssetRefSchema: z.ZodObject<{
37
77
  ref: z.ZodString;
38
78
  digest: z.ZodOptional<z.ZodString>;
39
79
  }, z.core.$strip>;
40
- declare const BoardClipSchema: z.ZodObject<{
41
- id: z.ZodString;
42
- sequenceId: z.ZodString;
43
- kind: z.ZodString;
44
- kindVersion: z.ZodNumber;
45
- target: z.ZodDiscriminatedUnion<[z.ZodObject<{
46
- type: z.ZodLiteral<"node">;
47
- nodeId: z.ZodString;
48
- }, z.core.$strip>, z.ZodObject<{
49
- type: z.ZodLiteral<"effect">;
50
- effectId: z.ZodString;
51
- }, z.core.$strip>, z.ZodObject<{
52
- type: z.ZodLiteral<"board">;
53
- }, z.core.$strip>, z.ZodObject<{
54
- type: z.ZodLiteral<"camera">;
55
- }, z.core.$strip>], "type">;
56
- start: z.ZodNumber;
57
- duration: z.ZodNumber;
58
- layer: z.ZodDefault<z.ZodEnum<{
59
- behind: "behind";
60
- content: "content";
61
- front: "front";
62
- screen: "screen";
63
- }>>;
64
- fill: z.ZodDefault<z.ZodEnum<{
65
- backwards: "backwards";
66
- both: "both";
67
- forwards: "forwards";
68
- none: "none";
69
- }>>;
70
- easing: z.ZodDefault<z.ZodString>;
71
- params: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
72
- keyframes: z.ZodDefault<z.ZodArray<z.ZodObject<{
73
- at: z.ZodNumber;
74
- value: z.ZodUnknown;
75
- easing: z.ZodOptional<z.ZodString>;
76
- }, z.core.$strip>>>;
77
- assetRefs: z.ZodDefault<z.ZodArray<z.ZodObject<{
78
- type: z.ZodEnum<{
79
- extension: "extension";
80
- "space-file": "space-file";
81
- }>;
82
- ref: z.ZodString;
83
- digest: z.ZodOptional<z.ZodString>;
84
- }, z.core.$strip>>>;
85
- seed: z.ZodString;
86
- metadata: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
87
- }, z.core.$strip>;
88
80
  declare const BoardEffectSchema: z.ZodObject<{
89
81
  id: z.ZodString;
90
82
  boardId: z.ZodString;
91
83
  target: z.ZodDiscriminatedUnion<[z.ZodObject<{
92
- type: z.ZodLiteral<"node">;
93
- nodeId: z.ZodString;
94
- }, z.core.$strip>, z.ZodObject<{
84
+ type: z.ZodLiteral<"item">;
85
+ itemId: z.ZodString;
86
+ }, z.core.$strict>, z.ZodObject<{
95
87
  type: z.ZodLiteral<"board">;
96
- }, z.core.$strip>], "type">;
88
+ }, z.core.$strict>], "type">;
97
89
  kind: z.ZodString;
98
90
  kindVersion: z.ZodNumber;
99
91
  enabled: z.ZodDefault<z.ZodBoolean>;
@@ -125,21 +117,11 @@ declare const BoardEffectSchema: z.ZodObject<{
125
117
  metadata: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
126
118
  revision: z.ZodNumber;
127
119
  }, z.core.$strip>;
128
- declare const BoardSequenceSchema: z.ZodObject<{
129
- id: z.ZodString;
130
- boardId: z.ZodString;
131
- name: z.ZodString;
132
- duration: z.ZodNumber;
133
- seed: z.ZodString;
134
- restPose: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
135
- metadata: z.ZodDefault<z.ZodRecord<z.ZodString, z.ZodUnknown>>;
136
- revision: z.ZodNumber;
137
- }, z.core.$strip>;
138
- type BoardTarget = z.infer<typeof BoardTargetSchema>;
120
+ type BoardCameraState = z.infer<typeof BoardCameraStateSchema>;
121
+ type BoardCameraFocus = z.infer<typeof BoardCameraFocusSchema>;
122
+ type BoardCameraFocusParams = z.infer<typeof BoardCameraFocusParamsSchema>;
139
123
  type BoardAssetRef = z.infer<typeof BoardAssetRefSchema>;
140
- type BoardClip = z.infer<typeof BoardClipSchema>;
141
124
  type BoardEffect = z.infer<typeof BoardEffectSchema>;
142
- type BoardSequence = z.infer<typeof BoardSequenceSchema>;
143
125
  type BoardRecord = {
144
126
  id: string;
145
127
  spaceId: string;
@@ -171,6 +153,77 @@ type BoardNodeRecord = {
171
153
  updatedAt: string | null;
172
154
  };
173
155
  type BoardNodeInput = Omit<BoardNodeRecord, "boardId" | "version" | "createdAt" | "updatedAt">;
156
+ declare const BOARD_DELETE_REASONS: readonly ["user-delete", "orphan-cleanup", "layout-replace", "placeholder-cascade", "node-cascade"];
157
+ type BoardDeleteReason = (typeof BOARD_DELETE_REASONS)[number] | (string & {});
158
+ type BoardOperationBase = {
159
+ opId?: string;
160
+ /** Optional local undo hint. Servers recompute authoritative inverse data. */
161
+ inverse?: Record<string, unknown>;
162
+ };
163
+ type BoardOperation = (BoardOperationBase & {
164
+ type: "board.patch";
165
+ payload: {
166
+ patch: {
167
+ title?: string;
168
+ metadata?: Record<string, unknown>;
169
+ metadataPatch?: Record<string, unknown>;
170
+ };
171
+ };
172
+ }) | (BoardOperationBase & {
173
+ type: "node.create";
174
+ payload: {
175
+ node: BoardNodeInput;
176
+ };
177
+ }) | (BoardOperationBase & {
178
+ type: "node.patch";
179
+ payload: {
180
+ nodeId: string;
181
+ patch: Partial<BoardNodeInput>;
182
+ };
183
+ }) | (BoardOperationBase & {
184
+ type: "node.delete";
185
+ payload: {
186
+ nodeId: string;
187
+ reason?: BoardDeleteReason;
188
+ };
189
+ }) | (BoardOperationBase & {
190
+ type: "connection.create";
191
+ payload: {
192
+ connection: BoardConnectionInput;
193
+ };
194
+ }) | (BoardOperationBase & {
195
+ type: "connection.patch";
196
+ payload: {
197
+ connectionId: string;
198
+ patch: BoardConnectionPatch;
199
+ };
200
+ }) | (BoardOperationBase & {
201
+ type: "connection.delete";
202
+ payload: {
203
+ connectionId: string;
204
+ reason?: BoardDeleteReason;
205
+ };
206
+ }) | (BoardOperationBase & {
207
+ type: "effect.upsert";
208
+ payload: {
209
+ effect: Omit<BoardEffect, "boardId" | "revision">;
210
+ };
211
+ }) | (BoardOperationBase & {
212
+ type: "effect.delete";
213
+ payload: {
214
+ effectId: string;
215
+ };
216
+ }) | (BoardOperationBase & {
217
+ type: "composition.apply";
218
+ payload: {
219
+ composition: Omit<BoardComposition, "revision">;
220
+ };
221
+ }) | (BoardOperationBase & {
222
+ type: "composition.delete";
223
+ payload: {
224
+ compositionId: string;
225
+ };
226
+ });
174
227
  type BoardDiagnostic = {
175
228
  severity: "info" | "warning" | "error";
176
229
  code: string;
@@ -180,13 +233,19 @@ type BoardDiagnostic = {
180
233
  expected?: string;
181
234
  received?: unknown;
182
235
  allowedValues?: readonly string[];
183
- coordinateSpace?: "frame-local" | "world";
236
+ coordinateSpace?: BoardCoordinateSpace;
184
237
  };
185
238
  type BoardValidationResult = {
186
239
  valid: boolean;
187
240
  diagnostics: BoardDiagnostic[];
188
241
  peakCost: BoardRenderCost;
189
242
  };
243
+ /** Persisted on `boards.metadata.playback`: how a Board plays when opened. */
244
+ declare const BoardPlaybackPolicySchema: z.ZodObject<{
245
+ compositionId: z.ZodString;
246
+ delayMs: z.ZodDefault<z.ZodNumber>;
247
+ }, z.core.$strip>;
248
+ type BoardPlaybackPolicy = z.infer<typeof BoardPlaybackPolicySchema>;
190
249
  declare function isBoardPath(path: string): boolean;
191
250
  //#endregion
192
- export { BOARD_DOCUMENT_KIND, BOARD_EXTENSION, BoardAssetRef, BoardAssetRefSchema, BoardClip, BoardClipSchema, BoardDiagnostic, BoardEffect, BoardEffectSchema, BoardManifest, BoardManifestSchema, BoardNodeInput, BoardNodeRecord, BoardRecord, BoardSequence, BoardSequenceSchema, BoardTarget, BoardTargetSchema, BoardValidationResult, InvalidBoardFileError, isBoardPath, parseBoardManifest, serializeBoardManifest };
251
+ export { BOARD_DELETE_REASONS, BOARD_DOCUMENT_KIND, BOARD_EXTENSION, BoardAssetRef, BoardAssetRefSchema, BoardCameraFocus, BoardCameraFocusParams, BoardCameraFocusParamsSchema, BoardCameraFocusSchema, BoardCameraState, BoardCameraStateSchema, type BoardCapability, BoardDeleteReason, BoardDiagnostic, BoardEffect, BoardEffectSchema, BoardManifest, BoardManifestSchema, BoardNodeInput, BoardNodeRecord, BoardOperation, BoardPlaybackPolicy, BoardPlaybackPolicySchema, BoardRecord, type BoardRenderCost, BoardValidationResult, InvalidBoardFileError, isBoardPath, parseBoardManifest, serializeBoardManifest };
@@ -1,5 +1,7 @@
1
- import "./board-constants.js";
1
+ import { BOARD_BUILTIN_CAPABILITIES, DEFAULT_BOARD_RENDER_LIMITS } from "./board-constants.js";
2
2
  import { BoardConnectionSchema } from "./board-connection.js";
3
+ import { BoardCompositionInputSchema } from "./board-composition.js";
4
+ import { BoardAuthoringItemSchema } from "./board-authoring.js";
3
5
  import { z } from "zod";
4
6
  //#region ../protocol/dist/board.js
5
7
  const BOARD_EXTENSION = ".board";
@@ -36,62 +38,59 @@ function parseBoardManifest(input) {
36
38
  function serializeBoardManifest(manifest) {
37
39
  return `${JSON.stringify(BoardManifestSchema.parse(manifest), null, 2)}\n`;
38
40
  }
39
- const BoardTargetSchema = z.discriminatedUnion("type", [
41
+ const BoardCameraStateSchema = z.object({
42
+ centerX: finiteSchema,
43
+ centerY: finiteSchema,
44
+ zoom: finiteSchema.positive()
45
+ });
46
+ const BoardCameraFocusSchema = z.discriminatedUnion("type", [
47
+ z.object({
48
+ type: z.literal("rect"),
49
+ rect: z.object({
50
+ x: finiteSchema,
51
+ y: finiteSchema,
52
+ width: finiteSchema.positive(),
53
+ height: finiteSchema.positive()
54
+ })
55
+ }),
40
56
  z.object({
41
- type: z.literal("node"),
42
- nodeId: idSchema
57
+ type: z.literal("item"),
58
+ itemId: idSchema
43
59
  }),
44
60
  z.object({
45
- type: z.literal("effect"),
46
- effectId: idSchema
61
+ type: z.literal("items"),
62
+ itemIds: z.array(idSchema).min(1).max(1e3)
47
63
  }),
48
- z.object({ type: z.literal("board") }),
49
- z.object({ type: z.literal("camera") })
64
+ z.object({
65
+ type: z.literal("frame"),
66
+ frameId: idSchema
67
+ })
50
68
  ]);
69
+ const BoardCameraFocusParamsSchema = z.object({
70
+ focus: BoardCameraFocusSchema,
71
+ fit: z.enum(["contain", "cover"]).default("contain"),
72
+ padding: finiteSchema.nonnegative().default(32),
73
+ minZoom: finiteSchema.positive().optional(),
74
+ maxZoom: finiteSchema.positive().optional()
75
+ }).superRefine((value, context) => {
76
+ if (value.minZoom !== void 0 && value.maxZoom !== void 0 && value.minZoom > value.maxZoom) context.addIssue({
77
+ code: "custom",
78
+ message: "minZoom must not exceed maxZoom",
79
+ path: ["minZoom"]
80
+ });
81
+ });
51
82
  const BoardAssetRefSchema = z.object({
52
83
  type: z.enum(["space-file", "extension"]),
53
84
  ref: z.string().min(1).max(4096),
54
85
  digest: z.string().min(16).max(160).optional()
55
86
  });
56
- const BoardKeyframeSchema = z.object({
57
- at: finiteSchema.nonnegative(),
58
- value: z.unknown(),
59
- easing: z.string().min(1).max(80).optional()
60
- });
61
- const BoardClipSchema = z.object({
62
- id: idSchema,
63
- sequenceId: idSchema,
64
- kind: extensionIdSchema,
65
- kindVersion: z.number().int().positive(),
66
- target: BoardTargetSchema,
67
- start: finiteSchema.nonnegative(),
68
- duration: finiteSchema.positive(),
69
- layer: z.enum([
70
- "behind",
71
- "content",
72
- "front",
73
- "screen"
74
- ]).default("content"),
75
- fill: z.enum([
76
- "none",
77
- "backwards",
78
- "forwards",
79
- "both"
80
- ]).default("none"),
81
- easing: z.string().min(1).max(80).default("linear"),
82
- params: jsonObjectSchema.default({}),
83
- keyframes: z.array(BoardKeyframeSchema).default([]),
84
- assetRefs: z.array(BoardAssetRefSchema).default([]),
85
- seed: z.string().min(1).max(160),
86
- metadata: jsonObjectSchema.default({})
87
- });
88
87
  const BoardEffectSchema = z.object({
89
88
  id: idSchema,
90
89
  boardId: z.string().uuid(),
91
90
  target: z.discriminatedUnion("type", [z.object({
92
- type: z.literal("node"),
93
- nodeId: idSchema
94
- }), z.object({ type: z.literal("board") })]),
91
+ type: z.literal("item"),
92
+ itemId: idSchema
93
+ }).strict(), z.object({ type: z.literal("board") }).strict()]),
95
94
  kind: extensionIdSchema,
96
95
  kindVersion: z.number().int().positive(),
97
96
  enabled: z.boolean().default(true),
@@ -116,17 +115,7 @@ const BoardEffectSchema = z.object({
116
115
  metadata: jsonObjectSchema.default({}),
117
116
  revision: z.number().int().nonnegative()
118
117
  });
119
- const BoardSequenceSchema = z.object({
120
- id: idSchema,
121
- boardId: z.string().uuid(),
122
- name: z.string().min(1).max(255),
123
- duration: finiteSchema.nonnegative(),
124
- seed: z.string().min(1).max(160),
125
- restPose: jsonObjectSchema.default({}),
126
- metadata: jsonObjectSchema.default({}),
127
- revision: z.number().int().nonnegative()
128
- });
129
- const BoardNodeInputSchema = z.object({
118
+ z.object({
130
119
  nodeId: idSchema,
131
120
  type: z.string().min(1).max(40),
132
121
  parentId: idSchema.nullable(),
@@ -149,27 +138,20 @@ z.object({
149
138
  mutationId: z.string().max(128).optional(),
150
139
  title: z.string().min(1).max(255).optional(),
151
140
  metadata: jsonObjectSchema.optional(),
152
- nodes: z.array(BoardNodeInputSchema).max(5e4).optional(),
141
+ items: z.array(BoardAuthoringItemSchema).max(5e4).optional(),
153
142
  connections: z.array(BoardConnectionSchema).max(5e4).optional(),
154
143
  effects: z.array(BoardEffectSchema.omit({
155
144
  boardId: true,
156
145
  revision: true
157
146
  })).optional(),
158
- sequences: z.array(z.object({
159
- sequence: BoardSequenceSchema.omit({
160
- boardId: true,
161
- revision: true
162
- }),
163
- clips: z.array(BoardClipSchema.omit({ sequenceId: true }))
164
- })).optional()
147
+ compositions: z.array(BoardCompositionInputSchema).optional()
165
148
  });
166
149
  z.object({
167
150
  include: z.array(z.enum([
168
151
  "nodes",
169
152
  "connections",
170
153
  "effects",
171
- "sequences",
172
- "clips",
154
+ "compositions",
173
155
  "playback"
174
156
  ])).optional(),
175
157
  viewport: z.object({
@@ -180,16 +162,15 @@ z.object({
180
162
  }).optional()
181
163
  });
182
164
  z.object({
183
- sequenceId: idSchema,
165
+ compositionId: idSchema,
184
166
  /** Delay before the first local playback after opening the Board, in milliseconds. */
185
- delayMs: finiteSchema.nonnegative().default(0),
186
- loop: z.boolean().default(false)
167
+ delayMs: finiteSchema.nonnegative().default(0)
187
168
  });
188
169
  z.discriminatedUnion("type", [
189
170
  z.object({
190
171
  commandId: idSchema,
191
172
  type: z.literal("play"),
192
- sequenceId: idSchema,
173
+ compositionId: idSchema,
193
174
  position: finiteSchema.nonnegative().optional(),
194
175
  timeScale: finiteSchema.positive().max(4).optional(),
195
176
  shared: z.boolean().optional(),
@@ -216,4 +197,4 @@ function isBoardPath(path) {
216
197
  return path.toLowerCase().endsWith(BOARD_EXTENSION);
217
198
  }
218
199
  //#endregion
219
- export { BOARD_DOCUMENT_KIND, BOARD_EXTENSION, BOARD_MANIFEST_KIND, BoardAssetRefSchema, BoardClipSchema, BoardEffectSchema, BoardKeyframeSchema, BoardManifestSchema, BoardNodeInputSchema, BoardSequenceSchema, BoardTargetSchema, InvalidBoardFileError, isBoardPath, parseBoardManifest, serializeBoardManifest };
200
+ export { BOARD_BUILTIN_CAPABILITIES, BOARD_DOCUMENT_KIND, BOARD_EXTENSION, BOARD_MANIFEST_KIND, BoardAssetRefSchema, BoardCameraFocusParamsSchema, BoardCameraFocusSchema, BoardCameraStateSchema, BoardEffectSchema, BoardManifestSchema, DEFAULT_BOARD_RENDER_LIMITS, InvalidBoardFileError, isBoardPath, parseBoardManifest, serializeBoardManifest };
@@ -1,9 +1,14 @@
1
- import { BoardCapability, BoardRenderCost } from "./board-constants.js";
1
+ import { BoardCapability, BoardCoordinateSpace, BoardRenderCost } from "./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 "./board-connection.js";
3
- import { BOARD_COLOR_IDS, BOARD_GEO_KINDS, BoardColorId, BoardGeoKind, BoardNodeValidationDiagnostic } from "./board-node.js";
4
- import { BOARD_DOCUMENT_KIND, BOARD_EXTENSION, BoardAssetRef, BoardAssetRefSchema, BoardClip, BoardClipSchema, BoardDiagnostic, BoardEffect, BoardEffectSchema, BoardManifest, BoardManifestSchema, BoardNodeInput, BoardNodeRecord, BoardRecord, BoardSequence, BoardSequenceSchema, BoardTarget, BoardTargetSchema, BoardValidationResult, InvalidBoardFileError, isBoardPath, parseBoardManifest, serializeBoardManifest } from "./board.js";
3
+ import { BoardAnimationTarget, BoardAnimationTargetSchema, BoardComposition, BoardCompositionSchema, BoardEasing, BoardEasingSchema, BoardProceduralClip, BoardProceduralClipSchema, BoardTimelineMarker, BoardTimelineMarkerSchema, BoardTrack, BoardTrackInterpolation, BoardTrackSchema } from "./board-composition.js";
4
+ import { BOARD_COLOR_IDS, BOARD_GEO_KINDS, BoardColorId, BoardGeoKind } from "./board-node.js";
5
+ import { BOARD_DELETE_REASONS, BOARD_DOCUMENT_KIND, BOARD_EXTENSION, BoardAssetRef, BoardAssetRefSchema, BoardCameraFocus, BoardCameraFocusParams, BoardCameraFocusParamsSchema, BoardCameraFocusSchema, BoardCameraState, BoardCameraStateSchema, BoardDeleteReason, BoardDiagnostic, BoardEffect, BoardEffectSchema, BoardManifest, BoardManifestSchema, BoardNodeInput, BoardNodeRecord, BoardOperation, BoardPlaybackPolicy, BoardPlaybackPolicySchema, BoardRecord, BoardValidationResult, InvalidBoardFileError, isBoardPath, parseBoardManifest, serializeBoardManifest } from "./board.js";
6
+ import "./board-authoring.js";
7
+ import "./board-capability-registry.js";
8
+ import "./board-codec.js";
5
9
  import "./board-content.js";
10
+ import "./board-upgrade.js";
6
11
  import "./realtime/board-awareness.js";
7
12
  import "./work.js";
8
13
  import "./realtime/types.js";
9
- export { AUTO_BOARD_CONNECTION_ANCHOR, BOARD_COLOR_IDS, BOARD_CONNECTION_DIRECTIONS, BOARD_CONNECTION_LINES, BOARD_CONNECTION_ROUTINGS, BOARD_CONNECTION_SIDES, BOARD_DOCUMENT_KIND, BOARD_EXTENSION, BOARD_GEO_KINDS, BoardAssetRef, BoardAssetRefSchema, BoardClip, BoardClipSchema, BoardColorId, BoardConnection, BoardConnectionAnchor, BoardConnectionAnchorSchema, BoardConnectionDirection, BoardConnectionEndpoint, BoardConnectionEndpointSchema, BoardConnectionInput, BoardConnectionLine, BoardConnectionPatch, BoardConnectionPatchSchema, BoardConnectionRecord, BoardConnectionRouting, BoardConnectionRoutingConfig, BoardConnectionRoutingSchema, BoardConnectionSchema, BoardConnectionSide, BoardConnectionStyle, BoardConnectionStyleSchema, BoardConnectionWaypointSchema, BoardDiagnostic, BoardEffect, BoardEffectSchema, BoardGeoKind, BoardManifest, BoardManifestSchema, BoardNodeInput, BoardNodeRecord, BoardNodeValidationDiagnostic, BoardRecord, BoardRelationSchema, BoardSequence, BoardSequenceSchema, BoardTarget, BoardTargetSchema, BoardValidationResult, DEFAULT_BOARD_CONNECTION_ROUTING, DEFAULT_BOARD_CONNECTION_STYLE, DEFAULT_BOARD_RELATION, InvalidBoardFileError, connectionNodeIds, connectionOtherNodeId, connectionTouchesNode, createBoardConnection, flipBoardConnection, isBoardPath, normalizeBoardConnectionStyle, parseBoardManifest, serializeBoardManifest };
14
+ export { AUTO_BOARD_CONNECTION_ANCHOR, BOARD_COLOR_IDS, BOARD_CONNECTION_DIRECTIONS, BOARD_CONNECTION_LINES, BOARD_CONNECTION_ROUTINGS, BOARD_CONNECTION_SIDES, BOARD_DELETE_REASONS, BOARD_DOCUMENT_KIND, BOARD_EXTENSION, BOARD_GEO_KINDS, BoardAnimationTarget, BoardAnimationTargetSchema, BoardAssetRef, BoardAssetRefSchema, BoardCameraFocus, BoardCameraFocusParams, BoardCameraFocusParamsSchema, BoardCameraFocusSchema, BoardCameraState, BoardCameraStateSchema, type BoardCapability, BoardColorId, BoardComposition, BoardCompositionSchema, BoardConnection, BoardConnectionAnchor, BoardConnectionAnchorSchema, BoardConnectionDirection, BoardConnectionEndpoint, BoardConnectionEndpointSchema, BoardConnectionInput, BoardConnectionLine, BoardConnectionPatch, BoardConnectionPatchSchema, BoardConnectionRecord, BoardConnectionRouting, BoardConnectionRoutingConfig, BoardConnectionRoutingSchema, BoardConnectionSchema, BoardConnectionSide, BoardConnectionStyle, BoardConnectionStyleSchema, BoardConnectionWaypointSchema, BoardDeleteReason, BoardDiagnostic, BoardEasing, BoardEasingSchema, BoardEffect, BoardEffectSchema, BoardGeoKind, BoardManifest, BoardManifestSchema, BoardNodeInput, BoardNodeRecord, BoardOperation, BoardPlaybackPolicy, BoardPlaybackPolicySchema, BoardProceduralClip, BoardProceduralClipSchema, BoardRecord, BoardRelationSchema, type BoardRenderCost, BoardTimelineMarker, BoardTimelineMarkerSchema, BoardTrack, BoardTrackInterpolation, BoardTrackSchema, BoardValidationResult, DEFAULT_BOARD_CONNECTION_ROUTING, DEFAULT_BOARD_CONNECTION_STYLE, DEFAULT_BOARD_RELATION, InvalidBoardFileError, connectionNodeIds, connectionOtherNodeId, connectionTouchesNode, createBoardConnection, flipBoardConnection, isBoardPath, normalizeBoardConnectionStyle, parseBoardManifest, serializeBoardManifest };
@@ -1,8 +1,13 @@
1
- import "./board-constants.js";
1
+ import { BOARD_BUILTIN_CAPABILITIES, DEFAULT_BOARD_RENDER_LIMITS } from "./board-constants.js";
2
2
  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 "./board-connection.js";
3
- import { BOARD_DOCUMENT_KIND, BOARD_EXTENSION, BOARD_MANIFEST_KIND, BoardAssetRefSchema, BoardClipSchema, BoardEffectSchema, BoardKeyframeSchema, BoardManifestSchema, BoardNodeInputSchema, BoardSequenceSchema, BoardTargetSchema, InvalidBoardFileError, isBoardPath, parseBoardManifest, serializeBoardManifest } from "./board.js";
3
+ import { BOARD_ANIMATION_CHANNELS, BOARD_EASINGS, BoardAnimationTargetSchema, BoardCompositionInputSchema, BoardCompositionPlaybackSchema, BoardCompositionSchema, BoardEasingSchema, BoardProceduralClipSchema, BoardTimelineMarkerSchema, BoardTimelineSchema, BoardTrackSchema, parseBoardCompositionInput } from "./board-composition.js";
4
+ import { BoardArrowAuthoringItemSchema, BoardAudioAuthoringItemSchema, BoardAuthoringItemSchema, BoardBuiltinAuthoringItemSchema, BoardDrawAuthoringItemSchema, BoardExtensionAuthoringItemSchema, BoardFileAuthoringItemSchema, BoardFrameAuthoringItemSchema, BoardGeoAuthoringItemSchema, BoardImageAuthoringItemSchema, BoardItemPatchSchema, BoardItemSourceSchema, BoardItemStyleSchema, BoardSemanticCommandSchema, BoardTaskAuthoringItemSchema, BoardTextAuthoringItemSchema, BoardVideoAuthoringItemSchema, isSafeBoardSourcePath } from "./board-authoring.js";
5
+ import { BOARD_DOCUMENT_KIND, BOARD_EXTENSION, BOARD_MANIFEST_KIND, BoardAssetRefSchema, BoardCameraFocusParamsSchema, BoardCameraFocusSchema, BoardCameraStateSchema, BoardEffectSchema, BoardManifestSchema, InvalidBoardFileError, isBoardPath, parseBoardManifest, serializeBoardManifest } from "./board.js";
6
+ import { estimateBuiltinBoardClipCost, validateBuiltinBoardClip } from "./board-capability-registry.js";
7
+ import { BOARD_COLOR_IDS, BOARD_GEO_KINDS, BOARD_NATIVE_NODE_TYPES, BoardColorIdSchema, BoardGeoKindSchema } from "./board-node.js";
8
+ import "./board-codec.js";
4
9
  import { BOARD_CONTENT_KINDS, BoardContentKindSchema, BoardPortSchema } from "./board-content.js";
5
- import { BOARD_COLOR_IDS, BOARD_GEO_KINDS, BOARD_NATIVE_NODE_TYPES, BoardColorIdSchema, BoardGeoKindSchema, validateBoardNodeInput } from "./board-node.js";
10
+ import "./board-upgrade.js";
6
11
  import { BoardAwarenessDrawPointSchema, BoardAwarenessFrameSchema, BoardAwarenessGestureSchema, BoardAwarenessNodePreviewSchema, BoardAwarenessPointSchema, BoardAwarenessStateUpdateSchema, BoardAwarenessUpdateSchema } from "./realtime/board-awareness.js";
7
12
  import { SHORT_UUID_PATTERN, UUID_OR_SHORT_UUID_PATTERN, UUID_PATTERN, UUID_SHAPE_PATTERN } from "./identifiers.js";
8
13
  import { COHUB_SOURCE_HEADER } from "./provenance.js";
@@ -11,4 +16,4 @@ import "./ui-command.js";
11
16
  import "./work-surface.js";
12
17
  import "./work-view-stats.js";
13
18
  import { WORK_PROMOTION_EVENT_KEYS } from "./work-promotion-stats.js";
14
- export { AUTO_BOARD_CONNECTION_ANCHOR, BOARD_COLOR_IDS, BOARD_CONNECTION_DIRECTIONS, BOARD_CONNECTION_LINES, BOARD_CONNECTION_ROUTINGS, BOARD_CONNECTION_SIDES, BOARD_CONTENT_KINDS, BOARD_DOCUMENT_KIND, BOARD_EXTENSION, BOARD_GEO_KINDS, BOARD_MANIFEST_KIND, BOARD_NATIVE_NODE_TYPES, BoardAssetRefSchema, BoardAwarenessDrawPointSchema, BoardAwarenessFrameSchema, BoardAwarenessGestureSchema, BoardAwarenessNodePreviewSchema, BoardAwarenessPointSchema, BoardAwarenessStateUpdateSchema, BoardAwarenessUpdateSchema, BoardClipSchema, BoardColorIdSchema, BoardConnectionAnchorSchema, BoardConnectionEndpointSchema, BoardConnectionPatchSchema, BoardConnectionRoutingSchema, BoardConnectionSchema, BoardConnectionStyleSchema, BoardConnectionWaypointSchema, BoardContentKindSchema, BoardEffectSchema, BoardGeoKindSchema, BoardKeyframeSchema, BoardManifestSchema, BoardNodeInputSchema, BoardPortSchema, BoardRelationSchema, BoardSequenceSchema, BoardTargetSchema, COHUB_SOURCE_HEADER, DEFAULT_BOARD_CONNECTION_ROUTING, DEFAULT_BOARD_CONNECTION_STYLE, DEFAULT_BOARD_RELATION, InvalidBoardFileError, RESERVED_PLATFORM_PATH_SEGMENTS, SHORT_UUID_PATTERN, UUID_OR_SHORT_UUID_PATTERN, UUID_PATTERN, UUID_SHAPE_PATTERN, WORK_PROMOTION_EVENT_KEYS, connectionNodeIds, connectionOtherNodeId, connectionTouchesNode, createBoardConnection, flipBoardConnection, isBoardPath, normalizeBoardConnectionStyle, parseBoardManifest, serializeBoardManifest, validateBoardNodeInput };
19
+ export { AUTO_BOARD_CONNECTION_ANCHOR, BOARD_ANIMATION_CHANNELS, BOARD_BUILTIN_CAPABILITIES, BOARD_COLOR_IDS, BOARD_CONNECTION_DIRECTIONS, BOARD_CONNECTION_LINES, BOARD_CONNECTION_ROUTINGS, BOARD_CONNECTION_SIDES, BOARD_CONTENT_KINDS, BOARD_DOCUMENT_KIND, BOARD_EASINGS, BOARD_EXTENSION, BOARD_GEO_KINDS, BOARD_MANIFEST_KIND, BOARD_NATIVE_NODE_TYPES, BoardAnimationTargetSchema, BoardArrowAuthoringItemSchema, BoardAssetRefSchema, BoardAudioAuthoringItemSchema, BoardAuthoringItemSchema, BoardAwarenessDrawPointSchema, BoardAwarenessFrameSchema, BoardAwarenessGestureSchema, BoardAwarenessNodePreviewSchema, BoardAwarenessPointSchema, BoardAwarenessStateUpdateSchema, BoardAwarenessUpdateSchema, BoardBuiltinAuthoringItemSchema, BoardCameraFocusParamsSchema, BoardCameraFocusSchema, BoardCameraStateSchema, BoardColorIdSchema, BoardCompositionInputSchema, BoardCompositionPlaybackSchema, BoardCompositionSchema, BoardConnectionAnchorSchema, BoardConnectionEndpointSchema, BoardConnectionPatchSchema, BoardConnectionRoutingSchema, BoardConnectionSchema, BoardConnectionStyleSchema, BoardConnectionWaypointSchema, BoardContentKindSchema, BoardDrawAuthoringItemSchema, BoardEasingSchema, BoardEffectSchema, BoardExtensionAuthoringItemSchema, BoardFileAuthoringItemSchema, BoardFrameAuthoringItemSchema, BoardGeoAuthoringItemSchema, BoardGeoKindSchema, BoardImageAuthoringItemSchema, BoardItemPatchSchema, BoardItemSourceSchema, BoardItemStyleSchema, BoardManifestSchema, BoardPortSchema, BoardProceduralClipSchema, BoardRelationSchema, BoardSemanticCommandSchema, BoardTaskAuthoringItemSchema, BoardTextAuthoringItemSchema, BoardTimelineMarkerSchema, BoardTimelineSchema, BoardTrackSchema, BoardVideoAuthoringItemSchema, COHUB_SOURCE_HEADER, DEFAULT_BOARD_CONNECTION_ROUTING, DEFAULT_BOARD_CONNECTION_STYLE, DEFAULT_BOARD_RELATION, DEFAULT_BOARD_RENDER_LIMITS, InvalidBoardFileError, RESERVED_PLATFORM_PATH_SEGMENTS, SHORT_UUID_PATTERN, UUID_OR_SHORT_UUID_PATTERN, UUID_PATTERN, UUID_SHAPE_PATTERN, WORK_PROMOTION_EVENT_KEYS, connectionNodeIds, connectionOtherNodeId, connectionTouchesNode, createBoardConnection, estimateBuiltinBoardClipCost, flipBoardConnection, isBoardPath, isSafeBoardSourcePath, normalizeBoardConnectionStyle, parseBoardCompositionInput, parseBoardManifest, serializeBoardManifest, validateBuiltinBoardClip };
package/dist/types.d.ts CHANGED
@@ -1,5 +1,6 @@
1
- import { BoardCapability, BoardRenderCost } from "./protocol/dist/board-constants.js";
2
- import { BoardAssetRef, BoardClip, BoardDiagnostic, BoardEffect, BoardManifest, BoardNodeInput, BoardNodeRecord, BoardRecord, BoardSequence, BoardTarget, BoardValidationResult } from "./protocol/dist/board.js";
1
+ import { BoardCapability, BoardCoordinateSpace, BoardRenderCost } from "./protocol/dist/board-constants.js";
2
+ import { BoardAnimationTarget, BoardComposition, BoardEasing, BoardProceduralClip, BoardTimelineMarker, BoardTrack } from "./protocol/dist/board-composition.js";
3
+ import { BoardAssetRef, BoardCameraFocus, BoardCameraFocusParams, BoardCameraState, BoardDeleteReason, BoardDiagnostic, BoardEffect, BoardManifest, BoardNodeInput, BoardNodeRecord, BoardOperation, BoardPlaybackPolicy, BoardRecord, BoardValidationResult } from "./protocol/dist/board.js";
3
4
  import "./protocol/dist/index.js";
4
5
  //#region src/types.d.ts
5
6
  type UserProfile = {
@@ -83,10 +83,24 @@ The Work runs inside a Cohub-hosted iframe (`window.parent !== window`). The
83
83
  SDK communicates with the parent window via `postMessage` to request tokens
84
84
  and context. This is the normal case when a viewer opens a Work through Cohub.
85
85
 
86
- - `client.context()` returns the **real** `space.id`, `work.id`, and current
87
- permission scopes from the host.
86
+ - `client.context()` returns the **real** `space.id`, `work.id`, current viewer,
87
+ and permission scopes from the host.
88
+ - A Work opened through `cohub ui preview` also receives an `invocation`
89
+ snapshot with the originating `spaceId`, `sessionId`, `turnId`, and
90
+ `toolCallId` when available. The invocation Space may differ from the Work's
91
+ own `space.id`.
88
92
  - `client.auth.request()` triggers an in-shell consent flow (no popup window).
89
93
 
94
+ ```js
95
+ const ctx = await client.context();
96
+ console.log(ctx.viewer?.userUuid ?? null);
97
+ console.log(ctx.invocation?.sessionId ?? null);
98
+ ```
99
+
100
+ Invocation fields describe where the preview came from. They are identifiers,
101
+ not authorization: API access remains controlled by the Work session token and
102
+ its scopes.
103
+
90
104
  ### Broker mode (standalone deployment)
91
105
 
92
106
  The Work is accessed as a standalone page (`window.parent === window`), e.g.
@@ -183,6 +197,7 @@ but **not active** until the viewer approves them through a consent dialog
183
197
  triggered by `client.auth.request()`. These are **action** permissions.
184
198
 
185
199
  ```
200
+ taskrun.view — read Task Runs the viewer can already access
186
201
  session.prompt.readonly — send read-only prompts (no side effects)
187
202
  session.prompt.fullaccess — send prompts with full access (write, create sessions)
188
203
  generation.create — create generation tasks (image/video/audio)
@@ -199,7 +214,8 @@ user.usage.read — read the viewer's aggregated usage
199
214
  `session.prompt.fullaccess` lets you **send** a prompt, but does **not** let
200
215
  you **read** the result — that needs `session.view` (a work scope).
201
216
  `generation.create` lets you **create** a generation task, but reading its
202
- result needs `taskrun.view` (a work scope).
217
+ result needs `taskrun.view`, either from the publishing Space's work scopes or
218
+ from viewer authorization checked against the requested Space or Session.
203
219
 
204
220
  ### Complete API → scope mapping
205
221
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@neta-art/cohub",
3
- "version": "5.9.0",
3
+ "version": "6.0.0",
4
4
  "description": "Cohub SDK for spaces, sessions, boards, and realtime agent collaboration.",
5
5
  "license": "Apache-2.0",
6
6
  "private": false,
@@ -82,6 +82,7 @@
82
82
  "tsdown": "^0.22.7",
83
83
  "tsx": "4.23.1",
84
84
  "typescript": "^7.0.2",
85
+ "@cohub/core": "1.1.1",
85
86
  "@cohub/protocol": "2.0.0"
86
87
  },
87
88
  "peerDependencies": {
@@ -100,7 +101,7 @@
100
101
  "build": "tsdown",
101
102
  "lint": "biome lint .",
102
103
  "lint:fix": "biome lint --write .",
103
- "test": "node ../../scripts/test/run.mjs 'src/**/*.test.ts' 'tests/**/*.test.ts'",
104
+ "test": "node ../../scripts/test/run.mjs --test-concurrency=2 'src/**/*.test.ts' 'tests/**/*.test.ts'",
104
105
  "typecheck": "tsc -p tsconfig.json --noEmit"
105
106
  }
106
107
  }