@nebutra/brand-genesis 0.2.0 → 0.2.1

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.
@@ -1,6 +1,6 @@
1
- {"at":"2026-05-18T14:50:40.290Z","type":"checkpoint","step":"brand_distillation","tenantId":"tenant_a","brandId":"loop"}
2
- {"at":"2026-05-18T14:50:40.291Z","type":"checkpoint","step":"visual_direction","tenantId":"tenant_a","brandId":"loop"}
3
- {"at":"2026-05-18T14:50:40.305Z","type":"checkpoint","step":"assets_generated","tenantId":"tenant_a","brandId":"loop"}
4
- {"at":"2026-05-18T14:50:40.320Z","type":"checkpoint","step":"video_rendered","tenantId":"tenant_a","brandId":"loop"}
5
- {"at":"2026-05-18T14:50:40.527Z","type":"checkpoint","step":"final_compose","tenantId":"tenant_a","brandId":"loop"}
6
- {"at":"2026-05-18T14:50:40.557Z","type":"run","tenantId":"tenant_a","brandId":"loop","eventId":"a8bc92119a245d9a9dbf42612dffdffc2d892fcd31f182f8715fd50cf216686b"}
1
+ {"at":"2026-05-19T08:15:34.452Z","type":"checkpoint","step":"brand_distillation","tenantId":"tenant_a","brandId":"loop"}
2
+ {"at":"2026-05-19T08:15:34.452Z","type":"checkpoint","step":"visual_direction","tenantId":"tenant_a","brandId":"loop"}
3
+ {"at":"2026-05-19T08:15:34.469Z","type":"checkpoint","step":"assets_generated","tenantId":"tenant_a","brandId":"loop"}
4
+ {"at":"2026-05-19T08:15:34.471Z","type":"checkpoint","step":"video_rendered","tenantId":"tenant_a","brandId":"loop"}
5
+ {"at":"2026-05-19T08:15:34.579Z","type":"checkpoint","step":"final_compose","tenantId":"tenant_a","brandId":"loop"}
6
+ {"at":"2026-05-19T08:15:34.620Z","type":"run","tenantId":"tenant_a","brandId":"loop","eventId":"e166fc7be4195c10110a51efee24e78a66bd8da8ed577986050b54962af71b80"}
@@ -1,6 +1,6 @@
1
- {"at":"2026-05-18T14:50:40.252Z","type":"reindex","tenantId":"tenant_a","files":0}
2
- {"at":"2026-05-18T14:50:40.277Z","type":"write","tenantId":"tenant_a","path":"company/BRAND.md"}
3
- {"at":"2026-05-18T14:50:40.286Z","type":"write","tenantId":"tenant_a","path":"company/assets/palette.json"}
4
- {"at":"2026-05-18T14:50:40.526Z","type":"write","tenantId":"tenant_a","path":"company/landing/index.html"}
5
- {"at":"2026-05-18T14:50:40.634Z","type":"reindex","tenantId":"local","files":0}
6
- {"at":"2026-05-18T14:50:40.769Z","type":"reindex","tenantId":"tenant_a","files":0}
1
+ {"at":"2026-05-19T08:15:34.411Z","type":"reindex","tenantId":"tenant_a","files":0}
2
+ {"at":"2026-05-19T08:15:34.443Z","type":"write","tenantId":"tenant_a","path":"company/BRAND.md"}
3
+ {"at":"2026-05-19T08:15:34.449Z","type":"write","tenantId":"tenant_a","path":"company/assets/palette.json"}
4
+ {"at":"2026-05-19T08:15:34.578Z","type":"write","tenantId":"tenant_a","path":"company/landing/index.html"}
5
+ {"at":"2026-05-19T08:15:34.698Z","type":"reindex","tenantId":"local","files":0}
6
+ {"at":"2026-05-19T08:15:34.834Z","type":"reindex","tenantId":"tenant_a","files":0}
@@ -1 +1 @@
1
- {"traceId":"brand_genesis_loop_mpbbmwb3","kind":"content_write","affected":["company/BRAND.md","company/assets/palette.json","company/landing/index.html","/tmp/brand-genesis-MyubPH/.nebutra/generated/image-pipeline/image_logo_loop_ai_debugging_for_indie_devs_ca_mpbbmw4p.svg","/tmp/brand-genesis-MyubPH/.nebutra/generated/image-pipeline/image_hero_debug_like_it_is_a_conversation_mpbbmw4p.svg","/tmp/brand-genesis-MyubPH/.nebutra/generated/image-pipeline/image_icon_loop_mpbbmw4s.svg","/tmp/brand-genesis-MyubPH/.nebutra/generated/video-pipeline/composition_video_storyboard_brand_film_loop_mpbbmw5_mpbbmwas.compose.json"],"parent":null,"snapshot":{"company/BRAND.md":"---\nbrand_id: loop\nname: Loop\ntype: brand_profile\n---\n# Loop\n\nAI debugging for indie devs called Loop\n\n## Tagline\n\nDebug like it is a conversation\n\n## Audience\n\nIndependent developers and small engineering teams shipping software quickly\n\n## Tone\n\ntechnical, direct, warm\n\n## Visual Direction\n\ncyberpunk: electric, terminal-native, high-contrast\n\n## Differentiation\n\nUnderstands the full production context instead of treating each error as an isolated message\n","company/assets/palette.json":"{\n \"brandId\": \"loop\",\n \"colors\": [\n {\n \"name\": \"electric cyan\",\n \"hex\": \"#00D4FF\",\n \"role\": \"primary\"\n },\n {\n \"name\": \"carbon black\",\n \"hex\": \"#111318\",\n \"role\": \"background\"\n },\n {\n \"name\": \"signal amber\",\n \"hex\": \"#F3C14B\",\n \"role\": \"accent\"\n }\n ]\n}","company/landing/index.html":"<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <title>Loop</title>\n</head>\n<body>\n <main data-brand-id=\"loop\">\n <h1>Loop</h1>\n <p>Debug like it is a conversation</p>\n <p>AI debugging for indie devs called Loop</p>\n </main>\n</body>\n</html>\n"},"id":"a8bc92119a245d9a9dbf42612dffdffc2d892fcd31f182f8715fd50cf216686b","tenantId":"tenant_a","at":"2026-05-18T14:50:40.549Z","summary":"content_write touched 7 path(s)","objectHashes":["214176d31137be38d254248f03bf7946f73e60c33f10aca626d3c8262eb81796","871042e6396b84e849e13122ce60392a98cd9108875d882103534c1abffe83ef","425de019a39993cdcc61c233a5e54625dbd4d5a99eb79275f4642f1cda210d33"]}
1
+ {"at":"2026-05-19T08:15:34.612Z","traceId":"brand_genesis_loop_mpccyncj","kind":"content_write","affected":["company/BRAND.md","company/assets/palette.json","company/landing/index.html","/tmp/brand-genesis-07d5Z1/.nebutra/generated/image-pipeline/image_logo_loop_ai_debugging_for_indie_devs_ca_mpccyn91.svg","/tmp/brand-genesis-07d5Z1/.nebutra/generated/image-pipeline/image_hero_debug_like_it_is_a_conversation_mpccyn91.svg","/tmp/brand-genesis-07d5Z1/.nebutra/generated/image-pipeline/image_icon_loop_mpccyn91.svg","/tmp/brand-genesis-07d5Z1/.nebutra/generated/video-pipeline/composition_video_storyboard_brand_film_loop_mpccyn9_mpccyncd.compose.json"],"parent":null,"snapshot":{"company/BRAND.md":"---\nbrand_id: loop\nname: Loop\ntype: brand_profile\n---\n# Loop\n\nAI debugging for indie devs called Loop\n\n## Tagline\n\nDebug like it is a conversation\n\n## Audience\n\nIndependent developers and small engineering teams shipping software quickly\n\n## Tone\n\ntechnical, direct, warm\n\n## Visual Direction\n\ncyberpunk: electric, terminal-native, high-contrast\n\n## Differentiation\n\nUnderstands the full production context instead of treating each error as an isolated message\n","company/assets/palette.json":"{\n \"brandId\": \"loop\",\n \"colors\": [\n {\n \"name\": \"electric cyan\",\n \"hex\": \"#00D4FF\",\n \"role\": \"primary\"\n },\n {\n \"name\": \"carbon black\",\n \"hex\": \"#111318\",\n \"role\": \"background\"\n },\n {\n \"name\": \"signal amber\",\n \"hex\": \"#F3C14B\",\n \"role\": \"accent\"\n }\n ]\n}","company/landing/index.html":"<!doctype html>\n<html lang=\"en\">\n<head>\n <meta charset=\"utf-8\" />\n <title>Loop</title>\n</head>\n<body>\n <main data-brand-id=\"loop\">\n <h1>Loop</h1>\n <p>Debug like it is a conversation</p>\n <p>AI debugging for indie devs called Loop</p>\n </main>\n</body>\n</html>\n"},"id":"e166fc7be4195c10110a51efee24e78a66bd8da8ed577986050b54962af71b80","tenantId":"tenant_a","summary":"content_write touched 7 path(s)","objectHashes":["214176d31137be38d254248f03bf7946f73e60c33f10aca626d3c8262eb81796","871042e6396b84e849e13122ce60392a98cd9108875d882103534c1abffe83ef","425de019a39993cdcc61c233a5e54625dbd4d5a99eb79275f4642f1cda210d33"]}
@@ -1,5 +1,5 @@
1
1
 
2
- > @nebutra/brand-genesis@0.2.0 build /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/ai/brand-genesis
2
+ > @nebutra/brand-genesis@0.2.1 build /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/ai/brand-genesis
3
3
  > tsup
4
4
 
5
5
  CLI Building entry: src/cli.ts, src/index.ts
@@ -10,13 +10,13 @@
10
10
  CLI Cleaning output folder
11
11
  ESM Build start
