@vosjs/cli 0.78.0 → 0.80.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 (42) hide show
  1. package/README.md +152 -31
  2. package/dist/{assetManifest-S6H5F2VE.js → assetManifest-ETT3C7ZA.js} +3 -3
  3. package/dist/{chunk-JYCW4EOA.js → chunk-B373NVJE.js} +7 -3
  4. package/dist/chunk-B373NVJE.js.map +1 -0
  5. package/dist/{chunk-B4U4URE3.js → chunk-J3KHIZCH.js} +466 -412
  6. package/dist/chunk-J3KHIZCH.js.map +1 -0
  7. package/dist/{chunk-RUDDBHQ7.js → chunk-OWYOJB7K.js} +5 -1
  8. package/dist/chunk-OWYOJB7K.js.map +1 -0
  9. package/dist/{chunk-ZSJEISKL.js → chunk-PJ6MEJZV.js} +213 -28
  10. package/dist/chunk-PJ6MEJZV.js.map +1 -0
  11. package/dist/{chunk-INRUYQ6J.js → chunk-SP5OHTVB.js} +4285 -1560
  12. package/dist/chunk-SP5OHTVB.js.map +1 -0
  13. package/dist/cli.js +17 -10
  14. package/dist/cli.js.map +1 -1
  15. package/dist/index.d.ts +15 -6
  16. package/dist/index.js +5 -5
  17. package/dist/manifest-VTOIEUHJ.js +8 -0
  18. package/dist/{run-TIFM3ZHI.js → run-2ELHMPTB.js} +5 -5
  19. package/dist/{shotList-SCA234OS.js → shotList-MSNWLVDN.js} +63 -9
  20. package/dist/shotList-MSNWLVDN.js.map +1 -0
  21. package/package.json +3 -3
  22. package/schema/actions.schema.json +498 -17
  23. package/schema/doc.schema.json +46 -5
  24. package/skills/VERSION +1 -1
  25. package/skills/launch-kit/SKILL.md +12 -3
  26. package/skills/product-video/SKILL.md +34 -0
  27. package/skills/product-video/references/taste.md +7 -3
  28. package/skills/vos-authoring/SKILL.md +8 -1
  29. package/skills/vos-create/SKILL.md +5 -0
  30. package/skills/vos-cut/SKILL.md +25 -2
  31. package/skills/vos-footage/SKILL.md +4 -0
  32. package/skills/vos-migrate/SKILL.md +4 -0
  33. package/dist/chunk-B4U4URE3.js.map +0 -1
  34. package/dist/chunk-INRUYQ6J.js.map +0 -1
  35. package/dist/chunk-JYCW4EOA.js.map +0 -1
  36. package/dist/chunk-RUDDBHQ7.js.map +0 -1
  37. package/dist/chunk-ZSJEISKL.js.map +0 -1
  38. package/dist/manifest-6DJSPKVH.js +0 -8
  39. package/dist/shotList-SCA234OS.js.map +0 -1
  40. /package/dist/{assetManifest-S6H5F2VE.js.map → assetManifest-ETT3C7ZA.js.map} +0 -0
  41. /package/dist/{manifest-6DJSPKVH.js.map → manifest-VTOIEUHJ.js.map} +0 -0
  42. /package/dist/{run-TIFM3ZHI.js.map → run-2ELHMPTB.js.map} +0 -0
@@ -4,6 +4,18 @@ import {
4
4
  } from "./chunk-6XPFWQKP.js";
5
5
 
6
6
  // src/plugin/shotList.ts
