@agent-native/core 0.128.2 → 0.128.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +0,0 @@
1
- {"version":3,"file":"sync-builder-starter-manifest.d.ts","sourceRoot":"","sources":["../../src/cli/sync-builder-starter-manifest.ts"],"names":[],"mappings":"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"}
@@ -1,426 +0,0 @@
1
- import fs from "node:fs";
2
- import os from "node:os";
3
- import path from "node:path";
4
- import { fileURLToPath } from "node:url";
5
- import { isMigrationManifestActive, readMigrationManifest, } from "../package-lifecycle/migration-manifest.js";
6
- import { _postProcessStandalone } from "./create.js";
7
- import { runMigrationCodemods } from "./migration-codemod.js";
8
- export const STARTER_APP_NAME = "builder-agent-native-starter";
9
- export const CHAT_TEMPLATE = "chat";
10
- /** Toolchain files that must track templates/chat or typecheck/build drift. */
11
- export const STARTER_TOOLCHAIN_SYNC_PATHS = [
12
- "react-router.config.ts",
13
- "vite.config.ts",
14
- "tsconfig.json",
15
- "ssr-entry.ts",
16
- "app/vite-env.d.ts",
17
- "app/routes.ts",
18
- "server/routes/[...page].get.ts",
19
- // server/plugins/* are intentionally excluded: starter keeps its own
20
- // systemPrompt and auth marketing copy; post-process only rewrites appId/title.
21
- "server/middleware/auth.ts",
22
- "components.json",
23
- ".oxfmtrc.json",
24
- "netlify.toml",
25
- ];
26
- export const STARTER_SOURCE_MIGRATION_PATHS = [
27
- ":(glob)**/*.ts",
28
- ":(glob)**/*.tsx",
29
- ];
30
- const STANDALONE_SNAPSHOT_EXCLUDED_TOP_LEVEL = new Set([
31
- ".deploy-tmp",
32
- ".env",
33
- ".env.local",
34
- ".generated",
35
- ".netlify",
36
- ".output",
37
- ".react-router",
38
- "build",
39
- "data",
40
- "dist",
41
- "node_modules",
42
- ]);
43
- export function listStarterSyncPaths() {
44
- return [
45
- "package.json",
46
- "pnpm-lock.yaml",
47
- "pnpm-workspace.yaml",
48
- ...STARTER_TOOLCHAIN_SYNC_PATHS,
49
- ...STARTER_SOURCE_MIGRATION_PATHS,
50
- ];
51
- }
52
- export function migrateStarterSources(options) {
53
- const manifestPath = path.join(options.repoRoot, "packages/core/migration-manifest.json");
54
- const manifest = readMigrationManifest(manifestPath);
55
- if (!manifest) {
56
- throw new Error(`Could not read migration manifest at ${manifestPath}.`);
57
- }
58
- if (!isMigrationManifestActive(manifest, options.coreVersion)) {
59
- return { changedPaths: [], warnings: [] };
60
- }
61
- const result = runMigrationCodemods({
62
- root: options.starterDir,
63
- manifests: [manifest],
64
- apply: options.write,
65
- // Checked-in migration targets are validated by the manifest guard before
66
- // this source sync runs; starter dependencies are installed afterward.
67
- targetExists: () => true,
68
- });
69
- return {
70
- changedPaths: [
71
- ...new Set(result.changes.map((change) => path.relative(options.starterDir, change.file))),
72
- ].sort(),
73
- warnings: result.warnings,
74
- };
75
- }
76
- export function resolveStarterCoreVersion(starterPackageJson, repoRoot) {
77
- const dependencies = starterPackageJson.dependencies;
78
- if (dependencies && typeof dependencies === "object") {
79
- const declared = dependencies["@agent-native/core"];
80
- if (typeof declared === "string") {
81
- const version = declared.match(/\d+\.\d+\.\d+/)?.[0];
82
- if (version)
83
- return version;
84
- }
85
- }
86
- try {
87
- const corePackageJson = JSON.parse(fs.readFileSync(path.join(repoRoot, "packages/core/package.json"), "utf-8"));
88
- return typeof corePackageJson.version === "string"
89
- ? corePackageJson.version
90
- : null;
91
- }
92
- catch {
93
- return null;
94
- }
95
- }
96
- export function findAgentNativeRoot(startDir = process.cwd()) {
97
- let dir = path.resolve(startDir);
98
- for (let i = 0; i < 12; i++) {
99
- const chatPackageJson = path.join(dir, "templates", CHAT_TEMPLATE, "package.json");
100
- if (fs.existsSync(chatPackageJson)) {
101
- return dir;
102
- }
103
- const parent = path.dirname(dir);
104
- if (parent === dir)
105
- break;
106
- dir = parent;
107
- }
108
- throw new Error("Could not find agent-native repo root (expected templates/chat/package.json).");
109
- }
110
- export function collectStarterToolchainFiles(canonicalDir) {
111
- const files = new Map();
112
- for (const relativePath of STARTER_TOOLCHAIN_SYNC_PATHS) {
113
- const absolutePath = path.join(canonicalDir, relativePath);
114
- if (!fs.existsSync(absolutePath))
115
- continue;
116
- files.set(relativePath, fs.readFileSync(absolutePath, "utf-8"));
117
- }
118
- return files;
119
- }
120
- export function createStandaloneChatSnapshot(repoRoot) {
121
- const root = repoRoot ?? findAgentNativeRoot();
122
- const chatTemplateDir = path.join(root, "templates", CHAT_TEMPLATE);
123
- const tempDir = fs.mkdtempSync(path.join(os.tmpdir(), "an-builder-starter-sync-"));
124
- fs.cpSync(chatTemplateDir, tempDir, {
125
- recursive: true,
126
- filter: (source) => shouldCopyStandaloneSnapshotPath(source, chatTemplateDir),
127
- });
128
- _postProcessStandalone(STARTER_APP_NAME, tempDir, CHAT_TEMPLATE);
129
- const packageJson = JSON.parse(fs.readFileSync(path.join(tempDir, "package.json"), "utf-8"));
130
- const workspacePath = path.join(tempDir, "pnpm-workspace.yaml");
131
- const pnpmWorkspaceYaml = fs.existsSync(workspacePath)
132
- ? fs.readFileSync(workspacePath, "utf-8")
133
- : null;
134
- return {
135
- cleanup: () => {
136
- fs.rmSync(tempDir, { recursive: true, force: true });
137
- },
138
- dir: tempDir,
139
- packageJson,
140
- pnpmWorkspaceYaml,
141
- toolchainFiles: collectStarterToolchainFiles(tempDir),
142
- };
143
- }
144
- function shouldCopyStandaloneSnapshotPath(source, root) {
145
- const relative = path.relative(root, source);
146
- if (!relative)
147
- return true;
148
- const topLevel = relative.split(path.sep)[0];
149
- return !STANDALONE_SNAPSHOT_EXCLUDED_TOP_LEVEL.has(topLevel);
150
- }
151
- export function generateStandaloneChatManifest(repoRoot) {
152
- const snapshot = createStandaloneChatSnapshot(repoRoot);
153
- try {
154
- return {
155
- packageJson: snapshot.packageJson,
156
- pnpmWorkspaceYaml: snapshot.pnpmWorkspaceYaml,
157
- };
158
- }
159
- finally {
160
- snapshot.cleanup();
161
- }
162
- }
163
- function mergePackageJsonRecords(canonical, starter, starterPinnedKeys = []) {
164
- const merged = { ...(canonical ?? {}) };
165
- for (const [key, value] of Object.entries(starter ?? {})) {
166
- if (!(key in merged)) {
167
- merged[key] = value;
168
- }
169
- }
170
- for (const key of starterPinnedKeys) {
171
- const pinned = starter?.[key];
172
- if (pinned) {
173
- merged[key] = pinned;
174
- }
175
- }
176
- return merged;
177
- }
178
- export function mergeStarterManifest(starterPackageJson, canonicalPackageJson) {
179
- const merged = structuredClone(canonicalPackageJson);
180
- merged.name = starterPackageJson.name ?? STARTER_APP_NAME;
181
- if (typeof starterPackageJson.displayName === "string") {
182
- merged.displayName = starterPackageJson.displayName;
183
- }
184
- if (typeof starterPackageJson.description === "string") {
185
- merged.description = starterPackageJson.description;
186
- }
187
- if (starterPackageJson.private !== undefined) {
188
- merged.private = starterPackageJson.private;
189
- }
190
- if (typeof starterPackageJson.packageManager === "string") {
191
- merged.packageManager = starterPackageJson.packageManager;
192
- }
193
- merged.dependencies = mergePackageJsonRecords(canonicalPackageJson.dependencies, starterPackageJson.dependencies, ["@agent-native/core", "@agent-native/toolkit"]);
194
- merged.devDependencies = mergePackageJsonRecords(canonicalPackageJson.devDependencies, starterPackageJson.devDependencies);
195
- merged.scripts = mergePackageJsonRecords(canonicalPackageJson.scripts, starterPackageJson.scripts);
196
- return merged;
197
- }
198
- export function workspaceFileSyncChanged(existingWorkspace, canonicalWorkspace) {
199
- if (canonicalWorkspace === null) {
200
- return existingWorkspace !== null;
201
- }
202
- return existingWorkspace !== canonicalWorkspace;
203
- }
204
- export function applyWorkspaceFileSync(targetPath, canonicalWorkspace) {
205
- if (canonicalWorkspace === null) {
206
- if (fs.existsSync(targetPath)) {
207
- fs.unlinkSync(targetPath);
208
- }
209
- return;
210
- }
211
- fs.writeFileSync(targetPath, canonicalWorkspace);
212
- }
213
- function stableJson(value) {
214
- return `${JSON.stringify(value, null, 2)}\n`;
215
- }
216
- export function diffStarterToolchainFiles(starterDir, canonicalFiles) {
217
- return STARTER_TOOLCHAIN_SYNC_PATHS.map((relativePath) => {
218
- const canonicalContent = canonicalFiles.get(relativePath) ?? null;
219
- const targetPath = path.join(starterDir, relativePath);
220
- const existingContent = fs.existsSync(targetPath)
221
- ? fs.readFileSync(targetPath, "utf-8")
222
- : null;
223
- return {
224
- relativePath,
225
- changed: existingContent !== canonicalContent,
226
- };
227
- });
228
- }
229
- export function applyStarterToolchainSync(starterDir, canonicalFiles) {
230
- const changes = [];
231
- for (const relativePath of STARTER_TOOLCHAIN_SYNC_PATHS) {
232
- const canonicalContent = canonicalFiles.get(relativePath) ?? null;
233
- const targetPath = path.join(starterDir, relativePath);
234
- const existingContent = fs.existsSync(targetPath)
235
- ? fs.readFileSync(targetPath, "utf-8")
236
- : null;
237
- const changed = existingContent !== canonicalContent;
238
- if (changed) {
239
- if (canonicalContent === null) {
240
- if (fs.existsSync(targetPath)) {
241
- fs.unlinkSync(targetPath);
242
- }
243
- }
244
- else {
245
- fs.mkdirSync(path.dirname(targetPath), { recursive: true });
246
- fs.writeFileSync(targetPath, canonicalContent);
247
- }
248
- }
249
- changes.push({ relativePath, changed });
250
- }
251
- return changes;
252
- }
253
- export function resolveStarterPaths(options) {
254
- if (options.starterDir) {
255
- return {
256
- starterDir: path.resolve(options.starterDir),
257
- starterPackageJsonPath: path.join(path.resolve(options.starterDir), "package.json"),
258
- starterPnpmWorkspacePath: path.join(path.resolve(options.starterDir), "pnpm-workspace.yaml"),
259
- };
260
- }
261
- if (!options.starterPackageJsonPath) {
262
- throw new Error("Provide --starter-dir or --starter-package-json.");
263
- }
264
- const starterPackageJsonPath = path.resolve(options.starterPackageJsonPath);
265
- return {
266
- starterDir: path.dirname(starterPackageJsonPath),
267
- starterPackageJsonPath,
268
- starterPnpmWorkspacePath: options.starterPnpmWorkspacePath ??
269
- path.join(path.dirname(starterPackageJsonPath), "pnpm-workspace.yaml"),
270
- };
271
- }
272
- export function syncStarterManifestFiles(options) {
273
- const { starterDir, starterPackageJsonPath, starterPnpmWorkspacePath } = resolveStarterPaths(options);
274
- const snapshot = createStandaloneChatSnapshot(options.repoRoot);
275
- try {
276
- const repoRoot = options.repoRoot ?? findAgentNativeRoot();
277
- const initialStarterPackageJson = JSON.parse(fs.readFileSync(starterPackageJsonPath, "utf-8"));
278
- const sourceMigration = migrateStarterSources({
279
- starterDir,
280
- repoRoot,
281
- coreVersion: resolveStarterCoreVersion(initialStarterPackageJson, repoRoot),
282
- write: options.write,
283
- });
284
- const starterPackageJson = JSON.parse(fs.readFileSync(starterPackageJsonPath, "utf-8"));
285
- const mergedPackageJson = mergeStarterManifest(starterPackageJson, snapshot.packageJson);
286
- const existingWorkspace = fs.existsSync(starterPnpmWorkspacePath)
287
- ? fs.readFileSync(starterPnpmWorkspacePath, "utf-8")
288
- : null;
289
- const workspaceChanged = workspaceFileSyncChanged(existingWorkspace, snapshot.pnpmWorkspaceYaml);
290
- const packageChanged = stableJson(starterPackageJson) !== stableJson(mergedPackageJson);
291
- const toolchainChanges = diffStarterToolchainFiles(starterDir, snapshot.toolchainFiles);
292
- const changedToolchainPaths = toolchainChanges
293
- .filter((change) => change.changed)
294
- .map((change) => change.relativePath);
295
- const changed = packageChanged ||
296
- workspaceChanged ||
297
- changedToolchainPaths.length > 0 ||
298
- sourceMigration.changedPaths.length > 0;
299
- if (options.write && changed) {
300
- if (packageChanged) {
301
- fs.writeFileSync(starterPackageJsonPath, stableJson(mergedPackageJson));
302
- }
303
- if (workspaceChanged) {
304
- applyWorkspaceFileSync(starterPnpmWorkspacePath, snapshot.pnpmWorkspaceYaml);
305
- }
306
- if (changedToolchainPaths.length > 0) {
307
- applyStarterToolchainSync(starterDir, snapshot.toolchainFiles);
308
- }
309
- }
310
- return {
311
- changed,
312
- packageChanged,
313
- workspaceChanged,
314
- packageJson: mergedPackageJson,
315
- pnpmWorkspaceYaml: snapshot.pnpmWorkspaceYaml,
316
- toolchainChanges,
317
- changedToolchainPaths,
318
- changedSourceMigrationPaths: sourceMigration.changedPaths,
319
- sourceMigrationWarnings: sourceMigration.warnings,
320
- };
321
- }
322
- finally {
323
- snapshot.cleanup();
324
- }
325
- }
326
- export function parseSyncStarterManifestArgs(argv) {
327
- const [commandRaw, ...rest] = argv;
328
- const command = commandRaw === "generate"
329
- ? "generate"
330
- : commandRaw === "paths"
331
- ? "paths"
332
- : "merge";
333
- let starterDir;
334
- let starterPackageJsonPath;
335
- let starterPnpmWorkspacePath;
336
- let write = false;
337
- let repoRoot;
338
- for (let i = 0; i < rest.length; i++) {
339
- const arg = rest[i];
340
- if (arg === "--write") {
341
- write = true;
342
- continue;
343
- }
344
- if (arg === "--starter-dir") {
345
- starterDir = rest[++i];
346
- continue;
347
- }
348
- if (arg === "--starter-package-json") {
349
- starterPackageJsonPath = rest[++i];
350
- continue;
351
- }
352
- if (arg === "--starter-pnpm-workspace") {
353
- starterPnpmWorkspacePath = rest[++i];
354
- continue;
355
- }
356
- if (arg === "--repo-root") {
357
- repoRoot = rest[++i];
358
- continue;
359
- }
360
- throw new Error(`Unknown argument: ${arg}`);
361
- }
362
- if (command === "merge" && !starterDir && !starterPackageJsonPath) {
363
- throw new Error("merge requires --starter-dir <path> or --starter-package-json <path> [--starter-pnpm-workspace <path>] [--write] [--repo-root <path>]");
364
- }
365
- return {
366
- command,
367
- starterDir,
368
- starterPackageJsonPath,
369
- starterPnpmWorkspacePath,
370
- write,
371
- repoRoot,
372
- };
373
- }
374
- export function runSyncStarterManifestCli(argv) {
375
- const args = parseSyncStarterManifestArgs(argv);
376
- if (args.command === "generate") {
377
- const { packageJson, pnpmWorkspaceYaml } = generateStandaloneChatManifest(args.repoRoot);
378
- process.stdout.write(stableJson(packageJson));
379
- if (pnpmWorkspaceYaml) {
380
- process.stdout.write("\n--- pnpm-workspace.yaml ---\n");
381
- process.stdout.write(pnpmWorkspaceYaml);
382
- }
383
- return 0;
384
- }
385
- if (args.command === "paths") {
386
- for (const syncPath of listStarterSyncPaths()) {
387
- process.stdout.write(`${syncPath}\n`);
388
- }
389
- return 0;
390
- }
391
- const result = syncStarterManifestFiles({
392
- starterDir: args.starterDir,
393
- starterPackageJsonPath: args.starterPackageJsonPath,
394
- starterPnpmWorkspacePath: args.starterPnpmWorkspacePath,
395
- repoRoot: args.repoRoot,
396
- write: args.write,
397
- });
398
- for (const warning of result.sourceMigrationWarnings) {
399
- console.warn(`[starter migration] ${warning}`);
400
- }
401
- if (result.changed) {
402
- const updatedPaths = [
403
- ...new Set([
404
- ...(result.packageChanged ? ["package.json"] : []),
405
- ...(result.workspaceChanged ? ["pnpm-workspace.yaml"] : []),
406
- ...result.changedToolchainPaths,
407
- ...result.changedSourceMigrationPaths,
408
- ]),
409
- ];
410
- const summary = updatedPaths.length ? ` (${updatedPaths.join(", ")})` : "";
411
- console.log(args.write
412
- ? `Updated builder-agent-native-starter from templates/chat${summary}.`
413
- : `builder-agent-native-starter is out of date with templates/chat${summary}.`);
414
- return args.write ? 0 : 1;
415
- }
416
- console.log("builder-agent-native-starter already matches templates/chat.");
417
- return 0;
418
- }
419
- const isDirectRun = process.argv[1] &&
420
- path.resolve(process.argv[1]) ===
421
- path.resolve(fileURLToPath(import.meta.url));
422
- if (isDirectRun) {
423
- const exitCode = runSyncStarterManifestCli(process.argv.slice(2));
424
- process.exit(exitCode);
425
- }
426
- //# sourceMappingURL=sync-builder-starter-manifest.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sync-builder-starter-manifest.js","sourceRoot":"","sources":["../../src/cli/sync-builder-starter-manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC,OAAO,EACL,yBAAyB,EACzB,qBAAqB,GACtB,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,MAAM,CAAC,MAAM,gBAAgB,GAAG,8BAA8B,CAAC;AAC/D,MAAM,CAAC,MAAM,aAAa,GAAG,MAAM,CAAC;AAEpC,+EAA+E;AAC/E,MAAM,CAAC,MAAM,4BAA4B,GAAG;IAC1C,wBAAwB;IACxB,gBAAgB;IAChB,eAAe;IACf,cAAc;IACd,mBAAmB;IACnB,eAAe;IACf,gCAAgC;IAChC,qEAAqE;IACrE,gFAAgF;IAChF,2BAA2B;IAC3B,iBAAiB;IACjB,eAAe;IACf,cAAc;CACN,CAAC;AAEX,MAAM,CAAC,MAAM,8BAA8B,GAAG;IAC5C,gBAAgB;IAChB,iBAAiB;CACT,CAAC;AAEX,MAAM,sCAAsC,GAAG,IAAI,GAAG,CAAC;IACrD,aAAa;IACb,MAAM;IACN,YAAY;IACZ,YAAY;IACZ,UAAU;IACV,SAAS;IACT,eAAe;IACf,OAAO;IACP,MAAM;IACN,MAAM;IACN,cAAc;CACf,CAAC,CAAC;AAeH,MAAM,UAAU,oBAAoB;IAClC,OAAO;QACL,cAAc;QACd,gBAAgB;QAChB,qBAAqB;QACrB,GAAG,4BAA4B;QAC/B,GAAG,8BAA8B;KAClC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,OAKrC;IACC,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAC5B,OAAO,CAAC,QAAQ,EAChB,uCAAuC,CACxC,CAAC;IACF,MAAM,QAAQ,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;IACrD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,wCAAwC,YAAY,GAAG,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,CAAC,yBAAyB,CAAC,QAAQ,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC;QAC9D,OAAO,EAAE,YAAY,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAC5C,CAAC;IAED,MAAM,MAAM,GAAG,oBAAoB,CAAC;QAClC,IAAI,EAAE,OAAO,CAAC,UAAU;QACxB,SAAS,EAAE,CAAC,QAAQ,CAAC;QACrB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,0EAA0E;QAC1E,uEAAuE;QACvE,YAAY,EAAE,GAAG,EAAE,CAAC,IAAI;KACzB,CAAC,CAAC;IAEH,OAAO;QACL,YAAY,EAAE;YACZ,GAAG,IAAI,GAAG,CACR,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAC5B,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,IAAI,CAAC,CAC/C,CACF;SACF,CAAC,IAAI,EAAE;QACR,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,kBAA+B,EAC/B,QAAgB;IAEhB,MAAM,YAAY,GAAG,kBAAkB,CAAC,YAAY,CAAC;IACrD,IAAI,YAAY,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE,CAAC;QACrD,MAAM,QAAQ,GAAI,YAAwC,CACxD,oBAAoB,CACrB,CAAC;QACF,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACrD,IAAI,OAAO;gBAAE,OAAO,OAAO,CAAC;QAC9B,CAAC;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAChC,EAAE,CAAC,YAAY,CACb,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,4BAA4B,CAAC,EACjD,OAAO,CACR,CACuB,CAAC;QAC3B,OAAO,OAAO,eAAe,CAAC,OAAO,KAAK,QAAQ;YAChD,CAAC,CAAC,eAAe,CAAC,OAAO;YACzB,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,EAAE;IAC1D,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;QAC5B,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAC/B,GAAG,EACH,WAAW,EACX,aAAa,EACb,cAAc,CACf,CAAC;QACF,IAAI,EAAE,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;YACnC,OAAO,GAAG,CAAC;QACb,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,MAAM,KAAK,GAAG;YAAE,MAAM;QAC1B,GAAG,GAAG,MAAM,CAAC;IACf,CAAC;IACD,MAAM,IAAI,KAAK,CACb,+EAA+E,CAChF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,YAAoB;IAEpB,MAAM,KAAK,GAAG,IAAI,GAAG,EAAoC,CAAC;IAC1D,KAAK,MAAM,YAAY,IAAI,4BAA4B,EAAE,CAAC;QACxD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;QAC3D,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC;YAAE,SAAS;QAC3C,KAAK,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC;IAClE,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,QAAiB;IAEjB,MAAM,IAAI,GAAG,QAAQ,IAAI,mBAAmB,EAAE,CAAC;IAC/C,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;IACpE,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAC5B,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,0BAA0B,CAAC,CACnD,CAAC;IAEF,EAAE,CAAC,MAAM,CAAC,eAAe,EAAE,OAAO,EAAE;QAClC,SAAS,EAAE,IAAI;QACf,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE,CACjB,gCAAgC,CAAC,MAAM,EAAE,eAAe,CAAC;KAC5D,CAAC,CAAC;IACH,sBAAsB,CAAC,gBAAgB,EAAE,OAAO,EAAE,aAAa,CAAC,CAAC;IAEjE,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAC5B,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,OAAO,CAAC,CAC9C,CAAC;IAEjB,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC,CAAC;IAChE,MAAM,iBAAiB,GAAG,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC;QACpD,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,OAAO,CAAC;QACzC,CAAC,CAAC,IAAI,CAAC;IAET,OAAO;QACL,OAAO,EAAE,GAAG,EAAE;YACZ,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,CAAC;QACD,GAAG,EAAE,OAAO;QACZ,WAAW;QACX,iBAAiB;QACjB,cAAc,EAAE,4BAA4B,CAAC,OAAO,CAAC;KACtD,CAAC;AACJ,CAAC;AAED,SAAS,gCAAgC,CACvC,MAAc,EACd,IAAY;IAEZ,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7C,IAAI,CAAC,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3B,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7C,OAAO,CAAC,sCAAsC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC/D,CAAC;AAED,MAAM,UAAU,8BAA8B,CAAC,QAAiB;IAI9D,MAAM,QAAQ,GAAG,4BAA4B,CAAC,QAAQ,CAAC,CAAC;IACxD,IAAI,CAAC;QACH,OAAO;YACL,WAAW,EAAE,QAAQ,CAAC,WAAW;YACjC,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;SAC9C,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,QAAQ,CAAC,OAAO,EAAE,CAAC;IACrB,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAC9B,SAA6C,EAC7C,OAA2C,EAC3C,iBAAiB,GAAa,EAAE;IAEhC,MAAM,MAAM,GAAG,EAAE,GAAG,CAAC,SAAS,IAAI,EAAE,CAAC,EAAE,CAAC;IACxC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,EAAE,CAAC;QACzD,IAAI,CAAC,CAAC,GAAG,IAAI,MAAM,CAAC,EAAE,CAAC;YACrB,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACtB,CAAC;IACH,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,iBAAiB,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC;QACvB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,kBAA+B,EAC/B,oBAAiC;IAEjC,MAAM,MAAM,GAAG,eAAe,CAAC,oBAAoB,CAAgB,CAAC;IAEpE,MAAM,CAAC,IAAI,GAAG,kBAAkB,CAAC,IAAI,IAAI,gBAAgB,CAAC;IAC1D,IAAI,OAAO,kBAAkB,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;QACvD,MAAM,CAAC,WAAW,GAAG,kBAAkB,CAAC,WAAW,CAAC;IACtD,CAAC;IACD,IAAI,OAAO,kBAAkB,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;QACvD,MAAM,CAAC,WAAW,GAAG,kBAAkB,CAAC,WAAW,CAAC;IACtD,CAAC;IACD,IAAI,kBAAkB,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC7C,MAAM,CAAC,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC;IAC9C,CAAC;IACD,IAAI,OAAO,kBAAkB,CAAC,cAAc,KAAK,QAAQ,EAAE,CAAC;QAC1D,MAAM,CAAC,cAAc,GAAG,kBAAkB,CAAC,cAAc,CAAC;IAC5D,CAAC;IAED,MAAM,CAAC,YAAY,GAAG,uBAAuB,CAC3C,oBAAoB,CAAC,YAAkD,EACvE,kBAAkB,CAAC,YAAkD,EACrE,CAAC,oBAAoB,EAAE,uBAAuB,CAAC,CAChD,CAAC;IACF,MAAM,CAAC,eAAe,GAAG,uBAAuB,CAC9C,oBAAoB,CAAC,eAAqD,EAC1E,kBAAkB,CAAC,eAAqD,CACzE,CAAC;IACF,MAAM,CAAC,OAAO,GAAG,uBAAuB,CACtC,oBAAoB,CAAC,OAA6C,EAClE,kBAAkB,CAAC,OAA6C,CACjE,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,wBAAwB,CACtC,iBAAgC,EAChC,kBAAiC;IAEjC,IAAI,kBAAkB,KAAK,IAAI,EAAE,CAAC;QAChC,OAAO,iBAAiB,KAAK,IAAI,CAAC;IACpC,CAAC;IACD,OAAO,iBAAiB,KAAK,kBAAkB,CAAC;AAClD,CAAC;AAED,MAAM,UAAU,sBAAsB,CACpC,UAAkB,EAClB,kBAAiC;IAEjC,IAAI,kBAAkB,KAAK,IAAI,EAAE,CAAC;QAChC,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC5B,CAAC;QACD,OAAO;IACT,CAAC;IACD,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,kBAAkB,CAAC,CAAC;AACnD,CAAC;AAED,SAAS,UAAU,CAAC,KAAc;IAChC,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC;AAC/C,CAAC;AAOD,MAAM,UAAU,yBAAyB,CACvC,UAAkB,EAClB,cAAqD;IAErD,OAAO,4BAA4B,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE;QACvD,MAAM,gBAAgB,GAAG,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC;QAClE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QACvD,MAAM,eAAe,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;YAC/C,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC;YACtC,CAAC,CAAC,IAAI,CAAC;QACT,OAAO;YACL,YAAY;YACZ,OAAO,EAAE,eAAe,KAAK,gBAAgB;SAC9C,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,UAAkB,EAClB,cAAqD;IAErD,MAAM,OAAO,GAAiC,EAAE,CAAC;IACjD,KAAK,MAAM,YAAY,IAAI,4BAA4B,EAAE,CAAC;QACxD,MAAM,gBAAgB,GAAG,cAAc,CAAC,GAAG,CAAC,YAAY,CAAC,IAAI,IAAI,CAAC;QAClE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QACvD,MAAM,eAAe,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;YAC/C,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC;YACtC,CAAC,CAAC,IAAI,CAAC;QACT,MAAM,OAAO,GAAG,eAAe,KAAK,gBAAgB,CAAC;QACrD,IAAI,OAAO,EAAE,CAAC;YACZ,IAAI,gBAAgB,KAAK,IAAI,EAAE,CAAC;gBAC9B,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC9B,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;gBAC5B,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC5D,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,gBAAgB,CAAC,CAAC;YACjD,CAAC;QACH,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1C,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAcD,MAAM,UAAU,mBAAmB,CAAC,OAInC;IAKC,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,OAAO;YACL,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC;YAC5C,sBAAsB,EAAE,IAAI,CAAC,IAAI,CAC/B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,EAChC,cAAc,CACf;YACD,wBAAwB,EAAE,IAAI,CAAC,IAAI,CACjC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,EAChC,qBAAqB,CACtB;SACF,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;IACtE,CAAC;IACD,MAAM,sBAAsB,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAC5E,OAAO;QACL,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC;QAChD,sBAAsB;QACtB,wBAAwB,EACtB,OAAO,CAAC,wBAAwB;YAChC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,sBAAsB,CAAC,EAAE,qBAAqB,CAAC;KACzE,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,OAMxC;IACC,MAAM,EAAE,UAAU,EAAE,sBAAsB,EAAE,wBAAwB,EAAE,GACpE,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAG,4BAA4B,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAEhE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,mBAAmB,EAAE,CAAC;QAC3D,MAAM,yBAAyB,GAAG,IAAI,CAAC,KAAK,CAC1C,EAAE,CAAC,YAAY,CAAC,sBAAsB,EAAE,OAAO,CAAC,CAClC,CAAC;QACjB,MAAM,eAAe,GAAG,qBAAqB,CAAC;YAC5C,UAAU;YACV,QAAQ;YACR,WAAW,EAAE,yBAAyB,CACpC,yBAAyB,EACzB,QAAQ,CACT;YACD,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;QACH,MAAM,kBAAkB,GAAG,IAAI,CAAC,KAAK,CACnC,EAAE,CAAC,YAAY,CAAC,sBAAsB,EAAE,OAAO,CAAC,CAClC,CAAC;QACjB,MAAM,iBAAiB,GAAG,oBAAoB,CAC5C,kBAAkB,EAClB,QAAQ,CAAC,WAAW,CACrB,CAAC;QAEF,MAAM,iBAAiB,GAAG,EAAE,CAAC,UAAU,CAAC,wBAAwB,CAAC;YAC/D,CAAC,CAAC,EAAE,CAAC,YAAY,CAAC,wBAAwB,EAAE,OAAO,CAAC;YACpD,CAAC,CAAC,IAAI,CAAC;QAET,MAAM,gBAAgB,GAAG,wBAAwB,CAC/C,iBAAiB,EACjB,QAAQ,CAAC,iBAAiB,CAC3B,CAAC;QACF,MAAM,cAAc,GAClB,UAAU,CAAC,kBAAkB,CAAC,KAAK,UAAU,CAAC,iBAAiB,CAAC,CAAC;QACnE,MAAM,gBAAgB,GAAG,yBAAyB,CAChD,UAAU,EACV,QAAQ,CAAC,cAAc,CACxB,CAAC;QACF,MAAM,qBAAqB,GAAG,gBAAgB;aAC3C,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC;aAClC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACxC,MAAM,OAAO,GACX,cAAc;YACd,gBAAgB;YAChB,qBAAqB,CAAC,MAAM,GAAG,CAAC;YAChC,eAAe,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC;QAE1C,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,EAAE,CAAC;YAC7B,IAAI,cAAc,EAAE,CAAC;gBACnB,EAAE,CAAC,aAAa,CAAC,sBAAsB,EAAE,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC;YAC1E,CAAC;YACD,IAAI,gBAAgB,EAAE,CAAC;gBACrB,sBAAsB,CACpB,wBAAwB,EACxB,QAAQ,CAAC,iBAAiB,CAC3B,CAAC;YACJ,CAAC;YACD,IAAI,qBAAqB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrC,yBAAyB,CAAC,UAAU,EAAE,QAAQ,CAAC,cAAc,CAAC,CAAC;YACjE,CAAC;QACH,CAAC;QAED,OAAO;YACL,OAAO;YACP,cAAc;YACd,gBAAgB;YAChB,WAAW,EAAE,iBAAiB;YAC9B,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB;YAC7C,gBAAgB;YAChB,qBAAqB;YACrB,2BAA2B,EAAE,eAAe,CAAC,YAAY;YACzD,uBAAuB,EAAE,eAAe,CAAC,QAAQ;SAClD,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,QAAQ,CAAC,OAAO,EAAE,CAAC;IACrB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,4BAA4B,CAAC,IAAc;IAQzD,MAAM,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;IACnC,MAAM,OAAO,GACX,UAAU,KAAK,UAAU;QACvB,CAAC,CAAC,UAAU;QACZ,CAAC,CAAC,UAAU,KAAK,OAAO;YACtB,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,OAAO,CAAC;IAChB,IAAI,UAA8B,CAAC;IACnC,IAAI,sBAA0C,CAAC;IAC/C,IAAI,wBAA4C,CAAC;IACjD,IAAI,KAAK,GAAG,KAAK,CAAC;IAClB,IAAI,QAA4B,CAAC;IAEjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACpB,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;YACtB,KAAK,GAAG,IAAI,CAAC;YACb,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,eAAe,EAAE,CAAC;YAC5B,UAAU,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACvB,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,wBAAwB,EAAE,CAAC;YACrC,sBAAsB,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACnC,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,0BAA0B,EAAE,CAAC;YACvC,wBAAwB,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACrC,SAAS;QACX,CAAC;QACD,IAAI,GAAG,KAAK,aAAa,EAAE,CAAC;YAC1B,QAAQ,GAAG,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YACrB,SAAS;QACX,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,qBAAqB,GAAG,EAAE,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,OAAO,KAAK,OAAO,IAAI,CAAC,UAAU,IAAI,CAAC,sBAAsB,EAAE,CAAC;QAClE,MAAM,IAAI,KAAK,CACb,uIAAuI,CACxI,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO;QACP,UAAU;QACV,sBAAsB;QACtB,wBAAwB;QACxB,KAAK;QACL,QAAQ;KACT,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,yBAAyB,CAAC,IAAc;IACtD,MAAM,IAAI,GAAG,4BAA4B,CAAC,IAAI,CAAC,CAAC;IAEhD,IAAI,IAAI,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;QAChC,MAAM,EAAE,WAAW,EAAE,iBAAiB,EAAE,GAAG,8BAA8B,CACvE,IAAI,CAAC,QAAQ,CACd,CAAC;QACF,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC;QAC9C,IAAI,iBAAiB,EAAE,CAAC;YACtB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;YACxD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;QAC1C,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,IAAI,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;QAC7B,KAAK,MAAM,QAAQ,IAAI,oBAAoB,EAAE,EAAE,CAAC;YAC9C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,QAAQ,IAAI,CAAC,CAAC;QACxC,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,MAAM,GAAG,wBAAwB,CAAC;QACtC,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,sBAAsB,EAAE,IAAI,CAAC,sBAAsB;QACnD,wBAAwB,EAAE,IAAI,CAAC,wBAAwB;QACvD,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,KAAK,EAAE,IAAI,CAAC,KAAK;KAClB,CAAC,CAAC;IAEH,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,uBAAuB,EAAE,CAAC;QACrD,OAAO,CAAC,IAAI,CAAC,uBAAuB,OAAO,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACnB,MAAM,YAAY,GAAG;YACnB,GAAG,IAAI,GAAG,CAAC;gBACT,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAClD,GAAG,CAAC,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3D,GAAG,MAAM,CAAC,qBAAqB;gBAC/B,GAAG,MAAM,CAAC,2BAA2B;aACtC,CAAC;SACH,CAAC;QACF,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3E,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,KAAK;YACR,CAAC,CAAC,2DAA2D,OAAO,GAAG;YACvE,CAAC,CAAC,kEAAkE,OAAO,GAAG,CACjF,CAAC;QACF,OAAO,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,8DAA8D,CAAC,CAAC;IAC5E,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,WAAW,GACf,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IACf,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAEjD,IAAI,WAAW,EAAE,CAAC;IAChB,MAAM,QAAQ,GAAG,yBAAyB,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACzB,CAAC","sourcesContent":["import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nimport {\n isMigrationManifestActive,\n readMigrationManifest,\n} from \"../package-lifecycle/migration-manifest.js\";\nimport { _postProcessStandalone } from \"./create.js\";\nimport { runMigrationCodemods } from \"./migration-codemod.js\";\n\nexport const STARTER_APP_NAME = \"builder-agent-native-starter\";\nexport const CHAT_TEMPLATE = \"chat\";\n\n/** Toolchain files that must track templates/chat or typecheck/build drift. */\nexport const STARTER_TOOLCHAIN_SYNC_PATHS = [\n \"react-router.config.ts\",\n \"vite.config.ts\",\n \"tsconfig.json\",\n \"ssr-entry.ts\",\n \"app/vite-env.d.ts\",\n \"app/routes.ts\",\n \"server/routes/[...page].get.ts\",\n // server/plugins/* are intentionally excluded: starter keeps its own\n // systemPrompt and auth marketing copy; post-process only rewrites appId/title.\n \"server/middleware/auth.ts\",\n \"components.json\",\n \".oxfmtrc.json\",\n \"netlify.toml\",\n] as const;\n\nexport const STARTER_SOURCE_MIGRATION_PATHS = [\n \":(glob)**/*.ts\",\n \":(glob)**/*.tsx\",\n] as const;\n\nconst STANDALONE_SNAPSHOT_EXCLUDED_TOP_LEVEL = new Set([\n \".deploy-tmp\",\n \".env\",\n \".env.local\",\n \".generated\",\n \".netlify\",\n \".output\",\n \".react-router\",\n \"build\",\n \"data\",\n \"dist\",\n \"node_modules\",\n]);\n\nexport type StarterToolchainSyncPath =\n (typeof STARTER_TOOLCHAIN_SYNC_PATHS)[number];\n\ntype PackageJson = Record<string, unknown>;\n\nexport type StandaloneChatSnapshot = {\n cleanup: () => void;\n dir: string;\n packageJson: PackageJson;\n pnpmWorkspaceYaml: string | null;\n toolchainFiles: Map<StarterToolchainSyncPath, string>;\n};\n\nexport function listStarterSyncPaths(): string[] {\n return [\n \"package.json\",\n \"pnpm-lock.yaml\",\n \"pnpm-workspace.yaml\",\n ...STARTER_TOOLCHAIN_SYNC_PATHS,\n ...STARTER_SOURCE_MIGRATION_PATHS,\n ];\n}\n\nexport function migrateStarterSources(options: {\n starterDir: string;\n repoRoot: string;\n coreVersion: string | null;\n write?: boolean;\n}): { changedPaths: string[]; warnings: string[] } {\n const manifestPath = path.join(\n options.repoRoot,\n \"packages/core/migration-manifest.json\",\n );\n const manifest = readMigrationManifest(manifestPath);\n if (!manifest) {\n throw new Error(`Could not read migration manifest at ${manifestPath}.`);\n }\n if (!isMigrationManifestActive(manifest, options.coreVersion)) {\n return { changedPaths: [], warnings: [] };\n }\n\n const result = runMigrationCodemods({\n root: options.starterDir,\n manifests: [manifest],\n apply: options.write,\n // Checked-in migration targets are validated by the manifest guard before\n // this source sync runs; starter dependencies are installed afterward.\n targetExists: () => true,\n });\n\n return {\n changedPaths: [\n ...new Set(\n result.changes.map((change) =>\n path.relative(options.starterDir, change.file),\n ),\n ),\n ].sort(),\n warnings: result.warnings,\n };\n}\n\nexport function resolveStarterCoreVersion(\n starterPackageJson: PackageJson,\n repoRoot: string,\n): string | null {\n const dependencies = starterPackageJson.dependencies;\n if (dependencies && typeof dependencies === \"object\") {\n const declared = (dependencies as Record<string, unknown>)[\n \"@agent-native/core\"\n ];\n if (typeof declared === \"string\") {\n const version = declared.match(/\\d+\\.\\d+\\.\\d+/)?.[0];\n if (version) return version;\n }\n }\n\n try {\n const corePackageJson = JSON.parse(\n fs.readFileSync(\n path.join(repoRoot, \"packages/core/package.json\"),\n \"utf-8\",\n ),\n ) as { version?: unknown };\n return typeof corePackageJson.version === \"string\"\n ? corePackageJson.version\n : null;\n } catch {\n return null;\n }\n}\n\nexport function findAgentNativeRoot(startDir = process.cwd()): string {\n let dir = path.resolve(startDir);\n for (let i = 0; i < 12; i++) {\n const chatPackageJson = path.join(\n dir,\n \"templates\",\n CHAT_TEMPLATE,\n \"package.json\",\n );\n if (fs.existsSync(chatPackageJson)) {\n return dir;\n }\n const parent = path.dirname(dir);\n if (parent === dir) break;\n dir = parent;\n }\n throw new Error(\n \"Could not find agent-native repo root (expected templates/chat/package.json).\",\n );\n}\n\nexport function collectStarterToolchainFiles(\n canonicalDir: string,\n): Map<StarterToolchainSyncPath, string> {\n const files = new Map<StarterToolchainSyncPath, string>();\n for (const relativePath of STARTER_TOOLCHAIN_SYNC_PATHS) {\n const absolutePath = path.join(canonicalDir, relativePath);\n if (!fs.existsSync(absolutePath)) continue;\n files.set(relativePath, fs.readFileSync(absolutePath, \"utf-8\"));\n }\n return files;\n}\n\nexport function createStandaloneChatSnapshot(\n repoRoot?: string,\n): StandaloneChatSnapshot {\n const root = repoRoot ?? findAgentNativeRoot();\n const chatTemplateDir = path.join(root, \"templates\", CHAT_TEMPLATE);\n const tempDir = fs.mkdtempSync(\n path.join(os.tmpdir(), \"an-builder-starter-sync-\"),\n );\n\n fs.cpSync(chatTemplateDir, tempDir, {\n recursive: true,\n filter: (source) =>\n shouldCopyStandaloneSnapshotPath(source, chatTemplateDir),\n });\n _postProcessStandalone(STARTER_APP_NAME, tempDir, CHAT_TEMPLATE);\n\n const packageJson = JSON.parse(\n fs.readFileSync(path.join(tempDir, \"package.json\"), \"utf-8\"),\n ) as PackageJson;\n\n const workspacePath = path.join(tempDir, \"pnpm-workspace.yaml\");\n const pnpmWorkspaceYaml = fs.existsSync(workspacePath)\n ? fs.readFileSync(workspacePath, \"utf-8\")\n : null;\n\n return {\n cleanup: () => {\n fs.rmSync(tempDir, { recursive: true, force: true });\n },\n dir: tempDir,\n packageJson,\n pnpmWorkspaceYaml,\n toolchainFiles: collectStarterToolchainFiles(tempDir),\n };\n}\n\nfunction shouldCopyStandaloneSnapshotPath(\n source: string,\n root: string,\n): boolean {\n const relative = path.relative(root, source);\n if (!relative) return true;\n const topLevel = relative.split(path.sep)[0];\n return !STANDALONE_SNAPSHOT_EXCLUDED_TOP_LEVEL.has(topLevel);\n}\n\nexport function generateStandaloneChatManifest(repoRoot?: string): {\n packageJson: PackageJson;\n pnpmWorkspaceYaml: string | null;\n} {\n const snapshot = createStandaloneChatSnapshot(repoRoot);\n try {\n return {\n packageJson: snapshot.packageJson,\n pnpmWorkspaceYaml: snapshot.pnpmWorkspaceYaml,\n };\n } finally {\n snapshot.cleanup();\n }\n}\n\nfunction mergePackageJsonRecords(\n canonical: Record<string, string> | undefined,\n starter: Record<string, string> | undefined,\n starterPinnedKeys: string[] = [],\n): Record<string, string> {\n const merged = { ...(canonical ?? {}) };\n for (const [key, value] of Object.entries(starter ?? {})) {\n if (!(key in merged)) {\n merged[key] = value;\n }\n }\n for (const key of starterPinnedKeys) {\n const pinned = starter?.[key];\n if (pinned) {\n merged[key] = pinned;\n }\n }\n return merged;\n}\n\nexport function mergeStarterManifest(\n starterPackageJson: PackageJson,\n canonicalPackageJson: PackageJson,\n): PackageJson {\n const merged = structuredClone(canonicalPackageJson) as PackageJson;\n\n merged.name = starterPackageJson.name ?? STARTER_APP_NAME;\n if (typeof starterPackageJson.displayName === \"string\") {\n merged.displayName = starterPackageJson.displayName;\n }\n if (typeof starterPackageJson.description === \"string\") {\n merged.description = starterPackageJson.description;\n }\n if (starterPackageJson.private !== undefined) {\n merged.private = starterPackageJson.private;\n }\n if (typeof starterPackageJson.packageManager === \"string\") {\n merged.packageManager = starterPackageJson.packageManager;\n }\n\n merged.dependencies = mergePackageJsonRecords(\n canonicalPackageJson.dependencies as Record<string, string> | undefined,\n starterPackageJson.dependencies as Record<string, string> | undefined,\n [\"@agent-native/core\", \"@agent-native/toolkit\"],\n );\n merged.devDependencies = mergePackageJsonRecords(\n canonicalPackageJson.devDependencies as Record<string, string> | undefined,\n starterPackageJson.devDependencies as Record<string, string> | undefined,\n );\n merged.scripts = mergePackageJsonRecords(\n canonicalPackageJson.scripts as Record<string, string> | undefined,\n starterPackageJson.scripts as Record<string, string> | undefined,\n );\n\n return merged;\n}\n\nexport function workspaceFileSyncChanged(\n existingWorkspace: string | null,\n canonicalWorkspace: string | null,\n): boolean {\n if (canonicalWorkspace === null) {\n return existingWorkspace !== null;\n }\n return existingWorkspace !== canonicalWorkspace;\n}\n\nexport function applyWorkspaceFileSync(\n targetPath: string,\n canonicalWorkspace: string | null,\n): void {\n if (canonicalWorkspace === null) {\n if (fs.existsSync(targetPath)) {\n fs.unlinkSync(targetPath);\n }\n return;\n }\n fs.writeFileSync(targetPath, canonicalWorkspace);\n}\n\nfunction stableJson(value: unknown): string {\n return `${JSON.stringify(value, null, 2)}\\n`;\n}\n\nexport type StarterToolchainSyncChange = {\n relativePath: StarterToolchainSyncPath;\n changed: boolean;\n};\n\nexport function diffStarterToolchainFiles(\n starterDir: string,\n canonicalFiles: Map<StarterToolchainSyncPath, string>,\n): StarterToolchainSyncChange[] {\n return STARTER_TOOLCHAIN_SYNC_PATHS.map((relativePath) => {\n const canonicalContent = canonicalFiles.get(relativePath) ?? null;\n const targetPath = path.join(starterDir, relativePath);\n const existingContent = fs.existsSync(targetPath)\n ? fs.readFileSync(targetPath, \"utf-8\")\n : null;\n return {\n relativePath,\n changed: existingContent !== canonicalContent,\n };\n });\n}\n\nexport function applyStarterToolchainSync(\n starterDir: string,\n canonicalFiles: Map<StarterToolchainSyncPath, string>,\n): StarterToolchainSyncChange[] {\n const changes: StarterToolchainSyncChange[] = [];\n for (const relativePath of STARTER_TOOLCHAIN_SYNC_PATHS) {\n const canonicalContent = canonicalFiles.get(relativePath) ?? null;\n const targetPath = path.join(starterDir, relativePath);\n const existingContent = fs.existsSync(targetPath)\n ? fs.readFileSync(targetPath, \"utf-8\")\n : null;\n const changed = existingContent !== canonicalContent;\n if (changed) {\n if (canonicalContent === null) {\n if (fs.existsSync(targetPath)) {\n fs.unlinkSync(targetPath);\n }\n } else {\n fs.mkdirSync(path.dirname(targetPath), { recursive: true });\n fs.writeFileSync(targetPath, canonicalContent);\n }\n }\n changes.push({ relativePath, changed });\n }\n return changes;\n}\n\nexport type SyncStarterManifestResult = {\n changed: boolean;\n packageChanged: boolean;\n workspaceChanged: boolean;\n packageJson: PackageJson;\n pnpmWorkspaceYaml: string | null;\n toolchainChanges: StarterToolchainSyncChange[];\n changedToolchainPaths: StarterToolchainSyncPath[];\n changedSourceMigrationPaths: string[];\n sourceMigrationWarnings: string[];\n};\n\nexport function resolveStarterPaths(options: {\n starterDir?: string;\n starterPackageJsonPath?: string;\n starterPnpmWorkspacePath?: string;\n}): {\n starterDir: string;\n starterPackageJsonPath: string;\n starterPnpmWorkspacePath: string;\n} {\n if (options.starterDir) {\n return {\n starterDir: path.resolve(options.starterDir),\n starterPackageJsonPath: path.join(\n path.resolve(options.starterDir),\n \"package.json\",\n ),\n starterPnpmWorkspacePath: path.join(\n path.resolve(options.starterDir),\n \"pnpm-workspace.yaml\",\n ),\n };\n }\n if (!options.starterPackageJsonPath) {\n throw new Error(\"Provide --starter-dir or --starter-package-json.\");\n }\n const starterPackageJsonPath = path.resolve(options.starterPackageJsonPath);\n return {\n starterDir: path.dirname(starterPackageJsonPath),\n starterPackageJsonPath,\n starterPnpmWorkspacePath:\n options.starterPnpmWorkspacePath ??\n path.join(path.dirname(starterPackageJsonPath), \"pnpm-workspace.yaml\"),\n };\n}\n\nexport function syncStarterManifestFiles(options: {\n starterDir?: string;\n starterPackageJsonPath?: string;\n starterPnpmWorkspacePath?: string;\n repoRoot?: string;\n write?: boolean;\n}): SyncStarterManifestResult {\n const { starterDir, starterPackageJsonPath, starterPnpmWorkspacePath } =\n resolveStarterPaths(options);\n const snapshot = createStandaloneChatSnapshot(options.repoRoot);\n\n try {\n const repoRoot = options.repoRoot ?? findAgentNativeRoot();\n const initialStarterPackageJson = JSON.parse(\n fs.readFileSync(starterPackageJsonPath, \"utf-8\"),\n ) as PackageJson;\n const sourceMigration = migrateStarterSources({\n starterDir,\n repoRoot,\n coreVersion: resolveStarterCoreVersion(\n initialStarterPackageJson,\n repoRoot,\n ),\n write: options.write,\n });\n const starterPackageJson = JSON.parse(\n fs.readFileSync(starterPackageJsonPath, \"utf-8\"),\n ) as PackageJson;\n const mergedPackageJson = mergeStarterManifest(\n starterPackageJson,\n snapshot.packageJson,\n );\n\n const existingWorkspace = fs.existsSync(starterPnpmWorkspacePath)\n ? fs.readFileSync(starterPnpmWorkspacePath, \"utf-8\")\n : null;\n\n const workspaceChanged = workspaceFileSyncChanged(\n existingWorkspace,\n snapshot.pnpmWorkspaceYaml,\n );\n const packageChanged =\n stableJson(starterPackageJson) !== stableJson(mergedPackageJson);\n const toolchainChanges = diffStarterToolchainFiles(\n starterDir,\n snapshot.toolchainFiles,\n );\n const changedToolchainPaths = toolchainChanges\n .filter((change) => change.changed)\n .map((change) => change.relativePath);\n const changed =\n packageChanged ||\n workspaceChanged ||\n changedToolchainPaths.length > 0 ||\n sourceMigration.changedPaths.length > 0;\n\n if (options.write && changed) {\n if (packageChanged) {\n fs.writeFileSync(starterPackageJsonPath, stableJson(mergedPackageJson));\n }\n if (workspaceChanged) {\n applyWorkspaceFileSync(\n starterPnpmWorkspacePath,\n snapshot.pnpmWorkspaceYaml,\n );\n }\n if (changedToolchainPaths.length > 0) {\n applyStarterToolchainSync(starterDir, snapshot.toolchainFiles);\n }\n }\n\n return {\n changed,\n packageChanged,\n workspaceChanged,\n packageJson: mergedPackageJson,\n pnpmWorkspaceYaml: snapshot.pnpmWorkspaceYaml,\n toolchainChanges,\n changedToolchainPaths,\n changedSourceMigrationPaths: sourceMigration.changedPaths,\n sourceMigrationWarnings: sourceMigration.warnings,\n };\n } finally {\n snapshot.cleanup();\n }\n}\n\nexport function parseSyncStarterManifestArgs(argv: string[]): {\n command: \"merge\" | \"generate\" | \"paths\";\n starterDir?: string;\n starterPackageJsonPath?: string;\n starterPnpmWorkspacePath?: string;\n write: boolean;\n repoRoot?: string;\n} {\n const [commandRaw, ...rest] = argv;\n const command =\n commandRaw === \"generate\"\n ? \"generate\"\n : commandRaw === \"paths\"\n ? \"paths\"\n : \"merge\";\n let starterDir: string | undefined;\n let starterPackageJsonPath: string | undefined;\n let starterPnpmWorkspacePath: string | undefined;\n let write = false;\n let repoRoot: string | undefined;\n\n for (let i = 0; i < rest.length; i++) {\n const arg = rest[i];\n if (arg === \"--write\") {\n write = true;\n continue;\n }\n if (arg === \"--starter-dir\") {\n starterDir = rest[++i];\n continue;\n }\n if (arg === \"--starter-package-json\") {\n starterPackageJsonPath = rest[++i];\n continue;\n }\n if (arg === \"--starter-pnpm-workspace\") {\n starterPnpmWorkspacePath = rest[++i];\n continue;\n }\n if (arg === \"--repo-root\") {\n repoRoot = rest[++i];\n continue;\n }\n throw new Error(`Unknown argument: ${arg}`);\n }\n\n if (command === \"merge\" && !starterDir && !starterPackageJsonPath) {\n throw new Error(\n \"merge requires --starter-dir <path> or --starter-package-json <path> [--starter-pnpm-workspace <path>] [--write] [--repo-root <path>]\",\n );\n }\n\n return {\n command,\n starterDir,\n starterPackageJsonPath,\n starterPnpmWorkspacePath,\n write,\n repoRoot,\n };\n}\n\nexport function runSyncStarterManifestCli(argv: string[]): number {\n const args = parseSyncStarterManifestArgs(argv);\n\n if (args.command === \"generate\") {\n const { packageJson, pnpmWorkspaceYaml } = generateStandaloneChatManifest(\n args.repoRoot,\n );\n process.stdout.write(stableJson(packageJson));\n if (pnpmWorkspaceYaml) {\n process.stdout.write(\"\\n--- pnpm-workspace.yaml ---\\n\");\n process.stdout.write(pnpmWorkspaceYaml);\n }\n return 0;\n }\n\n if (args.command === \"paths\") {\n for (const syncPath of listStarterSyncPaths()) {\n process.stdout.write(`${syncPath}\\n`);\n }\n return 0;\n }\n\n const result = syncStarterManifestFiles({\n starterDir: args.starterDir,\n starterPackageJsonPath: args.starterPackageJsonPath,\n starterPnpmWorkspacePath: args.starterPnpmWorkspacePath,\n repoRoot: args.repoRoot,\n write: args.write,\n });\n\n for (const warning of result.sourceMigrationWarnings) {\n console.warn(`[starter migration] ${warning}`);\n }\n\n if (result.changed) {\n const updatedPaths = [\n ...new Set([\n ...(result.packageChanged ? [\"package.json\"] : []),\n ...(result.workspaceChanged ? [\"pnpm-workspace.yaml\"] : []),\n ...result.changedToolchainPaths,\n ...result.changedSourceMigrationPaths,\n ]),\n ];\n const summary = updatedPaths.length ? ` (${updatedPaths.join(\", \")})` : \"\";\n console.log(\n args.write\n ? `Updated builder-agent-native-starter from templates/chat${summary}.`\n : `builder-agent-native-starter is out of date with templates/chat${summary}.`,\n );\n return args.write ? 0 : 1;\n }\n\n console.log(\"builder-agent-native-starter already matches templates/chat.\");\n return 0;\n}\n\nconst isDirectRun =\n process.argv[1] &&\n path.resolve(process.argv[1]) ===\n path.resolve(fileURLToPath(import.meta.url));\n\nif (isDirectRun) {\n const exitCode = runSyncStarterManifestCli(process.argv.slice(2));\n process.exit(exitCode);\n}\n"]}