12
12
  ESM dist/cli.js 2.22 KB
13
+ ESM dist/chunk-K3P6F3LB.js 12.92 KB
13
14
  ESM dist/index.js 300.00 B
14
- ESM dist/chunk-SB4N3ZZW.js 12.92 KB
15
15
  ESM dist/cli.js.map 4.04 KB
16
- ESM dist/chunk-SB4N3ZZW.js.map 25.95 KB
17
16
  ESM dist/index.js.map 71.00 B
18
- ESM ⚡️ Build success in 16ms
17
+ ESM dist/chunk-K3P6F3LB.js.map 25.88 KB
18
+ ESM ⚡️ Build success in 19ms
19
19
  DTS Build start
20
- DTS ⚡️ Build success in 2009ms
20
+ DTS ⚡️ Build success in 2193ms
21
21
  DTS dist/cli.d.ts 13.00 B
22
22
  DTS dist/index.d.ts 3.63 KB
@@ -1,17 +1,15 @@
1
1
 
2
- > @nebutra/brand-genesis@0.2.0 test /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/ai/brand-genesis
2
+ > @nebutra/brand-genesis@0.2.1 test /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/ai/brand-genesis
3
3
  > vitest run
4
4
 
5
5
 
6
6
   RUN  v4.1.4 /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/ai/brand-genesis
7
7
 
8
- (node:10598) ExperimentalWarning: SQLite is an experimental feature and might change at any time
9
- (Use `node --trace-warnings ...` to show where the warning was created)
10
- ✓ src/index.test.ts (5 tests) 695ms
11
- ✓ runs the brand_film_60s play through lower capabilities and writes checkpoints  466ms
8
+ ✓ src/index.test.ts (5 tests) 693ms
9
+ ✓ runs the brand_film_60s play through lower capabilities and writes checkpoints  388ms
12
10
 
13
11
   Test Files  1 passed (1)
14
12
   Tests  5 passed (5)
15
-  Start at  14:50:37
16
-  Duration  3.26s (transform 1.44s, setup 0ms, import 1.84s, tests 695ms, environment 0ms)
13
+  Start at  08:15:32
14
+  Duration  2.86s (transform 1.20s, setup 0ms, import 1.52s, tests 693ms, environment 0ms)
17
15
 
@@ -1,4 +1,4 @@
1
1
 
2
- > @nebutra/brand-genesis@0.2.0 typecheck /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/ai/brand-genesis
2
+ > @nebutra/brand-genesis@0.2.1 typecheck /home/runner/work/Nebutra-Sailor/Nebutra-Sailor/packages/ai/brand-genesis
3
3
  > tsc --noEmit
4
4
 
package/CHANGELOG.md CHANGED
@@ -1,5 +1,24 @@
1
1
  # @nebutra/brand-genesis
2
2
 
3
+ ## 0.2.1
4
+
5
+ ### Patch Changes
6
+
7
+ - Publish registry package metadata under the MIT license.
8
+
9
+ - Updated dependencies []:
10
+ - @nebutra/3d-pipeline@0.1.1
11
+ - @nebutra/audio-pipeline@0.1.1
12
+ - @nebutra/capability-kit@0.2.1
13
+ - @nebutra/content-store@0.1.1
14
+ - @nebutra/errors@0.1.1
15
+ - @nebutra/event-log@0.1.1
16
+ - @nebutra/generation-context@0.1.1
17
+ - @nebutra/image-pipeline@0.1.1
18
+ - @nebutra/play-loader@0.1.1
19
+ - @nebutra/video-pipeline@0.1.1
20
+ - @nebutra/voice-realtime@0.1.1
21
+
3
22
  ## 0.2.0
4
23
 
5
24
  ### Minor Changes
package/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # @nebutra/brand-genesis
2
2
 
3
+ Status: **WIP**
4
+
3
5
  `brand-genesis` is the flagship Play package. It distills a one-sentence
4
6
  company idea into a `BrandContext`, writes `company/BRAND.md`, then delegates
5
7
  asset generation to existing media capabilities.
@@ -3,6 +3,7 @@ import { mkdir } from "fs/promises";
3
3
  import { dirname, join } from "path";
4
4
  import { MeshPipeline } from "@nebutra/3d-pipeline";
5
5
  import { AudioPipeline } from "@nebutra/audio-pipeline";
6
+ import { requireCapabilityTenant } from "@nebutra/capability-kit";
6
7
  import { appendCapabilityDebug, readCapabilityDebug } from "@nebutra/capability-kit/debug";
7
8
  import { ContentStore, serializeContentFrontmatter } from "@nebutra/content-store";
8
9
  import { CapabilityError } from "@nebutra/errors";
@@ -21,16 +22,6 @@ var CHECKPOINTS = [
21
22
  "video_rendered",
22
23
  "final_compose"
23
24
  ];
24
- function requireTenant(explicit, fallback) {
25
- const tenantId = explicit ?? fallback;
26
- if (!tenantId?.trim()) {
27
- throw new CapabilityError("brand-genesis", "Brand Genesis requires tenant context", {
28
- suggestion: "Pass tenantId on the input or construct BrandGenesis with tenantId.",
29
- statusCode: 400
30
- });
31
- }
32
- return tenantId;
33
- }
34
25
  function normalizeBrandId(name) {
35
26
  return name.toLowerCase().replace(/[^a-z0-9]+/g, "_").replace(/^_+|_+$/g, "").slice(0, 32);
36
27
  }
@@ -223,7 +214,14 @@ var BrandGenesis = class _BrandGenesis {
223
214
  return new _BrandGenesis({ ...options, tenantId, root, contentStore, eventLog });
224
215
  }
