@cueframe/kernel 0.2.48 → 0.2.50

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 (33) hide show
  1. package/dist/_members/composition/validators/composition.d.ts +49 -0
  2. package/dist/_members/composition/validators/render.d.ts +24 -0
  3. package/dist/_members/composition-ops/index.d.ts +12 -0
  4. package/dist/_members/primitives/captions/placement.d.ts +6 -1
  5. package/dist/authoring/build-tools.js +5 -5
  6. package/dist/authoring/context.js +4 -4
  7. package/dist/authoring/tools.js +4 -4
  8. package/dist/authoring.js +8 -8
  9. package/dist/{chunk-CFIQY4OE.js → chunk-4WBSXHQA.js} +8 -4
  10. package/dist/{chunk-FGJ7GKWZ.js → chunk-6WQHVYJD.js} +1 -1
  11. package/dist/{chunk-4FKNPTLX.js → chunk-IHWC75AN.js} +1 -1
  12. package/dist/{chunk-BBNF4QLD.js → chunk-KY3QBG7O.js} +4 -4
  13. package/dist/{chunk-AG7HKF2U.js → chunk-LO3DH776.js} +1 -1
  14. package/dist/{chunk-ID5QY7V6.js → chunk-LZEX2GAY.js} +8 -0
  15. package/dist/{chunk-VEQTURKN.js → chunk-NLXQ7WTH.js} +1 -1
  16. package/dist/{chunk-SLUTOUWI.js → chunk-OVV35ZS2.js} +1 -1
  17. package/dist/{chunk-GI2NTS6B.js → chunk-WIPIYUY2.js} +2 -2
  18. package/dist/{chunk-TBZU7JYA.js → chunk-XVJU63TF.js} +2 -2
  19. package/dist/{chunk-W5W3FDDI.js → chunk-Z6NY6MCL.js} +4 -3
  20. package/dist/composition/graphics-plan.js +2 -2
  21. package/dist/composition/ops.js +3 -3
  22. package/dist/composition/projection.js +2 -2
  23. package/dist/composition/validators.js +4 -2
  24. package/dist/composition-ops.js +4 -4
  25. package/dist/composition.js +6 -4
  26. package/dist/{context-YNR73FNI.js → context-AIUJG7R4.js} +4 -4
  27. package/dist/mcp/adapter.js +1 -1
  28. package/dist/mcp/curation.js +1 -1
  29. package/dist/mcp/server.js +6 -6
  30. package/dist/mcp.js +6 -6
  31. package/dist/primitives/captions.js +35 -13
  32. package/dist/render-harness.js +6 -6
  33. package/package.json +14 -14
@@ -323,6 +323,13 @@ export declare const Region: z.ZodObject<{
323
323
  h: z.ZodNumber;
324
324
  }, z.core.$strip>;
325
325
  export type Region = z.infer<typeof Region>;