7
+ import { pressSequence, splitChord } from "@vosjs/render-core/record";
8
+ function sayChord(chord) {
9
+ const { mods, key } = splitChord(chord);
10
+ const word = (k) => k === "Mod" || k === "ControlOrMeta" ? "\u2318/Ctrl" : k === "Control" ? "Ctrl" : k === "Meta" ? "\u2318" : k === "Alt" ? "Alt/Option" : k === " " ? "Space" : k;
11
+ return [...mods, key].map(word).join("+");
12
+ }
13
+ function sayPoint(p) {
14
+ const x = p.x ?? 0;
15
+ const y = p.y ?? 0;
16
+ return `the spot at ${Math.round(x)}, ${Math.round(y)} (${y < 360 ? "upper" : "lower"} ${x < 640 ? "left" : "right"})`;
17
+ }
18
+ var thenList = (xs) => xs.length <= 1 ? xs[0] ?? "" : `${xs.slice(0, -1).join(", ")} then ${xs[xs.length - 1]}`;
7
19
  function sayTarget(selector) {
8
20
  const text = /^text=(['"]?)(.+?)\1$/.exec(selector);
9
21
  if (text) return `"${text[2]}"`;
@@ -32,6 +44,8 @@ function sayStepTarget(step) {
32
44
  return byId ? `${byId} (${bySelector})` : bySelector;
33
45
  }
34
46
  function sayCondition(c) {
47
+ if (c.js !== void 0)
48
+ return c.equals !== void 0 ? `the console's \`${c.js}\` gives ${JSON.stringify(c.equals)}` : `the console's \`${c.js}\` is true`;
35
49
  if (c.text !== void 0) return `"${c.text}" shows on the page`;
36
50
  if (c.gone !== void 0) return `${sayTarget(c.gone)} is gone`;
37
51
  const target = sayStepTarget({ selector: c.selector ?? "", id: c.id });
@@ -41,7 +55,9 @@ function sayCondition(c) {
41
55
  }
42
56
  function beatOf(step) {
43
57
  const line = gestureBeat(step);
44
- return line && step.guard ? `${line} (this spends something real: do it only if you mean to)` : line;
58
+ if (!line) return line;
59
+ const camera = step.zoom === true ? " (zoomed in on in the cut)" : step.zoom === false ? " (the cut stays wide here)" : "";
60
+ return step.guard ? `${line}${camera} (this spends something real: do it only if you mean to)` : `${line}${camera}`;
45
61
  }
46
62
  function gestureBeat(step) {
47
63
  const cap = step.caption;
@@ -56,26 +72,46 @@ function gestureBeat(step) {
56
72
  case "wait":
57
73
  return null;
58
74
  case "hover":
59
- return `${named}Rest the pointer on ${sayStepTarget(step)}`;
60
- case "click":
61
- return `${named}Click ${sayStepTarget(step)}`;
75
+ return `${named}Rest the pointer on ${step.selector !== void 0 ? sayStepTarget({ selector: step.selector, id: step.id }) : sayPoint(step)}`;
76
+ case "click": {
77
+ const verb = step.count === 3 ? "Triple-click" : step.count === 2 ? "Double-click" : "Click";
78
+ const button = step.button === "right" ? " with the right button" : step.button === "middle" ? " with the middle button" : "";
79
+ const target = step.selector !== void 0 ? sayStepTarget({ selector: step.selector, id: step.id }) : sayPoint(step);
80
+ const holding = step.modifiers?.length ? `Hold ${step.modifiers.map(sayChord).join("+")} and ${verb.toLowerCase()}` : verb;
81
+ return `${named}${holding} ${target}${button}`;
82
+ }
62
83
  case "type":
63
84
  return `${named}${step.replace ? "Replace what is in" : "Type"}${step.replace ? ` ${sayStepTarget(step)} with "${step.text}"` : ` "${step.text}" into ${sayStepTarget(step)}`}${step.at === "end" ? ", at the end" : step.at === "start" ? ", at the start" : ""}`;
64
85
  case "press":
65
- return `${named}Press ${step.key}${step.selector ? ` in ${sayStepTarget(step)}` : ""}`;
86
+ return `${named}Press ${thenList(pressSequence(step).map(sayChord))}${step.selector ? ` in ${sayStepTarget(step)}` : ""}`;
87
+ case "paste": {
88
+ const what = step.text !== void 0 ? `"${step.text.length > 60 ? `${step.text.slice(0, 57)}...` : step.text}"` : `the file ${step.file}`;
89
+ return `${named}Copy ${what}, then paste it${step.selector ? ` into ${sayStepTarget({ selector: step.selector, id: step.id })}` : ""} (\u2318/Ctrl+V)`;
90
+ }
66
91
  case "scroll":
67
92
  return `${named}Scroll ${step.dy < 0 ? "up" : "down"} ${step.dy < 0 ? "a little" : "a little"}`;
68
93
  case "move":
69
94
  return `${named}Move the pointer to the ${step.y < 360 ? "upper" : "lower"} ${step.x < 640 ? "left" : "right"}`;
70
- case "drag":
71
- return `${named}Drag ${step.selector ? sayStepTarget(step) : "from the start point"} across`;
95
+ case "drag": {
96
+ const holding = step.modifiers?.length ? `Hold ${step.modifiers.map(sayChord).join("+")} and ` : "";
97
+ const verb = holding ? "drag" : "Drag";
98
+ if (step.path !== void 0)
99
+ return `${named}${holding}${holding ? "draw" : "Draw"} the stroke ${typeof step.path === "string" ? `in ${step.path}` : `of ${step.path.length} points`}, in one press`;
100
+ return `${named}${holding}${verb} ${step.selector ? sayStepTarget(step) : "from the start point"} across`;
101
+ }
72
102
  }
73
103
  }
74
104
  function shotList(actions) {
75
105
  const beats = [];
76
106
  let pendingHold = 0;
77
107
  let total = 0;
108
+ const beatOfId = /* @__PURE__ */ new Map();
78
109
  for (const step of actions.steps) {
110
+ if (step.id)
111
+ beatOfId.set(
112
+ step.id,
113
+ Math.max(1, beats.length + (step.do === "wait" ? 0 : 1))
114
+ );
79
115
  total += askedMs(step);
80
116
  if (step.do === "wait") {
81
117
  if (beats.length) {
@@ -91,13 +127,23 @@ function shotList(actions) {
91
127
  beats.push(beat);
92
128
  }
93
129
  void pendingHold;
130
+ const peers = (actions.peers ?? []).map((peer) => ({
131
+ id: peer.id,
132
+ lines: peer.steps.map((step) => {
133
+ const line = step.do === "wait" ? `Wait ${s1(step.ms)} s` : beatOf(step);
134
+ if (!line) return null;
135
+ const when = step.with ? `As beat ${beatOfId.get(step.with) ?? "?"} starts: ` : step.after ? `Once beat ${beatOfId.get(step.after) ?? "?"} is done: ` : "";
136
+ return `${when}${line}`;
137
+ }).filter((l) => l !== null)
138
+ }));
94
139
  return {
95
140
  url: actions.url,
96
141
  viewport: actions.viewport,
97
142
  beats,
98
143
  // gestures the recorder adds around each ask: about a second a beat
99
144
  aboutS: Math.round((total + beats.length * 1e3) / 1e3),
100
- setup: actions.setup?.length ?? 0
145
+ setup: actions.setup?.length ?? 0,
146
+ ...peers.length ? { peers } : {}
101
147
  };
102
148
  }
103
149
  function formatShotList(list) {
@@ -116,6 +162,13 @@ function formatShotList(list) {
116
162
  const hold = b.holdS && b.holdS >= 0.4 ? ` Hold ${s1(b.holdS * 1e3)} s.` : "";
117
163
  out.push(`${b.n}. ${b.line}.${hold}`);
118
164
  }
165
+ for (const peer of list.peers ?? []) {
166
+ out.push("");
167
+ out.push(
168
+ `A second person (${peer.id}) does this at the same time, in their own browser on the same page; their screen is not recorded, the app shows what they do:`
169
+ );
170
+ peer.lines.forEach((l, i) => out.push(` ${peer.id}${i + 1}. ${l}.`));
171
+ }
119
172
  out.push("");
120
173
  out.push(
121
174
  "Move at a talking pace, let each screen settle before the next beat, and end on the finished state. Press the icon again to stop; the take opens in the studio and saves to your shelf."
@@ -124,8 +177,9 @@ function formatShotList(list) {
124
177
  }
125
178
  export {
126
179
  formatShotList,
180
+ sayChord,
127
181
  sayId,
128
182
  sayTarget,
129
183
  shotList
130
184
  };
131
- //# sourceMappingURL=shotList-SCA234OS.js.map
185
+ //# sourceMappingURL=shotList-MSNWLVDN.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/plugin/shotList.ts"],"sourcesContent":["/**\n * The shot list: an `actions.json` said in words, for a person who will\n * record it by hand. The last rung of the session ladder is \"the human\n * records, the agent cuts\", and an agent that falls to it should hand over\n * more than an apology: the flow it worked out, as numbered beats with the\n * pace it wanted, so its knowledge survives the hop to a human. The take\n * comes back through the ordinary handoff and the agent cuts it.\n *\n * Pure: an ActionsFile in, lines out. Selectors are said as what they name\n * where the script says (an id, a caption, a text= locator), and as the\n * selector itself where it does not: a person reading `#filter-late` can\n * find it; a person reading nothing cannot.\n */\nimport type { ActionStep, ActionsFile } from './actions'\nimport { askedMs } from './pace'\nimport { pressSequence, splitChord } from '@vosjs/render-core/record'\n\n/** A key or a chord as a person reads it: `Mod` is ⌘ on a Mac, Ctrl elsewhere. */\nexport function sayChord(chord: string): string {\n const { mods, key } = splitChord(chord)\n const word = (k: string) =>\n k === 'Mod' || k === 'ControlOrMeta'\n ? '⌘/Ctrl'\n : k === 'Control'\n ? 'Ctrl'\n : k === 'Meta'\n ? '⌘'\n : k === 'Alt'\n ? 'Alt/Option'\n : k === ' '\n ? 'Space'\n : k\n return [...mods, key].map(word).join('+')\n}\n\n/** A viewport point as a person finds it: where it is, and the script's numbers. */\nfunction sayPoint(p: { x?: number; y?: number }): string {\n const x = p.x ?? 0\n const y = p.y ?? 0\n return `the spot at ${Math.round(x)}, ${Math.round(y)} (${y < 360 ? 'upper' : 'lower'} ${x < 640 ? 'left' : 'right'})`\n}\n\n/** A list in words: `a`, `a then b`, `a, b then c`. */\nconst thenList = (xs: string[]): string =>\n xs.length <= 1\n ? (xs[0] ?? '')\n : `${xs.slice(0, -1).join(', ')} then ${xs[xs.length - 1]}`\n\nexport interface ShotBeat {\n n: number\n /** what to do, in words */\n line: string\n /** how long to hold after, in seconds, when the script asks for a hold */\n holdS?: number\n}\n\nexport interface ShotList {\n url?: string\n viewport?: { width: number; height: number }\n beats: ShotBeat[]\n /** the take's asked length, from the script's own pacing */\n aboutS: number\n setup: number\n /**\n * What each other person does (the script's `peers`), as beats tied to\n * the take's own: a second pair of hands, in their own browser, on the\n * same page.\n */\n peers?: { id: string; lines: string[] }[]\n}\n\n/** A selector as a person reads it: the text it names, or the selector itself. */\nexport function sayTarget(selector: string): string {\n const text = /^text=(['\"]?)(.+?)\\1$/.exec(selector)\n if (text) return `\"${text[2]}\"`\n const has = /:has-text\\((['\"])(.+?)\\1\\)/.exec(selector)\n if (has) return `\"${has[2]}\"`\n const role = /getByRole\\(['\"](\\w+)['\"],\\s*\\{\\s*name:\\s*(['\"])(.+?)\\2/.exec(\n selector,\n )\n if (role) return `the ${role[1]} \"${role[3]}\"`\n const label = /\\[aria-label=(['\"])(.+?)\\1\\]/.exec(selector)\n if (label) return `\"${label[2]}\"`\n const ph = /\\[placeholder=(['\"])(.+?)\\1\\]/.exec(selector)\n if (ph) return `the \"${ph[2]}\" field`\n return `\\`${selector}\\``\n}\n\nconst s1 = (ms: number) => `${Math.round(ms / 100) / 10}`.replace(/\\.0$/, '')\n\n/** A step's id, said as a name when it reads as one (`late`, `new-order`, `openBilling`). */\nexport function sayId(id: string | undefined): string | null {\n if (!id || /^\\d+$/.test(id) || id.length < 3) return null\n const words = id\n .replace(/([a-z])([A-Z])/g, '$1 $2')\n .replace(/[-_]+/g, ' ')\n .toLowerCase()\n .trim()\n return words.length >= 3 ? words : null\n}\n\n/** What a step points at, for a person: the words the selector names, else the id's, else the selector. */\nfunction sayStepTarget(step: { selector: string; id?: string }): string {\n const bySelector = sayTarget(step.selector)\n if (!bySelector.startsWith('`')) return bySelector\n const byId = sayId(step.id)\n return byId ? `${byId} (${bySelector})` : bySelector\n}\n\n/** A page condition, for a person: what they should see before going on. */\nfunction sayCondition(c: {\n selector?: string\n text?: string\n gone?: string\n enabled?: boolean\n js?: string\n equals?: unknown\n id?: string\n}): string {\n // A state the app keeps in script: a person reads it in the browser's\n // console, so the beat names the expression to run there.\n if (c.js !== undefined)\n return c.equals !== undefined\n ? `the console's \\`${c.js}\\` gives ${JSON.stringify(c.equals)}`\n : `the console's \\`${c.js}\\` is true`\n if (c.text !== undefined) return `\"${c.text}\" shows on the page`\n if (c.gone !== undefined) return `${sayTarget(c.gone)} is gone`\n const target = sayStepTarget({ selector: c.selector ?? '', id: c.id })\n if (c.enabled === true) return `${target} is enabled`\n if (c.enabled === false) return `${target} is disabled`\n return `${target} is showing`\n}\n\nfunction beatOf(step: ActionStep): string | null {\n const line = gestureBeat(step)\n if (!line) return line\n // What the cut's camera does here, said where a person reads it: a step\n // marked as the beat's payoff is zoomed in on, one marked against it is not.\n const camera =\n step.zoom === true\n ? ' (zoomed in on in the cut)'\n : step.zoom === false\n ? ' (the cut stays wide here)'\n : ''\n // A step that spends something real is marked where a person reads it.\n return step.guard\n ? `${line}${camera} (this spends something real: do it only if you mean to)`\n : `${line}${camera}`\n}\n\nfunction gestureBeat(step: ActionStep): string | null {\n const cap = step.caption\n const named = cap ? `${cap}: ` : ''\n switch (step.do) {\n case 'expect':\n return `${named}Check that ${sayCondition(step)}`\n case 'await':\n return `${named}Wait until ${sayCondition({ ...step.until, id: step.id })} (off camera: pause the recording meanwhile)`\n case 'download':\n return step.selector !== undefined\n ? `${named}Download the file ${sayStepTarget({ selector: step.selector, id: step.id })} gives${step.as ? `, as ${step.as}` : ''}`\n : `${named}Download what ${sayTarget(step.src ?? '')} plays${step.as ? `, as ${step.as}` : ''}`\n case 'wait':\n return null\n case 'hover':\n return `${named}Rest the pointer on ${step.selector !== undefined ? sayStepTarget({ selector: step.selector, id: step.id }) : sayPoint(step)}`\n case 'click': {\n const verb =\n step.count === 3\n ? 'Triple-click'\n : step.count === 2\n ? 'Double-click'\n : 'Click'\n const button =\n step.button === 'right'\n ? ' with the right button'\n : step.button === 'middle'\n ? ' with the middle button'\n : ''\n const target =\n step.selector !== undefined\n ? sayStepTarget({ selector: step.selector, id: step.id })\n : sayPoint(step)\n const holding = step.modifiers?.length\n ? `Hold ${step.modifiers.map(sayChord).join('+')} and ${verb.toLowerCase()}`\n : verb\n return `${named}${holding} ${target}${button}`\n }\n case 'type':\n return `${named}${step.replace ? 'Replace what is in' : 'Type'}${step.replace ? ` ${sayStepTarget(step)} with \"${step.text}\"` : ` \"${step.text}\" into ${sayStepTarget(step)}`}${step.at === 'end' ? ', at the end' : step.at === 'start' ? ', at the start' : ''}`\n case 'press':\n return `${named}Press ${thenList(pressSequence(step).map(sayChord))}${step.selector ? ` in ${sayStepTarget(step as { selector: string; id?: string })}` : ''}`\n case 'paste': {\n const what =\n step.text !== undefined\n ? `\"${step.text.length > 60 ? `${step.text.slice(0, 57)}...` : step.text}\"`\n : `the file ${step.file}`\n return `${named}Copy ${what}, then paste it${step.selector ? ` into ${sayStepTarget({ selector: step.selector, id: step.id })}` : ''} (⌘/Ctrl+V)`\n }\n case 'scroll':\n return `${named}Scroll ${step.dy < 0 ? 'up' : 'down'} ${step.dy < 0 ? 'a little' : 'a little'}`\n case 'move':\n return `${named}Move the pointer to the ${step.y < 360 ? 'upper' : 'lower'} ${step.x < 640 ? 'left' : 'right'}`\n case 'drag': {\n const holding = step.modifiers?.length\n ? `Hold ${step.modifiers.map(sayChord).join('+')} and `\n : ''\n const verb = holding ? 'drag' : 'Drag'\n if (step.path !== undefined)\n return `${named}${holding}${holding ? 'draw' : 'Draw'} the stroke ${typeof step.path === 'string' ? `in ${step.path}` : `of ${step.path.length} points`}, in one press`\n return `${named}${holding}${verb} ${step.selector ? sayStepTarget(step as { selector: string; id?: string }) : 'from the start point'} across`\n }\n }\n}\n\nexport function shotList(actions: ActionsFile): ShotList {\n const beats: ShotBeat[] = []\n let pendingHold = 0\n let total = 0\n // Which beat a take step is (or, for a wait, the beat it holds), so a\n // peer's step can say when it happens.\n const beatOfId = new Map<string, number>()\n for (const step of actions.steps) {\n if (step.id)\n beatOfId.set(\n step.id,\n Math.max(1, beats.length + (step.do === 'wait' ? 0 : 1)),\n )\n total += askedMs(step)\n if (step.do === 'wait') {\n // A wait after a beat is that beat's hold; a leading wait is the\n // settle before the first, which a person does without being told.\n if (beats.length) {\n const last = beats[beats.length - 1]\n last.holdS = (last.holdS ?? 0) + step.ms / 1000\n } else pendingHold += step.ms\n continue\n }\n const line = beatOf(step)\n if (!line) continue\n const beat: ShotBeat = { n: beats.length + 1, line }\n if (step.do === 'hover') beat.holdS = askedMs(step) / 1000\n beats.push(beat)\n }\n void pendingHold\n const peers = (actions.peers ?? []).map((peer) => ({\n id: peer.id,\n lines: peer.steps\n .map((step) => {\n const line = step.do === 'wait' ? `Wait ${s1(step.ms)} s` : beatOf(step)\n if (!line) return null\n const when = step.with\n ? `As beat ${beatOfId.get(step.with) ?? '?'} starts: `\n : step.after\n ? `Once beat ${beatOfId.get(step.after) ?? '?'} is done: `\n : ''\n return `${when}${line}`\n })\n .filter((l): l is string => l !== null),\n }))\n return {\n url: actions.url,\n viewport: actions.viewport,\n beats,\n // gestures the recorder adds around each ask: about a second a beat\n aboutS: Math.round((total + beats.length * 1000) / 1000),\n setup: actions.setup?.length ?? 0,\n ...(peers.length ? { peers } : {}),\n }\n}\n\n/** The list as the person reads it. */\nexport function formatShotList(list: ShotList): string {\n const out: string[] = []\n out.push(\n `Record this with the vosso extension in your own signed-in browser, about ${list.aboutS} seconds${list.viewport ? `, window about ${list.viewport.width}×${list.viewport.height}` : ''}.`,\n )\n if (list.url)\n out.push(`Start on ${list.url}, signed in, with the page settled.`)\n if (list.setup)\n out.push(\n `Before you press record: the script's ${list.setup} setup step${list.setup === 1 ? '' : 's'} (sign in, dismiss banners) are yours to do first; they are not part of the take.`,\n )\n out.push('')\n for (const b of list.beats) {\n const hold =\n b.holdS && b.holdS >= 0.4 ? ` Hold ${s1(b.holdS * 1000)} s.` : ''\n out.push(`${b.n}. ${b.line}.${hold}`)\n }\n for (const peer of list.peers ?? []) {\n out.push('')\n out.push(\n `A second person (${peer.id}) does this at the same time, in their own browser on the same page; their screen is not recorded, the app shows what they do:`,\n )\n peer.lines.forEach((l, i) => out.push(` ${peer.id}${i + 1}. ${l}.`))\n }\n out.push('')\n out.push(\n 'Move at a talking pace, let each screen settle before the next beat, and end on the finished state. Press the icon again to stop; the take opens in the studio and saves to your shelf.',\n )\n return out.join('\\n')\n}\n"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vosjs/cli",
3
- "version": "0.78.0",
3
+ "version": "0.80.0",
4
4
  "description": "The vos CLI: record the real product from a scripted browser flow, auto-zoom from the cursor track, cut as data in doc.json, render deterministic video, deliver a release's video cuts per destination spec, and sync with vos.so. One binary, every verb, MIT.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -54,9 +54,9 @@
54
54
  "@vosjs/core": "^0.31.0",
55
55
  "@vosjs/editor": "^1.6.0",
56
56
  "@vosjs/elements": "^0.12.1",
57
- "@vosjs/render-core": "^0.7.0",
57
+ "@vosjs/render-core": "^0.9.0",
58
58
  "@vosjs/shared": "^0.7.0",
59
- "@vosjs/studio-core": "^0.43.0",
59
+ "@vosjs/studio-core": "^0.45.0",
60
60
  "@vosjs/timeline": "^0.5.0",
61
61
  "@vosjs/tween": "^0.8.3"
62
62
  },