225
216
  async run(input) {
226
- const tenantId = requireTenant(input.tenantId, this.#tenantId);
217
+ const tenantId = requireCapabilityTenant({
218
+ explicit: input.tenantId,
219
+ fallback: this.#tenantId,
220
+ onMissing: () => new CapabilityError("brand-genesis", "Brand Genesis requires tenant context", {
221
+ suggestion: "Pass tenantId on the input or construct BrandGenesis with tenantId.",
222
+ statusCode: 400
223
+ })
224
+ });
227
225
  const draft = distillBrandIdea(input);
228
226
  const brand = brandContextFromDraft(draft, tenantId);
229
227
  const brandMarkdown = renderBrandMarkdown(draft, brand);
@@ -394,4 +392,4 @@ export {
394
392
  BrandGenesis,
395
393
  readBrandGenesisDebug
396
394
  };
397
- //# sourceMappingURL=chunk-SB4N3ZZW.js.map
395
+ //# sourceMappingURL=chunk-K3P6F3LB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { mkdir } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { type MeshAsset, MeshPipeline } from \"@nebutra/3d-pipeline\";\nimport { type AudioAsset, AudioPipeline } from \"@nebutra/audio-pipeline\";\nimport { requireCapabilityTenant } from \"@nebutra/capability-kit\";\nimport { appendCapabilityDebug, readCapabilityDebug } from \"@nebutra/capability-kit/debug\";\nimport { ContentStore, serializeContentFrontmatter } from \"@nebutra/content-store\";\nimport { CapabilityError } from \"@nebutra/errors\";\nimport { EventLog } from \"@nebutra/event-log\";\nimport {\n assetId,\n type BrandColor,\n type BrandContext,\n type VisualStyle,\n} from \"@nebutra/generation-context\";\nimport { type ImageAsset, ImagePipeline } from \"@nebutra/image-pipeline\";\nimport { type Storyboard, type VideoAsset, VideoPipeline } from \"@nebutra/video-pipeline\";\nimport { type VoiceAsset, VoiceRealtime } from \"@nebutra/voice-realtime\";\n\nexport type VisualDirectionHint =\n | \"cyberpunk\"\n | \"minimal\"\n | \"organic\"\n | \"playful\"\n | \"corporate\"\n | \"retro\"\n | \"futurist\";\n\nexport interface BrandFilmInput {\n readonly tenantId?: string;\n readonly idea: string;\n readonly founderVoiceId?: string;\n readonly visualDirectionHint?: VisualDirectionHint;\n}\n\nexport interface BrandIdentityDraft {\n readonly name: string;\n readonly oneLiner: string;\n readonly tagline: string;\n readonly targetAudience: string;\n readonly toneKeywords: readonly string[];\n readonly differentiation: string;\n readonly visualStyle: VisualStyle;\n}\n\nexport interface BrandPackage {\n readonly tenantId: string;\n readonly play: \"brand_film_60s\";\n readonly brand: BrandContext;\n readonly draft: BrandIdentityDraft;\n readonly brandMdPath: string;\n readonly palettePath: string;\n readonly landingPath: string;\n readonly logo: ImageAsset;\n readonly hero: ImageAsset;\n readonly icon: ImageAsset;\n readonly mesh: MeshAsset;\n readonly storyboard: Storyboard;\n readonly film: VideoAsset;\n readonly bgm: AudioAsset;\n readonly narration: VoiceAsset;\n readonly eventId: string;\n readonly checkpoints: readonly string[];\n}\n\nexport interface BrandGenesisDoctorReport {\n readonly capability: \"brand-genesis\";\n readonly ok: boolean;\n readonly checkedAt: string;\n readonly play: {\n readonly ok: boolean;\n readonly name: \"brand_film_60s\";\n readonly requiredSkills: readonly string[];\n };\n readonly media: {\n readonly image: readonly unknown[];\n readonly video: readonly unknown[];\n readonly audio: readonly unknown[];\n readonly voice: readonly unknown[];\n readonly mesh: readonly unknown[];\n };\n readonly suggestion?: string;\n}\n\nexport interface BrandGenesisOptions {\n readonly tenantId?: string;\n readonly root?: string;\n readonly debugRoot?: string;\n readonly contentStore?: ContentStore;\n readonly eventLog?: EventLog;\n readonly imagePipeline?: ImagePipeline;\n readonly videoPipeline?: VideoPipeline;\n readonly audioPipeline?: AudioPipeline;\n readonly voiceRealtime?: VoiceRealtime;\n readonly meshPipeline?: MeshPipeline;\n}\n\nconst PLAY_NAME = \"brand_film_60s\" as const;\nconst CHECKPOINTS = [\n \"brand_distillation\",\n \"visual_direction\",\n \"assets_generated\",\n \"video_rendered\",\n \"final_compose\",\n] as const;\n\nfunction normalizeBrandId(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n .slice(0, 32);\n}\n\nfunction pickName(idea: string): string {\n const called = idea.match(/\\bcalled\\s+([A-Z][a-zA-Z0-9]*(?:\\s+[A-Z][a-zA-Z0-9]*)?)/);\n if (called?.[1]) return called[1].trim();\n const capitalized = [...idea.matchAll(/\\b[A-Z][a-zA-Z0-9]{2,}\\b/g)]\n .map((match) => match[0])\n .filter((value) => ![\"AI\", \"SaaS\", \"API\"].includes(value));\n return capitalized.at(-1) ?? \"Venture\";\n}\n\nfunction paletteFor(hint: VisualDirectionHint | undefined): readonly BrandColor[] {\n switch (hint) {\n case \"cyberpunk\":\n case \"futurist\":\n return [\n { name: \"electric cyan\", hex: \"#00D4FF\", role: \"primary\" },\n { name: \"carbon black\", hex: \"#111318\", role: \"background\" },\n { name: \"signal amber\", hex: \"#F3C14B\", role: \"accent\" },\n ];\n case \"organic\":\n return [\n { name: \"moss\", hex: \"#3D7A57\", role: \"primary\" },\n { name: \"paper\", hex: \"#F7F4EA\", role: \"background\" },\n { name: \"clay\", hex: \"#C86B4A\", role: \"accent\" },\n ];\n case \"playful\":\n return [\n { name: \"coral\", hex: \"#FF6B6B\", role: \"primary\" },\n { name: \"ink\", hex: \"#202124\", role: \"neutral\" },\n { name: \"mint\", hex: \"#7CE2C6\", role: \"accent\" },\n ];\n case \"corporate\":\n return [\n { name: \"trust blue\", hex: \"#2454D6\", role: \"primary\" },\n { name: \"slate\", hex: \"#202A36\", role: \"neutral\" },\n { name: \"clear sky\", hex: \"#E8F0FF\", role: \"background\" },\n ];\n case \"retro\":\n return [\n { name: \"oxide\", hex: \"#B95F3B\", role: \"primary\" },\n { name: \"night ink\", hex: \"#18202A\", role: \"neutral\" },\n { name: \"cream light\", hex: \"#F8E7C9\", role: \"background\" },\n ];\n default:\n return [\n { name: \"graphite\", hex: \"#1F2933\", role: \"primary\" },\n { name: \"white\", hex: \"#FFFFFF\", role: \"background\" },\n { name: \"signal green\", hex: \"#00A693\", role: \"accent\" },\n ];\n }\n}\n\nfunction styleFor(hint: VisualDirectionHint | undefined): VisualStyle {\n const name = hint ?? \"minimal\";\n const keywordsByHint: Record<VisualDirectionHint, readonly string[]> = {\n cyberpunk: [\"electric\", \"terminal-native\", \"high-contrast\"],\n minimal: [\"calm\", \"precise\", \"spacious\"],\n organic: [\"warm\", \"natural\", \"human\"],\n playful: [\"bright\", \"friendly\", \"kinetic\"],\n corporate: [\"credible\", \"structured\", \"clear\"],\n retro: [\"nostalgic\", \"tactile\", \"characterful\"],\n futurist: [\"clean\", \"technical\", \"forward\"],\n };\n return {\n name,\n keywords: keywordsByHint[name],\n avoid: [\"generic stock\", \"dark horror\", \"visual clutter\"],\n };\n}\n\nexport function distillBrandIdea(input: BrandFilmInput): BrandIdentityDraft {\n const idea = input.idea.trim();\n if (idea.length === 0) {\n throw new CapabilityError(\"brand-genesis\", \"Brand idea is empty\", {\n suggestion: \"Pass a one-sentence company idea before running Brand Genesis.\",\n statusCode: 400,\n });\n }\n const name = pickName(idea);\n const devAudience = /\\bdev|debug|code|developer|engineering/i.test(idea);\n const audience = devAudience\n ? \"Independent developers and small engineering teams shipping software quickly\"\n : \"Early-stage founders validating a focused product wedge\";\n const toneKeywords = devAudience\n ? [\"technical\", \"direct\", \"warm\"]\n : [\"clear\", \"confident\", \"useful\"];\n return {\n name,\n oneLiner: idea,\n tagline: devAudience ? \"Debug like it is a conversation\" : `${name} turns intent into launch`,\n targetAudience: audience,\n toneKeywords,\n differentiation: devAudience\n ? \"Understands the full production context instead of treating each error as an isolated message\"\n : \"Combines brand, execution, and company memory in one repeatable workflow\",\n visualStyle: styleFor(input.visualDirectionHint),\n };\n}\n\nexport function brandContextFromDraft(\n draft: BrandIdentityDraft,\n tenantId: string,\n sourcePath = \"company/BRAND.md\",\n palette = paletteFor(draft.visualStyle.name as VisualDirectionHint),\n): BrandContext {\n return {\n tenantId,\n brandId: normalizeBrandId(draft.name),\n name: draft.name,\n palette,\n typography: {\n heading: draft.visualStyle.name === \"cyberpunk\" ? \"Geist Mono\" : \"Geist Sans\",\n body: \"Geist Sans\",\n accent: \"Geist Mono\",\n },\n visualStyle: draft.visualStyle,\n referenceImages: [],\n forbidden: draft.visualStyle.avoid ?? [],\n toneKeywords: draft.toneKeywords,\n sourcePath,\n };\n}\n\nexport function renderBrandMarkdown(draft: BrandIdentityDraft, brand: BrandContext): string {\n return serializeContentFrontmatter(\n {\n type: \"brand_profile\",\n brand_id: brand.brandId,\n name: brand.name,\n },\n [\n `# ${brand.name}`,\n \"\",\n draft.oneLiner,\n \"\",\n \"## Tagline\",\n \"\",\n draft.tagline,\n \"\",\n \"## Audience\",\n \"\",\n draft.targetAudience,\n \"\",\n \"## Tone\",\n \"\",\n brand.toneKeywords.join(\", \"),\n \"\",\n \"## Visual Direction\",\n \"\",\n `${brand.visualStyle.name}: ${brand.visualStyle.keywords.join(\", \")}`,\n \"\",\n \"## Differentiation\",\n \"\",\n draft.differentiation,\n \"\",\n ].join(\"\\n\"),\n );\n}\n\nfunction renderLandingManifest(draft: BrandIdentityDraft, brand: BrandContext): string {\n return [\n \"<!doctype html>\",\n '<html lang=\"en\">',\n \"<head>\",\n ' <meta charset=\"utf-8\" />',\n ` <title>${brand.name}</title>`,\n \"</head>\",\n \"<body>\",\n ` <main data-brand-id=\"${brand.brandId}\">`,\n ` <h1>${brand.name}</h1>`,\n ` <p>${draft.tagline}</p>`,\n ` <p>${draft.oneLiner}</p>`,\n \" </main>\",\n \"</body>\",\n \"</html>\",\n \"\",\n ].join(\"\\n\");\n}\n\nexport class BrandGenesis {\n readonly #tenantId: string | undefined;\n readonly #root: string;\n readonly #debugRoot: string;\n readonly #contentStore: ContentStore;\n readonly #eventLog: EventLog;\n readonly #image: ImagePipeline;\n readonly #video: VideoPipeline;\n readonly #audio: AudioPipeline;\n readonly #voice: VoiceRealtime;\n readonly #mesh: MeshPipeline;\n\n private constructor(\n options: BrandGenesisOptions & { contentStore: ContentStore; eventLog: EventLog },\n ) {\n this.#tenantId = options.tenantId;\n this.#root = options.root ?? join(process.cwd(), \".nebutra\", \"brand-genesis\");\n this.#debugRoot = options.debugRoot ?? process.cwd();\n this.#contentStore = options.contentStore;\n this.#eventLog = options.eventLog;\n this.#image = options.imagePipeline ?? new ImagePipeline({ root: this.#root });\n this.#video = options.videoPipeline ?? new VideoPipeline({ root: this.#root });\n this.#audio = options.audioPipeline ?? new AudioPipeline({ root: this.#root });\n this.#voice = options.voiceRealtime ?? new VoiceRealtime({ root: this.#root });\n this.#mesh = options.meshPipeline ?? new MeshPipeline({ root: this.#root });\n }\n\n static async open(\n root = \".nebutra/brand-genesis\",\n options: Omit<BrandGenesisOptions, \"root\" | \"contentStore\" | \"eventLog\"> = {},\n ): Promise<BrandGenesis> {\n const tenantId = options.tenantId ?? \"local\";\n await mkdir(root, { recursive: true });\n const contentStore = await ContentStore.open(join(root, \"content\"), { tenantId });\n const eventLog = await EventLog.open(join(root, \"event-log\"), { tenantId });\n return new BrandGenesis({ ...options, tenantId, root, contentStore, eventLog });\n }\n\n async run(input: BrandFilmInput): Promise<BrandPackage> {\n const tenantId = requireCapabilityTenant({\n explicit: input.tenantId,\n fallback: this.#tenantId,\n onMissing: () =>\n new CapabilityError(\"brand-genesis\", \"Brand Genesis requires tenant context\", {\n suggestion: \"Pass tenantId on the input or construct BrandGenesis with tenantId.\",\n statusCode: 400,\n }),\n });\n const draft = distillBrandIdea(input);\n const brand = brandContextFromDraft(draft, tenantId);\n const brandMarkdown = renderBrandMarkdown(draft, brand);\n await this.#contentStore.write(brand.sourcePath, brandMarkdown);\n const palettePath = \"company/assets/palette.json\";\n await this.#contentStore.write(\n palettePath,\n `${JSON.stringify({ brandId: brand.brandId, colors: brand.palette }, null, 2)}\\n`,\n );\n await this.#debug({\n type: \"checkpoint\",\n step: CHECKPOINTS[0],\n tenantId,\n brandId: brand.brandId,\n });\n await this.#debug({\n type: \"checkpoint\",\n step: CHECKPOINTS[1],\n tenantId,\n brandId: brand.brandId,\n });\n\n const [logo, hero, icon] = await Promise.all([\n this.#image.generate({ type: \"logo\", company: brand.name, oneLiner: draft.oneLiner }, brand),\n this.#image.generate({ type: \"hero\", headline: draft.tagline }, brand),\n this.#image.generate({ type: \"icon\", subject: brand.name }, brand),\n ]);\n const mesh = await this.#mesh.fromImage(logo, brand);\n await this.#debug({\n type: \"checkpoint\",\n step: CHECKPOINTS[2],\n tenantId,\n brandId: brand.brandId,\n });\n\n const storyboard = await this.#video.plan(\n { type: \"brand-film\", durationS: 60, theme: draft.tagline },\n brand,\n );\n const rendered = await this.#video.render(storyboard, brand);\n await this.#debug({\n type: \"checkpoint\",\n step: CHECKPOINTS[3],\n tenantId,\n brandId: brand.brandId,\n });\n\n const bgm = await this.#audio.generate(\n { type: \"bgm\", durationS: rendered.durationS, mood: brand.toneKeywords.join(\" \") },\n brand,\n true,\n );\n const narration = await this.#voice.synthesizeNarration(\n {\n script: `${draft.tagline}. ${draft.oneLiner}. ${draft.differentiation}.`,\n targetDurationS: Math.max(8, Math.min(20, rendered.durationS - 3)),\n ...(input.founderVoiceId !== undefined ? { voiceProfileId: input.founderVoiceId } : {}),\n },\n brand,\n );\n const film = await this.#video.compose({\n videoTrack: [rendered],\n audioTrack: [bgm],\n voiceTrack: [narration],\n captionTrack: [{ startS: 0, endS: narration.durationS, text: narration.transcript }],\n });\n const landingPath = \"company/landing/index.html\";\n await this.#contentStore.write(landingPath, renderLandingManifest(draft, brand));\n await this.#debug({\n type: \"checkpoint\",\n step: CHECKPOINTS[4],\n tenantId,\n brandId: brand.brandId,\n });\n\n const eventId = await this.#eventLog.commit({\n traceId: assetId(\"brand_genesis\", brand.brandId),\n kind: \"content_write\",\n affected: [\n brand.sourcePath,\n palettePath,\n landingPath,\n logo.path,\n hero.path,\n icon.path,\n film.path,\n ],\n parent: null,\n snapshot: {\n [brand.sourcePath]: brandMarkdown,\n [palettePath]: JSON.stringify({ brandId: brand.brandId, colors: brand.palette }, null, 2),\n [landingPath]: renderLandingManifest(draft, brand),\n },\n });\n\n const result: BrandPackage = {\n tenantId,\n play: PLAY_NAME,\n brand,\n draft,\n brandMdPath: brand.sourcePath,\n palettePath,\n landingPath,\n logo,\n hero,\n icon,\n mesh,\n storyboard,\n film,\n bgm,\n narration,\n eventId,\n checkpoints: CHECKPOINTS,\n };\n await this.#debug({ type: \"run\", tenantId, brandId: brand.brandId, eventId });\n return result;\n }\n\n async doctor(): Promise<BrandGenesisDoctorReport> {\n const [image, video, audio, rawVoice, mesh] = await Promise.all([\n this.#image.doctor(),\n this.#video.doctor(),\n this.#audio.doctor(),\n this.#voice.doctor(),\n this.#mesh.doctor(),\n ]);\n const voice = [{ provider: \"narration-local\", ok: true }, ...rawVoice];\n const localOk = [image, video, audio, voice, mesh].every((checks) =>\n checks.some((check) => Boolean((check as { ok?: boolean }).ok)),\n );\n return {\n capability: \"brand-genesis\",\n ok: localOk,\n checkedAt: new Date().toISOString(),\n play: {\n ok: true,\n name: PLAY_NAME,\n requiredSkills: [\n \"image_pipeline.generate\",\n \"video_pipeline.plan\",\n \"video_pipeline.render\",\n \"video_pipeline.compose\",\n \"audio_pipeline.generate\",\n \"voice_realtime.synthesize_narration\",\n \"mesh_pipeline.from_image\",\n \"content_store.write\",\n ],\n },\n media: { image, video, audio, voice, mesh },\n ...(!localOk\n ? {\n suggestion:\n \"Run the individual media doctor commands and configure missing local or remote providers.\",\n }\n : {}),\n };\n }\n\n async close(): Promise<void> {\n await this.#contentStore.close();\n }\n\n async #debug(entry: Record<string, unknown>): Promise<void> {\n await mkdir(dirname(join(this.#debugRoot, \".nebutra\", \"debug\", \"brand-genesis.jsonl\")), {\n recursive: true,\n });\n await appendCapabilityDebug(\"brand-genesis\", entry, { root: this.#debugRoot });\n }\n}\n\nexport async function readBrandGenesisDebug(root = process.cwd(), limit = 20): Promise<unknown[]> {\n return readCapabilityDebug(\"brand-genesis\", { root, limit });\n}\n"],"mappings":"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","names":[]}
package/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  BrandGenesis,
3
3
  readBrandGenesisDebug
4
- } from "./chunk-SB4N3ZZW.js";
4
+ } from "./chunk-K3P6F3LB.js";
5
5
 
