@agentmedia/schema 0.5.2 → 0.5.3

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.
@@ -37,12 +37,13 @@ export declare const SelfieSchema: z.ZodEffects<z.ZodObject<{
37
37
  subtitles: z.ZodDefault<z.ZodBoolean>;
38
38
  shot_preset: z.ZodOptional<z.ZodEffects<z.ZodString, string, string>>;
39
39
  vibe: z.ZodOptional<z.ZodEnum<["excited", "calm", "sassy", "serious", "curious"]>>;
40
- camera_locked: z.ZodOptional<z.ZodBoolean>;
40
+ camera_locked: z.ZodDefault<z.ZodBoolean>;
41
41
  phone_in_frame: z.ZodDefault<z.ZodEnum<["forbidden", "optional", "required"]>>;
42
42
  polish: z.ZodOptional<z.ZodEnum<["off", "default", "heavy"]>>;
43
43
  }, "strip", z.ZodTypeAny, {
44
44
  duration: 5 | 10 | 15;
45
45
  subtitles: boolean;
46
+ camera_locked: boolean;
46
47
  phone_in_frame: "forbidden" | "optional" | "required";
47
48
  script?: string | undefined;
48
49
  description?: string | undefined;
@@ -52,7 +53,6 @@ export declare const SelfieSchema: z.ZodEffects<z.ZodObject<{
52
53
  scene_action?: string | undefined;
53
54
  background_music?: string | boolean | undefined;
54
55
  shot_preset?: string | undefined;
55
- camera_locked?: boolean | undefined;
56
56
  polish?: "off" | "default" | "heavy" | undefined;
57
57
  }, {
58
58
  duration?: 5 | 10 | 15 | undefined;
@@ -71,6 +71,7 @@ export declare const SelfieSchema: z.ZodEffects<z.ZodObject<{
71
71
  }>, {
72
72
  duration: 5 | 10 | 15;
73
73
  subtitles: boolean;
74
+ camera_locked: boolean;
74
75
  phone_in_frame: "forbidden" | "optional" | "required";
75
76
  script?: string | undefined;
76
77
  description?: string | undefined;
@@ -80,7 +81,6 @@ export declare const SelfieSchema: z.ZodEffects<z.ZodObject<{
80
81
  scene_action?: string | undefined;
81
82
  background_music?: string | boolean | undefined;
82
83
  shot_preset?: string | undefined;
83
- camera_locked?: boolean | undefined;
84
84
  polish?: "off" | "default" | "heavy" | undefined;
85
85
  }, {
86
86
  duration?: 5 | 10 | 15 | undefined;
package/dist/v2/selfie.js CHANGED
@@ -85,14 +85,14 @@ export const SelfieSchema = z
85
85
  // omitted, the orchestrator picks defaults based on the script.
86
86
  shot_preset: shotPresetSchema.optional(),
87
87
  vibe: z.enum(V2_VIBES).optional(),
88
- // Default: handheld iPhone feel (the #1 realism cue). Set to true
89
- // ONLY for product/demo shots where a stable frame is required.
90
- camera_locked: z.boolean().optional(),
91
- // Default 'forbidden': no visible phone/camera/selfie-arm unless
92
- // explicitly requested for a specific composition.
88
+ // Default: stable/locked framing to avoid jitter. Set false only
89
+ // when the user explicitly requests handheld camera movement.
90
+ camera_locked: z.boolean().default(true),
91
+ // Default 'forbidden': no phone/camera/selfie-stick visible unless
92
+ // the user explicitly requests it.
93
93
  // 'required' — actively compose with phone covering chin/lower face
94
94
  // (the "iPhone-cover trick" — fewer face-render errors).
95
- // 'forbidden' — strip phone from frame entirely (default behavior).
95
+ // 'forbidden' — strip phone from frame entirely (legacy behavior).
96
96
  phone_in_frame: z.enum(V2_PHONE_IN_FRAME).default('forbidden'),
97
97
  // Post-Seedance polish pass (ffmpeg grain + warm grade + vignette).
98
98
  // Defaults to 'default'. Set to 'off' to bypass entirely.
@@ -1 +1 @@
1
- {"version":3,"file":"selfie.js","sourceRoot":"","sources":["../../src/v2/selfie.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"selfie.js","sourceRoot":"","sources":["../../src/v2/selfie.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentmedia/schema",
3
- "version": "0.5.2",
3
+ "version": "0.5.3",
4
4
  "description": "Type-safe schema definitions for AI UGC video generation \u2014 enums, Zod validation, and generator registry. Single source of truth for the agent-media platform.",
5
5
  "type": "module",
6
6
  "license": "Apache-2.0",
@@ -209,7 +209,7 @@ function renderSkillIndex(): string {
209
209
  '2. **Walk the user through 4 gates IN ORDER, one message each** — do not bulk-fire:',
210
210
  ' - **Gate 1:** confirm the exact script (verbatim — typos land in the video)',
211
211
  ' - **Gate 2:** confirm character. YOU run `agent-media character list --json` (do not ask the user "do you have a saved character?" — they don\'t know that\'s a thing). If the list is empty, just confirm the description from their original prompt. If non-empty, present each saved character BY NAME (not by `char_xxx` id — that format is internal). The user picks by NAME or says "new"; you map name → id internally. 🛑 NEVER auto-pick. NEVER show `char_xxx` ids to the user. Never ask for a photo by default.',
212
- ' - **Gate 3:** propose a full **director\'s brief** with pre-filled fields in 3 sections — **A. Intent+Performance**, **B. Scene+Look**, **C. Output**. Put visual direction into `--description` and action/product handling into `--scene-action`. The shot composition and energy are inferred from the brief; you can OPTIONALLY pin them with `--shot-preset` and `--vibe`, or override the realism defaults with `--camera-locked` / `--phone-in-frame` / `--polish` (rare — only when the user explicitly asks for a stable shot, a phone-in-hand composition, or a different polish look). Baseline realism policy: handheld camera stays on, visible phone stays off unless explicitly requested.',
212
+ ' - **Gate 3:** propose a full **director\'s brief** with pre-filled fields in 3 sections — **A. Intent+Performance**, **B. Scene+Look**, **C. Output**. Put visual direction into `--description` and action/product handling into `--scene-action`. The shot composition and energy are inferred from the brief; you can OPTIONALLY pin them with `--shot-preset` and `--vibe`, or override the realism defaults with `--camera-locked` / `--phone-in-frame` / `--polish` (rare — only when the user explicitly asks for a stable shot, a phone-in-hand composition, or a different polish look).',
213
213
  ' - **Gate 4:** duration + **script-pacing check**. Count the words in the script and PROPOSE the duration that fits (5s ≈ 10-20 words, 10s ≈ 20-40 words, 15s ≈ 30-60 words at the natural 2-4 words/sec pace).',
214
214
  '3. Only then call the CLI.',
215
215
  '',
@@ -334,7 +334,7 @@ function renderConversationFlow(): string {
334
334
  '- `--shot-preset <name>` — pin the scene composition (e.g. `car-quick-honest-review`, `bedroom-morning-ritual`, `gym-post-workout`). Pass `custom-scene:<text>` for one-offs. Useful when the user names a specific location and you want to lock it.',
335
335
  '- `--vibe <name>` — pin the actor\'s energy/tone (`excited`, `calm`, `sassy`, `serious`, `curious`). Useful when the user says e.g. "make it sassy" or "keep it serious".',
336
336
  '- `--camera-locked` — lock the camera (no handheld motion). Use for product/demo shots where a stable frame matters. Default is handheld — leave it off for normal UGC.',
337
- '- `--phone-in-frame <forbidden|optional|required>` — control whether the actor holds a phone on screen. Default `forbidden` (no visible phone/camera/selfie-arm). Use `required` when the user asks for a "talking to phone" or "iPhone-cover" composition; use `optional` only when the user explicitly wants phone visibility to be allowed.',
337
+ '- `--phone-in-frame <forbidden|optional|required>` — control whether the actor holds a phone on screen. Default `optional` (phone may appear if natural). Use `required` when the user asks for a "talking to phone" or "iPhone-cover" composition, `forbidden` when the user explicitly wants no phone visible.',
338
338
  '- `--polish <off|default|heavy>` — final-look intensity. Default `default` (recommended). Use `heavy` for a more stylized vintage look, `off` if the user wants the raw model output.',
339
339
  '',
340
340
  'When in doubt, OMIT these flags. The director\'s brief is doing the heavy lifting.',
@@ -444,7 +444,7 @@ function renderConversationFlow(): string {
444
444
  '- ❌ **Mismatching script length and duration** (e.g. 10-word script + 15s duration without enough visual action). Normal speech is 2-4 words/sec. Size duration to fit the script and action plan.',
445
445
  '- ❌ Passing removed flags such as `--preset`, `--voice-brief`, or `--sync` to the current v2 Selfie CLI. (Note: `--shot-preset` and `--vibe` ARE supported as optional overrides — use them only when the user explicitly pins a scene or tone.)',
446
446
  '- ❌ **Overriding the handheld camera default with `--camera-locked` for normal UGC.** Default handheld feel is the #1 realism cue — only lock the camera for product/demo shots where stability is essential.',
447
- '- ❌ **Allowing phone-in-frame by default.** Default is `forbidden` — no visible phone/camera/selfie-arm unless the user explicitly requests it.',
447
+ '- ❌ **Forbidding phone-in-frame by default.** Default is `optional` — phone may appear if natural. Only set `--phone-in-frame forbidden` when the user explicitly says "no phone in frame".',
448
448
  '- ❌ **Disabling polish with `--polish off` unless the user asks for raw output.** The default polish pass is what makes the clip feel like real iPhone footage instead of a model render.',
449
449
  '- ❌ Waiting silently until the final video when intermediate URLs are available. Surface portrait, sheet, wireframe, and final video as each completes.',
450
450
  '- ❌ Asking for a photo when the user only gave a text description.',
package/src/v2/selfie.ts CHANGED
@@ -111,15 +111,15 @@ export const SelfieSchema = z
111
111
  shot_preset: shotPresetSchema.optional(),
112
112
  vibe: z.enum(V2_VIBES).optional(),
113
113
 
114
- // Default: handheld iPhone feel (the #1 realism cue). Set to true
115
- // ONLY for product/demo shots where a stable frame is required.
116
- camera_locked: z.boolean().optional(),
114
+ // Default: stable/locked framing to avoid jitter. Set false only
115
+ // when the user explicitly requests handheld camera movement.
116
+ camera_locked: z.boolean().default(true),
117
117
 
118
- // Default 'forbidden': no visible phone/camera/selfie-arm unless
119
- // explicitly requested for a specific composition.
118
+ // Default 'forbidden': no phone/camera/selfie-stick visible unless
119
+ // the user explicitly requests it.
120
120
  // 'required' — actively compose with phone covering chin/lower face
121
121
  // (the "iPhone-cover trick" — fewer face-render errors).
122
- // 'forbidden' — strip phone from frame entirely (default behavior).
122
+ // 'forbidden' — strip phone from frame entirely (legacy behavior).
123
123
  phone_in_frame: z.enum(V2_PHONE_IN_FRAME).default('forbidden'),
124
124
 
125
125
  // Post-Seedance polish pass (ffmpeg grain + warm grade + vignette).