326
+ /** A caption layout box must stay wholly within the output frame. */
327
+ export declare const CaptionRegion: z.ZodObject<{
328
+ x: z.ZodNumber;
329
+ y: z.ZodNumber;
330
+ w: z.ZodNumber;
331
+ h: z.ZodNumber;
332
+ }, z.core.$strip>;
326
333
  export declare const ClipFit: z.ZodEnum<{
327
334
  contain: "contain";
328
335
  cover: "cover";
@@ -910,6 +917,12 @@ export declare const CaptionStyle: z.ZodObject<{
910
917
  center: "center";
911
918
  bottom: "bottom";
912
919
  }>>;
920
+ region: z.ZodOptional<z.ZodObject<{
921
+ x: z.ZodNumber;
922
+ y: z.ZodNumber;
923
+ w: z.ZodNumber;
924
+ h: z.ZodNumber;
925
+ }, z.core.$strip>>;
913
926
  textTransform: z.ZodOptional<z.ZodEnum<{
914
927
  none: "none";
915
928
  uppercase: "uppercase";
@@ -998,6 +1011,12 @@ export declare const CompositionCaptions: z.ZodDiscriminatedUnion<[z.ZodObject<{
998
1011
  center: "center";
999
1012
  bottom: "bottom";
1000
1013
  }>>;
1014
+ region: z.ZodOptional<z.ZodObject<{
1015
+ x: z.ZodNumber;
1016
+ y: z.ZodNumber;
1017
+ w: z.ZodNumber;
1018
+ h: z.ZodNumber;
1019
+ }, z.core.$strip>>;
1001
1020
  textTransform: z.ZodOptional<z.ZodEnum<{
1002
1021
  none: "none";
1003
1022
  uppercase: "uppercase";
@@ -1073,6 +1092,12 @@ export declare const CompositionCaptions: z.ZodDiscriminatedUnion<[z.ZodObject<{
1073
1092
  center: "center";
1074
1093
  bottom: "bottom";
1075
1094
  }>>;
1095
+ region: z.ZodOptional<z.ZodObject<{
1096
+ x: z.ZodNumber;
1097
+ y: z.ZodNumber;
1098
+ w: z.ZodNumber;
1099
+ h: z.ZodNumber;
1100
+ }, z.core.$strip>>;
1076
1101
  textTransform: z.ZodOptional<z.ZodEnum<{
1077
1102
  none: "none";
1078
1103
  uppercase: "uppercase";
@@ -1341,6 +1366,12 @@ export declare const Composition: z.ZodObject<{
1341
1366
  center: "center";
1342
1367
  bottom: "bottom";
1343
1368
  }>>;
1369
+ region: z.ZodOptional<z.ZodObject<{
1370
+ x: z.ZodNumber;
1371
+ y: z.ZodNumber;
1372
+ w: z.ZodNumber;
1373
+ h: z.ZodNumber;
1374
+ }, z.core.$strip>>;
1344
1375
  textTransform: z.ZodOptional<z.ZodEnum<{
1345
1376
  none: "none";
1346
1377
  uppercase: "uppercase";
@@ -1416,6 +1447,12 @@ export declare const Composition: z.ZodObject<{
1416
1447
  center: "center";
1417
1448
  bottom: "bottom";
1418
1449
  }>>;
1450
+ region: z.ZodOptional<z.ZodObject<{
1451
+ x: z.ZodNumber;
1452
+ y: z.ZodNumber;
1453
+ w: z.ZodNumber;
1454
+ h: z.ZodNumber;
1455
+ }, z.core.$strip>>;
1419
1456
  textTransform: z.ZodOptional<z.ZodEnum<{
1420
1457
  none: "none";
1421
1458
  uppercase: "uppercase";
@@ -1725,6 +1762,12 @@ export declare const CompositionVersion: z.ZodObject<{
1725
1762
  center: "center";
1726
1763
  bottom: "bottom";
1727
1764
  }>>;
1765
+ region: z.ZodOptional<z.ZodObject<{
1766
+ x: z.ZodNumber;
1767
+ y: z.ZodNumber;
1768
+ w: z.ZodNumber;
1769
+ h: z.ZodNumber;
1770
+ }, z.core.$strip>>;
1728
1771
  textTransform: z.ZodOptional<z.ZodEnum<{
1729
1772
  none: "none";
1730
1773
  uppercase: "uppercase";
@@ -1800,6 +1843,12 @@ export declare const CompositionVersion: z.ZodObject<{
1800
1843
  center: "center";
1801
1844
  bottom: "bottom";
1802
1845
  }>>;
1846
+ region: z.ZodOptional<z.ZodObject<{
1847
+ x: z.ZodNumber;
1848
+ y: z.ZodNumber;
1849
+ w: z.ZodNumber;
1850
+ h: z.ZodNumber;
1851
+ }, z.core.$strip>>;
1803
1852
  textTransform: z.ZodOptional<z.ZodEnum<{
1804
1853
  none: "none";
1805
1854
  uppercase: "uppercase";
@@ -269,6 +269,12 @@ export declare const RenderSnapshot: z.ZodObject<{
269
269
  center: "center";
270
270
  bottom: "bottom";
271
271
  }>>;
272
+ region: z.ZodOptional<z.ZodObject<{
273
+ x: z.ZodNumber;
274
+ y: z.ZodNumber;
275
+ w: z.ZodNumber;
276
+ h: z.ZodNumber;
277
+ }, z.core.$strip>>;
272
278
  textTransform: z.ZodOptional<z.ZodEnum<{
273
279
  none: "none";
274
280
  uppercase: "uppercase";
@@ -344,6 +350,12 @@ export declare const RenderSnapshot: z.ZodObject<{
344
350
  center: "center";
345
351
  bottom: "bottom";
346
352
  }>>;
353
+ region: z.ZodOptional<z.ZodObject<{
354
+ x: z.ZodNumber;
355
+ y: z.ZodNumber;
356
+ w: z.ZodNumber;
357
+ h: z.ZodNumber;
358
+ }, z.core.$strip>>;
347
359
  textTransform: z.ZodOptional<z.ZodEnum<{
348
360
  none: "none";
349
361
  uppercase: "uppercase";
@@ -1101,6 +1113,12 @@ export declare const RenderJob: z.ZodObject<{
1101
1113
  center: "center";
1102
1114
  bottom: "bottom";
1103
1115
  }>>;
1116
+ region: z.ZodOptional<z.ZodObject<{
1117
+ x: z.ZodNumber;
1118
+ y: z.ZodNumber;
1119
+ w: z.ZodNumber;
1120
+ h: z.ZodNumber;
1121
+ }, z.core.$strip>>;
1104
1122
  textTransform: z.ZodOptional<z.ZodEnum<{
1105
1123
  none: "none";
1106
1124
  uppercase: "uppercase";
@@ -1176,6 +1194,12 @@ export declare const RenderJob: z.ZodObject<{
1176
1194
  center: "center";
1177
1195
  bottom: "bottom";
1178
1196
  }>>;
1197
+ region: z.ZodOptional<z.ZodObject<{
1198
+ x: z.ZodNumber;
1199
+ y: z.ZodNumber;
1200
+ w: z.ZodNumber;
1201
+ h: z.ZodNumber;
1202
+ }, z.core.$strip>>;
1179
1203
  textTransform: z.ZodOptional<z.ZodEnum<{
1180
1204
  none: "none";
1181
1205
  uppercase: "uppercase";
@@ -661,6 +661,12 @@ export declare const CompositionOp: z.ZodDiscriminatedUnion<[z.ZodObject<{
661
661
  center: "center";
662
662
  bottom: "bottom";
663
663
  }>>>;
664
+ region: z.ZodOptional<z.ZodOptional<z.ZodObject<{
665
+ x: z.ZodNumber;
666
+ y: z.ZodNumber;
667
+ w: z.ZodNumber;
668
+ h: z.ZodNumber;
669
+ }, z.core.$strip>>>;
664
670
  textTransform: z.ZodOptional<z.ZodOptional<z.ZodEnum<{
665
671
  none: "none";
666
672
  uppercase: "uppercase";
@@ -738,6 +744,12 @@ export declare const CompositionOp: z.ZodDiscriminatedUnion<[z.ZodObject<{
738
744
  center: "center";
739
745
  bottom: "bottom";
740
746
  }>>>;
747
+ region: z.ZodOptional<z.ZodOptional<z.ZodObject<{
748
+ x: z.ZodNumber;
749
+ y: z.ZodNumber;
750
+ w: z.ZodNumber;
751
+ h: z.ZodNumber;
752
+ }, z.core.$strip>>>;
741
753
  textTransform: z.ZodOptional<z.ZodOptional<z.ZodEnum<{
742
754
  none: "none";
743
755
  uppercase: "uppercase";
@@ -2,4 +2,9 @@ import type { CSSProperties } from 'react';
2
2
  export declare function resolveCaptionPlacement(position: 'top' | 'center' | 'bottom' | undefined, region: {
3
3
  y: number;
4
4
  h: number;
5
- } | undefined): CSSProperties;
5
+ } | undefined, authoredRegion?: {
6
+ x: number;
7
+ y: number;
8
+ w: number;
9
+ h: number;
10
+ }): CSSProperties;
@@ -4,13 +4,13 @@ import {
4
4
  buildPlannerTools,
5
5
  buildToolsFromSchemas,
6
6
  extractProviderError
7
- } from "../chunk-4FKNPTLX.js";
8
- import "../chunk-BBNF4QLD.js";
7
+ } from "../chunk-IHWC75AN.js";
8
+ import "../chunk-KY3QBG7O.js";
9
9
  import "../chunk-JOURGVOR.js";
10
10
  import "../chunk-7AZLFN26.js";
11
- import "../chunk-VEQTURKN.js";
12
- import "../chunk-AG7HKF2U.js";
13
- import "../chunk-ID5QY7V6.js";
11
+ import "../chunk-NLXQ7WTH.js";
12
+ import "../chunk-LO3DH776.js";
13
+ import "../chunk-LZEX2GAY.js";
14
14
  import "../chunk-WPZKOVYF.js";
15
15
  import "../chunk-B7J5UUUV.js";
16
16
  import "../chunk-KYRDKK2D.js";
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  buildDirectorContext
3
- } from "../chunk-SLUTOUWI.js";
4
- import "../chunk-VEQTURKN.js";
5
- import "../chunk-AG7HKF2U.js";
6
- import "../chunk-ID5QY7V6.js";
3
+ } from "../chunk-OVV35ZS2.js";
4
+ import "../chunk-NLXQ7WTH.js";
5
+ import "../chunk-LO3DH776.js";
6
+ import "../chunk-LZEX2GAY.js";
7
7
  import "../chunk-WPZKOVYF.js";
8
8
  import "../chunk-B7J5UUUV.js";
9
9
  import "../chunk-KYRDKK2D.js";
@@ -6,12 +6,12 @@ import {
6
6
  COMPOSE_ROLE_TOOLS,
7
7
  COMPOSE_ROLE_TOOL_NAMES,
8
8
  dispatchComposeRoleTool
9
- } from "../chunk-BBNF4QLD.js";
9
+ } from "../chunk-KY3QBG7O.js";
10
10
  import "../chunk-JOURGVOR.js";
11
11
  import "../chunk-7AZLFN26.js";
12
- import "../chunk-VEQTURKN.js";
13
- import "../chunk-AG7HKF2U.js";
14
- import "../chunk-ID5QY7V6.js";
12
+ import "../chunk-NLXQ7WTH.js";
13
+ import "../chunk-LO3DH776.js";
14
+ import "../chunk-LZEX2GAY.js";
15
15
  import "../chunk-WPZKOVYF.js";
16
16
  import "../chunk-B7J5UUUV.js";
17
17
  import "../chunk-KYRDKK2D.js";
package/dist/authoring.js CHANGED
@@ -11,7 +11,7 @@ import {
11
11
  buildPlannerTools,
12
12
  buildToolsFromSchemas,
13
13
  extractProviderError
14
- } from "./chunk-4FKNPTLX.js";
14
+ } from "./chunk-IHWC75AN.js";
15
15
  import {
16
16
  COMPOSE_MOTION_TOOLS,
17
17
  COMPOSE_MOTION_VERIFY_TOOLS,
@@ -20,14 +20,14 @@ import {
20
20
  COMPOSE_ROLE_TOOLS,
21
21
  COMPOSE_ROLE_TOOL_NAMES,
22
22
  dispatchComposeRoleTool
23
- } from "./chunk-BBNF4QLD.js";
23
+ } from "./chunk-KY3QBG7O.js";
24
24
  import {
25
25
  AgentFixableCaptureError,
26
26
  getExcludedTools
27
27
  } from "./chunk-JOURGVOR.js";
28
28
  import {
29
29
  buildDirectorContext
30
- } from "./chunk-SLUTOUWI.js";
30
+ } from "./chunk-OVV35ZS2.js";
31
31
  import {
32
32
  buildFastModel,
33
33
  buildModel,
@@ -48,16 +48,16 @@ import {
48
48
  formatPlanSteps,
49
49
  initCodeGenPrompts
50
50
  } from "./chunk-Y4HPN4BC.js";
51
- import "./chunk-FGJ7GKWZ.js";
51
+ import "./chunk-6WQHVYJD.js";
52
52
  import {
53
53
  cssLayoutVars
54
- } from "./chunk-W5W3FDDI.js";
54
+ } from "./chunk-Z6NY6MCL.js";
55
55
  import "./chunk-ILO4NEZ3.js";
56
56
  import "./chunk-7AZLFN26.js";
57
57
  import "./chunk-VG2ND6PX.js";
58
- import "./chunk-VEQTURKN.js";
59
- import "./chunk-AG7HKF2U.js";
60
- import "./chunk-ID5QY7V6.js";
58
+ import "./chunk-NLXQ7WTH.js";
59
+ import "./chunk-LO3DH776.js";
60
+ import "./chunk-LZEX2GAY.js";
61
61
  import "./chunk-WPZKOVYF.js";
62
62
  import "./chunk-B7J5UUUV.js";
63
63
  import "./chunk-KYRDKK2D.js";
@@ -525,21 +525,25 @@ ${j.tsxSource}`,
525
525
  name: "prepare_media",
526
526
  operationId: "purchaseMediaFact",
527
527
  pathArgs: { mediaItemId: "id" },
528
- description: 'Prepare the perception artifact an authored edit needs BEFORE sighted review. Pass body.kind="subjectTrack" for face/active-speaker reframing, or body.kind="matte" for a true zPlane:"behind-subject" graphic. Pass body.intent {startSec,endSec} using SOURCE time (the media trim, not timeline time); it is required for mattes and strongly recommended for subject tracks so the prepared fact exactly matches the clip and quote. This is the supported product path \u2014 never accept a preview that silently flattens depth or ignores speaker tracking. Returns a fact receipt; poll get_media_facts with the same kind/window until exact.state is ready (failed is terminal). Existing pending/ready facts are reused without another charge.',
529
- okFormat: (j, a) => `Media preparation ${j.alreadyExisted ? "reused" : "started"}.
528
+ description: 'Prepare the perception artifact an authored edit needs BEFORE sighted review. Pass body.kind="subjectTrack" for face/active-speaker reframing, or body.kind="matte" for a true zPlane:"behind-subject" graphic. Pass body.intent {startSec,endSec} using SOURCE time (the media trim, not timeline time); it is required for mattes and strongly recommended for subject tracks so the prepared fact exactly matches the clip and quote. This is the supported product path \u2014 never accept a preview that silently flattens depth or ignores speaker tracking. Returns a fact receipt; with intent, poll get_media_facts using the same kind/window until exact.state is ready; without intent, omit all three filters and find the whole-source subjectTrack in facts until status is ready (failed is terminal). Existing pending/ready facts are reused without another charge.',
529
+ okFormat: (j, a) => {
530
+ const intent = a.body?.intent;
531
+ const poll = intent ? `Poll get_media_facts(mediaItemId="${a.mediaItemId}", kind="${a.body.kind}", startSec=${intent.startSec}, endSec=${intent.endSec}) until exact.state is ready before preview_frame or score_composition.` : `Poll get_media_facts(mediaItemId="${a.mediaItemId}") without filters; find the subjectTrack fact in facts whose source window runs from 0 to the media duration (get_media_context.durationSec) and wait until its status is ready before preview_frame or score_composition.`;
532
+ return `Media preparation ${j.alreadyExisted ? "reused" : "started"}.
530
533
 
531
534
  factId: ${j.factId}
532
535
  status: ${j.status}
533
536
  quotedUsd: ${j.quotedUsd}
534
537
 
535
- Poll get_media_facts(mediaItemId="${a.mediaItemId}", kind="${a.body?.kind}", startSec="${a.body?.intent?.startSec}", endSec="${a.body?.intent?.endSec}") until exact.state is ready before preview_frame or score_composition.`,
538
+ ${poll}`;
539
+ },
536
540
  annotations: { idempotentHint: true }
537
541
  },
538
542
  {
539
543
  name: "get_media_facts",
540
544
  operationId: "listMediaFacts",
541
545
  pathArgs: { mediaItemId: "id" },
542
- description: "Read prepared subject tracks and behind-subject mattes for one media item. For an exact readiness check, pass kind + startSec + endSec together using the same SOURCE window sent to prepare_media; exact.state is pending | ready | failed | available | unavailable. Use this after prepare_media and do not call preview_frame / score_composition until the required exact fact is ready.",
546
+ description: "Read prepared subject tracks and behind-subject mattes for one media item. For an exact readiness check, pass kind + startSec + endSec together using the same SOURCE window sent to prepare_media; exact.state is pending | ready | failed | available | unavailable. If subjectTrack was prepared without intent, omit all three filters and check the whole-source subjectTrack in facts instead. Wait for the required fact to be ready before preview_frame / score_composition.",
543
547
  annotations: { readOnlyHint: true, idempotentHint: true }
544
548
  },
545
549
  {
@@ -2,7 +2,7 @@ import {
2
2
  activeFaceKeepOutSeries,
3
3
  boundingBox,
4
4
  resolveBrandRefsDeep
5
- } from "./chunk-W5W3FDDI.js";
5
+ } from "./chunk-Z6NY6MCL.js";
6
6
  import {
7
7
  CueframeError,
8
8
  encodeError
@@ -2,7 +2,7 @@ import {
2
2
  COMPOSE_PLANNER_TOOLS,
3
3
  COMPOSE_ROLE_TOOLS,
4
4
  dispatchComposeRoleTool
5
- } from "./chunk-BBNF4QLD.js";
5
+ } from "./chunk-KY3QBG7O.js";
6
6
 
7
7
  // ../authoring/src/agent/buildTools.ts
8
8
  import { tool } from "ai";
@@ -7,13 +7,13 @@ import {
7
7
  } from "./chunk-7AZLFN26.js";
8
8
  import {
9
9
  selectAllOverlays
10
- } from "./chunk-VEQTURKN.js";
10
+ } from "./chunk-NLXQ7WTH.js";
11
11
  import {
12
12
  ComposePlan
13
- } from "./chunk-AG7HKF2U.js";
13
+ } from "./chunk-LO3DH776.js";
14
14
  import {
15
15
  OverlayClipSource
16
- } from "./chunk-ID5QY7V6.js";
16
+ } from "./chunk-LZEX2GAY.js";
17
17
 
18
18
  // ../authoring/src/tools/toolSets.ts
19
19
  var COMPOSE_PLANNER_TOOLS = [
@@ -63,7 +63,7 @@ var COMPOSE_ROLE_TOOLS = Object.freeze({
63
63
  schema: z.object({}),
64
64
  metadata: { label: "Get Context" },
65
65
  handler: async (_args, capabilities) => {
66
- const { buildDirectorContext } = await import("./context-YNR73FNI.js");
66
+ const { buildDirectorContext } = await import("./context-AIUJG7R4.js");
67
67
  return buildDirectorContext(capabilities);
68
68
  }
69
69
  },
@@ -4,7 +4,7 @@ import {
4
4
  Format,
5
5
  GraphicRole,
6
6
  OpaqueId
7
- } from "./chunk-ID5QY7V6.js";
7
+ } from "./chunk-LZEX2GAY.js";
8
8
  import {
9
9
  brandKitCaptionFaceIssues
10
10
  } from "./chunk-AVTEPAWI.js";
@@ -119,6 +119,10 @@ var Region = z2.object({
119
119
  w: z2.number().positive().max(1),
120
120
  h: z2.number().positive().max(1)
121
121
  });
122
+ var CaptionRegion = Region.refine(
123
+ (r) => r.x + r.w <= 1 && r.y + r.h <= 1,
124
+ "captions style.region must fit within the normalized frame"
125
+ );
122
126
  var ClipFit = z2.enum(["cover", "contain"]);
123
127
  var PerClipEffect = z2.object({
124
128
  primitiveId: z2.string().min(1),
@@ -253,6 +257,9 @@ var CaptionStyle = z2.object({
253
257
  backgroundColor: z2.string().optional(),
254
258
  plate: z2.enum(["glass", "solid", "none"]).optional(),
255
259
  position: z2.enum(["top", "center", "bottom"]).optional(),
260
+ region: CaptionRegion.optional().describe(
261
+ "Optional caption layout box {x,y,w,h} in normalized output-frame coordinates. Overrides position; text starts at its top edge and wraps/pages within its width and height."
262
+ ),
256
263
  textTransform: z2.enum(["none", "uppercase", "capitalize"]).optional(),
257
264
  emphasisColor: z2.string().optional(),
258
265
  emphasisGradient: z2.string().optional(),
@@ -493,6 +500,7 @@ export {
493
500
  POSITION_MIN,
494
501
  POSITION_MAX,
495
502
  Region,
503
+ CaptionRegion,
496
504
  ClipFit,
497
505
  PerClipEffect,
498
506
  KeyframeEasing,
@@ -1,6 +1,6 @@
1
1
  import {
2
2
  Composition
3
- } from "./chunk-ID5QY7V6.js";
3
+ } from "./chunk-LZEX2GAY.js";
4
4
  import {
5
5
  expandToLinkGroup
6
6
  } from "./chunk-KYRDKK2D.js";
@@ -2,7 +2,7 @@ import {
2
2
  selectAllClips,
3
3
  selectAllOverlays,
4
4
  selectSceneMarkers
5
- } from "./chunk-VEQTURKN.js";
5
+ } from "./chunk-NLXQ7WTH.js";
6
6
 
7
7
  // ../authoring/src/context/transcript.ts
8
8
  var MAX_TRANSCRIPT_CHARS = 6e4;
@@ -9,7 +9,7 @@ import {
9
9
  findClipById,
10
10
  findMarkerById,
11
11
  findTrackContainingClipId
12
- } from "./chunk-VEQTURKN.js";
12
+ } from "./chunk-NLXQ7WTH.js";
13
13
  import {
14
14
  CaptionSegment,
15
15
  CaptionStyle,
@@ -20,7 +20,7 @@ import {
20
20
  TimelineClip,
21
21
  Track,
22
22
  Transition
23
- } from "./chunk-ID5QY7V6.js";
23
+ } from "./chunk-LZEX2GAY.js";
24
24
  import {
25
25
  ReframeSegment
26
26
  } from "./chunk-B7J5UUUV.js";
@@ -10,7 +10,7 @@ import {
10
10
  } from "./chunk-XSBVOXSB.js";
11
11
  import {
12
12
  CURATED_TOOLS
13
- } from "./chunk-CFIQY4OE.js";
13
+ } from "./chunk-4WBSXHQA.js";
14
14
  import {
15
15
  GENERATED_OPERATIONS,
16
16
  apiErrorFrom,
@@ -31,7 +31,7 @@ import {
31
31
  } from "./chunk-AOIY7NGF.js";
32
32
  import {
33
33
  CompositionOp
34
- } from "./chunk-GI2NTS6B.js";
34
+ } from "./chunk-WIPIYUY2.js";
35
35
 
36
36
  // ../mcp/src/prompts.ts
37
37
  var skillListCache = null;
@@ -84,11 +84,12 @@ function resolveBrandKit(kit, compositionWidth) {
84
84
  };
85
85
  const captionBaseFamily = effectiveCaptionFamily(kit).family;
86
86
  const cp = kit.captionProfile;
87
+ const captionInk = (color) => cp?.plate === "none" ? color : clampToFloor(color, safe.captionScrim, FLOORS.body);
87
88
  const caption = {
88
- fg: cp?.emphasisColor ? clampToFloor(cp.emphasisColor, safe.captionScrim, FLOORS.body) : safe.captionFg,
89
+ fg: cp?.emphasisColor ? captionInk(cp.emphasisColor) : safe.captionFg,
89
90
  scrim: safe.captionScrim,
90
- ...cp?.color ? { color: clampToFloor(cp.color, safe.captionScrim, FLOORS.body) } : {},
91
- ...cp?.highlightColor ? { highlightColor: clampToFloor(cp.highlightColor, safe.captionScrim, FLOORS.body) } : {},
91
+ ...cp?.color ? { color: captionInk(cp.color) } : {},
92
+ ...cp?.highlightColor ? { highlightColor: captionInk(cp.highlightColor) } : {},
92
93
  ...cp?.plate ? { plate: cp.plate } : {},
93
94
  ...cp?.entrance ? { entrance: cp.entrance } : {},
94
95
  ...cp?.entranceMs != null ? { entranceMs: cp.entranceMs } : {},
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  placeInLegalArea,
3
3
  resolveBrandRefsDeep
4
- } from "../chunk-W5W3FDDI.js";
4
+ } from "../chunk-Z6NY6MCL.js";
5
5
  import "../chunk-ILO4NEZ3.js";
6
6
  import "../chunk-VG2ND6PX.js";
7
7
  import {
@@ -26,7 +26,7 @@ import {
26
26
  PlanRect,
27
27
  StyleRole,
28
28
  ZPlane
29
- } from "../chunk-ID5QY7V6.js";
29
+ } from "../chunk-LZEX2GAY.js";
30
30
  import "../chunk-WPZKOVYF.js";
31
31
  import "../chunk-B7J5UUUV.js";
32
32
  import "../chunk-WREYUH2E.js";
@@ -20,9 +20,9 @@ import {
20
20
  selectMediaClipAt,
21
21
  selectSceneMarkers,
22
22
  selectTracksByKind
23
- } from "../chunk-VEQTURKN.js";
24
- import "../chunk-AG7HKF2U.js";
25
- import "../chunk-ID5QY7V6.js";
23
+ } from "../chunk-NLXQ7WTH.js";
24
+ import "../chunk-LO3DH776.js";
25
+ import "../chunk-LZEX2GAY.js";
26
26
  import "../chunk-WPZKOVYF.js";
27
27
  import "../chunk-B7J5UUUV.js";
28
28
  import "../chunk-KYRDKK2D.js";
@@ -32,7 +32,7 @@ import {
32
32
  silhouetteKeepOutForWindow,
33
33
  sourceRectToOutput,
34
34
  sourceWindowKey
35
- } from "../chunk-FGJ7GKWZ.js";
35
+ } from "../chunk-6WQHVYJD.js";
36
36
  import {
37
37
  BRAND_TOKEN_REFS,
38
38
  BRAND_TOKEN_ROOT_KEYS,
@@ -69,7 +69,7 @@ import {
69
69
  resolveLayoutIntent,
70
70
  resolveOverlayRegion,
71
71
  unionFaceKeepOutSeries
72
- } from "../chunk-W5W3FDDI.js";
72
+ } from "../chunk-Z6NY6MCL.js";
73
73
  import {
74
74
  contrastRatio
75
75
  } from "../chunk-ILO4NEZ3.js";
@@ -48,11 +48,12 @@ import {
48
48
  WebhookDeliveryStatus,
49
49
  WebhookDestination,
50
50
  YoutubeDestination
51
- } from "../chunk-AG7HKF2U.js";
51
+ } from "../chunk-LO3DH776.js";
52
52
  import {
53
53
  ANIMATABLE_PARAMS,
54
54
  ANIMATABLE_VALUE,
55
55
  AlphaLayerClipSource,
56
+ CaptionRegion,
56
57
  CaptionSegment,
57
58
  CaptionStyle,
58
59
  CaptionWord,
@@ -85,7 +86,7 @@ import {
85
86
  Transition,
86
87
  captionWords,
87
88
  captionsAreBehindSubject
88
- } from "../chunk-ID5QY7V6.js";
89
+ } from "../chunk-LZEX2GAY.js";
89
90
  import {
90
91
  AUTHORED_GRAPHIC_KINDS
91
92
  } from "../chunk-WPZKOVYF.js";
@@ -105,6 +106,7 @@ export {
105
106
  AlphaLayerClipSource,
106
107
  AudioPaletteRef,
107
108
  BrandKit,
109
+ CaptionRegion,
108
110
  CaptionSegment,
109
111
  CaptionStyle,
110
112
  CaptionWord,
@@ -20,16 +20,16 @@ import {
20
20
  replaceRegion,
21
21
  resolveClipKind,
22
22
  wrapWithOpRecorder
23
- } from "./chunk-GI2NTS6B.js";
23
+ } from "./chunk-WIPIYUY2.js";
24
24
  import "./chunk-INYP56TC.js";
25
25
  import "./chunk-QH3YI3ND.js";
26
26
  import "./chunk-JPMVNMF3.js";
27
27
  import "./chunk-IMIUHG2E.js";
28
28
  import "./chunk-VZ7TYX6Z.js";
29
29
  import "./chunk-T56BK7NS.js";
30
- import "./chunk-VEQTURKN.js";
31
- import "./chunk-AG7HKF2U.js";
32
- import "./chunk-ID5QY7V6.js";
30
+ import "./chunk-NLXQ7WTH.js";
31
+ import "./chunk-LO3DH776.js";
32
+ import "./chunk-LZEX2GAY.js";
33
33
  import "./chunk-WPZKOVYF.js";
34
34
  import "./chunk-B7J5UUUV.js";
35
35
  import "./chunk-KYRDKK2D.js";
@@ -46,7 +46,7 @@ import {
46
46
  silhouetteKeepOutForWindow,
47
47
  sourceRectToOutput,
48
48
  sourceWindowKey
49
- } from "./chunk-FGJ7GKWZ.js";
49
+ } from "./chunk-6WQHVYJD.js";
50
50
  import {
51
51
  BRAND_TOKEN_REFS,
52
52
  BRAND_TOKEN_ROOT_KEYS,
@@ -83,7 +83,7 @@ import {
83
83
  resolveLayoutIntent,
84
84
  resolveOverlayRegion,
85
85
  unionFaceKeepOutSeries
86
- } from "./chunk-W5W3FDDI.js";
86
+ } from "./chunk-Z6NY6MCL.js";
87
87
  import {
88
88
  contrastRatio
89
89
  } from "./chunk-ILO4NEZ3.js";
@@ -149,11 +149,12 @@ import {
149
149
  WebhookDeliveryStatus,
150
150
  WebhookDestination,
151
151
  YoutubeDestination
152
- } from "./chunk-AG7HKF2U.js";
152
+ } from "./chunk-LO3DH776.js";
153
153
  import {
154
154
  ANIMATABLE_PARAMS,
155
155
  ANIMATABLE_VALUE,
156
156
  AlphaLayerClipSource,
157
+ CaptionRegion,
157
158
  CaptionSegment,
158
159
  CaptionStyle,
159
160
  CaptionWord,
@@ -186,7 +187,7 @@ import {
186
187
  Transition,
187
188
  captionWords,
188
189
  captionsAreBehindSubject
189
- } from "./chunk-ID5QY7V6.js";
190
+ } from "./chunk-LZEX2GAY.js";
190
191
  import {
191
192
  AUTHORED_GRAPHIC_KINDS
192
193
  } from "./chunk-WPZKOVYF.js";
@@ -306,6 +307,7 @@ export {
306
307
  COVIEW_MAX_SILHOUETTE_W,
307
308
  COVIEW_MIN_BAND_COVERAGE,
308
309
  CURRENT_MATTE_BAKE_VERSION,
310
+ CaptionRegion,
309
311
  CaptionSegment,
310
312
  CaptionStyle,
311
313
  CaptionWord,
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  buildDirectorContext
3
- } from "./chunk-SLUTOUWI.js";
4
- import "./chunk-VEQTURKN.js";
5
- import "./chunk-AG7HKF2U.js";
6
- import "./chunk-ID5QY7V6.js";
3
+ } from "./chunk-OVV35ZS2.js";
4
+ import "./chunk-NLXQ7WTH.js";
5
+ import "./chunk-LO3DH776.js";
6
+ import "./chunk-LZEX2GAY.js";
7
7
  import "./chunk-WPZKOVYF.js";
8
8
  import "./chunk-B7J5UUUV.js";
9
9
  import "./chunk-KYRDKK2D.js";
@@ -5,7 +5,7 @@ import {
5
5
  } from "../chunk-XSBVOXSB.js";
6
6
  import {
7
7
  CURATED_TOOLS
8
- } from "../chunk-CFIQY4OE.js";
8
+ } from "../chunk-4WBSXHQA.js";
9
9
  import {
10
10
  apiErrorFrom,
11
11
  bodySchemaFor,
@@ -10,7 +10,7 @@ import {
10
10
  formatResourceCandidates,
11
11
  formatTranscriptPage,
12
12
  formatWarnings
13
- } from "../chunk-CFIQY4OE.js";
13
+ } from "../chunk-4WBSXHQA.js";
14
14
  import "../chunk-2ESYSVXG.js";
15
15
  export {
16
16
  CRUD_COVERAGE,
@@ -8,21 +8,21 @@ import {
8
8
  registerRawTools,
9
9
  registerSkillPrompts,
10
10
  titleCase
11
- } from "../chunk-TBZU7JYA.js";
11
+ } from "../chunk-XVJU63TF.js";
12
12
  import "../chunk-FYS2XUKJ.js";
13
13
  import "../chunk-XSBVOXSB.js";
14
- import "../chunk-CFIQY4OE.js";
14
+ import "../chunk-4WBSXHQA.js";
15
15
  import "../chunk-AOIY7NGF.js";
16
- import "../chunk-GI2NTS6B.js";
16
+ import "../chunk-WIPIYUY2.js";
17
17
  import "../chunk-INYP56TC.js";
18
18
  import "../chunk-QH3YI3ND.js";
19
19
  import "../chunk-JPMVNMF3.js";
20
20
  import "../chunk-IMIUHG2E.js";
21
21
  import "../chunk-VZ7TYX6Z.js";
22
22
  import "../chunk-T56BK7NS.js";
23
- import "../chunk-VEQTURKN.js";
24
- import "../chunk-AG7HKF2U.js";
25
- import "../chunk-ID5QY7V6.js";
23
+ import "../chunk-NLXQ7WTH.js";
24
+ import "../chunk-LO3DH776.js";
25
+ import "../chunk-LZEX2GAY.js";
26
26
  import "../chunk-WPZKOVYF.js";
27
27
  import "../chunk-B7J5UUUV.js";
28
28
  import "../chunk-KYRDKK2D.js";
package/dist/mcp.js CHANGED
@@ -8,21 +8,21 @@ import {
8
8
  buildServer,
9
9
  registerCuratedTools,
10
10
  registerRawTools
11
- } from "./chunk-TBZU7JYA.js";
11
+ } from "./chunk-XVJU63TF.js";
12
12
  import "./chunk-FYS2XUKJ.js";
13
13
  import "./chunk-XSBVOXSB.js";
14
- import "./chunk-CFIQY4OE.js";
14
+ import "./chunk-4WBSXHQA.js";
15
15
  import "./chunk-AOIY7NGF.js";
16
- import "./chunk-GI2NTS6B.js";
16
+ import "./chunk-WIPIYUY2.js";
17
17
  import "./chunk-INYP56TC.js";
18
18
  import "./chunk-QH3YI3ND.js";
19
19
  import "./chunk-JPMVNMF3.js";
20
20
  import "./chunk-IMIUHG2E.js";
21
21
  import "./chunk-VZ7TYX6Z.js";
22
22
  import "./chunk-T56BK7NS.js";
23
- import "./chunk-VEQTURKN.js";
24
- import "./chunk-AG7HKF2U.js";
25
- import "./chunk-ID5QY7V6.js";
23
+ import "./chunk-NLXQ7WTH.js";
24
+ import "./chunk-LO3DH776.js";
25
+ import "./chunk-LZEX2GAY.js";
26
26
  import "./chunk-WPZKOVYF.js";
27
27
  import "./chunk-B7J5UUUV.js";
28
28
  import "./chunk-KYRDKK2D.js";
@@ -93,8 +93,21 @@ function assignTimeline(raw, lingerMs) {
93
93
  }
94
94
 
95
95
  // ../execution/primitives/src/captions/placement.ts
96
- function resolveCaptionPlacement(position, region) {
97
- const vertical = region ? { bottom: `${Math.max(0, (1 - (region.y + region.h)) * 100)}%` } : position === "top" ? { top: "8%" } : position === "center" ? { top: "50%", transform: "translateY(-50%)" } : { bottom: "10%" };
96
+ var percent = (fraction) => `${Number((fraction * 100).toFixed(4))}%`;
97
+ function resolveCaptionPlacement(position, region, authoredRegion) {
98
+ if (authoredRegion) {
99
+ return {
100
+ position: "absolute",
101
+ left: percent(authoredRegion.x),
102
+ top: percent(authoredRegion.y),
103
+ width: percent(authoredRegion.w),
104
+ height: percent(authoredRegion.h),
105
+ display: "flex",
106
+ justifyContent: "flex-start",
107
+ alignItems: "flex-start"
108
+ };
109
+ }
110
+ const vertical = position === "top" ? { top: "8%" } : position === "center" ? { top: "50%", transform: "translateY(-50%)" } : position === "bottom" ? { bottom: "10%" } : region ? { bottom: `${Math.max(0, (1 - (region.y + region.h)) * 100)}%` } : { bottom: "10%" };
98
111
  return {
99
112
  position: "absolute",
100
113
  left: 0,
@@ -153,16 +166,16 @@ function addTokenToBox(box, token, fontFamily, fontSize, fontWeight, emphasis) {
153
166
  fontWeight: String(tokenWeight)
154
167
  });
155
168
  }
156
- function makeBoxFactory(maxWidth, fontFamily, fontSize, fontWeight, emphasis) {
169
+ function makeBoxFactory(maxWidth, maxLines, fontFamily, fontSize, fontWeight, emphasis) {
157
170
  return () => {
158
- const box = fillTextBox({ maxBoxWidth: maxWidth, maxLines: 3 });
171
+ const box = fillTextBox({ maxBoxWidth: maxWidth, maxLines });
159
172
  return {
160
173
  add: (token) => !addTokenToBox(box, token, fontFamily, fontSize, fontWeight, emphasis).exceedsBox
161
174
  };
162
175
  };
163
176
  }
164
- function layoutTokensIntoLines(tokens, maxWidth, fontFamily, fontSize, fontWeight, emphasis) {
165
- const box = fillTextBox({ maxBoxWidth: maxWidth, maxLines: 3 });
177
+ function layoutTokensIntoLines(tokens, maxWidth, maxLines, fontFamily, fontSize, fontWeight, emphasis) {
178
+ const box = fillTextBox({ maxBoxWidth: maxWidth, maxLines });
166
179
  const lines = [[]];
167
180
  for (const token of tokens) {
168
181
  const result = addTokenToBox(box, token, fontFamily, fontSize, fontWeight, emphasis);
@@ -211,7 +224,15 @@ function Captions({
211
224
  const maxWidthPercent = style.maxWidthPercent ?? 80;
212
225
  const plateStyle = plateStyleFor(style.plate ?? "glass", style.backgroundColor);
213
226
  const fontSize = Math.round(height * (style.fontSize / 100));
214
- const maxTextWidth = width * (maxWidthPercent / 100);
227
+ const authoredRegion = userStyle?.region;
228
+ const regionWidth = authoredRegion ? width * authoredRegion.w : width;
229
+ const maxTextWidth = authoredRegion ? Math.min(width * (maxWidthPercent / 100), regionWidth - fontSize * 1.6) : width * (maxWidthPercent / 100);
230
+ const availableHeight = authoredRegion ? height * authoredRegion.h - fontSize * 0.8 : Infinity;
231
+ const lineHeight = fontSize * Math.max(1, emphasisScale) * 1.2;
232
+ const maxLines = authoredRegion ? Math.min(3, Math.floor((availableHeight + fontSize * 0.25) / (lineHeight + fontSize * 0.25))) : 3;
233
+ if (authoredRegion && (maxTextWidth <= 0 || maxLines < 1)) {
234
+ throw new Error("Caption style.region is too small for one caption line at the authored font size");
235
+ }
215
236
  const { emphasisStartMs, annotateKind } = useMemo(() => {
216
237
  const emph = /* @__PURE__ */ new Set();
217
238
  const ann = /* @__PURE__ */ new Map();
@@ -228,10 +249,10 @@ function Captions({
228
249
  const pages = useMemo(
229
250
  () => paginateCaptionSegments(segments, {
230
251
  combineMs: COMBINE_TOKENS_MS,
231
- makeBox: makeBoxFactory(maxTextWidth, style.fontFamily, fontSize, style.fontWeight, emphasisLayout),
252
+ makeBox: makeBoxFactory(maxTextWidth, maxLines, style.fontFamily, fontSize, style.fontWeight, emphasisLayout),
232
253
  lingerMs: CAPTION_LINGER_MS
233
254
  }),
234
- [segments, maxTextWidth, fontSize, style.fontFamily, style.fontWeight, emphasisLayout]
255
+ [segments, maxTextWidth, maxLines, fontSize, style.fontFamily, style.fontWeight, emphasisLayout]
235
256
  );
236
257
  if (pages.length === 0) return null;
237
258
  const currentTimeMs = frame / fps * 1e3;
@@ -259,12 +280,13 @@ function Captions({
259
280
  const lines = layoutTokensIntoLines(
260
281
  currentPage.tokens,
261
282
  maxTextWidth,
283
+ maxLines,
262
284
  style.fontFamily,
263
285
  fontSize,
264
286
  style.fontWeight,
265
287
  emphasisLayout
266
288
  );
267
- const wrapperStyle = resolveCaptionPlacement(style.position, region);
289
+ const wrapperStyle = resolveCaptionPlacement(userStyle?.position, region, authoredRegion);
268
290
  return /* @__PURE__ */ React.createElement(AbsoluteFill, { style: { pointerEvents: "none" } }, /* @__PURE__ */ React.createElement("div", { style: wrapperStyle }, /* @__PURE__ */ React.createElement(
269
291
  "div",
270
292
  {
@@ -272,12 +294,12 @@ function Captions({
272
294
  opacity: groupOpacity,
273
295
  display: "flex",
274
296
  flexDirection: "column",
275
- alignItems: "center",
297
+ alignItems: authoredRegion ? "flex-start" : "center",
276
298
  gap: `${fontSize * 0.25}px`,
277
299
  padding: `${fontSize * 0.4}px ${fontSize * 0.8}px`,
278
300
  borderRadius: fontSize * 0.5,
279
301
  ...plateStyle,
280
- maxWidth: `${maxWidthPercent}%`,
302
+ maxWidth: authoredRegion ? "100%" : `${maxWidthPercent}%`,
281
303
  boxSizing: "border-box"
282
304
  }
283
305
  },
@@ -317,7 +339,7 @@ function Captions({
317
339
  if (emphasisPlate && e && last && last.emph) last.tokens.push(t);
318
340
  else segs.push({ tokens: [t], emph: e });
319
341
  }
320
- return /* @__PURE__ */ React.createElement("div", { key: lineIdx, style: { display: "flex", justifyContent: "center", alignItems: "baseline", gap: `${fontSize * 0.35}px` } }, segs.map((seg, si) => {
342
+ return /* @__PURE__ */ React.createElement("div", { key: lineIdx, style: { display: "flex", justifyContent: authoredRegion ? "flex-start" : "center", alignItems: "baseline", gap: `${fontSize * 0.35}px` } }, segs.map((seg, si) => {
321
343
  const first = seg.tokens[0];
322
344
  const { opacity, scale, y } = entranceOf(first, seg.emph);
323
345
  const entranceTransform = `translateY(${y}px) scale(${scale})`;
@@ -1,3 +1,9 @@
1
+ import {
2
+ assertCardHtmlAssetFree
3
+ } from "./chunk-DV7ZFVL4.js";
4
+ import {
5
+ assertCardFontsAdmitted
6
+ } from "./chunk-ACURZCPN.js";
1
7
  import {
2
8
  assertNoRemoteRefs,
3
9
  assetSlots,
@@ -5,13 +11,7 @@ import {
5
11
  isRemoteUrl,
6
12
  renderInputAssets
7
13
  } from "./chunk-KSRFYFUZ.js";
8
- import {
9
- assertCardHtmlAssetFree
10
- } from "./chunk-DV7ZFVL4.js";
11
14
  import "./chunk-OSMXQV5V.js";
12
- import {
13
- assertCardFontsAdmitted
14
- } from "./chunk-ACURZCPN.js";
15
15
  import "./chunk-MYBK6DKF.js";
16
16
  import "./chunk-BVA3537Z.js";
17
17
  import {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cueframe/kernel",
3
- "version": "0.2.48",
3
+ "version": "0.2.50",
4
4
  "type": "module",
5
5
  "description": "Publish-only aggregate of CueFrame's isomorphic kernel packages — composition, primitives, authoring, MCP, and friends shipped as one npm artifact. Members remain separate workspace packages; this only changes what ships.",
6
6
  "files": [
@@ -16,26 +16,26 @@
16
16
  "devDependencies": {
17
17
  "tsup": "^8.3.5",
18
18
  "typescript": "^5.9.3",
19
- "@cueframe/authoring": "0.1.0",
20
19
  "@cueframe/account-model": "0.1.0",
20
+ "@cueframe/animate": "0.1.0",
21
+ "@cueframe/authoring": "0.1.0",
22
+ "@cueframe/composition-ops": "0.1.0",
23
+ "@cueframe/cloud-import": "0.1.0",
21
24
  "@cueframe/compose": "0.1.0",
25
+ "@cueframe/brand-derivation": "0.1.0",
26
+ "@cueframe/component-runtime": "0.1.0",
27
+ "@cueframe/core": "0.1.0",
22
28
  "@cueframe/composition": "0.1.0",
23
- "@cueframe/cloud-import": "0.1.0",
29
+ "@cueframe/errors": "0.1.0",
24
30
  "@cueframe/director": "0.1.0",
25
- "@cueframe/composition-ops": "0.1.0",
26
- "@cueframe/animate": "0.1.0",
27
- "@cueframe/brand-derivation": "0.1.0",
31
+ "@cueframe/nle-export": "0.1.0",
32
+ "@cueframe/media-model": "0.1.0",
33
+ "@cueframe/mcp": "0.1.0",
28
34
  "@cueframe/foundation": "0.1.0",
29
35
  "@cueframe/perception": "0.1.0",
30
- "@cueframe/mcp": "0.1.0",
31
- "@cueframe/errors": "0.1.0",
32
- "@cueframe/component-runtime": "0.1.0",
33
- "@cueframe/media-model": "0.1.0",
34
- "@cueframe/primitives": "0.1.0",
35
- "@cueframe/nle-export": "0.1.0",
36
- "@cueframe/core": "0.1.0",
36
+ "@cueframe/plane": "0.1.0",
37
37
  "@cueframe/render-harness": "0.1.0",
38
- "@cueframe/plane": "0.1.0"
38
+ "@cueframe/primitives": "0.1.0"
39
39
  },
40
40
  "peerDependencies": {
41
41
  "gsap": "3.13.0",