6
6
  // src/cli.ts
7
7
  import { mkdir, rm, stat } from "fs/promises";
package/dist/index.js CHANGED
@@ -4,7 +4,7 @@ import {
4
4
  distillBrandIdea,
5
5
  readBrandGenesisDebug,
6
6
  renderBrandMarkdown
7
- } from "./chunk-SB4N3ZZW.js";
7
+ } from "./chunk-K3P6F3LB.js";
8
8
  export {
9
9
  BrandGenesis,
10
10
  brandContextFromDraft,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nebutra/brand-genesis",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "BrandContext-first flagship play for creating a complete brand package from one idea",
5
5
  "private": false,
6
6
  "license": "MIT",
@@ -19,7 +19,7 @@
19
19
  "gaps": [
20
20
  "Generated media uses deterministic local fallbacks until model-backed providers are configured",
21
21
  "Storyboard editing is represented as an orchestration checkpoint, not yet a GUI step",
22
- "Landing page handoff is a manifest placeholder until landing-builder is implemented"
22
+ "Landing page handoff is minimal inside Brand Genesis; @nebutra/landing-builder owns the standalone site Play"
23
23
  ],
24
24
  "featureId": "brand-genesis",
25
25
  "category": "ai",
@@ -31,17 +31,17 @@
31
31
  ".": "./src/index.ts"
32
32
  },
33
33
  "dependencies": {
34
- "@nebutra/3d-pipeline": "0.1.0",
35
- "@nebutra/content-store": "0.1.0",
36
- "@nebutra/capability-kit": "0.2.0",
37
- "@nebutra/audio-pipeline": "0.1.0",
38
- "@nebutra/errors": "0.1.0",
39
- "@nebutra/event-log": "0.1.0",
40
- "@nebutra/generation-context": "0.1.0",
41
- "@nebutra/image-pipeline": "0.1.0",
42
- "@nebutra/play-loader": "0.1.0",
43
- "@nebutra/video-pipeline": "0.1.0",
44
- "@nebutra/voice-realtime": "0.1.0"
34
+ "@nebutra/3d-pipeline": "0.1.1",
35
+ "@nebutra/audio-pipeline": "0.1.1",
36
+ "@nebutra/capability-kit": "0.2.1",
37
+ "@nebutra/content-store": "0.1.1",
38
+ "@nebutra/errors": "0.1.1",
39
+ "@nebutra/event-log": "0.1.1",
40
+ "@nebutra/generation-context": "0.1.1",
41
+ "@nebutra/image-pipeline": "0.1.1",
42
+ "@nebutra/play-loader": "0.1.1",
43
+ "@nebutra/video-pipeline": "0.1.1",
44
+ "@nebutra/voice-realtime": "0.1.1"
45
45
  },
