@mpfrontend/ftg-cli 0.0.0-stage → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/cli.js ADDED
@@ -0,0 +1,182 @@
1
+ #!/usr/bin/env node
2
+ import { generate, InputError } from './core.js';
3
+ import { createApplication, createWorkspace, createFeature, createRoute, createPackage } from '@mpfrontend/nx-plugin';
4
+ import { skillCatalog, installSkills, checkSkills, SkillsError } from '@mpfrontend/ai-skills/internal';
5
+ import { readFileSync } from 'node:fs';
6
+ import { designCommand, DesignError } from './design.js';
7
+ import { designSourceCommand } from './design-source.js';
8
+ import { catalogCheck } from './catalog.js';
9
+ const CLI_VERSION = String(JSON.parse(readFileSync(new URL('../package.json', import.meta.url), 'utf8')).version);
10
+ const args = process.argv.slice(2);
11
+ function option(name) { const index = args.indexOf(name); if (index < 0)
12
+ return undefined; const value = args[index + 1]; if (!value || value.startsWith('--'))
13
+ throw new InputError('MISSING_OPTION_VALUE'); return value; }
14
+ try {
15
+ if (args.includes('--version')) {
16
+ if (args.length !== 1)
17
+ throw new InputError('VERSION_MUST_BE_STANDALONE');
18
+ console.log(CLI_VERSION);
19
+ }
20
+ else if (args[0] === 'design') {
21
+ const command = args[1];
22
+ if (!command)
23
+ throw new InputError('DESIGN_COMMAND_REQUIRED');
24
+ const profiles = {
25
+ import: ['--binding', '--snapshot', '--dry-run', '--json'], validate: ['--binding', '--candidate', '--json'],
26
+ diff: ['--binding', '--candidate', '--json'], plan: ['--binding', '--candidate', '--dry-run', '--json'],
27
+ apply: ['--plan', '--dry-run', '--json'], accept: ['--plan', '--evidence', '--dry-run', '--json'], check: ['--binding', '--json'],
28
+ attach: ['--directory', '--source', '--binding', '--dry-run', '--json'], status: ['--directory', '--json']
29
+ };
30
+ if (!Object.hasOwn(profiles, command))
31
+ throw new InputError('UNKNOWN_DESIGN_COMMAND');
32
+ const seen = new Set();
33
+ for (let index = 2; index < args.length; index++) {
34
+ const flag = args[index];
35
+ if (!profiles[command].includes(flag))
36
+ throw new InputError('UNKNOWN_DESIGN_OPTION');
37
+ if (seen.has(flag))
38
+ throw new InputError('DUPLICATE_DESIGN_OPTION');
39
+ seen.add(flag);
40
+ if (flag !== '--dry-run' && flag !== '--json') {
41
+ const value = args[++index];
42
+ if (!value || value.startsWith('--'))
43
+ throw new InputError('MISSING_OPTION_VALUE');
44
+ }
45
+ }
46
+ if (command === 'attach' || command === 'status') {
47
+ const directory = option('--directory') ?? process.cwd(), source = option('--source');
48
+ const bindingPath = option('--binding');
49
+ console.log(JSON.stringify(await designSourceCommand({ command, directory, ...(source ? { source } : {}), ...(bindingPath ? { bindingPath } : {}), dryRun: args.includes('--dry-run'), cliVersion: CLI_VERSION })));
50
+ }
51
+ else {
52
+ const inputs = { bindingPath: option('--binding'), snapshotPath: option('--snapshot'), candidate: option('--candidate'), planPath: option('--plan'), evidencePath: option('--evidence') };
53
+ const supplied = Object.fromEntries(Object.entries(inputs).filter(([, value]) => value !== undefined));
54
+ console.log(JSON.stringify(await designCommand({ command, ...supplied, dryRun: args.includes('--dry-run') })));
55
+ }
56
+ }
57
+ else if (args[0] === 'catalog') {
58
+ if (args[1] !== 'check')
59
+ throw new InputError('UNKNOWN_CATALOG_COMMAND');
60
+ const allowed = new Set(['--app', '--json']), seen = new Set();
61
+ for (let index = 2; index < args.length; index++) {
62
+ const flag = args[index];
63
+ if (!allowed.has(flag))
64
+ throw new InputError('UNKNOWN_CATALOG_OPTION');
65
+ if (seen.has(flag))
66
+ throw new InputError('DUPLICATE_CATALOG_OPTION');
67
+ seen.add(flag);
68
+ if (flag === '--app') {
69
+ const value = args[++index];
70
+ if (!value || value.startsWith('--'))
71
+ throw new InputError('MISSING_OPTION_VALUE');
72
+ }
73
+ }
74
+ const app = option('--app');
75
+ if (!app)
76
+ throw new InputError('APP_REQUIRED');
77
+ const result = await catalogCheck(app);
78
+ console.log(JSON.stringify(result));
79
+ if (!result.ok)
80
+ process.exitCode = 3;
81
+ }
82
+ else if (args[0] === 'init') {
83
+ const allowed = new Set(['--name', '--directory', '--design-source', '--dry-run', '--json']), seen = new Set();
84
+ for (let index = 1; index < args.length; index++) {
85
+ const flag = args[index];
86
+ if (!allowed.has(flag))
87
+ throw new InputError('UNKNOWN_INIT_OPTION');
88
+ if (seen.has(flag))
89
+ throw new InputError('DUPLICATE_INIT_OPTION');
90
+ seen.add(flag);
91
+ if (flag !== '--dry-run' && flag !== '--json') {
92
+ const value = args[++index];
93
+ if (!value || value.startsWith('--'))
94
+ throw new InputError('MISSING_OPTION_VALUE');
95
+ }
96
+ }
97
+ const name = option('--name'), directory = option('--directory');
98
+ if (!name || !directory)
99
+ throw new InputError('NAME_AND_DIRECTORY_REQUIRED');
100
+ const designSource = (option('--design-source') ?? 'none');
101
+ console.log(JSON.stringify(await createWorkspace({ name, directory, designSource, dryRun: args.includes('--dry-run') })));
102
+ }
103
+ else if (args[0] === 'skills') {
104
+ const directory = option('--directory') ?? process.cwd();
105
+ if (args[1] === 'list')
106
+ console.log(JSON.stringify(skillCatalog()));
107
+ else if (args[1] === 'check')
108
+ console.log(JSON.stringify(await checkSkills(directory)));
109
+ else if (args[1] === 'install' || args[1] === 'update') {
110
+ const profile = option('--profile'), agent = option('--for');
111
+ console.log(JSON.stringify(await installSkills({ directory, ...(profile ? { profile } : {}), ...(agent ? { agent } : {}), dryRun: args.includes('--dry-run'), update: args[1] === 'update' })));
112
+ }
113
+ else
114
+ throw new InputError('UNKNOWN_SKILLS_COMMAND');
115
+ }
116
+ else if (args[0] === 'generate' || args[0] === 'check') {
117
+ const config = option('--config');
118
+ if (!config)
119
+ throw new InputError('CONFIG_REQUIRED');
120
+ const result = await generate(config, { check: args[0] === 'check', dryRun: args.includes('--dry-run') });
121
+ console.log(JSON.stringify(result));
122
+ }
123
+ else if (args[0] === 'create' && args[1] === 'app') {
124
+ const name = option('--name'), directory = option('--directory');
125
+ if (!name || !directory)
126
+ throw new InputError('NAME_AND_DIRECTORY_REQUIRED');
127
+ console.log(JSON.stringify(await createApplication({ name, directory, dryRun: args.includes('--dry-run') })));
128
+ }
129
+ else if (args[0] === 'create' && (args[1] === 'feature' || args[1] === 'route' || args[1] === 'package')) {
130
+ const profiles = { feature: ['--app', '--name', '--resource'], route: ['--app', '--path', '--feature', '--screen'], package: ['--name', '--directory', '--runtime'] };
131
+ const allowed = new Set([...profiles[args[1]], '--dry-run', '--json']), seen = new Set();
132
+ for (let index = 2; index < args.length; index++) {
133
+ const flag = args[index];
134
+ if (!allowed.has(flag))
135
+ throw new InputError('UNKNOWN_CREATE_OPTION');
136
+ if (seen.has(flag))
137
+ throw new InputError('DUPLICATE_CREATE_OPTION');
138
+ seen.add(flag);
139
+ if (flag !== '--dry-run' && flag !== '--json') {
140
+ const value = args[++index];
141
+ if (!value || value.startsWith('--'))
142
+ throw new InputError('MISSING_OPTION_VALUE');
143
+ }
144
+ }
145
+ const dryRun = args.includes('--dry-run');
146
+ try {
147
+ if (args[1] === 'feature') {
148
+ const app = option('--app'), name = option('--name'), resource = option('--resource');
149
+ if (!app || !name)
150
+ throw new InputError('APP_AND_NAME_REQUIRED');
151
+ console.log(JSON.stringify(await createFeature({ app, name, ...(resource ? { resource } : {}), dryRun })));
152
+ }
153
+ else if (args[1] === 'route') {
154
+ const app = option('--app'), path = option('--path'), feature = option('--feature'), screen = option('--screen');
155
+ if (!app || !path || !feature)
156
+ throw new InputError('APP_PATH_AND_FEATURE_REQUIRED');
157
+ console.log(JSON.stringify(await createRoute({ app, path, feature, ...(screen ? { screen } : {}), dryRun })));
158
+ }
159
+ else {
160
+ const name = option('--name'), directory = option('--directory'), runtime = option('--runtime');
161
+ if (!name)
162
+ throw new InputError('NAME_REQUIRED');
163
+ console.log(JSON.stringify(await createPackage({ name, ...(directory ? { directory } : {}), ...(runtime ? { runtime } : {}), dryRun })));
164
+ }
165
+ }
166
+ catch (error) {
167
+ if (error instanceof InputError)
168
+ throw error;
169
+ throw new InputError(error instanceof Error ? error.message : 'CREATE_FAILED');
170
+ }
171
+ }
172
+ else {
173
+ console.log('ftg generate|check --config <file> [--dry-run] [--json]\nmpfrontend init --name <name> --directory <new-directory> [--design-source none|existing] [--dry-run] [--json]\nmpfrontend design attach --directory <workspace> --source existing --binding <file> [--dry-run] [--json]\nmpfrontend design status --directory <workspace> [--json]\nmpfrontend create app --name <name> --directory <new-directory> [--dry-run]\nmpfrontend create feature --app <app-directory> --name <feature> [--resource <ftg-resource>] [--dry-run] [--json]\nmpfrontend create route --app <app-directory> --path <route> --feature <feature> [--screen <Export>] [--dry-run] [--json]\nmpfrontend create package --name <name> [--directory packages/<name>] [--runtime universal|client|server] [--dry-run] [--json]\nmpfrontend skills list|install|update|check [--directory <repository>] [--for codex|claude|both] [--profile base|design] [--dry-run] [--json]\nmpfrontend catalog check --app <app-directory> [--json]\nftg --version');
174
+ process.exitCode = args.length ? 2 : 0;
175
+ }
176
+ }
177
+ catch (error) {
178
+ const code = error instanceof InputError || error instanceof SkillsError || error instanceof DesignError ? error.exitCode : 2;
179
+ console.error(JSON.stringify({ ok: false, code, error: error instanceof Error ? error.message : 'COMMAND_FAILED' }));
180
+ process.exitCode = code;
181
+ }
182
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
package/dist/core.d.ts ADDED
@@ -0,0 +1,30 @@
1
+ import type { OpenApiDocument, ResourceSelection, RequestSelection } from '@mpfrontend/ftg-core';
2
+ export declare const GENERATOR_VERSION = "0.1.0-dev.6";
3
+ export declare const digest: (value: string) => string;
4
+ export declare class InputError extends Error {
5
+ readonly exitCode: number;
6
+ constructor(message: string, exitCode?: number);
7
+ }
8
+ export type GeneratorConfig = {
9
+ openapi: string;
10
+ output: string;
11
+ resources: ResourceSelection[];
12
+ requests?: RequestSelection[];
13
+ };
14
+ export declare function loadContract(path: string): Promise<{
15
+ document: OpenApiDocument;
16
+ bytes: string;
17
+ hash: string;
18
+ }>;
19
+ export declare function generate(configPath: string, { check, dryRun }?: {
20
+ check?: boolean;
21
+ dryRun?: boolean;
22
+ }): Promise<{
23
+ ok: boolean;
24
+ contractHash: string;
25
+ resources: number;
26
+ requests: number;
27
+ changed: string[];
28
+ dryRun: boolean;
29
+ check: boolean;
30
+ }>;
package/dist/core.js ADDED
@@ -0,0 +1,185 @@
1
+ import { readFile, writeFile, mkdir, realpath, lstat, rename, unlink } from 'node:fs/promises';
2
+ import { dirname, resolve, relative, isAbsolute, join } from 'node:path';
3
+ import { createHash, randomUUID } from 'node:crypto';
4
+ import SwaggerParser from '@apidevtools/swagger-parser';
5
+ import { parse } from 'yaml';
6
+ import { normalizeResources, normalizeRequests } from '@mpfrontend/ftg-core/internal';
7
+ import { readModelOutputs, requestModelOutputs } from './read-models.js';
8
+ export const GENERATOR_VERSION = '0.1.0-dev.6';
9
+ export const digest = (value) => createHash('sha256').update(value).digest('hex');
10
+ export class InputError extends Error {
11
+ exitCode;
12
+ constructor(message, exitCode = 2) {
13
+ super(message);
14
+ this.exitCode = exitCode;
15
+ }
16
+ }
17
+ const HEADER = '// @generated by FTG; edit authored overrides instead.\n';
18
+ function containsExternalRef(value) {
19
+ if (!value || typeof value !== 'object')
20
+ return false;
21
+ if (Array.isArray(value))
22
+ return value.some(containsExternalRef);
23
+ const object = value;
24
+ if (typeof object.$ref === 'string' && !object.$ref.startsWith('#/'))
25
+ return true;
26
+ return Object.values(object).some(containsExternalRef);
27
+ }
28
+ export async function loadContract(path) {
29
+ const bytes = await readFile(path, 'utf8');
30
+ if (Buffer.byteLength(bytes) > 5 * 1024 * 1024)
31
+ throw new InputError('CONTRACT_TOO_LARGE');
32
+ const document = parse(bytes);
33
+ if (!document || typeof document.openapi !== 'string' || !document.openapi.startsWith('3.'))
34
+ throw new InputError('INVALID_OPENAPI');
35
+ if (containsExternalRef(document))
36
+ throw new InputError('EXTERNAL_REFS_REQUIRE_PINNED_BUNDLE');
37
+ await SwaggerParser.validate(document, { resolve: { external: false } });
38
+ return { document, bytes, hash: digest(bytes) };
39
+ }
40
+ async function safeOutput(base, output) {
41
+ const canonical = await realpath(base);
42
+ const target = resolve(canonical, output);
43
+ if (isAbsolute(output) || relative(canonical, target).startsWith('..') || target === canonical)
44
+ throw new InputError('OUTPUT_OUTSIDE_CONFIG_ROOT', 4);
45
+ let existing = target;
46
+ while (true) {
47
+ try {
48
+ const actual = await realpath(existing);
49
+ if (relative(canonical, actual).startsWith('..'))
50
+ throw new InputError('SYMLINK_OUTPUT_ESCAPE', 4);
51
+ break;
52
+ }
53
+ catch (error) {
54
+ if (error instanceof InputError)
55
+ throw error;
56
+ if (error.code !== 'ENOENT')
57
+ throw error;
58
+ existing = dirname(existing);
59
+ }
60
+ }
61
+ return target;
62
+ }
63
+ async function generatedFile(file) {
64
+ try {
65
+ if ((await lstat(file)).isSymbolicLink())
66
+ throw new InputError('GENERATED_FILE_SYMLINK', 4);
67
+ return await readFile(file, 'utf8');
68
+ }
69
+ catch (error) {
70
+ if (error.code === 'ENOENT')
71
+ return undefined;
72
+ throw error;
73
+ }
74
+ }
75
+ async function assertNoWriter(marker) {
76
+ try {
77
+ await lstat(marker);
78
+ throw new InputError('GENERATION_BUSY', 4);
79
+ }
80
+ catch (error) {
81
+ if (error.code !== 'ENOENT')
82
+ throw error;
83
+ }
84
+ }
85
+ export async function generate(configPath, { check = false, dryRun = false } = {}) {
86
+ const base = dirname(resolve(configPath));
87
+ const raw = JSON.parse(await readFile(configPath, 'utf8'));
88
+ if (typeof raw.openapi !== 'string' || typeof raw.output !== 'string' || !Array.isArray(raw.resources))
89
+ throw new InputError('INVALID_CONFIG');
90
+ if (raw.requests !== undefined && !Array.isArray(raw.requests))
91
+ throw new InputError('INVALID_REQUEST_CONFIG');
92
+ const output = await safeOutput(base, raw.output);
93
+ const { document, hash } = await loadContract(resolve(base, raw.openapi));
94
+ const resources = normalizeResources(document, raw.resources);
95
+ const requests = normalizeRequests(document, raw.requests ?? []);
96
+ const source = HEADER + 'import type { ResourceModel } from "@mpfrontend/ftg-core";\n' +
97
+ 'export const contractHash = ' + JSON.stringify(hash) + ';\n' +
98
+ 'export const resources = ' + JSON.stringify(resources, null, 2) + ' as const satisfies readonly ResourceModel[];\n';
99
+ const readers = Object.fromEntries(Object.entries(readModelOutputs(document, raw.resources)).map(([name, bytes]) => [name, HEADER + bytes]));
100
+ const requestSource = HEADER + 'import type { RequestModel } from "@mpfrontend/ftg-core";\n' +
101
+ 'export const contractHash = ' + JSON.stringify(hash) + ';\n' +
102
+ 'export const requests = ' + JSON.stringify(requests, null, 2) + ' as const satisfies readonly RequestModel[];\n';
103
+ const payloads = Object.fromEntries(Object.entries(requestModelOutputs(document, requests)).map(([name, bytes]) => [name, HEADER + bytes]));
104
+ const generated = { 'resources.gen.ts': source, ...readers, 'requests.gen.ts': requestSource, ...payloads };
105
+ const manifest = JSON.stringify({ generator: 'FTG', version: GENERATOR_VERSION, irVersion: 3, contractHash: hash,
106
+ files: Object.fromEntries(Object.entries(generated).map(([name, bytes]) => [name, digest(bytes)])) }, null, 2) + '\n';
107
+ const desired = { ...generated, 'generation-manifest.json': manifest };
108
+ const marker = join(output, '.ftg-write.lock'), writer = !check && !dryRun, owner = randomUUID();
109
+ await assertNoWriter(marker);
110
+ if (writer) {
111
+ await mkdir(output, { recursive: true });
112
+ try {
113
+ await writeFile(marker, owner, { flag: 'wx' });
114
+ }
115
+ catch (error) {
116
+ if (error.code === 'EEXIST')
117
+ throw new InputError('GENERATION_BUSY', 4);
118
+ throw error;
119
+ }
120
+ }
121
+ try {
122
+ const previous = new Map();
123
+ const changed = [];
124
+ for (const [name, content] of Object.entries(desired)) {
125
+ const file = join(output, name);
126
+ const old = await generatedFile(file);
127
+ if (old !== undefined && (name === 'generation-manifest.json' ? JSON.parse(old).generator !== 'FTG' : !old.startsWith(HEADER)))
128
+ throw new InputError('AUTHORED_FILE_COLLISION', 4);
129
+ previous.set(name, old);
130
+ if (old !== content)
131
+ changed.push(name);
132
+ }
133
+ if (check && changed.length)
134
+ throw new InputError('GENERATED_DRIFT', 3);
135
+ if (!check && !dryRun && changed.length) {
136
+ const staged = new Map();
137
+ const replaced = [];
138
+ try {
139
+ for (const name of changed) {
140
+ const stage = join(output, '.ftg-' + randomUUID());
141
+ await writeFile(stage, desired[name], { flag: 'wx' });
142
+ staged.set(name, stage);
143
+ }
144
+ for (const name of changed) {
145
+ if (await generatedFile(join(output, name)) !== previous.get(name))
146
+ throw new InputError('GENERATION_FILE_CHANGED', 4);
147
+ await rename(staged.get(name), join(output, name));
148
+ staged.delete(name);
149
+ replaced.push(name);
150
+ }
151
+ }
152
+ catch (error) {
153
+ let conflict = false;
154
+ for (const name of replaced) {
155
+ const file = join(output, name);
156
+ if (await generatedFile(file) !== desired[name]) {
157
+ conflict = true;
158
+ continue;
159
+ }
160
+ const old = previous.get(name);
161
+ if (old === undefined)
162
+ await unlink(file);
163
+ else
164
+ await writeFile(file, old);
165
+ }
166
+ if (conflict)
167
+ throw new InputError('GENERATION_ROLLBACK_CONFLICT', 4);
168
+ throw error;
169
+ }
170
+ finally {
171
+ for (const stage of staged.values())
172
+ await unlink(stage).catch(() => undefined);
173
+ }
174
+ }
175
+ if (!writer)
176
+ await assertNoWriter(marker);
177
+ return { ok: true, contractHash: hash, resources: resources.length, requests: requests.length, changed, dryRun, check };
178
+ }
179
+ finally {
180
+ // Never remove another writer's marker or a marker replaced by an authored symlink.
181
+ if (writer && await generatedFile(marker) === owner)
182
+ await unlink(marker);
183
+ }
184
+ }
185
+ //# sourceMappingURL=core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ type SourceMode = 'none' | 'existing';
2
+ export type DesignSourceOptions = {
3
+ command: 'attach' | 'status';
4
+ directory: string;
5
+ source?: SourceMode;
6
+ bindingPath?: string;
7
+ dryRun?: boolean;
8
+ cliVersion: string;
9
+ };
10
+ export declare function designSourceCommand(options: DesignSourceOptions): Promise<{
11
+ bindingHash: null;
12
+ releaseVersion: null;
13
+ ok: boolean;
14
+ command: string;
15
+ source: SourceMode;
16
+ status: "disabled" | "pending" | "attached";
17
+ binding: string | null;
18
+ dryRun?: never;
19
+ changed?: never;
20
+ } | {
21
+ bindingHash: string;
22
+ releaseVersion: null;
23
+ ok: boolean;
24
+ command: string;
25
+ source: SourceMode;
26
+ status: "disabled" | "pending" | "attached";
27
+ binding: string | null;
28
+ dryRun?: never;
29
+ changed?: never;
30
+ } | {
31
+ ok: boolean;
32
+ command: string;
33
+ source: "existing";
34
+ status: string;
35
+ binding: string;
36
+ bindingHash: string;
37
+ releaseVersion: null;
38
+ dryRun: boolean;
39
+ changed: string[];
40
+ }>;
41
+ export {};
@@ -0,0 +1,141 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { lstat, mkdir, readFile, rename, unlink, writeFile } from 'node:fs/promises';
3
+ import { isAbsolute, join, relative, resolve } from 'node:path';
4
+ import { DesignError, inspectDesignBinding } from './design.js';
5
+ const configPath = '.mpfrontend/design-source.json', lockPath = '.mpfrontend/design-source.lock';
6
+ const encode = (value) => JSON.stringify(value, null, 2) + '\n';
7
+ function ensure(value, message, code = 2) { if (!value)
8
+ throw new DesignError(message, code); }
9
+ const record = (value, message = 'INVALID_DESIGN_SOURCE_CONFIG') => {
10
+ ensure(value !== null && typeof value === 'object' && !Array.isArray(value), message);
11
+ const result = value;
12
+ ensure(Object.keys(result).every(key => !['__proto__', 'prototype', 'constructor'].includes(key)), 'UNSAFE_DESIGN_SOURCE_KEY', 4);
13
+ return result;
14
+ };
15
+ function exact(value, keys, message) { ensure(Object.keys(value).length === keys.length && keys.every(key => Object.hasOwn(value, key)), message); }
16
+ function safeRelative(value) {
17
+ ensure(!isAbsolute(value) && value.length > 0 && value.length <= 500 && /^[a-zA-Z0-9_./@-]+$/.test(value) &&
18
+ value.split('/').every(part => part && part !== '.' && part !== '..' && !['.git', '.aws', '.codex', '.agents', '.claude', 'node_modules'].includes(part)), 'UNSAFE_DESIGN_SOURCE_PATH', 4);
19
+ }
20
+ async function file(root, path, required = true) {
21
+ safeRelative(path);
22
+ let current = root;
23
+ for (const part of path.split('/')) {
24
+ current = join(current, part);
25
+ try {
26
+ const info = await lstat(current);
27
+ ensure(!info.isSymbolicLink(), 'DESIGN_SOURCE_PATH_SYMLINK', 4);
28
+ ensure(current === join(root, path) ? info.isFile() : info.isDirectory(), 'DESIGN_SOURCE_PATH_KIND', 4);
29
+ if (current === join(root, path))
30
+ ensure(info.size <= 5 * 1024 * 1024, 'DESIGN_SOURCE_FILE_TOO_LARGE', 4);
31
+ }
32
+ catch (error) {
33
+ if (error.code === 'ENOENT') {
34
+ ensure(!required, 'DESIGN_SOURCE_FILE_MISSING');
35
+ return undefined;
36
+ }
37
+ throw error;
38
+ }
39
+ }
40
+ const result = await readFile(current);
41
+ ensure(result.length <= 5 * 1024 * 1024, 'DESIGN_SOURCE_FILE_TOO_LARGE', 4);
42
+ return result;
43
+ }
44
+ function json(bytes, message) { ensure(bytes, message); try {
45
+ return JSON.parse(bytes.toString('utf8'));
46
+ }
47
+ catch {
48
+ throw new DesignError(message);
49
+ } }
50
+ function parseConfig(raw) {
51
+ const value = record(raw);
52
+ exact(value, ['schemaVersion', 'generator', 'cliVersion', 'source', 'status', 'binding', 'bindingHash', 'sourceIdentity', 'release'], 'INVALID_DESIGN_SOURCE_CONFIG');
53
+ ensure(value.schemaVersion === 1 && value.generator === 'MPFrontendDesignSource' && typeof value.cliVersion === 'string' && ['none', 'existing'].includes(String(value.source)) && ['disabled', 'pending', 'attached'].includes(String(value.status)), 'INVALID_DESIGN_SOURCE_CONFIG');
54
+ ensure(value.binding === null || typeof value.binding === 'string', 'INVALID_DESIGN_SOURCE_CONFIG');
55
+ if (typeof value.binding === 'string')
56
+ safeRelative(value.binding);
57
+ ensure(value.bindingHash === null || typeof value.bindingHash === 'string' && /^[a-f0-9]{64}$/.test(value.bindingHash), 'INVALID_DESIGN_SOURCE_CONFIG');
58
+ ensure(value.sourceIdentity === null && value.release === null, 'INVALID_DESIGN_SOURCE_CONFIG');
59
+ return value;
60
+ }
61
+ async function rootFor(directory) {
62
+ const root = resolve(directory), info = await lstat(root).catch(() => undefined);
63
+ ensure(info?.isDirectory() && !info.isSymbolicLink(), 'DESIGN_WORKSPACE_REQUIRED', 4);
64
+ for (const marker of ['package.json', 'nx.json', 'pnpm-workspace.yaml'])
65
+ await file(root, marker);
66
+ return root;
67
+ }
68
+ async function localFile(root, input) {
69
+ ensure(!isAbsolute(input), 'UNSAFE_DESIGN_SOURCE_PATH', 4);
70
+ const path = relative(root, resolve(root, input));
71
+ safeRelative(path);
72
+ await file(root, path);
73
+ return path;
74
+ }
75
+ async function readConfig(root) { const bytes = await file(root, configPath, false); return { bytes, value: bytes ? parseConfig(json(bytes, 'INVALID_DESIGN_SOURCE_CONFIG')) : undefined }; }
76
+ async function verifyAttached(root, value) {
77
+ if (value.source === 'none') {
78
+ ensure(value.status === 'disabled' && value.binding === null && value.bindingHash === null && value.sourceIdentity === null && value.release === null, 'INVALID_DESIGN_SOURCE_CONFIG');
79
+ return { bindingHash: null, releaseVersion: null };
80
+ }
81
+ ensure(value.status === 'attached' && value.binding && value.bindingHash, 'DESIGN_SOURCE_NOT_ATTACHED', 3);
82
+ const binding = await inspectDesignBinding(join(root, value.binding));
83
+ ensure(binding.bindingHash === value.bindingHash, 'DESIGN_BINDING_DRIFT', 3);
84
+ ensure(value.sourceIdentity === null && value.release === null, 'INVALID_DESIGN_SOURCE_CONFIG');
85
+ return { bindingHash: binding.bindingHash, releaseVersion: null };
86
+ }
87
+ async function writeConfig(root, content, expected, dryRun) {
88
+ if (dryRun)
89
+ return expected?.toString('utf8') === content ? [] : [configPath];
90
+ await mkdir(join(root, '.mpfrontend'), { recursive: true });
91
+ const owner = randomUUID();
92
+ let acquired = false, stage = '';
93
+ try {
94
+ await file(root, lockPath, false);
95
+ try {
96
+ await writeFile(join(root, lockPath), owner, { flag: 'wx' });
97
+ acquired = true;
98
+ }
99
+ catch (error) {
100
+ if (error.code === 'EEXIST')
101
+ throw new DesignError('DESIGN_SOURCE_BUSY', 4);
102
+ throw error;
103
+ }
104
+ const current = await file(root, configPath, false);
105
+ ensure((current?.toString('utf8') ?? null) === (expected?.toString('utf8') ?? null), 'CONCURRENT_DESIGN_SOURCE_EDIT', 4);
106
+ if (current?.toString('utf8') === content)
107
+ return [];
108
+ stage = join(root, '.mpfrontend', '.design-source-' + randomUUID());
109
+ await writeFile(stage, content, { flag: 'wx' });
110
+ await rename(stage, join(root, configPath));
111
+ stage = '';
112
+ return [configPath];
113
+ }
114
+ finally {
115
+ if (stage)
116
+ await unlink(stage).catch(() => undefined);
117
+ if (acquired && (await file(root, lockPath, false))?.toString('utf8') === owner)
118
+ await unlink(join(root, lockPath));
119
+ }
120
+ }
121
+ export async function designSourceCommand(options) {
122
+ const root = await rootFor(options.directory), current = await readConfig(root);
123
+ if (options.command === 'status') {
124
+ ensure(current.value, 'DESIGN_SOURCE_NOT_CONFIGURED', 3);
125
+ const verification = current.value.status === 'pending' ? { bindingHash: null, releaseVersion: null } : await verifyAttached(root, current.value);
126
+ return { ok: true, command: 'status', source: current.value.source, status: current.value.status, binding: current.value.binding, ...verification };
127
+ }
128
+ ensure(options.source === 'existing', 'ATTACHABLE_DESIGN_SOURCE_REQUIRED');
129
+ ensure(options.bindingPath, 'DESIGN_BINDING_REQUIRED');
130
+ const bindingPath = await localFile(root, options.bindingPath), binding = await inspectDesignBinding(join(root, bindingPath));
131
+ if (current.value) {
132
+ ensure(current.value.status !== 'attached' || current.value.source === options.source && current.value.binding === bindingPath && current.value.bindingHash === binding.bindingHash, 'DESIGN_SOURCE_ALREADY_ATTACHED', 4);
133
+ ensure(current.value.source === 'none' || current.value.source === options.source, 'DESIGN_SOURCE_MODE_MISMATCH', 4);
134
+ }
135
+ const next = { schemaVersion: 1, generator: 'MPFrontendDesignSource', cliVersion: options.cliVersion, source: options.source, status: 'attached', binding: bindingPath, bindingHash: binding.bindingHash, sourceIdentity: null, release: null };
136
+ const content = encode(next);
137
+ ensure(current.value?.status !== 'attached' || current.bytes?.toString('utf8') === content, 'DESIGN_SOURCE_ALREADY_ATTACHED', 4);
138
+ const changed = await writeConfig(root, content, current.bytes, options.dryRun ?? false);
139
+ return { ok: true, command: 'attach', source: options.source, status: 'attached', binding: bindingPath, bindingHash: binding.bindingHash, releaseVersion: null, dryRun: options.dryRun ?? false, changed };
140
+ }
141
+ //# sourceMappingURL=design-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"design-source.js","sourceRoot":"","sources":["../src/design-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,aAAa,CAAC;AACvC,OAAO,EAAC,KAAK,EAAC,KAAK,EAAC,QAAQ,EAAC,MAAM,EAAC,MAAM,EAAC,SAAS,EAAC,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAC,UAAU,EAAC,IAAI,EAAC,QAAQ,EAAC,OAAO,EAAC,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAC,WAAW,EAAC,oBAAoB,EAAC,MAAM,aAAa,CAAC;AAM7D,MAAM,UAAU,GAAC,gCAAgC,EAAC,QAAQ,GAAC,gCAAgC,CAAC;AAC5F,MAAM,MAAM,GAAC,CAAC,KAAa,EAAC,EAAE,CAAA,IAAI,CAAC,SAAS,CAAC,KAAK,EAAC,IAAI,EAAC,CAAC,CAAC,GAAC,IAAI,CAAC;AAChE,SAAS,MAAM,CAAC,KAAa,EAAC,OAAc,EAAC,IAAI,GAAC,CAAC,IAAgB,IAAG,CAAC,KAAK;IAAC,MAAM,IAAI,WAAW,CAAC,OAAO,EAAC,IAAI,CAAC,CAAC,CAAA,CAAC;AAClH,MAAM,MAAM,GAAC,CAAC,KAAa,EAAC,OAAO,GAAC,8BAA8B,EAAwB,EAAE;IAC1F,MAAM,CAAC,KAAK,KAAG,IAAI,IAAE,OAAO,KAAK,KAAG,QAAQ,IAAE,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAC,OAAO,CAAC,CAAC;IAC7E,MAAM,MAAM,GAAC,KAA+B,CAAC;IAAA,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAA,EAAE,CAAA,CAAC,CAAC,WAAW,EAAC,WAAW,EAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAC,0BAA0B,EAAC,CAAC,CAAC,CAAC;IAAA,OAAO,MAAM,CAAC;AACzL,CAAC,CAAC;AACF,SAAS,KAAK,CAAC,KAA4B,EAAC,IAAa,EAAC,OAAc,IAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAG,IAAI,CAAC,MAAM,IAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAA,EAAE,CAAA,MAAM,CAAC,MAAM,CAAC,KAAK,EAAC,GAAG,CAAC,CAAC,EAAC,OAAO,CAAC,CAAC,CAAA,CAAC;AAC9K,SAAS,YAAY,CAAC,KAAY;IAChC,MAAM,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,IAAE,KAAK,CAAC,MAAM,GAAC,CAAC,IAAE,KAAK,CAAC,MAAM,IAAE,GAAG,IAAE,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC;QAC7F,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,CAAA,EAAE,CAAA,IAAI,IAAE,IAAI,KAAG,GAAG,IAAE,IAAI,KAAG,IAAI,IAAE,CAAC,CAAC,MAAM,EAAC,MAAM,EAAC,QAAQ,EAAC,SAAS,EAAC,SAAS,EAAC,cAAc,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAC,2BAA2B,EAAC,CAAC,CAAC,CAAC;AAC5K,CAAC;AACD,KAAK,UAAU,IAAI,CAAC,IAAW,EAAC,IAAW,EAAC,QAAQ,GAAC,IAAI;IACvD,YAAY,CAAC,IAAI,CAAC,CAAC;IAAA,IAAI,OAAO,GAAC,IAAI,CAAC;IACpC,KAAI,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAC,CAAC;QACjC,OAAO,GAAC,IAAI,CAAC,OAAO,EAAC,IAAI,CAAC,CAAC;QAC3B,IAAG,CAAC;YAAA,MAAM,IAAI,GAAC,MAAM,KAAK,CAAC,OAAO,CAAC,CAAC;YAAA,MAAM,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,EAAC,4BAA4B,EAAC,CAAC,CAAC,CAAC;YAChG,MAAM,CAAC,OAAO,KAAG,IAAI,CAAC,IAAI,EAAC,IAAI,CAAC,CAAA,CAAC,CAAA,IAAI,CAAC,MAAM,EAAE,CAAA,CAAC,CAAA,IAAI,CAAC,WAAW,EAAE,EAAC,yBAAyB,EAAC,CAAC,CAAC,CAAC;YAC/F,IAAG,OAAO,KAAG,IAAI,CAAC,IAAI,EAAC,IAAI,CAAC;gBAAC,MAAM,CAAC,IAAI,CAAC,IAAI,IAAE,CAAC,GAAC,IAAI,GAAC,IAAI,EAAC,8BAA8B,EAAC,CAAC,CAAC,CAAC;QAC/F,CAAC;QAAA,OAAM,KAAK,EAAC,CAAC;YAAA,IAAI,KAA+B,CAAC,IAAI,KAAG,QAAQ,EAAC,CAAC;gBAAA,MAAM,CAAC,CAAC,QAAQ,EAAC,4BAA4B,CAAC,CAAC;gBAAA,OAAO,SAAS,CAAC;YAAA,CAAC;YAAA,MAAM,KAAK,CAAC;QAAA,CAAC;IACnJ,CAAC;IACD,MAAM,MAAM,GAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;IAAA,MAAM,CAAC,MAAM,CAAC,MAAM,IAAE,CAAC,GAAC,IAAI,GAAC,IAAI,EAAC,8BAA8B,EAAC,CAAC,CAAC,CAAC;IAAA,OAAO,MAAM,CAAC;AACzH,CAAC;AACD,SAAS,IAAI,CAAC,KAAsB,EAAC,OAAc,IAAU,MAAM,CAAC,KAAK,EAAC,OAAO,CAAC,CAAC,CAAA,IAAG,CAAC;IAAA,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;AAAA,CAAC;AAAA,MAAK,CAAC;IAAA,MAAM,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC;AAAA,CAAC,CAAA,CAAC;AACzK,SAAS,WAAW,CAAC,GAAW;IAC9B,MAAM,KAAK,GAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAAA,KAAK,CAAC,KAAK,EAAC,CAAC,eAAe,EAAC,WAAW,EAAC,YAAY,EAAC,QAAQ,EAAC,QAAQ,EAAC,SAAS,EAAC,aAAa,EAAC,gBAAgB,EAAC,SAAS,CAAC,EAAC,8BAA8B,CAAC,CAAC;IACpL,MAAM,CAAC,KAAK,CAAC,aAAa,KAAG,CAAC,IAAE,KAAK,CAAC,SAAS,KAAG,wBAAwB,IAAE,OAAO,KAAK,CAAC,UAAU,KAAG,QAAQ,IAAE,CAAC,MAAM,EAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAE,CAAC,UAAU,EAAC,SAAS,EAAC,UAAU,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAC,8BAA8B,CAAC,CAAC;IACrQ,MAAM,CAAC,KAAK,CAAC,OAAO,KAAG,IAAI,IAAE,OAAO,KAAK,CAAC,OAAO,KAAG,QAAQ,EAAC,8BAA8B,CAAC,CAAC;IAAA,IAAG,OAAO,KAAK,CAAC,OAAO,KAAG,QAAQ;QAAC,YAAY,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5J,MAAM,CAAC,KAAK,CAAC,WAAW,KAAG,IAAI,IAAE,OAAO,KAAK,CAAC,WAAW,KAAG,QAAQ,IAAE,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,EAAC,8BAA8B,CAAC,CAAC;IAC/I,MAAM,CAAC,KAAK,CAAC,cAAc,KAAG,IAAI,IAAE,KAAK,CAAC,OAAO,KAAG,IAAI,EAAC,8BAA8B,CAAC,CAAC;IACzF,OAAO,KAAgC,CAAC;AAC1C,CAAC;AACD,KAAK,UAAU,OAAO,CAAC,SAAgB;IACrC,MAAM,IAAI,GAAC,OAAO,CAAC,SAAS,CAAC,EAAC,IAAI,GAAC,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,GAAE,EAAE,CAAA,SAAS,CAAC,CAAC;IAAA,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,IAAE,CAAC,IAAI,CAAC,cAAc,EAAE,EAAC,2BAA2B,EAAC,CAAC,CAAC,CAAC;IAC5J,KAAI,MAAM,MAAM,IAAI,CAAC,cAAc,EAAC,SAAS,EAAC,qBAAqB,CAAC;QAAC,MAAM,IAAI,CAAC,IAAI,EAAC,MAAM,CAAC,CAAC;IAC7F,OAAO,IAAI,CAAC;AACd,CAAC;AACD,KAAK,UAAU,SAAS,CAAC,IAAW,EAAC,KAAY;IAC/C,MAAM,CAAC,CAAC,UAAU,CAAC,KAAK,CAAC,EAAC,2BAA2B,EAAC,CAAC,CAAC,CAAC;IAAA,MAAM,IAAI,GAAC,QAAQ,CAAC,IAAI,EAAC,OAAO,CAAC,IAAI,EAAC,KAAK,CAAC,CAAC,CAAC;IAAA,YAAY,CAAC,IAAI,CAAC,CAAC;IAAA,MAAM,IAAI,CAAC,IAAI,EAAC,IAAI,CAAC,CAAC;IAAA,OAAO,IAAI,CAAC;AAC9J,CAAC;AACD,KAAK,UAAU,UAAU,CAAC,IAAW,IAAE,MAAM,KAAK,GAAC,MAAM,IAAI,CAAC,IAAI,EAAC,UAAU,EAAC,KAAK,CAAC,CAAC,CAAA,OAAO,EAAC,KAAK,EAAC,KAAK,EAAC,KAAK,CAAA,CAAC,CAAA,WAAW,CAAC,IAAI,CAAC,KAAK,EAAC,8BAA8B,CAAC,CAAC,CAAA,CAAC,CAAA,SAAS,EAAC,CAAC,CAAA,CAAC;AACnL,KAAK,UAAU,cAAc,CAAC,IAAW,EAAC,KAAkB;IAC1D,IAAG,KAAK,CAAC,MAAM,KAAG,MAAM,EAAC,CAAC;QAAA,MAAM,CAAC,KAAK,CAAC,MAAM,KAAG,UAAU,IAAE,KAAK,CAAC,OAAO,KAAG,IAAI,IAAE,KAAK,CAAC,WAAW,KAAG,IAAI,IAAE,KAAK,CAAC,cAAc,KAAG,IAAI,IAAE,KAAK,CAAC,OAAO,KAAG,IAAI,EAAC,8BAA8B,CAAC,CAAC;QAAA,OAAO,EAAC,WAAW,EAAC,IAAI,EAAC,cAAc,EAAC,IAAI,EAAC,CAAC;IAAA,CAAC;IAC7O,MAAM,CAAC,KAAK,CAAC,MAAM,KAAG,UAAU,IAAE,KAAK,CAAC,OAAO,IAAE,KAAK,CAAC,WAAW,EAAC,4BAA4B,EAAC,CAAC,CAAC,CAAC;IACnG,MAAM,OAAO,GAAC,MAAM,oBAAoB,CAAC,IAAI,CAAC,IAAI,EAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAAA,MAAM,CAAC,OAAO,CAAC,WAAW,KAAG,KAAK,CAAC,WAAW,EAAC,sBAAsB,EAAC,CAAC,CAAC,CAAC;IAC5I,MAAM,CAAC,KAAK,CAAC,cAAc,KAAG,IAAI,IAAE,KAAK,CAAC,OAAO,KAAG,IAAI,EAAC,8BAA8B,CAAC,CAAC;IACzF,OAAO,EAAC,WAAW,EAAC,OAAO,CAAC,WAAW,EAAC,cAAc,EAAC,IAAI,EAAC,CAAC;AAC/D,CAAC;AACD,KAAK,UAAU,WAAW,CAAC,IAAW,EAAC,OAAc,EAAC,QAAyB,EAAC,MAAc;IAC5F,IAAG,MAAM;QAAC,OAAO,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAG,OAAO,CAAA,CAAC,CAAA,EAAE,CAAA,CAAC,CAAA,CAAC,UAAU,CAAC,CAAC;IACtE,MAAM,KAAK,CAAC,IAAI,CAAC,IAAI,EAAC,aAAa,CAAC,EAAC,EAAC,SAAS,EAAC,IAAI,EAAC,CAAC,CAAC;IAAA,MAAM,KAAK,GAAC,UAAU,EAAE,CAAC;IAAA,IAAI,QAAQ,GAAC,KAAK,EAAC,KAAK,GAAC,EAAE,CAAC;IAC5G,IAAG,CAAC;QACF,MAAM,IAAI,CAAC,IAAI,EAAC,QAAQ,EAAC,KAAK,CAAC,CAAC;QAAA,IAAG,CAAC;YAAA,MAAM,SAAS,CAAC,IAAI,CAAC,IAAI,EAAC,QAAQ,CAAC,EAAC,KAAK,EAAC,EAAC,IAAI,EAAC,IAAI,EAAC,CAAC,CAAC;YAAA,QAAQ,GAAC,IAAI,CAAC;QAAA,CAAC;QAAA,OAAM,KAAK,EAAC,CAAC;YAAA,IAAI,KAA+B,CAAC,IAAI,KAAG,QAAQ;gBAAC,MAAM,IAAI,WAAW,CAAC,oBAAoB,EAAC,CAAC,CAAC,CAAC;YAAA,MAAM,KAAK,CAAC;QAAA,CAAC;QACtO,MAAM,OAAO,GAAC,MAAM,IAAI,CAAC,IAAI,EAAC,UAAU,EAAC,KAAK,CAAC,CAAC;QAAA,MAAM,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAE,IAAI,CAAC,KAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAE,IAAI,CAAC,EAAC,+BAA+B,EAAC,CAAC,CAAC,CAAC;QACjK,IAAG,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAG,OAAO;YAAC,OAAO,EAAE,CAAC;QACjD,KAAK,GAAC,IAAI,CAAC,IAAI,EAAC,aAAa,EAAC,iBAAiB,GAAC,UAAU,EAAE,CAAC,CAAC;QAAA,MAAM,SAAS,CAAC,KAAK,EAAC,OAAO,EAAC,EAAC,IAAI,EAAC,IAAI,EAAC,CAAC,CAAC;QAAA,MAAM,MAAM,CAAC,KAAK,EAAC,IAAI,CAAC,IAAI,EAAC,UAAU,CAAC,CAAC,CAAC;QAAA,KAAK,GAAC,EAAE,CAAC;QAAA,OAAO,CAAC,UAAU,CAAC,CAAC;IAClL,CAAC;YAAO,CAAC;QAAA,IAAG,KAAK;YAAC,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAE,EAAE,CAAA,SAAS,CAAC,CAAC;QAAA,IAAG,QAAQ,IAAE,CAAC,MAAM,IAAI,CAAC,IAAI,EAAC,QAAQ,EAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAG,KAAK;YAAC,MAAM,MAAM,CAAC,IAAI,CAAC,IAAI,EAAC,QAAQ,CAAC,CAAC,CAAC;IAAA,CAAC;AACzK,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAA2B;IACnE,MAAM,IAAI,GAAC,MAAM,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,EAAC,OAAO,GAAC,MAAM,UAAU,CAAC,IAAI,CAAC,CAAC;IAC3E,IAAG,OAAO,CAAC,OAAO,KAAG,QAAQ,EAAC,CAAC;QAC7B,MAAM,CAAC,OAAO,CAAC,KAAK,EAAC,8BAA8B,EAAC,CAAC,CAAC,CAAC;QAAA,MAAM,YAAY,GAAC,OAAO,CAAC,KAAK,CAAC,MAAM,KAAG,SAAS,CAAA,CAAC,CAAA,EAAC,WAAW,EAAC,IAAI,EAAC,cAAc,EAAC,IAAI,EAAC,CAAA,CAAC,CAAA,MAAM,cAAc,CAAC,IAAI,EAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC3L,OAAO,EAAC,EAAE,EAAC,IAAI,EAAC,OAAO,EAAC,QAAQ,EAAC,MAAM,EAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAC,MAAM,EAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAC,OAAO,EAAC,OAAO,CAAC,KAAK,CAAC,OAAO,EAAC,GAAG,YAAY,EAAC,CAAC;IAC1I,CAAC;IACD,MAAM,CAAC,OAAO,CAAC,MAAM,KAAG,UAAU,EAAC,mCAAmC,CAAC,CAAC;IACxE,MAAM,CAAC,OAAO,CAAC,WAAW,EAAC,yBAAyB,CAAC,CAAC;IAAA,MAAM,WAAW,GAAC,MAAM,SAAS,CAAC,IAAI,EAAC,OAAO,CAAC,WAAW,CAAC,EAAC,OAAO,GAAC,MAAM,oBAAoB,CAAC,IAAI,CAAC,IAAI,EAAC,WAAW,CAAC,CAAC,CAAC;IAC7K,IAAG,OAAO,CAAC,KAAK,EAAC,CAAC;QAChB,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,KAAG,UAAU,IAAE,OAAO,CAAC,KAAK,CAAC,MAAM,KAAG,OAAO,CAAC,MAAM,IAAE,OAAO,CAAC,KAAK,CAAC,OAAO,KAAG,WAAW,IAAE,OAAO,CAAC,KAAK,CAAC,WAAW,KAAG,OAAO,CAAC,WAAW,EAAC,gCAAgC,EAAC,CAAC,CAAC,CAAC;QAC1M,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,KAAG,MAAM,IAAE,OAAO,CAAC,KAAK,CAAC,MAAM,KAAG,OAAO,CAAC,MAAM,EAAC,6BAA6B,EAAC,CAAC,CAAC,CAAC;IAC/G,CAAC;IACD,MAAM,IAAI,GAAc,EAAC,aAAa,EAAC,CAAC,EAAC,SAAS,EAAC,wBAAwB,EAAC,UAAU,EAAC,OAAO,CAAC,UAAU,EAAC,MAAM,EAAC,OAAO,CAAC,MAAM,EAAC,MAAM,EAAC,UAAU,EAAC,OAAO,EAAC,WAAW,EAAC,WAAW,EAAC,OAAO,CAAC,WAAW,EAAC,cAAc,EAAC,IAAI,EAAC,OAAO,EAAC,IAAI,EAAC,CAAC;IACxO,MAAM,OAAO,GAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAAA,MAAM,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,KAAG,UAAU,IAAE,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAG,OAAO,EAAC,gCAAgC,EAAC,CAAC,CAAC,CAAC;IACpJ,MAAM,OAAO,GAAC,MAAM,WAAW,CAAC,IAAI,EAAC,OAAO,EAAC,OAAO,CAAC,KAAK,EAAC,OAAO,CAAC,MAAM,IAAE,KAAK,CAAC,CAAC;IAClF,OAAO,EAAC,EAAE,EAAC,IAAI,EAAC,OAAO,EAAC,QAAQ,EAAC,MAAM,EAAC,OAAO,CAAC,MAAM,EAAC,MAAM,EAAC,UAAU,EAAC,OAAO,EAAC,WAAW,EAAC,WAAW,EAAC,OAAO,CAAC,WAAW,EAAC,cAAc,EAAC,IAAI,EAAC,MAAM,EAAC,OAAO,CAAC,MAAM,IAAE,KAAK,EAAC,OAAO,EAAC,CAAC;AACzL,CAAC"}