46
46
  "devDependencies": {
47
47
  "@types/node": "^22.19.15",
@@ -37,7 +37,7 @@ required_skills:
37
37
  - mesh_pipeline.from_image
38
38
  - content_store.write
39
39
  required_plays:
40
- - landing_page_v1
40
+ - one_pager
41
41
  sub_agents:
42
42
  - role: brand_strategist
43
43
  allowed_skills: [llm_gateway.complete, content_store.write]
package/src/index.ts CHANGED
@@ -2,6 +2,7 @@ import { mkdir } from "node:fs/promises";
2
2
  import { dirname, join } from "node:path";
3
3
  import { type MeshAsset, MeshPipeline } from "@nebutra/3d-pipeline";
4
4
  import { type AudioAsset, AudioPipeline } from "@nebutra/audio-pipeline";
5
+ import { requireCapabilityTenant } from "@nebutra/capability-kit";
5
6
  import { appendCapabilityDebug, readCapabilityDebug } from "@nebutra/capability-kit/debug";
6
7
  import { ContentStore, serializeContentFrontmatter } from "@nebutra/content-store";
7
8
  import { CapabilityError } from "@nebutra/errors";
@@ -103,17 +104,6 @@ const CHECKPOINTS = [
103
104
  "final_compose",
104
105
  ] as const;
105
106
 
106
- function requireTenant(explicit: string | undefined, fallback: string | undefined): string {
107
- const tenantId = explicit ?? fallback;
108
- if (!tenantId?.trim()) {
109
- throw new CapabilityError("brand-genesis", "Brand Genesis requires tenant context", {
110
- suggestion: "Pass tenantId on the input or construct BrandGenesis with tenantId.",
111
- statusCode: 400,
112
- });
113
- }
114
- return tenantId;
115
- }
116
-
117
107
  function normalizeBrandId(name: string): string {
118
108
  return name
119
109
  .toLowerCase()
@@ -339,7 +329,15 @@ export class BrandGenesis {
339
329
  }
340
330
 
341
331
  async run(input: BrandFilmInput): Promise<BrandPackage> {
342
- const tenantId = requireTenant(input.tenantId, this.#tenantId);
332
+ const tenantId = requireCapabilityTenant({
333
+ explicit: input.tenantId,
334
+ fallback: this.#tenantId,
335
+ onMissing: () =>
336
+ new CapabilityError("brand-genesis", "Brand Genesis requires tenant context", {
337
+ suggestion: "Pass tenantId on the input or construct BrandGenesis with tenantId.",
338
+ statusCode: 400,
339
+ }),
340
+ });
343
341
  const draft = distillBrandIdea(input);
344
342
  const brand = brandContextFromDraft(draft, tenantId);
345
343
  const brandMarkdown = renderBrandMarkdown(draft, brand);
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { mkdir } from \"node:fs/promises\";\nimport { dirname, join } from \"node:path\";\nimport { type MeshAsset, MeshPipeline } from \"@nebutra/3d-pipeline\";\nimport { type AudioAsset, AudioPipeline } from \"@nebutra/audio-pipeline\";\nimport { appendCapabilityDebug, readCapabilityDebug } from \"@nebutra/capability-kit/debug\";\nimport { ContentStore, serializeContentFrontmatter } from \"@nebutra/content-store\";\nimport { CapabilityError } from \"@nebutra/errors\";\nimport { EventLog } from \"@nebutra/event-log\";\nimport {\n assetId,\n type BrandColor,\n type BrandContext,\n type VisualStyle,\n} from \"@nebutra/generation-context\";\nimport { type ImageAsset, ImagePipeline } from \"@nebutra/image-pipeline\";\nimport { type Storyboard, type VideoAsset, VideoPipeline } from \"@nebutra/video-pipeline\";\nimport { type VoiceAsset, VoiceRealtime } from \"@nebutra/voice-realtime\";\n\nexport type VisualDirectionHint =\n | \"cyberpunk\"\n | \"minimal\"\n | \"organic\"\n | \"playful\"\n | \"corporate\"\n | \"retro\"\n | \"futurist\";\n\nexport interface BrandFilmInput {\n readonly tenantId?: string;\n readonly idea: string;\n readonly founderVoiceId?: string;\n readonly visualDirectionHint?: VisualDirectionHint;\n}\n\nexport interface BrandIdentityDraft {\n readonly name: string;\n readonly oneLiner: string;\n readonly tagline: string;\n readonly targetAudience: string;\n readonly toneKeywords: readonly string[];\n readonly differentiation: string;\n readonly visualStyle: VisualStyle;\n}\n\nexport interface BrandPackage {\n readonly tenantId: string;\n readonly play: \"brand_film_60s\";\n readonly brand: BrandContext;\n readonly draft: BrandIdentityDraft;\n readonly brandMdPath: string;\n readonly palettePath: string;\n readonly landingPath: string;\n readonly logo: ImageAsset;\n readonly hero: ImageAsset;\n readonly icon: ImageAsset;\n readonly mesh: MeshAsset;\n readonly storyboard: Storyboard;\n readonly film: VideoAsset;\n readonly bgm: AudioAsset;\n readonly narration: VoiceAsset;\n readonly eventId: string;\n readonly checkpoints: readonly string[];\n}\n\nexport interface BrandGenesisDoctorReport {\n readonly capability: \"brand-genesis\";\n readonly ok: boolean;\n readonly checkedAt: string;\n readonly play: {\n readonly ok: boolean;\n readonly name: \"brand_film_60s\";\n readonly requiredSkills: readonly string[];\n };\n readonly media: {\n readonly image: readonly unknown[];\n readonly video: readonly unknown[];\n readonly audio: readonly unknown[];\n readonly voice: readonly unknown[];\n readonly mesh: readonly unknown[];\n };\n readonly suggestion?: string;\n}\n\nexport interface BrandGenesisOptions {\n readonly tenantId?: string;\n readonly root?: string;\n readonly debugRoot?: string;\n readonly contentStore?: ContentStore;\n readonly eventLog?: EventLog;\n readonly imagePipeline?: ImagePipeline;\n readonly videoPipeline?: VideoPipeline;\n readonly audioPipeline?: AudioPipeline;\n readonly voiceRealtime?: VoiceRealtime;\n readonly meshPipeline?: MeshPipeline;\n}\n\nconst PLAY_NAME = \"brand_film_60s\" as const;\nconst CHECKPOINTS = [\n \"brand_distillation\",\n \"visual_direction\",\n \"assets_generated\",\n \"video_rendered\",\n \"final_compose\",\n] as const;\n\nfunction requireTenant(explicit: string | undefined, fallback: string | undefined): string {\n const tenantId = explicit ?? fallback;\n if (!tenantId?.trim()) {\n throw new CapabilityError(\"brand-genesis\", \"Brand Genesis requires tenant context\", {\n suggestion: \"Pass tenantId on the input or construct BrandGenesis with tenantId.\",\n statusCode: 400,\n });\n }\n return tenantId;\n}\n\nfunction normalizeBrandId(name: string): string {\n return name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\")\n .slice(0, 32);\n}\n\nfunction pickName(idea: string): string {\n const called = idea.match(/\\bcalled\\s+([A-Z][a-zA-Z0-9]*(?:\\s+[A-Z][a-zA-Z0-9]*)?)/);\n if (called?.[1]) return called[1].trim();\n const capitalized = [...idea.matchAll(/\\b[A-Z][a-zA-Z0-9]{2,}\\b/g)]\n .map((match) => match[0])\n .filter((value) => ![\"AI\", \"SaaS\", \"API\"].includes(value));\n return capitalized.at(-1) ?? \"Venture\";\n}\n\nfunction paletteFor(hint: VisualDirectionHint | undefined): readonly BrandColor[] {\n switch (hint) {\n case \"cyberpunk\":\n case \"futurist\":\n return [\n { name: \"electric cyan\", hex: \"#00D4FF\", role: \"primary\" },\n { name: \"carbon black\", hex: \"#111318\", role: \"background\" },\n { name: \"signal amber\", hex: \"#F3C14B\", role: \"accent\" },\n ];\n case \"organic\":\n return [\n { name: \"moss\", hex: \"#3D7A57\", role: \"primary\" },\n { name: \"paper\", hex: \"#F7F4EA\", role: \"background\" },\n { name: \"clay\", hex: \"#C86B4A\", role: \"accent\" },\n ];\n case \"playful\":\n return [\n { name: \"coral\", hex: \"#FF6B6B\", role: \"primary\" },\n { name: \"ink\", hex: \"#202124\", role: \"neutral\" },\n { name: \"mint\", hex: \"#7CE2C6\", role: \"accent\" },\n ];\n case \"corporate\":\n return [\n { name: \"trust blue\", hex: \"#2454D6\", role: \"primary\" },\n { name: \"slate\", hex: \"#202A36\", role: \"neutral\" },\n { name: \"clear sky\", hex: \"#E8F0FF\", role: \"background\" },\n ];\n case \"retro\":\n return [\n { name: \"oxide\", hex: \"#B95F3B\", role: \"primary\" },\n { name: \"night ink\", hex: \"#18202A\", role: \"neutral\" },\n { name: \"cream light\", hex: \"#F8E7C9\", role: \"background\" },\n ];\n default:\n return [\n { name: \"graphite\", hex: \"#1F2933\", role: \"primary\" },\n { name: \"white\", hex: \"#FFFFFF\", role: \"background\" },\n { name: \"signal green\", hex: \"#00A693\", role: \"accent\" },\n ];\n }\n}\n\nfunction styleFor(hint: VisualDirectionHint | undefined): VisualStyle {\n const name = hint ?? \"minimal\";\n const keywordsByHint: Record<VisualDirectionHint, readonly string[]> = {\n cyberpunk: [\"electric\", \"terminal-native\", \"high-contrast\"],\n minimal: [\"calm\", \"precise\", \"spacious\"],\n organic: [\"warm\", \"natural\", \"human\"],\n playful: [\"bright\", \"friendly\", \"kinetic\"],\n corporate: [\"credible\", \"structured\", \"clear\"],\n retro: [\"nostalgic\", \"tactile\", \"characterful\"],\n futurist: [\"clean\", \"technical\", \"forward\"],\n };\n return {\n name,\n keywords: keywordsByHint[name],\n avoid: [\"generic stock\", \"dark horror\", \"visual clutter\"],\n };\n}\n\nexport function distillBrandIdea(input: BrandFilmInput): BrandIdentityDraft {\n const idea = input.idea.trim();\n if (idea.length === 0) {\n throw new CapabilityError(\"brand-genesis\", \"Brand idea is empty\", {\n suggestion: \"Pass a one-sentence company idea before running Brand Genesis.\",\n statusCode: 400,\n });\n }\n const name = pickName(idea);\n const devAudience = /\\bdev|debug|code|developer|engineering/i.test(idea);\n const audience = devAudience\n ? \"Independent developers and small engineering teams shipping software quickly\"\n : \"Early-stage founders validating a focused product wedge\";\n const toneKeywords = devAudience\n ? [\"technical\", \"direct\", \"warm\"]\n : [\"clear\", \"confident\", \"useful\"];\n return {\n name,\n oneLiner: idea,\n tagline: devAudience ? \"Debug like it is a conversation\" : `${name} turns intent into launch`,\n targetAudience: audience,\n toneKeywords,\n differentiation: devAudience\n ? \"Understands the full production context instead of treating each error as an isolated message\"\n : \"Combines brand, execution, and company memory in one repeatable workflow\",\n visualStyle: styleFor(input.visualDirectionHint),\n };\n}\n\nexport function brandContextFromDraft(\n draft: BrandIdentityDraft,\n tenantId: string,\n sourcePath = \"company/BRAND.md\",\n palette = paletteFor(draft.visualStyle.name as VisualDirectionHint),\n): BrandContext {\n return {\n tenantId,\n brandId: normalizeBrandId(draft.name),\n name: draft.name,\n palette,\n typography: {\n heading: draft.visualStyle.name === \"cyberpunk\" ? \"Geist Mono\" : \"Geist Sans\",\n body: \"Geist Sans\",\n accent: \"Geist Mono\",\n },\n visualStyle: draft.visualStyle,\n referenceImages: [],\n forbidden: draft.visualStyle.avoid ?? [],\n toneKeywords: draft.toneKeywords,\n sourcePath,\n };\n}\n\nexport function renderBrandMarkdown(draft: BrandIdentityDraft, brand: BrandContext): string {\n return serializeContentFrontmatter(\n {\n type: \"brand_profile\",\n brand_id: brand.brandId,\n name: brand.name,\n },\n [\n `# ${brand.name}`,\n \"\",\n draft.oneLiner,\n \"\",\n \"## Tagline\",\n \"\",\n draft.tagline,\n \"\",\n \"## Audience\",\n \"\",\n draft.targetAudience,\n \"\",\n \"## Tone\",\n \"\",\n brand.toneKeywords.join(\", \"),\n \"\",\n \"## Visual Direction\",\n \"\",\n `${brand.visualStyle.name}: ${brand.visualStyle.keywords.join(\", \")}`,\n \"\",\n \"## Differentiation\",\n \"\",\n draft.differentiation,\n \"\",\n ].join(\"\\n\"),\n );\n}\n\nfunction renderLandingManifest(draft: BrandIdentityDraft, brand: BrandContext): string {\n return [\n \"<!doctype html>\",\n '<html lang=\"en\">',\n \"<head>\",\n ' <meta charset=\"utf-8\" />',\n ` <title>${brand.name}</title>`,\n \"</head>\",\n \"<body>\",\n ` <main data-brand-id=\"${brand.brandId}\">`,\n ` <h1>${brand.name}</h1>`,\n ` <p>${draft.tagline}</p>`,\n ` <p>${draft.oneLiner}</p>`,\n \" </main>\",\n \"</body>\",\n \"</html>\",\n \"\",\n ].join(\"\\n\");\n}\n\nexport class BrandGenesis {\n readonly #tenantId: string | undefined;\n readonly #root: string;\n readonly #debugRoot: string;\n readonly #contentStore: ContentStore;\n readonly #eventLog: EventLog;\n readonly #image: ImagePipeline;\n readonly #video: VideoPipeline;\n readonly #audio: AudioPipeline;\n readonly #voice: VoiceRealtime;\n readonly #mesh: MeshPipeline;\n\n private constructor(\n options: BrandGenesisOptions & { contentStore: ContentStore; eventLog: EventLog },\n ) {\n this.#tenantId = options.tenantId;\n this.#root = options.root ?? join(process.cwd(), \".nebutra\", \"brand-genesis\");\n this.#debugRoot = options.debugRoot ?? process.cwd();\n this.#contentStore = options.contentStore;\n this.#eventLog = options.eventLog;\n this.#image = options.imagePipeline ?? new ImagePipeline({ root: this.#root });\n this.#video = options.videoPipeline ?? new VideoPipeline({ root: this.#root });\n this.#audio = options.audioPipeline ?? new AudioPipeline({ root: this.#root });\n this.#voice = options.voiceRealtime ?? new VoiceRealtime({ root: this.#root });\n this.#mesh = options.meshPipeline ?? new MeshPipeline({ root: this.#root });\n }\n\n static async open(\n root = \".nebutra/brand-genesis\",\n options: Omit<BrandGenesisOptions, \"root\" | \"contentStore\" | \"eventLog\"> = {},\n ): Promise<BrandGenesis> {\n const tenantId = options.tenantId ?? \"local\";\n await mkdir(root, { recursive: true });\n const contentStore = await ContentStore.open(join(root, \"content\"), { tenantId });\n const eventLog = await EventLog.open(join(root, \"event-log\"), { tenantId });\n return new BrandGenesis({ ...options, tenantId, root, contentStore, eventLog });\n }\n\n async run(input: BrandFilmInput): Promise<BrandPackage> {\n const tenantId = requireTenant(input.tenantId, this.#tenantId);\n const draft = distillBrandIdea(input);\n const brand = brandContextFromDraft(draft, tenantId);\n const brandMarkdown = renderBrandMarkdown(draft, brand);\n await this.#contentStore.write(brand.sourcePath, brandMarkdown);\n const palettePath = \"company/assets/palette.json\";\n await this.#contentStore.write(\n palettePath,\n `${JSON.stringify({ brandId: brand.brandId, colors: brand.palette }, null, 2)}\\n`,\n );\n await this.#debug({\n type: \"checkpoint\",\n step: CHECKPOINTS[0],\n tenantId,\n brandId: brand.brandId,\n });\n await this.#debug({\n type: \"checkpoint\",\n step: CHECKPOINTS[1],\n tenantId,\n brandId: brand.brandId,\n });\n\n const [logo, hero, icon] = await Promise.all([\n this.#image.generate({ type: \"logo\", company: brand.name, oneLiner: draft.oneLiner }, brand),\n this.#image.generate({ type: \"hero\", headline: draft.tagline }, brand),\n this.#image.generate({ type: \"icon\", subject: brand.name }, brand),\n ]);\n const mesh = await this.#mesh.fromImage(logo, brand);\n await this.#debug({\n type: \"checkpoint\",\n step: CHECKPOINTS[2],\n tenantId,\n brandId: brand.brandId,\n });\n\n const storyboard = await this.#video.plan(\n { type: \"brand-film\", durationS: 60, theme: draft.tagline },\n brand,\n );\n const rendered = await this.#video.render(storyboard, brand);\n await this.#debug({\n type: \"checkpoint\",\n step: CHECKPOINTS[3],\n tenantId,\n brandId: brand.brandId,\n });\n\n const bgm = await this.#audio.generate(\n { type: \"bgm\", durationS: rendered.durationS, mood: brand.toneKeywords.join(\" \") },\n brand,\n true,\n );\n const narration = await this.#voice.synthesizeNarration(\n {\n script: `${draft.tagline}. ${draft.oneLiner}. ${draft.differentiation}.`,\n targetDurationS: Math.max(8, Math.min(20, rendered.durationS - 3)),\n ...(input.founderVoiceId !== undefined ? { voiceProfileId: input.founderVoiceId } : {}),\n },\n brand,\n );\n const film = await this.#video.compose({\n videoTrack: [rendered],\n audioTrack: [bgm],\n voiceTrack: [narration],\n captionTrack: [{ startS: 0, endS: narration.durationS, text: narration.transcript }],\n });\n const landingPath = \"company/landing/index.html\";\n await this.#contentStore.write(landingPath, renderLandingManifest(draft, brand));\n await this.#debug({\n type: \"checkpoint\",\n step: CHECKPOINTS[4],\n tenantId,\n brandId: brand.brandId,\n });\n\n const eventId = await this.#eventLog.commit({\n traceId: assetId(\"brand_genesis\", brand.brandId),\n kind: \"content_write\",\n affected: [\n brand.sourcePath,\n palettePath,\n landingPath,\n logo.path,\n hero.path,\n icon.path,\n film.path,\n ],\n parent: null,\n snapshot: {\n [brand.sourcePath]: brandMarkdown,\n [palettePath]: JSON.stringify({ brandId: brand.brandId, colors: brand.palette }, null, 2),\n [landingPath]: renderLandingManifest(draft, brand),\n },\n });\n\n const result: BrandPackage = {\n tenantId,\n play: PLAY_NAME,\n brand,\n draft,\n brandMdPath: brand.sourcePath,\n palettePath,\n landingPath,\n logo,\n hero,\n icon,\n mesh,\n storyboard,\n film,\n bgm,\n narration,\n eventId,\n checkpoints: CHECKPOINTS,\n };\n await this.#debug({ type: \"run\", tenantId, brandId: brand.brandId, eventId });\n return result;\n }\n\n async doctor(): Promise<BrandGenesisDoctorReport> {\n const [image, video, audio, rawVoice, mesh] = await Promise.all([\n this.#image.doctor(),\n this.#video.doctor(),\n this.#audio.doctor(),\n this.#voice.doctor(),\n this.#mesh.doctor(),\n ]);\n const voice = [{ provider: \"narration-local\", ok: true }, ...rawVoice];\n const localOk = [image, video, audio, voice, mesh].every((checks) =>\n checks.some((check) => Boolean((check as { ok?: boolean }).ok)),\n );\n return {\n capability: \"brand-genesis\",\n ok: localOk,\n checkedAt: new Date().toISOString(),\n play: {\n ok: true,\n name: PLAY_NAME,\n requiredSkills: [\n \"image_pipeline.generate\",\n \"video_pipeline.plan\",\n \"video_pipeline.render\",\n \"video_pipeline.compose\",\n \"audio_pipeline.generate\",\n \"voice_realtime.synthesize_narration\",\n \"mesh_pipeline.from_image\",\n \"content_store.write\",\n ],\n },\n media: { image, video, audio, voice, mesh },\n ...(!localOk\n ? {\n suggestion:\n \"Run the individual media doctor commands and configure missing local or remote providers.\",\n }\n : {}),\n };\n }\n\n async close(): Promise<void> {\n await this.#contentStore.close();\n }\n\n async #debug(entry: Record<string, unknown>): Promise<void> {\n await mkdir(dirname(join(this.#debugRoot, \".nebutra\", \"debug\", \"brand-genesis.jsonl\")), {\n recursive: true,\n });\n await appendCapabilityDebug(\"brand-genesis\", entry, { root: this.#debugRoot });\n }\n}\n\nexport async function readBrandGenesisDebug(root = process.cwd(), limit = 20): Promise<unknown[]> {\n return readCapabilityDebug(\"brand-genesis\", { root, limit });\n}\n"],"mappings":";AAAA,SAAS,aAAa;AACtB,SAAS,SAAS,YAAY;AAC9B,SAAyB,oBAAoB;AAC7C,SAA0B,qBAAqB;AAC/C,SAAS,uBAAuB,2BAA2B;AAC3D,SAAS,cAAc,mCAAmC;AAC1D,SAAS,uBAAuB;AAChC,SAAS,gBAAgB;AACzB;AAAA,EACE;AAAA,OAIK;AACP,SAA0B,qBAAqB;AAC/C,SAA2C,qBAAqB;AAChE,SAA0B,qBAAqB;AAgF/C,IAAM,YAAY;AAClB,IAAM,cAAc;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,SAAS,cAAc,UAA8B,UAAsC;AACzF,QAAM,WAAW,YAAY;AAC7B,MAAI,CAAC,UAAU,KAAK,GAAG;AACrB,UAAM,IAAI,gBAAgB,iBAAiB,yCAAyC;AAAA,MAClF,YAAY;AAAA,MACZ,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AACA,SAAO;AACT;AAEA,SAAS,iBAAiB,MAAsB;AAC9C,SAAO,KACJ,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE,EACtB,MAAM,GAAG,EAAE;AAChB;AAEA,SAAS,SAAS,MAAsB;AACtC,QAAM,SAAS,KAAK,MAAM,yDAAyD;AACnF,MAAI,SAAS,CAAC,EAAG,QAAO,OAAO,CAAC,EAAE,KAAK;AACvC,QAAM,cAAc,CAAC,GAAG,KAAK,SAAS,2BAA2B,CAAC,EAC/D,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC,EACvB,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,QAAQ,KAAK,EAAE,SAAS,KAAK,CAAC;AAC3D,SAAO,YAAY,GAAG,EAAE,KAAK;AAC/B;AAEA,SAAS,WAAW,MAA8D;AAChF,UAAQ,MAAM;AAAA,IACZ,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,EAAE,MAAM,iBAAiB,KAAK,WAAW,MAAM,UAAU;AAAA,QACzD,EAAE,MAAM,gBAAgB,KAAK,WAAW,MAAM,aAAa;AAAA,QAC3D,EAAE,MAAM,gBAAgB,KAAK,WAAW,MAAM,SAAS;AAAA,MACzD;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,EAAE,MAAM,QAAQ,KAAK,WAAW,MAAM,UAAU;AAAA,QAChD,EAAE,MAAM,SAAS,KAAK,WAAW,MAAM,aAAa;AAAA,QACpD,EAAE,MAAM,QAAQ,KAAK,WAAW,MAAM,SAAS;AAAA,MACjD;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,EAAE,MAAM,SAAS,KAAK,WAAW,MAAM,UAAU;AAAA,QACjD,EAAE,MAAM,OAAO,KAAK,WAAW,MAAM,UAAU;AAAA,QAC/C,EAAE,MAAM,QAAQ,KAAK,WAAW,MAAM,SAAS;AAAA,MACjD;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,EAAE,MAAM,cAAc,KAAK,WAAW,MAAM,UAAU;AAAA,QACtD,EAAE,MAAM,SAAS,KAAK,WAAW,MAAM,UAAU;AAAA,QACjD,EAAE,MAAM,aAAa,KAAK,WAAW,MAAM,aAAa;AAAA,MAC1D;AAAA,IACF,KAAK;AACH,aAAO;AAAA,QACL,EAAE,MAAM,SAAS,KAAK,WAAW,MAAM,UAAU;AAAA,QACjD,EAAE,MAAM,aAAa,KAAK,WAAW,MAAM,UAAU;AAAA,QACrD,EAAE,MAAM,eAAe,KAAK,WAAW,MAAM,aAAa;AAAA,MAC5D;AAAA,IACF;AACE,aAAO;AAAA,QACL,EAAE,MAAM,YAAY,KAAK,WAAW,MAAM,UAAU;AAAA,QACpD,EAAE,MAAM,SAAS,KAAK,WAAW,MAAM,aAAa;AAAA,QACpD,EAAE,MAAM,gBAAgB,KAAK,WAAW,MAAM,SAAS;AAAA,MACzD;AAAA,EACJ;AACF;AAEA,SAAS,SAAS,MAAoD;AACpE,QAAM,OAAO,QAAQ;AACrB,QAAM,iBAAiE;AAAA,IACrE,WAAW,CAAC,YAAY,mBAAmB,eAAe;AAAA,IAC1D,SAAS,CAAC,QAAQ,WAAW,UAAU;AAAA,IACvC,SAAS,CAAC,QAAQ,WAAW,OAAO;AAAA,IACpC,SAAS,CAAC,UAAU,YAAY,SAAS;AAAA,IACzC,WAAW,CAAC,YAAY,cAAc,OAAO;AAAA,IAC7C,OAAO,CAAC,aAAa,WAAW,cAAc;AAAA,IAC9C,UAAU,CAAC,SAAS,aAAa,SAAS;AAAA,EAC5C;AACA,SAAO;AAAA,IACL;AAAA,IACA,UAAU,eAAe,IAAI;AAAA,IAC7B,OAAO,CAAC,iBAAiB,eAAe,gBAAgB;AAAA,EAC1D;AACF;AAEO,SAAS,iBAAiB,OAA2C;AAC1E,QAAM,OAAO,MAAM,KAAK,KAAK;AAC7B,MAAI,KAAK,WAAW,GAAG;AACrB,UAAM,IAAI,gBAAgB,iBAAiB,uBAAuB;AAAA,MAChE,YAAY;AAAA,MACZ,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AACA,QAAM,OAAO,SAAS,IAAI;AAC1B,QAAM,cAAc,0CAA0C,KAAK,IAAI;AACvE,QAAM,WAAW,cACb,iFACA;AACJ,QAAM,eAAe,cACjB,CAAC,aAAa,UAAU,MAAM,IAC9B,CAAC,SAAS,aAAa,QAAQ;AACnC,SAAO;AAAA,IACL;AAAA,IACA,UAAU;AAAA,IACV,SAAS,cAAc,oCAAoC,GAAG,IAAI;AAAA,IAClE,gBAAgB;AAAA,IAChB;AAAA,IACA,iBAAiB,cACb,kGACA;AAAA,IACJ,aAAa,SAAS,MAAM,mBAAmB;AAAA,EACjD;AACF;AAEO,SAAS,sBACd,OACA,UACA,aAAa,oBACb,UAAU,WAAW,MAAM,YAAY,IAA2B,GACpD;AACd,SAAO;AAAA,IACL;AAAA,IACA,SAAS,iBAAiB,MAAM,IAAI;AAAA,IACpC,MAAM,MAAM;AAAA,IACZ;AAAA,IACA,YAAY;AAAA,MACV,SAAS,MAAM,YAAY,SAAS,cAAc,eAAe;AAAA,MACjE,MAAM;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,IACA,aAAa,MAAM;AAAA,IACnB,iBAAiB,CAAC;AAAA,IAClB,WAAW,MAAM,YAAY,SAAS,CAAC;AAAA,IACvC,cAAc,MAAM;AAAA,IACpB;AAAA,EACF;AACF;AAEO,SAAS,oBAAoB,OAA2B,OAA6B;AAC1F,SAAO;AAAA,IACL;AAAA,MACE,MAAM;AAAA,MACN,UAAU,MAAM;AAAA,MAChB,MAAM,MAAM;AAAA,IACd;AAAA,IACA;AAAA,MACE,KAAK,MAAM,IAAI;AAAA,MACf;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM,aAAa,KAAK,IAAI;AAAA,MAC5B;AAAA,MACA;AAAA,MACA;AAAA,MACA,GAAG,MAAM,YAAY,IAAI,KAAK,MAAM,YAAY,SAAS,KAAK,IAAI,CAAC;AAAA,MACnE;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN;AAAA,IACF,EAAE,KAAK,IAAI;AAAA,EACb;AACF;AAEA,SAAS,sBAAsB,OAA2B,OAA6B;AACrF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,YAAY,MAAM,IAAI;AAAA,IACtB;AAAA,IACA;AAAA,IACA,0BAA0B,MAAM,OAAO;AAAA,IACvC,WAAW,MAAM,IAAI;AAAA,IACrB,UAAU,MAAM,OAAO;AAAA,IACvB,UAAU,MAAM,QAAQ;AAAA,IACxB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,EAAE,KAAK,IAAI;AACb;AAEO,IAAM,eAAN,MAAM,cAAa;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAED,YACN,SACA;AACA,SAAK,YAAY,QAAQ;AACzB,SAAK,QAAQ,QAAQ,QAAQ,KAAK,QAAQ,IAAI,GAAG,YAAY,eAAe;AAC5E,SAAK,aAAa,QAAQ,aAAa,QAAQ,IAAI;AACnD,SAAK,gBAAgB,QAAQ;AAC7B,SAAK,YAAY,QAAQ;AACzB,SAAK,SAAS,QAAQ,iBAAiB,IAAI,cAAc,EAAE,MAAM,KAAK,MAAM,CAAC;AAC7E,SAAK,SAAS,QAAQ,iBAAiB,IAAI,cAAc,EAAE,MAAM,KAAK,MAAM,CAAC;AAC7E,SAAK,SAAS,QAAQ,iBAAiB,IAAI,cAAc,EAAE,MAAM,KAAK,MAAM,CAAC;AAC7E,SAAK,SAAS,QAAQ,iBAAiB,IAAI,cAAc,EAAE,MAAM,KAAK,MAAM,CAAC;AAC7E,SAAK,QAAQ,QAAQ,gBAAgB,IAAI,aAAa,EAAE,MAAM,KAAK,MAAM,CAAC;AAAA,EAC5E;AAAA,EAEA,aAAa,KACX,OAAO,0BACP,UAA2E,CAAC,GACrD;AACvB,UAAM,WAAW,QAAQ,YAAY;AACrC,UAAM,MAAM,MAAM,EAAE,WAAW,KAAK,CAAC;AACrC,UAAM,eAAe,MAAM,aAAa,KAAK,KAAK,MAAM,SAAS,GAAG,EAAE,SAAS,CAAC;AAChF,UAAM,WAAW,MAAM,SAAS,KAAK,KAAK,MAAM,WAAW,GAAG,EAAE,SAAS,CAAC;AAC1E,WAAO,IAAI,cAAa,EAAE,GAAG,SAAS,UAAU,MAAM,cAAc,SAAS,CAAC;AAAA,EAChF;AAAA,EAEA,MAAM,IAAI,OAA8C;AACtD,UAAM,WAAW,cAAc,MAAM,UAAU,KAAK,SAAS;AAC7D,UAAM,QAAQ,iBAAiB,KAAK;AACpC,UAAM,QAAQ,sBAAsB,OAAO,QAAQ;AACnD,UAAM,gBAAgB,oBAAoB,OAAO,KAAK;AACtD,UAAM,KAAK,cAAc,MAAM,MAAM,YAAY,aAAa;AAC9D,UAAM,cAAc;AACpB,UAAM,KAAK,cAAc;AAAA,MACvB;AAAA,MACA,GAAG,KAAK,UAAU,EAAE,SAAS,MAAM,SAAS,QAAQ,MAAM,QAAQ,GAAG,MAAM,CAAC,CAAC;AAAA;AAAA,IAC/E;AACA,UAAM,KAAK,OAAO;AAAA,MAChB,MAAM;AAAA,MACN,MAAM,YAAY,CAAC;AAAA,MACnB;AAAA,MACA,SAAS,MAAM;AAAA,IACjB,CAAC;AACD,UAAM,KAAK,OAAO;AAAA,MAChB,MAAM;AAAA,MACN,MAAM,YAAY,CAAC;AAAA,MACnB;AAAA,MACA,SAAS,MAAM;AAAA,IACjB,CAAC;AAED,UAAM,CAAC,MAAM,MAAM,IAAI,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC3C,KAAK,OAAO,SAAS,EAAE,MAAM,QAAQ,SAAS,MAAM,MAAM,UAAU,MAAM,SAAS,GAAG,KAAK;AAAA,MAC3F,KAAK,OAAO,SAAS,EAAE,MAAM,QAAQ,UAAU,MAAM,QAAQ,GAAG,KAAK;AAAA,MACrE,KAAK,OAAO,SAAS,EAAE,MAAM,QAAQ,SAAS,MAAM,KAAK,GAAG,KAAK;AAAA,IACnE,CAAC;AACD,UAAM,OAAO,MAAM,KAAK,MAAM,UAAU,MAAM,KAAK;AACnD,UAAM,KAAK,OAAO;AAAA,MAChB,MAAM;AAAA,MACN,MAAM,YAAY,CAAC;AAAA,MACnB;AAAA,MACA,SAAS,MAAM;AAAA,IACjB,CAAC;AAED,UAAM,aAAa,MAAM,KAAK,OAAO;AAAA,MACnC,EAAE,MAAM,cAAc,WAAW,IAAI,OAAO,MAAM,QAAQ;AAAA,MAC1D;AAAA,IACF;AACA,UAAM,WAAW,MAAM,KAAK,OAAO,OAAO,YAAY,KAAK;AAC3D,UAAM,KAAK,OAAO;AAAA,MAChB,MAAM;AAAA,MACN,MAAM,YAAY,CAAC;AAAA,MACnB;AAAA,MACA,SAAS,MAAM;AAAA,IACjB,CAAC;AAED,UAAM,MAAM,MAAM,KAAK,OAAO;AAAA,MAC5B,EAAE,MAAM,OAAO,WAAW,SAAS,WAAW,MAAM,MAAM,aAAa,KAAK,GAAG,EAAE;AAAA,MACjF;AAAA,MACA;AAAA,IACF;AACA,UAAM,YAAY,MAAM,KAAK,OAAO;AAAA,MAClC;AAAA,QACE,QAAQ,GAAG,MAAM,OAAO,KAAK,MAAM,QAAQ,KAAK,MAAM,eAAe;AAAA,QACrE,iBAAiB,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,SAAS,YAAY,CAAC,CAAC;AAAA,QACjE,GAAI,MAAM,mBAAmB,SAAY,EAAE,gBAAgB,MAAM,eAAe,IAAI,CAAC;AAAA,MACvF;AAAA,MACA;AAAA,IACF;AACA,UAAM,OAAO,MAAM,KAAK,OAAO,QAAQ;AAAA,MACrC,YAAY,CAAC,QAAQ;AAAA,MACrB,YAAY,CAAC,GAAG;AAAA,MAChB,YAAY,CAAC,SAAS;AAAA,MACtB,cAAc,CAAC,EAAE,QAAQ,GAAG,MAAM,UAAU,WAAW,MAAM,UAAU,WAAW,CAAC;AAAA,IACrF,CAAC;AACD,UAAM,cAAc;AACpB,UAAM,KAAK,cAAc,MAAM,aAAa,sBAAsB,OAAO,KAAK,CAAC;AAC/E,UAAM,KAAK,OAAO;AAAA,MAChB,MAAM;AAAA,MACN,MAAM,YAAY,CAAC;AAAA,MACnB;AAAA,MACA,SAAS,MAAM;AAAA,IACjB,CAAC;AAED,UAAM,UAAU,MAAM,KAAK,UAAU,OAAO;AAAA,MAC1C,SAAS,QAAQ,iBAAiB,MAAM,OAAO;AAAA,MAC/C,MAAM;AAAA,MACN,UAAU;AAAA,QACR,MAAM;AAAA,QACN;AAAA,QACA;AAAA,QACA,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AAAA,MACA,QAAQ;AAAA,MACR,UAAU;AAAA,QACR,CAAC,MAAM,UAAU,GAAG;AAAA,QACpB,CAAC,WAAW,GAAG,KAAK,UAAU,EAAE,SAAS,MAAM,SAAS,QAAQ,MAAM,QAAQ,GAAG,MAAM,CAAC;AAAA,QACxF,CAAC,WAAW,GAAG,sBAAsB,OAAO,KAAK;AAAA,MACnD;AAAA,IACF,CAAC;AAED,UAAM,SAAuB;AAAA,MAC3B;AAAA,MACA,MAAM;AAAA,MACN;AAAA,MACA;AAAA,MACA,aAAa,MAAM;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,aAAa;AAAA,IACf;AACA,UAAM,KAAK,OAAO,EAAE,MAAM,OAAO,UAAU,SAAS,MAAM,SAAS,QAAQ,CAAC;AAC5E,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,SAA4C;AAChD,UAAM,CAAC,OAAO,OAAO,OAAO,UAAU,IAAI,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC9D,KAAK,OAAO,OAAO;AAAA,MACnB,KAAK,OAAO,OAAO;AAAA,MACnB,KAAK,OAAO,OAAO;AAAA,MACnB,KAAK,OAAO,OAAO;AAAA,MACnB,KAAK,MAAM,OAAO;AAAA,IACpB,CAAC;AACD,UAAM,QAAQ,CAAC,EAAE,UAAU,mBAAmB,IAAI,KAAK,GAAG,GAAG,QAAQ;AACrE,UAAM,UAAU,CAAC,OAAO,OAAO,OAAO,OAAO,IAAI,EAAE;AAAA,MAAM,CAAC,WACxD,OAAO,KAAK,CAAC,UAAU,QAAS,MAA2B,EAAE,CAAC;AAAA,IAChE;AACA,WAAO;AAAA,MACL,YAAY;AAAA,MACZ,IAAI;AAAA,MACJ,YAAW,oBAAI,KAAK,GAAE,YAAY;AAAA,MAClC,MAAM;AAAA,QACJ,IAAI;AAAA,QACJ,MAAM;AAAA,QACN,gBAAgB;AAAA,UACd;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,MACA,OAAO,EAAE,OAAO,OAAO,OAAO,OAAO,KAAK;AAAA,MAC1C,GAAI,CAAC,UACD;AAAA,QACE,YACE;AAAA,MACJ,IACA,CAAC;AAAA,IACP;AAAA,EACF;AAAA,EAEA,MAAM,QAAuB;AAC3B,UAAM,KAAK,cAAc,MAAM;AAAA,EACjC;AAAA,EAEA,MAAM,OAAO,OAA+C;AAC1D,UAAM,MAAM,QAAQ,KAAK,KAAK,YAAY,YAAY,SAAS,qBAAqB,CAAC,GAAG;AAAA,MACtF,WAAW;AAAA,IACb,CAAC;AACD,UAAM,sBAAsB,iBAAiB,OAAO,EAAE,MAAM,KAAK,WAAW,CAAC;AAAA,EAC/E;AACF;AAEA,eAAsB,sBAAsB,OAAO,QAAQ,IAAI,GAAG,QAAQ,IAAwB;AAChG,SAAO,oBAAoB,iBAAiB,EAAE,MAAM,MAAM,CAAC;AAC7D;","names":[]}