@kenkaiiii/gg-pixel 4.3.83 → 4.3.85
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 +28 -17
- package/dist/cli.js.map +1 -1
- package/dist/index.cjs +28 -17
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.js +28 -17
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -50,8 +50,8 @@ async function install(opts = {}) {
|
|
|
50
50
|
const existingKey = readEnvKey(envFilePath, "GG_PIXEL_KEY");
|
|
51
51
|
let created;
|
|
52
52
|
let reused = false;
|
|
53
|
-
if (existing && existingKey) {
|
|
54
|
-
created = { id: existing.id, key: existingKey };
|
|
53
|
+
if (existing && existing.secret && existingKey) {
|
|
54
|
+
created = { id: existing.id, key: existingKey, secret: existing.secret };
|
|
55
55
|
reused = true;
|
|
56
56
|
} else {
|
|
57
57
|
created = await createProject(fetchFn, ingestUrl, projectName);
|
|
@@ -68,10 +68,11 @@ async function install(opts = {}) {
|
|
|
68
68
|
if (kind !== "browser" && kind !== "tauri") {
|
|
69
69
|
writeEnvKey(envFilePath, "GG_PIXEL_KEY", created.key);
|
|
70
70
|
}
|
|
71
|
-
writeProjectsMapping(projectsJsonPath, created.id, projectName, nodeRoot);
|
|
71
|
+
writeProjectsMapping(projectsJsonPath, created.id, projectName, nodeRoot, created.secret);
|
|
72
72
|
return {
|
|
73
73
|
projectId: created.id,
|
|
74
74
|
projectKey: created.key,
|
|
75
|
+
projectSecret: created.secret,
|
|
75
76
|
projectName,
|
|
76
77
|
projectKind: kind,
|
|
77
78
|
initFilePath: wired.primaryInitPath,
|
|
@@ -128,8 +129,10 @@ async function createProject(fetchFn, ingestUrl, name) {
|
|
|
128
129
|
throw new Error(`POST /api/projects failed: ${res.status} ${await safeText(res)}`);
|
|
129
130
|
}
|
|
130
131
|
const body = await res.json();
|
|
131
|
-
if (!body.id || !body.key
|
|
132
|
-
|
|
132
|
+
if (!body.id || !body.key || !body.secret) {
|
|
133
|
+
throw new Error("response missing id/key/secret");
|
|
134
|
+
}
|
|
135
|
+
return { id: body.id, key: body.key, secret: body.secret };
|
|
133
136
|
}
|
|
134
137
|
async function safeText(r) {
|
|
135
138
|
try {
|
|
@@ -475,7 +478,10 @@ function injectNextClientComponent(layoutPath, clientInitPath) {
|
|
|
475
478
|
const childrenIdx = updated.lastIndexOf("{children}");
|
|
476
479
|
if (childrenIdx === -1) {
|
|
477
480
|
writeFileSync(layoutPath, updated, "utf8");
|
|
478
|
-
return {
|
|
481
|
+
return {
|
|
482
|
+
kind: "skipped",
|
|
483
|
+
reason: "added import but couldn't find {children} to render <GGPixelClient />"
|
|
484
|
+
};
|
|
479
485
|
}
|
|
480
486
|
const before = updated.slice(0, childrenIdx);
|
|
481
487
|
const after = updated.slice(childrenIdx);
|
|
@@ -1032,8 +1038,8 @@ async function installGo(ctx) {
|
|
|
1032
1038
|
const existingKey = readEnvKey(envFilePath, "GG_PIXEL_KEY");
|
|
1033
1039
|
let created;
|
|
1034
1040
|
let reused = false;
|
|
1035
|
-
if (existing && existingKey) {
|
|
1036
|
-
created = { id: existing.id, key: existingKey };
|
|
1041
|
+
if (existing && existing.secret && existingKey) {
|
|
1042
|
+
created = { id: existing.id, key: existingKey, secret: existing.secret };
|
|
1037
1043
|
reused = true;
|
|
1038
1044
|
} else {
|
|
1039
1045
|
created = await createProject(fetchFn, ingestUrl, projectName);
|
|
@@ -1061,10 +1067,11 @@ func init() {
|
|
|
1061
1067
|
"utf8"
|
|
1062
1068
|
);
|
|
1063
1069
|
writeEnvKey(envFilePath, "GG_PIXEL_KEY", created.key);
|
|
1064
|
-
writeProjectsMapping(projectsJsonPath, created.id, projectName, projectRoot);
|
|
1070
|
+
writeProjectsMapping(projectsJsonPath, created.id, projectName, projectRoot, created.secret);
|
|
1065
1071
|
return {
|
|
1066
1072
|
projectId: created.id,
|
|
1067
1073
|
projectKey: created.key,
|
|
1074
|
+
projectSecret: created.secret,
|
|
1068
1075
|
projectName,
|
|
1069
1076
|
projectKind: "go",
|
|
1070
1077
|
initFilePath,
|
|
@@ -1105,8 +1112,8 @@ async function installRuby(ctx) {
|
|
|
1105
1112
|
const existingKey = readEnvKey(envFilePath, "GG_PIXEL_KEY");
|
|
1106
1113
|
let created;
|
|
1107
1114
|
let reused = false;
|
|
1108
|
-
if (existing && existingKey) {
|
|
1109
|
-
created = { id: existing.id, key: existingKey };
|
|
1115
|
+
if (existing && existing.secret && existingKey) {
|
|
1116
|
+
created = { id: existing.id, key: existingKey, secret: existing.secret };
|
|
1110
1117
|
reused = true;
|
|
1111
1118
|
} else {
|
|
1112
1119
|
created = await createProject(fetchFn, ingestUrl, projectName);
|
|
@@ -1125,10 +1132,11 @@ GGPixel.init(
|
|
|
1125
1132
|
"utf8"
|
|
1126
1133
|
);
|
|
1127
1134
|
writeEnvKey(envFilePath, "GG_PIXEL_KEY", created.key);
|
|
1128
|
-
writeProjectsMapping(projectsJsonPath, created.id, projectName, projectRoot);
|
|
1135
|
+
writeProjectsMapping(projectsJsonPath, created.id, projectName, projectRoot, created.secret);
|
|
1129
1136
|
return {
|
|
1130
1137
|
projectId: created.id,
|
|
1131
1138
|
projectKey: created.key,
|
|
1139
|
+
projectSecret: created.secret,
|
|
1132
1140
|
projectName,
|
|
1133
1141
|
projectKind: "ruby",
|
|
1134
1142
|
initFilePath,
|
|
@@ -1181,8 +1189,8 @@ async function installPython(ctx) {
|
|
|
1181
1189
|
const existingKey = readEnvKey(envFilePath, "GG_PIXEL_KEY");
|
|
1182
1190
|
let created;
|
|
1183
1191
|
let reused = false;
|
|
1184
|
-
if (existing && existingKey) {
|
|
1185
|
-
created = { id: existing.id, key: existingKey };
|
|
1192
|
+
if (existing && existing.secret && existingKey) {
|
|
1193
|
+
created = { id: existing.id, key: existingKey, secret: existing.secret };
|
|
1186
1194
|
reused = true;
|
|
1187
1195
|
} else {
|
|
1188
1196
|
created = await createProject(fetchFn, ingestUrl, projectName);
|
|
@@ -1192,11 +1200,12 @@ async function installPython(ctx) {
|
|
|
1192
1200
|
const initFilePath = join(projectRoot, "gg_pixel_init.py");
|
|
1193
1201
|
writeFileSync(initFilePath, renderPythonInitFile(ingestUrl, created.key), "utf8");
|
|
1194
1202
|
writeEnvKey(envFilePath, "GG_PIXEL_KEY", created.key);
|
|
1195
|
-
writeProjectsMapping(projectsJsonPath, created.id, projectName, projectRoot);
|
|
1203
|
+
writeProjectsMapping(projectsJsonPath, created.id, projectName, projectRoot, created.secret);
|
|
1196
1204
|
const entryWiring = wirePythonEntry(projectRoot, initFilePath);
|
|
1197
1205
|
return {
|
|
1198
1206
|
projectId: created.id,
|
|
1199
1207
|
projectKey: created.key,
|
|
1208
|
+
projectSecret: created.secret,
|
|
1200
1209
|
projectName,
|
|
1201
1210
|
projectKind: "python",
|
|
1202
1211
|
initFilePath,
|
|
@@ -1314,7 +1323,7 @@ function findPythonEntryFile(projectRoot) {
|
|
|
1314
1323
|
}
|
|
1315
1324
|
return null;
|
|
1316
1325
|
}
|
|
1317
|
-
function writeProjectsMapping(projectsJsonPath, projectId, name, path) {
|
|
1326
|
+
function writeProjectsMapping(projectsJsonPath, projectId, name, path, secret) {
|
|
1318
1327
|
mkdirSync(dirname(projectsJsonPath), { recursive: true });
|
|
1319
1328
|
let map = {};
|
|
1320
1329
|
if (existsSync(projectsJsonPath)) {
|
|
@@ -1323,7 +1332,9 @@ function writeProjectsMapping(projectsJsonPath, projectId, name, path) {
|
|
|
1323
1332
|
} catch {
|
|
1324
1333
|
}
|
|
1325
1334
|
}
|
|
1326
|
-
|
|
1335
|
+
const entry = { name, path };
|
|
1336
|
+
if (secret) entry.secret = secret;
|
|
1337
|
+
map[projectId] = entry;
|
|
1327
1338
|
writeFileSync(projectsJsonPath, `${JSON.stringify(map, null, 2)}
|
|
1328
1339
|
`, "utf8");
|
|
1329
1340
|
}
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/install.ts","../src/cli.ts"],"sourcesContent":["import {\n existsSync,\n readFileSync,\n writeFileSync,\n appendFileSync,\n mkdirSync,\n readdirSync,\n} from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, relative, resolve, sep } from \"node:path\";\nimport { spawnSync } from \"node:child_process\";\n\nexport const DEFAULT_INGEST_URL = \"https://gg-pixel-server.buzzbeamaustralia.workers.dev\";\n\nexport interface InstallOptions {\n cwd?: string;\n ingestUrl?: string;\n projectName?: string;\n fetchFn?: typeof fetch;\n skipPackageInstall?: boolean;\n homeDir?: string;\n}\n\nexport interface InstallResult {\n projectId: string;\n projectKey: string;\n projectName: string;\n projectKind: ProjectKind;\n initFilePath: string;\n envFilePath: string;\n projectsJsonPath: string;\n packageManager: PackageManager | PythonPackageManager;\n packageInstalled: boolean;\n entryWiring: EntryWiringResult;\n /** True when an existing project mapping was reused instead of minting a fresh one. */\n reused: boolean;\n /** Hybrid frameworks: a second init file (e.g. server-side for Next.js). */\n secondaryInit?: { path: string; description: string };\n /** Honest disclaimers — surfaced in the CLI summary. */\n warnings: string[];\n}\n\nexport type EntryWiringResult =\n | { kind: \"injected\"; entryPath: string }\n | { kind: \"already_present\"; entryPath: string }\n | { kind: \"no_entry_found\" }\n | { kind: \"skipped\"; reason: string };\n\ninterface PackageJson {\n name?: string;\n type?: string;\n main?: string;\n module?: string;\n bin?: string | Record<string, string>;\n browser?: unknown;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n}\n\nexport type PackageManager = \"pnpm\" | \"yarn\" | \"bun\" | \"npm\";\n\nexport type ProjectKind =\n | \"node\"\n | \"browser\"\n | \"python\"\n | \"nextjs\"\n | \"sveltekit\"\n | \"nuxt\"\n | \"remix\"\n | \"electron\"\n | \"tauri\"\n | \"react-native\"\n | \"cloudflare-workers\"\n | \"go\"\n | \"ruby\";\n\nexport type PythonPackageManager = \"uv\" | \"poetry\" | \"pipenv\" | \"pip\";\n\nexport async function install(opts: InstallOptions = {}): Promise<InstallResult> {\n const cwd = resolve(opts.cwd ?? process.cwd());\n const ingestUrl = (opts.ingestUrl ?? DEFAULT_INGEST_URL).replace(/\\/+$/, \"\");\n const fetchFn = opts.fetchFn ?? fetch;\n const home = opts.homeDir ?? homedir();\n\n // Detect project kind. We pick the closest (deepest) root when multiple\n // markers exist — polyglot monorepos commonly have everything at root.\n const nodeRoot = findProjectRoot(cwd);\n const pythonRoot = findPythonProjectRoot(cwd);\n const goRoot = findGoProjectRoot(cwd);\n const rubyRoot = findRubyProjectRoot(cwd);\n\n if (!nodeRoot && !pythonRoot && !goRoot && !rubyRoot) {\n throw new Error(\n `No project found at ${cwd}: looked for package.json, pyproject.toml/setup.py/requirements.txt/Pipfile, go.mod, Gemfile/*.gemspec.`,\n );\n }\n\n const closestRoot = pickClosestRoot([nodeRoot, pythonRoot, goRoot, rubyRoot]);\n\n if (closestRoot === goRoot && goRoot) {\n return installGo({ projectRoot: goRoot, opts, ingestUrl, fetchFn, home });\n }\n if (closestRoot === rubyRoot && rubyRoot) {\n return installRuby({ projectRoot: rubyRoot, opts, ingestUrl, fetchFn, home });\n }\n if (closestRoot === pythonRoot && pythonRoot) {\n return installPython({ projectRoot: pythonRoot, opts, ingestUrl, fetchFn, home });\n }\n\n // Node / browser / hybrid framework path.\n if (!nodeRoot) {\n throw new Error(\"Internal: closest root is Node but nodeRoot is null\");\n }\n const pkgPath = join(nodeRoot, \"package.json\");\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf8\")) as PackageJson;\n const projectName = opts.projectName ?? pkg.name ?? nodeRoot.split(\"/\").pop() ?? \"unnamed\";\n const kind = detectJsProjectKind(pkg, nodeRoot);\n\n const projectsJsonPath = join(home, \".gg\", \"projects.json\");\n const envFilePath = join(nodeRoot, \".env\");\n\n const existing = findMappingByPath(projectsJsonPath, nodeRoot);\n const existingKey = readEnvKey(envFilePath, \"GG_PIXEL_KEY\");\n let created: { id: string; key: string };\n let reused = false;\n if (existing && existingKey) {\n created = { id: existing.id, key: existingKey };\n reused = true;\n } else {\n created = await createProject(fetchFn, ingestUrl, projectName);\n }\n\n const pm = detectPackageManager(nodeRoot);\n const packageInstalled = opts.skipPackageInstall\n ? false\n : runInstall(nodeRoot, pm, \"@kenkaiiii/gg-pixel\");\n\n // Dispatch to per-framework wiring.\n const wired = wireFramework({\n kind,\n projectRoot: nodeRoot,\n pkg,\n projectKey: created.key,\n ingestUrl,\n });\n\n // .env: write the key for runtimes that read it from process.env (Node servers,\n // Electron main, Next.js server, etc). Pure browser apps don't need it (key\n // is inlined into the init file).\n if (kind !== \"browser\" && kind !== \"tauri\") {\n writeEnvKey(envFilePath, \"GG_PIXEL_KEY\", created.key);\n }\n\n writeProjectsMapping(projectsJsonPath, created.id, projectName, nodeRoot);\n\n return {\n projectId: created.id,\n projectKey: created.key,\n projectName,\n projectKind: kind,\n initFilePath: wired.primaryInitPath,\n envFilePath,\n projectsJsonPath,\n packageManager: pm,\n packageInstalled,\n entryWiring: wired.entryWiring,\n reused,\n secondaryInit: wired.secondaryInit,\n warnings: wired.warnings,\n };\n}\n\nfunction findMappingByPath(\n projectsJsonPath: string,\n projectRoot: string,\n): { id: string; name: string; path: string } | null {\n if (!existsSync(projectsJsonPath)) return null;\n let map: Record<string, { name: string; path: string }>;\n try {\n map = JSON.parse(readFileSync(projectsJsonPath, \"utf8\")) as typeof map;\n } catch {\n return null;\n }\n for (const [id, entry] of Object.entries(map)) {\n if (entry.path === projectRoot) return { id, ...entry };\n }\n return null;\n}\n\nfunction readEnvKey(envPath: string, key: string): string | null {\n if (!existsSync(envPath)) return null;\n try {\n const content = readFileSync(envPath, \"utf8\");\n const match = new RegExp(`^${key}=(.+)$`, \"m\").exec(content);\n return match?.[1]?.trim() ?? null;\n } catch {\n return null;\n }\n}\n\nfunction findProjectRoot(start: string): string | null {\n let dir = start;\n for (let i = 0; i < 20; i++) {\n if (existsSync(join(dir, \"package.json\"))) return dir;\n const parent = dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n return null;\n}\n\nasync function createProject(\n fetchFn: typeof fetch,\n ingestUrl: string,\n name: string,\n): Promise<{ id: string; key: string }> {\n const res = await fetchFn(`${ingestUrl}/api/projects`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ name }),\n });\n if (!res.ok) {\n throw new Error(`POST /api/projects failed: ${res.status} ${await safeText(res)}`);\n }\n const body = (await res.json()) as { id: string; key: string };\n if (!body.id || !body.key) throw new Error(\"response missing id/key\");\n return { id: body.id, key: body.key };\n}\n\nasync function safeText(r: Response): Promise<string> {\n try {\n return await r.text();\n } catch {\n return \"\";\n }\n}\n\nexport function detectPackageManager(projectRoot: string): PackageManager {\n if (existsSync(join(projectRoot, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (existsSync(join(projectRoot, \"bun.lockb\"))) return \"bun\";\n if (existsSync(join(projectRoot, \"yarn.lock\"))) return \"yarn\";\n return \"npm\";\n}\n\nfunction runInstall(projectRoot: string, pm: PackageManager, pkg: string): boolean {\n const cmd = pm;\n // npm prints `npm audit` warnings + `npm fund` solicitations on every install.\n // That output is about the user's *existing* project — irrelevant to pixel.\n // The other package managers don't show this noise by default.\n const args = pm === \"npm\" ? [\"install\", pkg, \"--no-audit\", \"--no-fund\"] : [\"add\", pkg];\n const result = spawnSync(cmd, args, { cwd: projectRoot, stdio: \"inherit\" });\n return result.status === 0;\n}\n\nexport function renderInitFile(ingestUrl: string, projectKey?: string): string {\n const fallback = projectKey ? ` || ${JSON.stringify(projectKey)}` : \"\";\n return `import { initPixel } from \"@kenkaiiii/gg-pixel\";\n\nconst key = process.env.GG_PIXEL_KEY${fallback};\nif (key) {\n initPixel({\n projectKey: key,\n sink: { kind: \"http\", ingestUrl: ${JSON.stringify(`${ingestUrl}/ingest`)} },\n });\n}\n`;\n}\n\nexport function renderInitFileCjs(ingestUrl: string, projectKey?: string): string {\n const fallback = projectKey ? ` || ${JSON.stringify(projectKey)}` : \"\";\n return `const { initPixel } = require(\"@kenkaiiii/gg-pixel\");\n\nconst key = process.env.GG_PIXEL_KEY${fallback};\nif (key) {\n initPixel({\n projectKey: key,\n sink: { kind: \"http\", ingestUrl: ${JSON.stringify(`${ingestUrl}/ingest`)} },\n });\n}\n`;\n}\n\nexport function writeEnvKey(envPath: string, key: string, value: string): void {\n if (existsSync(envPath)) {\n const current = readFileSync(envPath, \"utf8\");\n const lineRegex = new RegExp(`^${key}=.*$`, \"m\");\n if (lineRegex.test(current)) {\n writeFileSync(envPath, current.replace(lineRegex, `${key}=${value}`), \"utf8\");\n return;\n }\n const sep = current.endsWith(\"\\n\") || current.length === 0 ? \"\" : \"\\n\";\n appendFileSync(envPath, `${sep}${key}=${value}\\n`, \"utf8\");\n return;\n }\n writeFileSync(envPath, `${key}=${value}\\n`, \"utf8\");\n}\n\nexport function wireEntryFile(\n projectRoot: string,\n initFilePath: string,\n pkg: PackageJson,\n): EntryWiringResult {\n const entryPath = findEntryFile(projectRoot, pkg);\n if (!entryPath) return { kind: \"no_entry_found\" };\n\n let content: string;\n try {\n content = readFileSync(entryPath, \"utf8\");\n } catch (err) {\n return { kind: \"skipped\", reason: `unreadable: ${(err as Error).message}` };\n }\n\n if (content.includes(\"gg-pixel.init\")) {\n return { kind: \"already_present\", entryPath };\n }\n\n // Compute import specifier relative to the entry file.\n const fromDir = dirname(entryPath);\n let spec = relative(fromDir, initFilePath).split(sep).join(\"/\");\n if (!spec.startsWith(\".\")) spec = \"./\" + spec;\n\n const isCjs = isCommonJsEntry(entryPath, pkg);\n const importLine = isCjs\n ? `require(${JSON.stringify(spec)});`\n : `import ${JSON.stringify(spec)};`;\n\n // Inject at the top — after a shebang line and any leading \"use strict\",\n // but before all other code, so pixel hooks run before anything else.\n const lines = content.split(\"\\n\");\n let insertAt = 0;\n if (lines[0]?.startsWith(\"#!\")) insertAt = 1;\n while (\n insertAt < lines.length &&\n /^\\s*(?:[\"']use strict[\"']|\\/\\/|\\/\\*)/.test(lines[insertAt] ?? \"\")\n ) {\n insertAt++;\n }\n\n const updated = [...lines.slice(0, insertAt), importLine, ...lines.slice(insertAt)].join(\"\\n\");\n writeFileSync(entryPath, updated, \"utf8\");\n return { kind: \"injected\", entryPath };\n}\n\nfunction findEntryFile(projectRoot: string, pkg: PackageJson): string | null {\n const tryPath = (rel: string): string | null => {\n const p = join(projectRoot, rel);\n if (existsSync(p)) return p;\n // If user pointed `main` at .js but only the .ts source exists (common in TS projects).\n if (rel.endsWith(\".js\")) {\n const ts = join(projectRoot, rel.replace(/\\.js$/, \".ts\"));\n if (existsSync(ts)) return ts;\n }\n return null;\n };\n\n if (typeof pkg.bin === \"string\") {\n const found = tryPath(pkg.bin);\n if (found) return found;\n }\n if (pkg.bin && typeof pkg.bin === \"object\") {\n for (const value of Object.values(pkg.bin)) {\n if (typeof value === \"string\") {\n const found = tryPath(value);\n if (found) return found;\n }\n }\n }\n if (pkg.main) {\n const found = tryPath(pkg.main);\n if (found) return found;\n }\n if (pkg.module) {\n const found = tryPath(pkg.module);\n if (found) return found;\n }\n\n // Fall back to common conventions.\n const candidates = [\n \"src/index.ts\",\n \"src/index.tsx\",\n \"src/index.js\",\n \"src/index.mjs\",\n \"src/main.ts\",\n \"src/main.tsx\",\n \"src/main.js\",\n \"src/server.ts\",\n \"src/server.js\",\n \"src/app.ts\",\n \"src/app.js\",\n \"src/cli.ts\",\n \"src/cli.js\",\n \"index.ts\",\n \"index.tsx\",\n \"index.js\",\n \"index.mjs\",\n \"main.ts\",\n \"main.js\",\n \"server.ts\",\n \"server.js\",\n \"app.ts\",\n \"app.js\",\n ];\n for (const c of candidates) {\n const found = tryPath(c);\n if (found) return found;\n }\n return null;\n}\n\nfunction isCommonJsEntry(entryPath: string, pkg: PackageJson): boolean {\n if (entryPath.endsWith(\".cjs\")) return true;\n if (entryPath.endsWith(\".mjs\")) return false;\n if (entryPath.endsWith(\".ts\") || entryPath.endsWith(\".tsx\")) return false;\n // .js → governed by package.json type (default is \"commonjs\")\n return pkg.type !== \"module\";\n}\n\n// ── Framework detection + wiring ────────────────────────────────────\n\nexport function detectJsProjectKind(pkg: PackageJson, projectRoot: string): ProjectKind {\n const all = { ...(pkg.dependencies ?? {}), ...(pkg.devDependencies ?? {}) };\n // Order matters: more specific first (Electron + React = electron, not browser).\n if (\n existsSync(join(projectRoot, \"wrangler.toml\")) ||\n existsSync(join(projectRoot, \"wrangler.jsonc\")) ||\n existsSync(join(projectRoot, \"wrangler.json\"))\n ) {\n return \"cloudflare-workers\";\n }\n if (\"electron\" in all) return \"electron\";\n if (existsSync(join(projectRoot, \"src-tauri\")) || \"@tauri-apps/api\" in all) return \"tauri\";\n if (\"react-native\" in all) return \"react-native\";\n if (\"next\" in all) return \"nextjs\";\n if (\"@sveltejs/kit\" in all) return \"sveltekit\";\n if (\"nuxt\" in all || \"nuxt3\" in all) return \"nuxt\";\n if (\"@remix-run/react\" in all || \"@remix-run/node\" in all) return \"remix\";\n if (isBrowserProject(pkg, projectRoot)) return \"browser\";\n return \"node\";\n}\n\ninterface WiringInput {\n kind: ProjectKind;\n projectRoot: string;\n pkg: PackageJson;\n projectKey: string;\n ingestUrl: string;\n}\n\ninterface WiringResult {\n primaryInitPath: string;\n entryWiring: EntryWiringResult;\n secondaryInit?: { path: string; description: string };\n warnings: string[];\n}\n\nfunction wireFramework(w: WiringInput): WiringResult {\n switch (w.kind) {\n case \"node\":\n return wireNode(w);\n case \"browser\":\n return wireBrowser(w);\n case \"nextjs\":\n return wireNextjs(w);\n case \"sveltekit\":\n return wireSveltekit(w);\n case \"nuxt\":\n return wireNuxt(w);\n case \"remix\":\n return wireRemix(w);\n case \"electron\":\n return wireElectron(w);\n case \"tauri\":\n return wireTauri(w);\n case \"react-native\":\n return wireReactNative(w);\n case \"cloudflare-workers\":\n return wireWorkers(w);\n case \"python\":\n case \"go\":\n case \"ruby\":\n throw new Error(`Internal: ${w.kind} should have been handled earlier`);\n }\n}\n\nfunction wireNode({ projectRoot, pkg, projectKey, ingestUrl }: WiringInput): WiringResult {\n const initPath = join(projectRoot, \"gg-pixel.init.mjs\");\n writeFileSync(initPath, renderInitFile(ingestUrl, projectKey), \"utf8\");\n return {\n primaryInitPath: initPath,\n entryWiring: wireEntryFile(projectRoot, initPath, pkg),\n warnings: [],\n };\n}\n\nfunction wireBrowser({ projectRoot, pkg, projectKey, ingestUrl }: WiringInput): WiringResult {\n const initPath = join(projectRoot, \"gg-pixel.init.mjs\");\n writeFileSync(initPath, renderBrowserInitFile(ingestUrl, projectKey), \"utf8\");\n return {\n primaryInitPath: initPath,\n entryWiring: wireEntryFile(projectRoot, initPath, pkg),\n warnings: [],\n };\n}\n\nfunction wireNextjs({ projectRoot, projectKey, ingestUrl }: WiringInput): WiringResult {\n // Next.js auto-loads `instrumentation.ts` for the server. No entry wiring needed.\n // For the client, we drop a registration script and import it from the root layout.\n const warnings: string[] = [];\n\n // ── Server: instrumentation.ts ─────────────\n const serverInitPath = pickPath(projectRoot, [\"instrumentation.ts\", \"instrumentation.js\"]);\n const finalServerPath = serverInitPath ?? join(projectRoot, \"instrumentation.ts\");\n writeNextInstrumentation(finalServerPath, ingestUrl, projectKey);\n\n // ── next.config: mark @kenkaiiii/gg-pixel as a server-external package\n // so Next's bundler doesn't try to compile better-sqlite3 (a native\n // module) when bundling API routes / Server Components.\n patchNextConfig(projectRoot);\n\n // ── Client: drop a Client Component that initializes pixel only on the\n // browser, then render it from the root layout. We can't just import\n // a `.mjs` from layout.tsx — server-side rendering of pages like\n // /_not-found would evaluate `window.onerror = ...` and blow up.\n const clientInitPath = join(projectRoot, \"gg-pixel.client.tsx\");\n writeFileSync(clientInitPath, renderNextClientComponent(ingestUrl, projectKey), \"utf8\");\n\n const layoutPath = findNextLayout(projectRoot);\n let entryWiring: EntryWiringResult;\n if (!layoutPath) {\n warnings.push(\n 'Could not auto-wire the Next.js client init — no app/layout.{tsx,jsx} or pages/_app.{tsx,jsx} found. Add `<GGPixelClient />` from \"./gg-pixel.client\" to your root layout/_app.',\n );\n entryWiring = { kind: \"no_entry_found\" };\n } else {\n entryWiring = injectNextClientComponent(layoutPath, clientInitPath);\n }\n\n return {\n primaryInitPath: clientInitPath,\n entryWiring,\n secondaryInit: {\n path: finalServerPath,\n description: \"Next.js server instrumentation (auto-loaded by Next runtime)\",\n },\n warnings,\n };\n}\n\nfunction writeNextInstrumentation(path: string, ingestUrl: string, projectKey?: string): void {\n const existing = existsSync(path) ? readFileSync(path, \"utf8\") : \"\";\n if (existing.includes(\"@kenkaiiii/gg-pixel\")) return; // idempotent\n\n const newContent = existing\n ? existing + \"\\n\" + nextInstrumentationAppend(ingestUrl, projectKey)\n : nextInstrumentationStandalone(ingestUrl, projectKey);\n writeFileSync(path, newContent, \"utf8\");\n}\n\nfunction nextInstrumentationStandalone(ingestUrl: string, projectKey?: string): string {\n const fallback = projectKey ? ` ?? ${JSON.stringify(projectKey)}` : \"\";\n return `// Next.js auto-loads this file on server start. Pixel hooks the\n// uncaughtExceptionMonitor + unhandledRejection events for API routes,\n// Server Components, and route handlers.\nexport async function register() {\n if (process.env.NEXT_RUNTIME === \"nodejs\") {\n const { initPixel } = await import(\"@kenkaiiii/gg-pixel\");\n initPixel({\n projectKey: process.env.GG_PIXEL_KEY${fallback},\n sink: { kind: \"http\", ingestUrl: ${JSON.stringify(`${ingestUrl}/ingest`)} },\n });\n }\n}\n`;\n}\n\nfunction nextInstrumentationAppend(ingestUrl: string, projectKey?: string): string {\n const fallback = projectKey ? ` ?? ${JSON.stringify(projectKey)}` : \"\";\n return `// gg-pixel: server-side error tracking\nimport { initPixel } from \"@kenkaiiii/gg-pixel\";\nif (typeof process !== \"undefined\" && process.env.NEXT_RUNTIME === \"nodejs\") {\n initPixel({\n projectKey: process.env.GG_PIXEL_KEY${fallback},\n sink: { kind: \"http\", ingestUrl: ${JSON.stringify(`${ingestUrl}/ingest`)} },\n });\n}\n`;\n}\n\nfunction findNextLayout(projectRoot: string): string | null {\n const candidates = [\n \"app/layout.tsx\",\n \"app/layout.jsx\",\n \"app/layout.ts\",\n \"src/app/layout.tsx\",\n \"src/app/layout.jsx\",\n \"pages/_app.tsx\",\n \"pages/_app.jsx\",\n \"src/pages/_app.tsx\",\n \"src/pages/_app.jsx\",\n ];\n for (const c of candidates) {\n const p = join(projectRoot, c);\n if (existsSync(p)) return p;\n }\n return null;\n}\n\nfunction renderNextClientComponent(ingestUrl: string, projectKey: string): string {\n return `\"use client\";\n// Client-only pixel init. Rendered from the root layout. The \"use client\"\n// directive guarantees this module never executes during server-side\n// rendering — \\`window.onerror\\` references would otherwise crash builds.\nimport { useEffect } from \"react\";\nimport { initPixel } from \"@kenkaiiii/gg-pixel/browser\";\n\nlet inited = false;\n\nexport default function GGPixelClient() {\n useEffect(() => {\n if (inited) return;\n inited = true;\n initPixel({\n projectKey: ${JSON.stringify(projectKey)},\n ingestUrl: ${JSON.stringify(ingestUrl)},\n });\n }, []);\n return null;\n}\n`;\n}\n\nfunction injectNextClientComponent(layoutPath: string, clientInitPath: string): EntryWiringResult {\n let content: string;\n try {\n content = readFileSync(layoutPath, \"utf8\");\n } catch (err) {\n return { kind: \"skipped\", reason: `unreadable: ${(err as Error).message}` };\n }\n if (content.includes(\"GGPixelClient\") || content.includes(\"@kenkaiiii/gg-pixel\")) {\n return { kind: \"already_present\", entryPath: layoutPath };\n }\n const fromDir = dirname(layoutPath);\n let spec = relative(fromDir, clientInitPath).split(sep).join(\"/\");\n if (!spec.startsWith(\".\")) spec = \"./\" + spec;\n // Strip the .tsx extension for cleanest imports.\n spec = spec.replace(/\\.tsx$/, \"\");\n\n // 1. Add the import below the existing imports.\n const importLine = `import GGPixelClient from ${JSON.stringify(spec)};`;\n const lines = content.split(\"\\n\");\n let insertImportAt = 0;\n for (let i = 0; i < lines.length; i++) {\n if (/^\\s*import\\s/.test(lines[i] ?? \"\")) insertImportAt = i + 1;\n }\n lines.splice(insertImportAt, 0, importLine);\n\n // 2. Inject `<GGPixelClient />` inside the body. We look for the last\n // `{children}` reference and insert just before it.\n const updated = lines.join(\"\\n\");\n const childrenIdx = updated.lastIndexOf(\"{children}\");\n if (childrenIdx === -1) {\n // Couldn't find {children} — write the import only and warn.\n writeFileSync(layoutPath, updated, \"utf8\");\n return { kind: \"skipped\", reason: \"added import but couldn't find {children} to render <GGPixelClient />\" };\n }\n const before = updated.slice(0, childrenIdx);\n const after = updated.slice(childrenIdx);\n const finalContent = before + \"<GGPixelClient />\\n \" + after;\n writeFileSync(layoutPath, finalContent, \"utf8\");\n return { kind: \"injected\", entryPath: layoutPath };\n}\n\nfunction patchNextConfig(projectRoot: string): void {\n // Required so Next's bundler doesn't statically follow better-sqlite3\n // (a native module) when @kenkaiiii/gg-pixel is imported server-side.\n const candidates = [\"next.config.ts\", \"next.config.mjs\", \"next.config.js\", \"next.config.cjs\"];\n let configPath: string | null = null;\n for (const c of candidates) {\n const p = join(projectRoot, c);\n if (existsSync(p)) {\n configPath = p;\n break;\n }\n }\n if (!configPath) {\n configPath = join(projectRoot, \"next.config.ts\");\n writeFileSync(\n configPath,\n `import type { NextConfig } from \"next\";\\n\\nconst nextConfig: NextConfig = {\\n // Keeps Next's bundler from trying to compile better-sqlite3 (native dep).\\n serverExternalPackages: [\"@kenkaiiii/gg-pixel\"],\\n};\\n\\nexport default nextConfig;\\n`,\n \"utf8\",\n );\n return;\n }\n const content = readFileSync(configPath, \"utf8\");\n if (content.includes(\"@kenkaiiii/gg-pixel\")) return;\n if (content.includes(\"serverExternalPackages\")) {\n const updated = content.replace(\n /serverExternalPackages\\s*:\\s*\\[([^\\]]*)\\]/,\n (_match: string, inside: string) => {\n const trimmed = inside.trim();\n const sep = trimmed.length > 0 ? \", \" : \"\";\n return `serverExternalPackages: [${trimmed}${sep}\"@kenkaiiii/gg-pixel\"]`;\n },\n );\n if (updated !== content) writeFileSync(configPath, updated, \"utf8\");\n return;\n }\n // Inject a fresh `serverExternalPackages` line into the config object.\n const objStart = /(const\\s+\\w+\\s*:\\s*NextConfig\\s*=\\s*\\{|module\\.exports\\s*=\\s*\\{|export\\s+default\\s*\\{)/;\n const m = objStart.exec(content);\n if (m) {\n const insertAt = m.index + m[0].length;\n const updated =\n content.slice(0, insertAt) +\n `\\n serverExternalPackages: [\"@kenkaiiii/gg-pixel\"],` +\n content.slice(insertAt);\n writeFileSync(configPath, updated, \"utf8\");\n }\n}\n\nfunction wireSveltekit({ projectRoot, projectKey, ingestUrl }: WiringInput): WiringResult {\n // SvelteKit auto-loads src/hooks.server.ts and src/hooks.client.ts.\n const serverPath = join(projectRoot, \"src/hooks.server.ts\");\n const clientPath = join(projectRoot, \"src/hooks.client.ts\");\n if (!existsSync(dirname(serverPath))) mkdirSync(dirname(serverPath), { recursive: true });\n appendOrCreate(\n serverPath,\n `import { initPixel } from \"@kenkaiiii/gg-pixel\";\\ninitPixel({\\n projectKey: process.env.GG_PIXEL_KEY ?? ${JSON.stringify(projectKey)},\\n sink: { kind: \"http\", ingestUrl: ${JSON.stringify(`${ingestUrl}/ingest`)} },\\n});\\n`,\n \"@kenkaiiii/gg-pixel\",\n );\n appendOrCreate(\n clientPath,\n `import { initPixel } from \"@kenkaiiii/gg-pixel/browser\";\\ninitPixel({\\n projectKey: ${JSON.stringify(projectKey)},\\n ingestUrl: ${JSON.stringify(ingestUrl)},\\n});\\n`,\n \"@kenkaiiii/gg-pixel/browser\",\n );\n return {\n primaryInitPath: clientPath,\n entryWiring: { kind: \"injected\", entryPath: clientPath },\n secondaryInit: {\n path: serverPath,\n description: \"SvelteKit server hooks (auto-loaded)\",\n },\n warnings: [],\n };\n}\n\nfunction wireNuxt({ projectRoot, projectKey, ingestUrl }: WiringInput): WiringResult {\n // Nuxt auto-loads plugins/*.client.ts and plugins/*.server.ts.\n const pluginsDir = join(projectRoot, \"plugins\");\n mkdirSync(pluginsDir, { recursive: true });\n const serverPath = join(pluginsDir, \"gg-pixel.server.ts\");\n const clientPath = join(pluginsDir, \"gg-pixel.client.ts\");\n writeFileSync(\n serverPath,\n `import { initPixel } from \"@kenkaiiii/gg-pixel\";\\nexport default defineNuxtPlugin(() => {\\n initPixel({\\n projectKey: process.env.GG_PIXEL_KEY ?? ${JSON.stringify(projectKey)},\\n sink: { kind: \"http\", ingestUrl: ${JSON.stringify(`${ingestUrl}/ingest`)} },\\n });\\n});\\n`,\n \"utf8\",\n );\n writeFileSync(\n clientPath,\n `import { initPixel } from \"@kenkaiiii/gg-pixel/browser\";\\nexport default defineNuxtPlugin(() => {\\n initPixel({\\n projectKey: ${JSON.stringify(projectKey)},\\n ingestUrl: ${JSON.stringify(ingestUrl)},\\n });\\n});\\n`,\n \"utf8\",\n );\n return {\n primaryInitPath: clientPath,\n entryWiring: { kind: \"injected\", entryPath: clientPath },\n secondaryInit: { path: serverPath, description: \"Nuxt server plugin (auto-loaded)\" },\n warnings: [],\n };\n}\n\nfunction wireRemix({ projectRoot, projectKey, ingestUrl }: WiringInput): WiringResult {\n // Remix uses app/entry.server.tsx and app/entry.client.tsx.\n const serverPath = pickPath(projectRoot, [\"app/entry.server.tsx\", \"app/entry.server.jsx\"]);\n const clientPath = pickPath(projectRoot, [\"app/entry.client.tsx\", \"app/entry.client.jsx\"]);\n const warnings: string[] = [];\n\n // Drop a small init module to import.\n const clientInitPath = join(projectRoot, \"gg-pixel.client.mjs\");\n writeFileSync(clientInitPath, renderBrowserInitFile(ingestUrl, projectKey), \"utf8\");\n\n if (clientPath) {\n injectImport(clientPath, clientInitPath);\n } else {\n warnings.push(\n \"No app/entry.client.tsx found. Run `npx remix reveal` then re-run pixel install.\",\n );\n }\n\n // Server-side: write a small init we import from entry.server.\n const serverInitPath = join(projectRoot, \"gg-pixel.server.mjs\");\n writeFileSync(serverInitPath, renderInitFile(ingestUrl), \"utf8\");\n let serverEntry: EntryWiringResult = { kind: \"no_entry_found\" };\n if (serverPath) {\n serverEntry = injectImport(serverPath, serverInitPath);\n } else {\n warnings.push(\n \"No app/entry.server.tsx found. Run `npx remix reveal` then re-run pixel install.\",\n );\n }\n void serverEntry;\n\n return {\n primaryInitPath: clientInitPath,\n entryWiring: clientPath\n ? { kind: \"injected\", entryPath: clientPath }\n : { kind: \"no_entry_found\" },\n secondaryInit: { path: serverInitPath, description: \"Remix server init\" },\n warnings,\n };\n}\n\nfunction wireElectron({ projectRoot, pkg, projectKey, ingestUrl }: WiringInput): WiringResult {\n const warnings: string[] = [];\n const isMainEsm = pkg.type === \"module\";\n const mainInitPath = isMainEsm\n ? join(projectRoot, \"gg-pixel.main.mjs\")\n : join(projectRoot, \"gg-pixel.main.cjs\");\n writeFileSync(\n mainInitPath,\n isMainEsm ? renderInitFile(ingestUrl, projectKey) : renderInitFileCjs(ingestUrl, projectKey),\n \"utf8\",\n );\n\n // ── Main entry resolution: pkg.main might point at compiled output\n // (e.g. dist/main/index.js for TS-compiled apps like pocket-agent).\n // We prefer the source file so the import survives `npm run build`.\n const mainEntry = resolveMainEntryFromPkg(projectRoot, pkg);\n let mainWiring: EntryWiringResult = { kind: \"no_entry_found\" };\n if (mainEntry && existsSync(mainEntry)) {\n mainWiring = injectImport(mainEntry, mainInitPath);\n }\n\n // ── Renderer: HTML-with-CSP apps use the IIFE bundle; module-system\n // apps use the .mjs init.\n const htmlFiles = findRendererHtmlFiles(projectRoot);\n let rendererInitPath: string;\n if (htmlFiles.length > 0) {\n const rendererDir = dirname(htmlFiles[0]!);\n rendererInitPath = join(rendererDir, \"gg-pixel.browser.iife.js\");\n if (!copyIifeBundle(projectRoot, rendererInitPath)) {\n warnings.push(\n \"Could not copy gg-pixel browser IIFE bundle — install @kenkaiiii/gg-pixel and re-run.\",\n );\n }\n let patchedAny = false;\n for (const html of htmlFiles) {\n if (patchRendererHtml(html, rendererInitPath, projectKey, ingestUrl) === \"patched\") {\n patchedAny = true;\n }\n }\n if (!patchedAny) {\n warnings.push(\n `Found HTML files in ${rendererDir} but couldn't patch any — they may have unusual CSP or no <head>.`,\n );\n }\n } else {\n rendererInitPath = join(projectRoot, \"gg-pixel.renderer.mjs\");\n writeFileSync(rendererInitPath, renderBrowserInitFile(ingestUrl, projectKey), \"utf8\");\n const rendererEntry = pickPath(projectRoot, [\n \"src/renderer/index.ts\",\n \"src/renderer/index.tsx\",\n \"src/renderer/index.js\",\n \"src/renderer/main.ts\",\n \"src/renderer/main.tsx\",\n \"src/renderer/main.js\",\n \"renderer/index.ts\",\n \"renderer/index.tsx\",\n \"renderer/index.js\",\n \"renderer.ts\",\n \"renderer.tsx\",\n \"renderer.js\",\n \"src/index.tsx\",\n \"src/index.jsx\",\n \"src/main.tsx\",\n \"src/main.jsx\",\n ]);\n if (rendererEntry) injectImport(rendererEntry, rendererInitPath);\n else\n warnings.push(\n 'Could not auto-detect the Electron renderer entry. Add `import \"./gg-pixel.renderer.mjs\";` to the top of your renderer entry file.',\n );\n }\n\n return {\n primaryInitPath: rendererInitPath,\n entryWiring: { kind: \"injected\", entryPath: rendererInitPath },\n secondaryInit: {\n path: mainInitPath,\n description:\n \"Electron main-process init\" +\n (mainWiring.kind === \"injected\" ? ` (wired into ${mainEntry})` : \"\"),\n },\n warnings,\n };\n}\n\nfunction resolveMainEntryFromPkg(projectRoot: string, pkg: PackageJson): string | null {\n if (pkg.main) {\n const sourceCandidates: string[] = [];\n const main = pkg.main;\n // dist/X.js → src/X.ts (most common TS-compiled layout)\n if (/^(dist|build|\\.next|out)\\//.test(main)) {\n const swap = main.replace(/^(dist|build|\\.next|out)\\//, \"src/\");\n if (swap.endsWith(\".js\")) {\n sourceCandidates.push(swap.replace(/\\.js$/, \".ts\"));\n sourceCandidates.push(swap.replace(/\\.js$/, \".tsx\"));\n }\n sourceCandidates.push(swap);\n }\n if (main.endsWith(\".js\")) {\n sourceCandidates.push(main.replace(/\\.js$/, \".ts\"));\n sourceCandidates.push(main.replace(/\\.js$/, \".tsx\"));\n }\n for (const c of sourceCandidates) {\n const p = join(projectRoot, c);\n if (existsSync(p)) return p;\n }\n const literal = join(projectRoot, main);\n if (existsSync(literal)) return literal;\n }\n return pickPath(projectRoot, [\n \"main.js\",\n \"main.ts\",\n \"src/main.js\",\n \"src/main.ts\",\n \"src/main/index.ts\",\n \"src/main/index.js\",\n \"electron/main.js\",\n \"electron/main.ts\",\n ]);\n}\n\nconst RENDERER_HTML_DIRS = [\"ui\", \"renderer\", \"src/renderer\", \"public\", \"static\"];\n\nfunction findRendererHtmlFiles(projectRoot: string): string[] {\n for (const dir of RENDERER_HTML_DIRS) {\n const root = join(projectRoot, dir);\n if (!existsSync(root)) continue;\n const html: string[] = [];\n let entries: string[];\n try {\n entries = readdirSync(root);\n } catch {\n continue;\n }\n for (const e of entries) {\n if (!e.endsWith(\".html\")) continue;\n const p = join(root, e);\n try {\n const c = readFileSync(p, \"utf8\");\n if (/<meta[^>]+content-security-policy/i.test(c) || /<script[\\s>]/i.test(c)) {\n html.push(p);\n }\n } catch {\n // ignore\n }\n }\n if (html.length > 0) return html;\n }\n return [];\n}\n\nfunction copyIifeBundle(projectRoot: string, dest: string): boolean {\n const candidates = [\n join(projectRoot, \"node_modules/@kenkaiiii/gg-pixel/dist/browser.iife.global.js\"),\n join(projectRoot, \"node_modules/@kenkaiiii/gg-pixel/dist/browser.iife.js\"),\n ];\n for (const c of candidates) {\n if (existsSync(c)) {\n try {\n writeFileSync(dest, readFileSync(c, \"utf8\"), \"utf8\");\n return true;\n } catch {\n // continue\n }\n }\n }\n return false;\n}\n\nfunction patchRendererHtml(\n htmlPath: string,\n iifePath: string,\n projectKey: string,\n ingestUrl: string,\n): \"patched\" | \"already\" | \"not-applicable\" {\n let content: string;\n try {\n content = readFileSync(htmlPath, \"utf8\");\n } catch {\n return \"not-applicable\";\n }\n if (content.includes(\"gg-pixel.browser.iife\")) return \"already\";\n\n const ingestOrigin = new URL(ingestUrl).origin;\n // Match content=\"...\" OR content='...'. Critical: don't use `[^\"']` for\n // the inner — CSPs legitimately contain `'self'` etc., which would halt\n // a `[^\"']+` match at the first single-quote and corrupt the directive.\n content = content.replace(\n /(<meta[^>]+http-equiv=[\"']?content-security-policy[\"']?[^>]*content=)(\"([^\"]+)\"|'([^']+)')/i,\n (\n _match: string,\n before: string,\n _all: string,\n dq: string | undefined,\n sq: string | undefined,\n ) => {\n const quote = dq !== undefined ? '\"' : \"'\";\n const csp = dq !== undefined ? dq : (sq as string);\n let updated = csp;\n if (/connect-src\\s/i.test(csp)) {\n if (!csp.includes(ingestOrigin)) {\n updated = csp.replace(/(connect-src[^;]*)/i, `$1 ${ingestOrigin}`);\n }\n } else {\n updated = csp.trim().replace(/;?$/, `; connect-src 'self' ${ingestOrigin};`);\n }\n return before + quote + updated + quote;\n },\n );\n\n const relScript = relative(dirname(htmlPath), iifePath).split(sep).join(\"/\");\n const inject = `\\n <!-- gg-pixel: auto-wired by ggcoder pixel install -->\\n <script src=\"${relScript}\"></script>\\n <script>\\n if (window.GGPixel) GGPixel.initPixel({ projectKey: ${JSON.stringify(projectKey)}, ingestUrl: ${JSON.stringify(ingestUrl)} });\\n </script>\\n`;\n if (/<head[^>]*>/i.test(content)) {\n content = content.replace(/(<head[^>]*>)/i, `$1${inject}`);\n } else if (/<html[^>]*>/i.test(content)) {\n content = content.replace(/(<html[^>]*>)/i, `$1<head>${inject}</head>`);\n } else {\n return \"not-applicable\";\n }\n writeFileSync(htmlPath, content, \"utf8\");\n return \"patched\";\n}\n\nfunction wireTauri({ projectRoot, pkg, projectKey, ingestUrl }: WiringInput): WiringResult {\n // Tauri frontend = web. Use Browser SDK on the JS side.\n // The Rust backend has no SDK yet — we say so honestly.\n const initPath = join(projectRoot, \"gg-pixel.init.mjs\");\n writeFileSync(initPath, renderBrowserInitFile(ingestUrl, projectKey), \"utf8\");\n const entryWiring = wireEntryFile(projectRoot, initPath, pkg);\n return {\n primaryInitPath: initPath,\n entryWiring,\n warnings: [\n \"Tauri Rust backend is not instrumented — no Rust SDK exists yet. Frontend errors are captured.\",\n ],\n };\n}\n\nfunction wireWorkers({ projectRoot, projectKey, ingestUrl }: WiringInput): WiringResult {\n // Cloudflare Workers / Vercel Edge / etc. The user's worker exports a default\n // object with fetch/scheduled/queue handlers. We can't safely refactor their\n // default export with regex, so we drop a snippet showing the wrap pattern\n // and warn the user.\n const initPath = join(projectRoot, \"gg-pixel.workers.snippet.ts\");\n writeFileSync(\n initPath,\n `// gg-pixel — Cloudflare Workers wiring snippet.\n// Auto-generated by ggcoder pixel install. Wrap your default export with\n// withPixel(...) so any throw in your handler is auto-reported. Example:\n//\n// import { withPixel } from \"@kenkaiiii/gg-pixel/workers\";\n//\n// export default withPixel(\n// { projectKey: ${JSON.stringify(projectKey)} },\n// {\n// async fetch(req, env, ctx) { /* your code */ },\n// async scheduled(evt, env, ctx) { /* your code */ },\n// },\n// );\n//\n// For manual reports inside a handler:\n//\n// import { reportPixel } from \"@kenkaiiii/gg-pixel/workers\";\n// reportPixel(ctx, { projectKey: ${JSON.stringify(projectKey)} }, {\n// message: \"user clicked the broken button\",\n// });\n//\n// Your project_key is publishable — safe to commit.\n\nimport { withPixel, reportPixel } from \"@kenkaiiii/gg-pixel/workers\";\nexport const PIXEL_KEY = ${JSON.stringify(projectKey)};\nexport const PIXEL_INGEST = ${JSON.stringify(ingestUrl)};\nexport { withPixel, reportPixel };\n`,\n \"utf8\",\n );\n return {\n primaryInitPath: initPath,\n entryWiring: { kind: \"no_entry_found\" },\n warnings: [\n `Cloudflare Workers default exports can't be auto-wrapped safely. Open ${initPath} for a 3-line snippet you can paste into your worker.`,\n ],\n };\n}\n\nfunction wireReactNative({ projectRoot }: WiringInput): WiringResult {\n // RN's JS engine is neither a real browser nor Node. Our current SDKs\n // don't reliably hook it. Be honest rather than ship something broken.\n return {\n primaryInitPath: join(projectRoot, \"(not-installed)\"),\n entryWiring: { kind: \"skipped\", reason: \"react-native SDK not built yet\" },\n warnings: [\n \"React Native is not yet supported — its JS runtime is neither browser nor Node.\",\n \"A dedicated React Native SDK will be a future slice.\",\n ],\n };\n}\n\n// ── small helpers used by the per-framework writers ────────────────\n\nfunction pickPath(root: string, candidates: string[]): string | null {\n for (const c of candidates) {\n const p = join(root, c);\n if (existsSync(p)) return p;\n }\n return null;\n}\n\nfunction appendOrCreate(filePath: string, snippet: string, marker: string): void {\n if (existsSync(filePath)) {\n const existing = readFileSync(filePath, \"utf8\");\n if (existing.includes(marker)) return;\n writeFileSync(filePath, existing + \"\\n\" + snippet, \"utf8\");\n return;\n }\n writeFileSync(filePath, snippet, \"utf8\");\n}\n\nfunction injectImport(entryPath: string, initFilePath: string): EntryWiringResult {\n let content: string;\n try {\n content = readFileSync(entryPath, \"utf8\");\n } catch (err) {\n return { kind: \"skipped\", reason: `unreadable: ${(err as Error).message}` };\n }\n const initBasename = initFilePath.split(sep).pop() ?? \"gg-pixel.init.mjs\";\n if (content.includes(initBasename) || content.includes(\"@kenkaiiii/gg-pixel\")) {\n return { kind: \"already_present\", entryPath };\n }\n const fromDir = dirname(entryPath);\n let spec = relative(fromDir, initFilePath).split(sep).join(\"/\");\n if (!spec.startsWith(\".\")) spec = \"./\" + spec;\n // Detect CJS by content: .cjs, or .js using `require(` and lacking ESM markers.\n // Electron's main.js is the canonical case here.\n const isCjs =\n entryPath.endsWith(\".cjs\") ||\n (entryPath.endsWith(\".js\") &&\n /\\brequire\\s*\\(/.test(content) &&\n !/\\bimport\\s+/.test(content) &&\n !/\\bexport\\s+/.test(content));\n const importLine = isCjs ? `require(${JSON.stringify(spec)});` : `import ${JSON.stringify(spec)};`;\n const lines = content.split(\"\\n\");\n let insertAt = 0;\n if (lines[0]?.startsWith(\"#!\")) insertAt = 1;\n while (\n insertAt < lines.length &&\n /^\\s*(?:[\"']use strict[\"']|\\/\\/|\\/\\*)/.test(lines[insertAt] ?? \"\")\n ) {\n insertAt++;\n }\n const updated = [...lines.slice(0, insertAt), importLine, ...lines.slice(insertAt)].join(\"\\n\");\n writeFileSync(entryPath, updated, \"utf8\");\n return { kind: \"injected\", entryPath };\n}\n\n// ── /Framework wiring ───────────────────────────────────────────────\n\nexport function isBrowserProject(pkg: PackageJson, projectRoot: string): boolean {\n const all = { ...(pkg.dependencies ?? {}), ...(pkg.devDependencies ?? {}) };\n const browserishDeps = [\n \"react\",\n \"react-dom\",\n \"vue\",\n \"@vue/runtime-core\",\n \"svelte\",\n \"next\",\n \"vite\",\n \"@vitejs/plugin-react\",\n \"@angular/core\",\n \"solid-js\",\n \"preact\",\n \"@remix-run/react\",\n \"astro\",\n \"qwik\",\n \"@sveltejs/kit\",\n \"expo\",\n ];\n if (browserishDeps.some((d) => d in all)) return true;\n if (pkg.browser !== undefined) return true;\n if (existsSync(join(projectRoot, \"index.html\"))) return true;\n if (existsSync(join(projectRoot, \"public\", \"index.html\"))) return true;\n return false;\n}\n\nexport function renderBrowserInitFile(ingestUrl: string, projectKey: string): string {\n return `// gg-pixel init — auto-generated by ggcoder pixel install.\n// The project_key is publishable (designed to live in browser bundles).\nimport { initPixel } from \"@kenkaiiii/gg-pixel/browser\";\n\ninitPixel({\n projectKey: ${JSON.stringify(projectKey)},\n ingestUrl: ${JSON.stringify(ingestUrl)},\n});\n`;\n}\n\n// ── Python ──────────────────────────────────────────────────────────\n\nconst PYTHON_MARKERS = [\"pyproject.toml\", \"setup.py\", \"requirements.txt\", \"Pipfile\"];\n\nexport function findPythonProjectRoot(start: string): string | null {\n let dir = start;\n for (let i = 0; i < 20; i++) {\n if (PYTHON_MARKERS.some((m) => existsSync(join(dir, m)))) return dir;\n const parent = dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n return null;\n}\n\nexport function detectPythonPackageManager(projectRoot: string): PythonPackageManager {\n if (existsSync(join(projectRoot, \"uv.lock\"))) return \"uv\";\n if (existsSync(join(projectRoot, \"poetry.lock\"))) return \"poetry\";\n if (existsSync(join(projectRoot, \"Pipfile.lock\"))) return \"pipenv\";\n return \"pip\";\n}\n\nfunction pickClosestRoot(roots: Array<string | null>): string | null {\n let best: string | null = null;\n for (const r of roots) {\n if (!r) continue;\n if (!best || r.length > best.length) best = r;\n }\n return best;\n}\n\nconst GO_MARKER = \"go.mod\";\nconst RUBY_MARKERS = [\"Gemfile\"];\n\nexport function findGoProjectRoot(start: string): string | null {\n let dir = start;\n for (let i = 0; i < 20; i++) {\n if (existsSync(join(dir, GO_MARKER))) return dir;\n const parent = dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n return null;\n}\n\nexport function findRubyProjectRoot(start: string): string | null {\n let dir = start;\n for (let i = 0; i < 20; i++) {\n for (const m of RUBY_MARKERS) {\n if (existsSync(join(dir, m))) return dir;\n }\n // Also catch *.gemspec files at this level.\n try {\n const entries = readdirSync(dir);\n if (entries.some((e) => e.endsWith(\".gemspec\"))) return dir;\n } catch {\n // ignore\n }\n const parent = dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n return null;\n}\n\ninterface NativeInstallContext {\n projectRoot: string;\n opts: InstallOptions;\n ingestUrl: string;\n fetchFn: typeof fetch;\n home: string;\n}\n\nasync function installGo(ctx: NativeInstallContext): Promise<InstallResult> {\n const { projectRoot, opts, ingestUrl, fetchFn, home } = ctx;\n const projectName =\n opts.projectName ?? readGoModuleName(projectRoot) ?? projectRoot.split(\"/\").pop() ?? \"unnamed\";\n const projectsJsonPath = join(home, \".gg\", \"projects.json\");\n const envFilePath = join(projectRoot, \".env\");\n\n const existing = findMappingByPath(projectsJsonPath, projectRoot);\n const existingKey = readEnvKey(envFilePath, \"GG_PIXEL_KEY\");\n let created: { id: string; key: string };\n let reused = false;\n if (existing && existingKey) {\n created = { id: existing.id, key: existingKey };\n reused = true;\n } else {\n created = await createProject(fetchFn, ingestUrl, projectName);\n }\n\n const packageInstalled = opts.skipPackageInstall ? false : runGoGet(projectRoot);\n\n const initFilePath = join(projectRoot, \"gg_pixel_init.go\");\n writeFileSync(\n initFilePath,\n `// gg-pixel init — auto-generated by ggcoder pixel install.\npackage main\n\nimport (\n\t\"os\"\n\tgg \"github.com/kenkaiiii/gg-pixel-go\"\n)\n\nfunc init() {\n\tkey := os.Getenv(\"GG_PIXEL_KEY\")\n\tif key == \"\" {\n\t\tkey = ${JSON.stringify(created.key)}\n\t}\n\t_ = gg.Init(gg.Options{ProjectKey: key, IngestURL: ${JSON.stringify(`${ingestUrl}/ingest`)}})\n}\n`,\n \"utf8\",\n );\n\n writeEnvKey(envFilePath, \"GG_PIXEL_KEY\", created.key);\n writeProjectsMapping(projectsJsonPath, created.id, projectName, projectRoot);\n\n return {\n projectId: created.id,\n projectKey: created.key,\n projectName,\n projectKind: \"go\",\n initFilePath,\n envFilePath,\n projectsJsonPath,\n packageManager: \"pip\",\n packageInstalled,\n entryWiring: { kind: \"no_entry_found\" },\n reused,\n warnings: [\n \"Add `defer ggpixel.Recover()` near the top of your main() so panics are captured before the process exits.\",\n ],\n };\n}\n\nfunction readGoModuleName(projectRoot: string): string | null {\n try {\n const content = readFileSync(join(projectRoot, \"go.mod\"), \"utf8\");\n const match = /^\\s*module\\s+(\\S+)\\s*$/m.exec(content);\n if (!match) return null;\n return match[1]!.split(\"/\").pop() ?? null;\n } catch {\n return null;\n }\n}\n\nfunction runGoGet(projectRoot: string): boolean {\n const result = spawnSync(\"go\", [\"get\", \"github.com/kenkaiiii/gg-pixel-go@latest\"], {\n cwd: projectRoot,\n stdio: \"inherit\",\n });\n return result.status === 0;\n}\n\nasync function installRuby(ctx: NativeInstallContext): Promise<InstallResult> {\n const { projectRoot, opts, ingestUrl, fetchFn, home } = ctx;\n const projectName =\n opts.projectName ?? readRubyAppName(projectRoot) ?? projectRoot.split(\"/\").pop() ?? \"unnamed\";\n const projectsJsonPath = join(home, \".gg\", \"projects.json\");\n const envFilePath = join(projectRoot, \".env\");\n\n const existing = findMappingByPath(projectsJsonPath, projectRoot);\n const existingKey = readEnvKey(envFilePath, \"GG_PIXEL_KEY\");\n let created: { id: string; key: string };\n let reused = false;\n if (existing && existingKey) {\n created = { id: existing.id, key: existingKey };\n reused = true;\n } else {\n created = await createProject(fetchFn, ingestUrl, projectName);\n }\n\n const packageInstalled = opts.skipPackageInstall ? false : runRubyInstall(projectRoot);\n\n const initFilePath = join(projectRoot, \"gg_pixel_init.rb\");\n writeFileSync(\n initFilePath,\n `# gg-pixel init — auto-generated by ggcoder pixel install.\nrequire \"gg_pixel\"\nGGPixel.init(\n project_key: ENV[\"GG_PIXEL_KEY\"] || ${JSON.stringify(created.key)},\n ingest_url: ${JSON.stringify(`${ingestUrl}/ingest`)},\n)\n`,\n \"utf8\",\n );\n\n writeEnvKey(envFilePath, \"GG_PIXEL_KEY\", created.key);\n writeProjectsMapping(projectsJsonPath, created.id, projectName, projectRoot);\n\n return {\n projectId: created.id,\n projectKey: created.key,\n projectName,\n projectKind: \"ruby\",\n initFilePath,\n envFilePath,\n projectsJsonPath,\n packageManager: \"pip\",\n packageInstalled,\n entryWiring: { kind: \"no_entry_found\" },\n reused,\n warnings: [\n `Add \\`require \"./gg_pixel_init\"\\` at the top of your entry script (often \\`config/application.rb\\` for Rails, \\`app.rb\\` for Sinatra, or your main file).`,\n ],\n };\n}\n\nfunction readRubyAppName(projectRoot: string): string | null {\n try {\n const entries = readdirSync(projectRoot);\n const gemspec = entries.find((e) => e.endsWith(\".gemspec\"));\n if (!gemspec) return null;\n return gemspec.replace(/\\.gemspec$/, \"\");\n } catch {\n return null;\n }\n}\n\nfunction runRubyInstall(projectRoot: string): boolean {\n // Prefer bundler if a Gemfile exists.\n if (existsSync(join(projectRoot, \"Gemfile\"))) {\n // Append to Gemfile if not present.\n try {\n const content = readFileSync(join(projectRoot, \"Gemfile\"), \"utf8\");\n if (!content.includes(\"gg_pixel\")) {\n writeFileSync(\n join(projectRoot, \"Gemfile\"),\n content + (content.endsWith(\"\\n\") ? \"\" : \"\\n\") + 'gem \"gg_pixel\"\\n',\n \"utf8\",\n );\n }\n } catch {\n // ignore\n }\n const r = spawnSync(\"bundle\", [\"install\"], { cwd: projectRoot, stdio: \"inherit\" });\n if (r.status === 0) return true;\n }\n const r2 = spawnSync(\"gem\", [\"install\", \"gg_pixel\"], { cwd: projectRoot, stdio: \"inherit\" });\n return r2.status === 0;\n}\n\ninterface PythonInstallContext {\n projectRoot: string;\n opts: InstallOptions;\n ingestUrl: string;\n fetchFn: typeof fetch;\n home: string;\n}\n\nasync function installPython(ctx: PythonInstallContext): Promise<InstallResult> {\n const { projectRoot, opts, ingestUrl, fetchFn, home } = ctx;\n const projectName =\n opts.projectName ?? readPyprojectName(projectRoot) ?? projectRoot.split(\"/\").pop() ?? \"unnamed\";\n\n const projectsJsonPath = join(home, \".gg\", \"projects.json\");\n const envFilePath = join(projectRoot, \".env\");\n\n const existing = findMappingByPath(projectsJsonPath, projectRoot);\n const existingKey = readEnvKey(envFilePath, \"GG_PIXEL_KEY\");\n let created: { id: string; key: string };\n let reused = false;\n if (existing && existingKey) {\n created = { id: existing.id, key: existingKey };\n reused = true;\n } else {\n created = await createProject(fetchFn, ingestUrl, projectName);\n }\n\n const pm = detectPythonPackageManager(projectRoot);\n const packageInstalled = opts.skipPackageInstall ? false : runPythonInstall(projectRoot, pm);\n\n const initFilePath = join(projectRoot, \"gg_pixel_init.py\");\n writeFileSync(initFilePath, renderPythonInitFile(ingestUrl, created.key), \"utf8\");\n\n writeEnvKey(envFilePath, \"GG_PIXEL_KEY\", created.key);\n writeProjectsMapping(projectsJsonPath, created.id, projectName, projectRoot);\n\n const entryWiring = wirePythonEntry(projectRoot, initFilePath);\n\n return {\n projectId: created.id,\n projectKey: created.key,\n projectName,\n projectKind: \"python\",\n initFilePath,\n envFilePath,\n projectsJsonPath,\n packageManager: pm,\n packageInstalled,\n entryWiring,\n reused,\n warnings: [],\n };\n}\n\nfunction readPyprojectName(projectRoot: string): string | null {\n const path = join(projectRoot, \"pyproject.toml\");\n if (!existsSync(path)) return null;\n try {\n const content = readFileSync(path, \"utf8\");\n const match = /^\\s*name\\s*=\\s*[\"']([^\"']+)[\"']/m.exec(content);\n return match?.[1] ?? null;\n } catch {\n return null;\n }\n}\n\nfunction runPythonInstall(projectRoot: string, pm: PythonPackageManager): boolean {\n const cmd =\n pm === \"uv\"\n ? [\"uv\", [\"add\", \"gg-pixel\"]]\n : pm === \"poetry\"\n ? [\"poetry\", [\"add\", \"gg-pixel\"]]\n : pm === \"pipenv\"\n ? [\"pipenv\", [\"install\", \"gg-pixel\"]]\n : [\"pip\", [\"install\", \"gg-pixel\"]];\n const result = spawnSync(cmd[0] as string, cmd[1] as string[], {\n cwd: projectRoot,\n stdio: \"inherit\",\n });\n if (result.status === 0) return true;\n // Fallback: many systems only have `pip3` on PATH.\n if (pm === \"pip\") {\n const r2 = spawnSync(\"pip3\", [\"install\", \"gg-pixel\"], {\n cwd: projectRoot,\n stdio: \"inherit\",\n });\n if (r2.status === 0) return true;\n const r3 = spawnSync(\"python3\", [\"-m\", \"pip\", \"install\", \"gg-pixel\"], {\n cwd: projectRoot,\n stdio: \"inherit\",\n });\n return r3.status === 0;\n }\n return false;\n}\n\nexport function renderPythonInitFile(ingestUrl: string, projectKey: string): string {\n return `\"\"\"gg-pixel init — auto-generated by ggcoder pixel install.\n\nThis file initializes error tracking. Importing it (which the install step\nwires into your entry file) registers the global Python error handlers.\n\"\"\"\nimport os\n\nimport gg_pixel\n\ngg_pixel.init_pixel(\n project_key=os.environ.get(\"GG_PIXEL_KEY\") or ${JSON.stringify(projectKey)},\n ingest_url=${JSON.stringify(`${ingestUrl}/ingest`)},\n)\n`;\n}\n\nfunction wirePythonEntry(projectRoot: string, initFilePath: string): EntryWiringResult {\n const entryPath = findPythonEntryFile(projectRoot);\n if (!entryPath) return { kind: \"no_entry_found\" };\n\n let content: string;\n try {\n content = readFileSync(entryPath, \"utf8\");\n } catch (err) {\n return { kind: \"skipped\", reason: `unreadable: ${(err as Error).message}` };\n }\n\n if (content.includes(\"gg_pixel_init\")) {\n return { kind: \"already_present\", entryPath };\n }\n\n // Compute import name from the relative path. gg_pixel_init.py at root →\n // `gg_pixel_init`. For nested, the user can adjust manually.\n const fromDir = dirname(entryPath);\n const rel = relative(fromDir, initFilePath).split(sep).join(\"/\");\n let moduleSpec: string;\n if (rel === \"gg_pixel_init.py\") {\n moduleSpec = \"gg_pixel_init\";\n } else if (rel.startsWith(\"../\")) {\n // Init is above the entry — Python imports don't traverse via path,\n // so insert via sys.path manipulation as a fallback.\n moduleSpec = \"gg_pixel_init\";\n } else {\n // Same-or-deeper directory: use module path.\n moduleSpec = rel.replace(/\\.py$/, \"\").replace(/\\//g, \".\");\n }\n\n const importLine = `import ${moduleSpec} # noqa: F401, E402 -- gg-pixel`;\n\n const lines = content.split(\"\\n\");\n let insertAt = 0;\n if (lines[0]?.startsWith(\"#!\")) insertAt = 1;\n // Skip encoding declarations and module docstrings.\n while (insertAt < lines.length && /^\\s*(?:#.*coding[:=]|[\"']{3}|#)/.test(lines[insertAt] ?? \"\")) {\n insertAt++;\n }\n\n const updated = [...lines.slice(0, insertAt), importLine, ...lines.slice(insertAt)].join(\"\\n\");\n writeFileSync(entryPath, updated, \"utf8\");\n return { kind: \"injected\", entryPath };\n}\n\nfunction findPythonEntryFile(projectRoot: string): string | null {\n const tryPath = (rel: string): string | null => {\n const p = join(projectRoot, rel);\n return existsSync(p) ? p : null;\n };\n const candidates = [\n \"main.py\",\n \"app.py\",\n \"server.py\",\n \"manage.py\",\n \"wsgi.py\",\n \"asgi.py\",\n \"__main__.py\",\n \"src/main.py\",\n \"src/app.py\",\n \"src/server.py\",\n \"src/__main__.py\",\n ];\n for (const c of candidates) {\n const found = tryPath(c);\n if (found) return found;\n }\n return null;\n}\n\n// ── /Python ─────────────────────────────────────────────────────────\n\nexport function writeProjectsMapping(\n projectsJsonPath: string,\n projectId: string,\n name: string,\n path: string,\n): void {\n mkdirSync(dirname(projectsJsonPath), { recursive: true });\n let map: Record<string, { name: string; path: string }> = {};\n if (existsSync(projectsJsonPath)) {\n try {\n map = JSON.parse(readFileSync(projectsJsonPath, \"utf8\")) as typeof map;\n } catch {\n // start fresh on corrupt file\n }\n }\n map[projectId] = { name, path };\n writeFileSync(projectsJsonPath, `${JSON.stringify(map, null, 2)}\\n`, \"utf8\");\n}\n","import { install, DEFAULT_INGEST_URL } from \"./install.js\";\n\ninterface ParsedArgs {\n command: string;\n ingestUrl?: string;\n name?: string;\n skipPackageInstall: boolean;\n help: boolean;\n}\n\nfunction parse(argv: string[]): ParsedArgs {\n const out: ParsedArgs = { command: argv[0] ?? \"\", skipPackageInstall: false, help: false };\n for (let i = 1; i < argv.length; i++) {\n const a = argv[i];\n if (a === \"--ingest-url\") out.ingestUrl = argv[++i];\n else if (a === \"--name\") out.name = argv[++i];\n else if (a === \"--skip-install\") out.skipPackageInstall = true;\n else if (a === \"--help\" || a === \"-h\") out.help = true;\n }\n return out;\n}\n\nfunction printUsage(): void {\n console.log(`gg-pixel install — drop the pixel into the current project\n\nUsage:\n gg-pixel install [--name <project-name>] [--ingest-url <url>] [--skip-install]\n\nOptions:\n --name Project name to register (defaults to package.json name)\n --ingest-url Backend URL (defaults to ${DEFAULT_INGEST_URL})\n --skip-install Skip the package-manager install step (useful for testing)\n`);\n}\n\nasync function main(argv: string[]): Promise<void> {\n const args = parse(argv);\n if (args.help || !args.command) {\n printUsage();\n return;\n }\n if (args.command !== \"install\") {\n console.error(`Unknown command: ${args.command}`);\n printUsage();\n process.exitCode = 1;\n return;\n }\n\n const result = await install({\n ingestUrl: args.ingestUrl,\n projectName: args.name,\n skipPackageInstall: args.skipPackageInstall,\n });\n\n console.log(\"\");\n console.log(result.reused ? \"Pixel re-wired (existing project).\" : \"Pixel installed.\");\n console.log(` Project: ${result.projectName} (${result.projectId})`);\n console.log(` Kind: ${result.projectKind}`);\n console.log(` Wrote: ${result.initFilePath}`);\n console.log(` Wrote env: ${result.envFilePath}`);\n console.log(` Mapping saved: ${result.projectsJsonPath}`);\n switch (result.entryWiring.kind) {\n case \"injected\":\n console.log(` Wired entry: ${result.entryWiring.entryPath}`);\n break;\n case \"already_present\":\n console.log(` Entry: ${result.entryWiring.entryPath} (already wired)`);\n break;\n case \"no_entry_found\":\n console.log(` ⚠ Could not auto-detect your entry file.`);\n console.log(` Add this line to the TOP of your entry file manually:`);\n console.log(` import \"./gg-pixel.init.mjs\";`);\n break;\n case \"skipped\":\n console.log(` ⚠ Entry wiring skipped: ${result.entryWiring.reason}`);\n break;\n }\n if (!result.packageInstalled && !args.skipPackageInstall) {\n console.log(` ⚠ Package install failed via ${result.packageManager}. Run it manually.`);\n }\n if (result.secondaryInit) {\n console.log(` Also wrote: ${result.secondaryInit.path}`);\n console.log(` ${result.secondaryInit.description}`);\n }\n for (const w of result.warnings) {\n console.log(` ⚠ ${w}`);\n }\n console.log(\"\");\n}\n\nmain(process.argv.slice(2)).catch((err: unknown) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exitCode = 1;\n});\n"],"mappings":"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","names":["sep","main"]}
|
|
1
|
+
{"version":3,"sources":["../src/install.ts","../src/cli.ts"],"sourcesContent":["import {\n existsSync,\n readFileSync,\n writeFileSync,\n appendFileSync,\n mkdirSync,\n readdirSync,\n} from \"node:fs\";\nimport { homedir } from \"node:os\";\nimport { dirname, join, relative, resolve, sep } from \"node:path\";\nimport { spawnSync } from \"node:child_process\";\n\nexport const DEFAULT_INGEST_URL = \"https://gg-pixel-server.buzzbeamaustralia.workers.dev\";\n\nexport interface InstallOptions {\n cwd?: string;\n ingestUrl?: string;\n projectName?: string;\n fetchFn?: typeof fetch;\n skipPackageInstall?: boolean;\n homeDir?: string;\n}\n\nexport interface InstallResult {\n projectId: string;\n projectKey: string;\n /**\n * Per-project bearer secret returned by the server on creation. Stored in\n * ~/.gg/projects.json and required for every /api/* call (read/list/patch/\n * delete). Never leaves the user's machine — never inlined into source.\n */\n projectSecret: string;\n projectName: string;\n projectKind: ProjectKind;\n initFilePath: string;\n envFilePath: string;\n projectsJsonPath: string;\n packageManager: PackageManager | PythonPackageManager;\n packageInstalled: boolean;\n entryWiring: EntryWiringResult;\n /** True when an existing project mapping was reused instead of minting a fresh one. */\n reused: boolean;\n /** Hybrid frameworks: a second init file (e.g. server-side for Next.js). */\n secondaryInit?: { path: string; description: string };\n /** Honest disclaimers — surfaced in the CLI summary. */\n warnings: string[];\n}\n\nexport type EntryWiringResult =\n | { kind: \"injected\"; entryPath: string }\n | { kind: \"already_present\"; entryPath: string }\n | { kind: \"no_entry_found\" }\n | { kind: \"skipped\"; reason: string };\n\ninterface PackageJson {\n name?: string;\n type?: string;\n main?: string;\n module?: string;\n bin?: string | Record<string, string>;\n browser?: unknown;\n dependencies?: Record<string, string>;\n devDependencies?: Record<string, string>;\n}\n\nexport type PackageManager = \"pnpm\" | \"yarn\" | \"bun\" | \"npm\";\n\nexport type ProjectKind =\n | \"node\"\n | \"browser\"\n | \"python\"\n | \"nextjs\"\n | \"sveltekit\"\n | \"nuxt\"\n | \"remix\"\n | \"electron\"\n | \"tauri\"\n | \"react-native\"\n | \"cloudflare-workers\"\n | \"go\"\n | \"ruby\";\n\nexport type PythonPackageManager = \"uv\" | \"poetry\" | \"pipenv\" | \"pip\";\n\nexport async function install(opts: InstallOptions = {}): Promise<InstallResult> {\n const cwd = resolve(opts.cwd ?? process.cwd());\n const ingestUrl = (opts.ingestUrl ?? DEFAULT_INGEST_URL).replace(/\\/+$/, \"\");\n const fetchFn = opts.fetchFn ?? fetch;\n const home = opts.homeDir ?? homedir();\n\n // Detect project kind. We pick the closest (deepest) root when multiple\n // markers exist — polyglot monorepos commonly have everything at root.\n const nodeRoot = findProjectRoot(cwd);\n const pythonRoot = findPythonProjectRoot(cwd);\n const goRoot = findGoProjectRoot(cwd);\n const rubyRoot = findRubyProjectRoot(cwd);\n\n if (!nodeRoot && !pythonRoot && !goRoot && !rubyRoot) {\n throw new Error(\n `No project found at ${cwd}: looked for package.json, pyproject.toml/setup.py/requirements.txt/Pipfile, go.mod, Gemfile/*.gemspec.`,\n );\n }\n\n const closestRoot = pickClosestRoot([nodeRoot, pythonRoot, goRoot, rubyRoot]);\n\n if (closestRoot === goRoot && goRoot) {\n return installGo({ projectRoot: goRoot, opts, ingestUrl, fetchFn, home });\n }\n if (closestRoot === rubyRoot && rubyRoot) {\n return installRuby({ projectRoot: rubyRoot, opts, ingestUrl, fetchFn, home });\n }\n if (closestRoot === pythonRoot && pythonRoot) {\n return installPython({ projectRoot: pythonRoot, opts, ingestUrl, fetchFn, home });\n }\n\n // Node / browser / hybrid framework path.\n if (!nodeRoot) {\n throw new Error(\"Internal: closest root is Node but nodeRoot is null\");\n }\n const pkgPath = join(nodeRoot, \"package.json\");\n const pkg = JSON.parse(readFileSync(pkgPath, \"utf8\")) as PackageJson;\n const projectName = opts.projectName ?? pkg.name ?? nodeRoot.split(\"/\").pop() ?? \"unnamed\";\n const kind = detectJsProjectKind(pkg, nodeRoot);\n\n const projectsJsonPath = join(home, \".gg\", \"projects.json\");\n const envFilePath = join(nodeRoot, \".env\");\n\n const existing = findMappingByPath(projectsJsonPath, nodeRoot);\n const existingKey = readEnvKey(envFilePath, \"GG_PIXEL_KEY\");\n let created: CreatedProject;\n let reused = false;\n // Reusing requires *all three* — id, publishable key, and the secret —\n // because the secret is now mandatory for every management call. If any\n // is missing (e.g. legacy install before secrets existed), mint fresh.\n if (existing && existing.secret && existingKey) {\n created = { id: existing.id, key: existingKey, secret: existing.secret };\n reused = true;\n } else {\n created = await createProject(fetchFn, ingestUrl, projectName);\n }\n\n const pm = detectPackageManager(nodeRoot);\n const packageInstalled = opts.skipPackageInstall\n ? false\n : runInstall(nodeRoot, pm, \"@kenkaiiii/gg-pixel\");\n\n // Dispatch to per-framework wiring.\n const wired = wireFramework({\n kind,\n projectRoot: nodeRoot,\n pkg,\n projectKey: created.key,\n ingestUrl,\n });\n\n // .env: write the key for runtimes that read it from process.env (Node servers,\n // Electron main, Next.js server, etc). Pure browser apps don't need it (key\n // is inlined into the init file).\n if (kind !== \"browser\" && kind !== \"tauri\") {\n writeEnvKey(envFilePath, \"GG_PIXEL_KEY\", created.key);\n }\n\n writeProjectsMapping(projectsJsonPath, created.id, projectName, nodeRoot, created.secret);\n\n return {\n projectId: created.id,\n projectKey: created.key,\n projectSecret: created.secret,\n projectName,\n projectKind: kind,\n initFilePath: wired.primaryInitPath,\n envFilePath,\n projectsJsonPath,\n packageManager: pm,\n packageInstalled,\n entryWiring: wired.entryWiring,\n reused,\n secondaryInit: wired.secondaryInit,\n warnings: wired.warnings,\n };\n}\n\ninterface CreatedProject {\n id: string;\n key: string;\n secret: string;\n}\n\nfunction findMappingByPath(\n projectsJsonPath: string,\n projectRoot: string,\n): { id: string; name: string; path: string; secret?: string } | null {\n if (!existsSync(projectsJsonPath)) return null;\n let map: Record<string, { name: string; path: string; secret?: string }>;\n try {\n map = JSON.parse(readFileSync(projectsJsonPath, \"utf8\")) as typeof map;\n } catch {\n return null;\n }\n for (const [id, entry] of Object.entries(map)) {\n if (entry.path === projectRoot) return { id, ...entry };\n }\n return null;\n}\n\nfunction readEnvKey(envPath: string, key: string): string | null {\n if (!existsSync(envPath)) return null;\n try {\n const content = readFileSync(envPath, \"utf8\");\n const match = new RegExp(`^${key}=(.+)$`, \"m\").exec(content);\n return match?.[1]?.trim() ?? null;\n } catch {\n return null;\n }\n}\n\nfunction findProjectRoot(start: string): string | null {\n let dir = start;\n for (let i = 0; i < 20; i++) {\n if (existsSync(join(dir, \"package.json\"))) return dir;\n const parent = dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n return null;\n}\n\nasync function createProject(\n fetchFn: typeof fetch,\n ingestUrl: string,\n name: string,\n): Promise<CreatedProject> {\n const res = await fetchFn(`${ingestUrl}/api/projects`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify({ name }),\n });\n if (!res.ok) {\n throw new Error(`POST /api/projects failed: ${res.status} ${await safeText(res)}`);\n }\n const body = (await res.json()) as { id: string; key: string; secret: string };\n if (!body.id || !body.key || !body.secret) {\n throw new Error(\"response missing id/key/secret\");\n }\n return { id: body.id, key: body.key, secret: body.secret };\n}\n\nasync function safeText(r: Response): Promise<string> {\n try {\n return await r.text();\n } catch {\n return \"\";\n }\n}\n\nexport function detectPackageManager(projectRoot: string): PackageManager {\n if (existsSync(join(projectRoot, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (existsSync(join(projectRoot, \"bun.lockb\"))) return \"bun\";\n if (existsSync(join(projectRoot, \"yarn.lock\"))) return \"yarn\";\n return \"npm\";\n}\n\nfunction runInstall(projectRoot: string, pm: PackageManager, pkg: string): boolean {\n const cmd = pm;\n // npm prints `npm audit` warnings + `npm fund` solicitations on every install.\n // That output is about the user's *existing* project — irrelevant to pixel.\n // The other package managers don't show this noise by default.\n const args = pm === \"npm\" ? [\"install\", pkg, \"--no-audit\", \"--no-fund\"] : [\"add\", pkg];\n const result = spawnSync(cmd, args, { cwd: projectRoot, stdio: \"inherit\" });\n return result.status === 0;\n}\n\nexport function renderInitFile(ingestUrl: string, projectKey?: string): string {\n const fallback = projectKey ? ` || ${JSON.stringify(projectKey)}` : \"\";\n return `import { initPixel } from \"@kenkaiiii/gg-pixel\";\n\nconst key = process.env.GG_PIXEL_KEY${fallback};\nif (key) {\n initPixel({\n projectKey: key,\n sink: { kind: \"http\", ingestUrl: ${JSON.stringify(`${ingestUrl}/ingest`)} },\n });\n}\n`;\n}\n\nexport function renderInitFileCjs(ingestUrl: string, projectKey?: string): string {\n const fallback = projectKey ? ` || ${JSON.stringify(projectKey)}` : \"\";\n return `const { initPixel } = require(\"@kenkaiiii/gg-pixel\");\n\nconst key = process.env.GG_PIXEL_KEY${fallback};\nif (key) {\n initPixel({\n projectKey: key,\n sink: { kind: \"http\", ingestUrl: ${JSON.stringify(`${ingestUrl}/ingest`)} },\n });\n}\n`;\n}\n\nexport function writeEnvKey(envPath: string, key: string, value: string): void {\n if (existsSync(envPath)) {\n const current = readFileSync(envPath, \"utf8\");\n const lineRegex = new RegExp(`^${key}=.*$`, \"m\");\n if (lineRegex.test(current)) {\n writeFileSync(envPath, current.replace(lineRegex, `${key}=${value}`), \"utf8\");\n return;\n }\n const sep = current.endsWith(\"\\n\") || current.length === 0 ? \"\" : \"\\n\";\n appendFileSync(envPath, `${sep}${key}=${value}\\n`, \"utf8\");\n return;\n }\n writeFileSync(envPath, `${key}=${value}\\n`, \"utf8\");\n}\n\nexport function wireEntryFile(\n projectRoot: string,\n initFilePath: string,\n pkg: PackageJson,\n): EntryWiringResult {\n const entryPath = findEntryFile(projectRoot, pkg);\n if (!entryPath) return { kind: \"no_entry_found\" };\n\n let content: string;\n try {\n content = readFileSync(entryPath, \"utf8\");\n } catch (err) {\n return { kind: \"skipped\", reason: `unreadable: ${(err as Error).message}` };\n }\n\n if (content.includes(\"gg-pixel.init\")) {\n return { kind: \"already_present\", entryPath };\n }\n\n // Compute import specifier relative to the entry file.\n const fromDir = dirname(entryPath);\n let spec = relative(fromDir, initFilePath).split(sep).join(\"/\");\n if (!spec.startsWith(\".\")) spec = \"./\" + spec;\n\n const isCjs = isCommonJsEntry(entryPath, pkg);\n const importLine = isCjs\n ? `require(${JSON.stringify(spec)});`\n : `import ${JSON.stringify(spec)};`;\n\n // Inject at the top — after a shebang line and any leading \"use strict\",\n // but before all other code, so pixel hooks run before anything else.\n const lines = content.split(\"\\n\");\n let insertAt = 0;\n if (lines[0]?.startsWith(\"#!\")) insertAt = 1;\n while (\n insertAt < lines.length &&\n /^\\s*(?:[\"']use strict[\"']|\\/\\/|\\/\\*)/.test(lines[insertAt] ?? \"\")\n ) {\n insertAt++;\n }\n\n const updated = [...lines.slice(0, insertAt), importLine, ...lines.slice(insertAt)].join(\"\\n\");\n writeFileSync(entryPath, updated, \"utf8\");\n return { kind: \"injected\", entryPath };\n}\n\nfunction findEntryFile(projectRoot: string, pkg: PackageJson): string | null {\n const tryPath = (rel: string): string | null => {\n const p = join(projectRoot, rel);\n if (existsSync(p)) return p;\n // If user pointed `main` at .js but only the .ts source exists (common in TS projects).\n if (rel.endsWith(\".js\")) {\n const ts = join(projectRoot, rel.replace(/\\.js$/, \".ts\"));\n if (existsSync(ts)) return ts;\n }\n return null;\n };\n\n if (typeof pkg.bin === \"string\") {\n const found = tryPath(pkg.bin);\n if (found) return found;\n }\n if (pkg.bin && typeof pkg.bin === \"object\") {\n for (const value of Object.values(pkg.bin)) {\n if (typeof value === \"string\") {\n const found = tryPath(value);\n if (found) return found;\n }\n }\n }\n if (pkg.main) {\n const found = tryPath(pkg.main);\n if (found) return found;\n }\n if (pkg.module) {\n const found = tryPath(pkg.module);\n if (found) return found;\n }\n\n // Fall back to common conventions.\n const candidates = [\n \"src/index.ts\",\n \"src/index.tsx\",\n \"src/index.js\",\n \"src/index.mjs\",\n \"src/main.ts\",\n \"src/main.tsx\",\n \"src/main.js\",\n \"src/server.ts\",\n \"src/server.js\",\n \"src/app.ts\",\n \"src/app.js\",\n \"src/cli.ts\",\n \"src/cli.js\",\n \"index.ts\",\n \"index.tsx\",\n \"index.js\",\n \"index.mjs\",\n \"main.ts\",\n \"main.js\",\n \"server.ts\",\n \"server.js\",\n \"app.ts\",\n \"app.js\",\n ];\n for (const c of candidates) {\n const found = tryPath(c);\n if (found) return found;\n }\n return null;\n}\n\nfunction isCommonJsEntry(entryPath: string, pkg: PackageJson): boolean {\n if (entryPath.endsWith(\".cjs\")) return true;\n if (entryPath.endsWith(\".mjs\")) return false;\n if (entryPath.endsWith(\".ts\") || entryPath.endsWith(\".tsx\")) return false;\n // .js → governed by package.json type (default is \"commonjs\")\n return pkg.type !== \"module\";\n}\n\n// ── Framework detection + wiring ────────────────────────────────────\n\nexport function detectJsProjectKind(pkg: PackageJson, projectRoot: string): ProjectKind {\n const all = { ...(pkg.dependencies ?? {}), ...(pkg.devDependencies ?? {}) };\n // Order matters: more specific first (Electron + React = electron, not browser).\n if (\n existsSync(join(projectRoot, \"wrangler.toml\")) ||\n existsSync(join(projectRoot, \"wrangler.jsonc\")) ||\n existsSync(join(projectRoot, \"wrangler.json\"))\n ) {\n return \"cloudflare-workers\";\n }\n if (\"electron\" in all) return \"electron\";\n if (existsSync(join(projectRoot, \"src-tauri\")) || \"@tauri-apps/api\" in all) return \"tauri\";\n if (\"react-native\" in all) return \"react-native\";\n if (\"next\" in all) return \"nextjs\";\n if (\"@sveltejs/kit\" in all) return \"sveltekit\";\n if (\"nuxt\" in all || \"nuxt3\" in all) return \"nuxt\";\n if (\"@remix-run/react\" in all || \"@remix-run/node\" in all) return \"remix\";\n if (isBrowserProject(pkg, projectRoot)) return \"browser\";\n return \"node\";\n}\n\ninterface WiringInput {\n kind: ProjectKind;\n projectRoot: string;\n pkg: PackageJson;\n projectKey: string;\n ingestUrl: string;\n}\n\ninterface WiringResult {\n primaryInitPath: string;\n entryWiring: EntryWiringResult;\n secondaryInit?: { path: string; description: string };\n warnings: string[];\n}\n\nfunction wireFramework(w: WiringInput): WiringResult {\n switch (w.kind) {\n case \"node\":\n return wireNode(w);\n case \"browser\":\n return wireBrowser(w);\n case \"nextjs\":\n return wireNextjs(w);\n case \"sveltekit\":\n return wireSveltekit(w);\n case \"nuxt\":\n return wireNuxt(w);\n case \"remix\":\n return wireRemix(w);\n case \"electron\":\n return wireElectron(w);\n case \"tauri\":\n return wireTauri(w);\n case \"react-native\":\n return wireReactNative(w);\n case \"cloudflare-workers\":\n return wireWorkers(w);\n case \"python\":\n case \"go\":\n case \"ruby\":\n throw new Error(`Internal: ${w.kind} should have been handled earlier`);\n }\n}\n\nfunction wireNode({ projectRoot, pkg, projectKey, ingestUrl }: WiringInput): WiringResult {\n const initPath = join(projectRoot, \"gg-pixel.init.mjs\");\n writeFileSync(initPath, renderInitFile(ingestUrl, projectKey), \"utf8\");\n return {\n primaryInitPath: initPath,\n entryWiring: wireEntryFile(projectRoot, initPath, pkg),\n warnings: [],\n };\n}\n\nfunction wireBrowser({ projectRoot, pkg, projectKey, ingestUrl }: WiringInput): WiringResult {\n const initPath = join(projectRoot, \"gg-pixel.init.mjs\");\n writeFileSync(initPath, renderBrowserInitFile(ingestUrl, projectKey), \"utf8\");\n return {\n primaryInitPath: initPath,\n entryWiring: wireEntryFile(projectRoot, initPath, pkg),\n warnings: [],\n };\n}\n\nfunction wireNextjs({ projectRoot, projectKey, ingestUrl }: WiringInput): WiringResult {\n // Next.js auto-loads `instrumentation.ts` for the server. No entry wiring needed.\n // For the client, we drop a registration script and import it from the root layout.\n const warnings: string[] = [];\n\n // ── Server: instrumentation.ts ─────────────\n const serverInitPath = pickPath(projectRoot, [\"instrumentation.ts\", \"instrumentation.js\"]);\n const finalServerPath = serverInitPath ?? join(projectRoot, \"instrumentation.ts\");\n writeNextInstrumentation(finalServerPath, ingestUrl, projectKey);\n\n // ── next.config: mark @kenkaiiii/gg-pixel as a server-external package\n // so Next's bundler doesn't try to compile better-sqlite3 (a native\n // module) when bundling API routes / Server Components.\n patchNextConfig(projectRoot);\n\n // ── Client: drop a Client Component that initializes pixel only on the\n // browser, then render it from the root layout. We can't just import\n // a `.mjs` from layout.tsx — server-side rendering of pages like\n // /_not-found would evaluate `window.onerror = ...` and blow up.\n const clientInitPath = join(projectRoot, \"gg-pixel.client.tsx\");\n writeFileSync(clientInitPath, renderNextClientComponent(ingestUrl, projectKey), \"utf8\");\n\n const layoutPath = findNextLayout(projectRoot);\n let entryWiring: EntryWiringResult;\n if (!layoutPath) {\n warnings.push(\n 'Could not auto-wire the Next.js client init — no app/layout.{tsx,jsx} or pages/_app.{tsx,jsx} found. Add `<GGPixelClient />` from \"./gg-pixel.client\" to your root layout/_app.',\n );\n entryWiring = { kind: \"no_entry_found\" };\n } else {\n entryWiring = injectNextClientComponent(layoutPath, clientInitPath);\n }\n\n return {\n primaryInitPath: clientInitPath,\n entryWiring,\n secondaryInit: {\n path: finalServerPath,\n description: \"Next.js server instrumentation (auto-loaded by Next runtime)\",\n },\n warnings,\n };\n}\n\nfunction writeNextInstrumentation(path: string, ingestUrl: string, projectKey?: string): void {\n const existing = existsSync(path) ? readFileSync(path, \"utf8\") : \"\";\n if (existing.includes(\"@kenkaiiii/gg-pixel\")) return; // idempotent\n\n const newContent = existing\n ? existing + \"\\n\" + nextInstrumentationAppend(ingestUrl, projectKey)\n : nextInstrumentationStandalone(ingestUrl, projectKey);\n writeFileSync(path, newContent, \"utf8\");\n}\n\nfunction nextInstrumentationStandalone(ingestUrl: string, projectKey?: string): string {\n const fallback = projectKey ? ` ?? ${JSON.stringify(projectKey)}` : \"\";\n return `// Next.js auto-loads this file on server start. Pixel hooks the\n// uncaughtExceptionMonitor + unhandledRejection events for API routes,\n// Server Components, and route handlers.\nexport async function register() {\n if (process.env.NEXT_RUNTIME === \"nodejs\") {\n const { initPixel } = await import(\"@kenkaiiii/gg-pixel\");\n initPixel({\n projectKey: process.env.GG_PIXEL_KEY${fallback},\n sink: { kind: \"http\", ingestUrl: ${JSON.stringify(`${ingestUrl}/ingest`)} },\n });\n }\n}\n`;\n}\n\nfunction nextInstrumentationAppend(ingestUrl: string, projectKey?: string): string {\n const fallback = projectKey ? ` ?? ${JSON.stringify(projectKey)}` : \"\";\n return `// gg-pixel: server-side error tracking\nimport { initPixel } from \"@kenkaiiii/gg-pixel\";\nif (typeof process !== \"undefined\" && process.env.NEXT_RUNTIME === \"nodejs\") {\n initPixel({\n projectKey: process.env.GG_PIXEL_KEY${fallback},\n sink: { kind: \"http\", ingestUrl: ${JSON.stringify(`${ingestUrl}/ingest`)} },\n });\n}\n`;\n}\n\nfunction findNextLayout(projectRoot: string): string | null {\n const candidates = [\n \"app/layout.tsx\",\n \"app/layout.jsx\",\n \"app/layout.ts\",\n \"src/app/layout.tsx\",\n \"src/app/layout.jsx\",\n \"pages/_app.tsx\",\n \"pages/_app.jsx\",\n \"src/pages/_app.tsx\",\n \"src/pages/_app.jsx\",\n ];\n for (const c of candidates) {\n const p = join(projectRoot, c);\n if (existsSync(p)) return p;\n }\n return null;\n}\n\nfunction renderNextClientComponent(ingestUrl: string, projectKey: string): string {\n return `\"use client\";\n// Client-only pixel init. Rendered from the root layout. The \"use client\"\n// directive guarantees this module never executes during server-side\n// rendering — \\`window.onerror\\` references would otherwise crash builds.\nimport { useEffect } from \"react\";\nimport { initPixel } from \"@kenkaiiii/gg-pixel/browser\";\n\nlet inited = false;\n\nexport default function GGPixelClient() {\n useEffect(() => {\n if (inited) return;\n inited = true;\n initPixel({\n projectKey: ${JSON.stringify(projectKey)},\n ingestUrl: ${JSON.stringify(ingestUrl)},\n });\n }, []);\n return null;\n}\n`;\n}\n\nfunction injectNextClientComponent(layoutPath: string, clientInitPath: string): EntryWiringResult {\n let content: string;\n try {\n content = readFileSync(layoutPath, \"utf8\");\n } catch (err) {\n return { kind: \"skipped\", reason: `unreadable: ${(err as Error).message}` };\n }\n if (content.includes(\"GGPixelClient\") || content.includes(\"@kenkaiiii/gg-pixel\")) {\n return { kind: \"already_present\", entryPath: layoutPath };\n }\n const fromDir = dirname(layoutPath);\n let spec = relative(fromDir, clientInitPath).split(sep).join(\"/\");\n if (!spec.startsWith(\".\")) spec = \"./\" + spec;\n // Strip the .tsx extension for cleanest imports.\n spec = spec.replace(/\\.tsx$/, \"\");\n\n // 1. Add the import below the existing imports.\n const importLine = `import GGPixelClient from ${JSON.stringify(spec)};`;\n const lines = content.split(\"\\n\");\n let insertImportAt = 0;\n for (let i = 0; i < lines.length; i++) {\n if (/^\\s*import\\s/.test(lines[i] ?? \"\")) insertImportAt = i + 1;\n }\n lines.splice(insertImportAt, 0, importLine);\n\n // 2. Inject `<GGPixelClient />` inside the body. We look for the last\n // `{children}` reference and insert just before it.\n const updated = lines.join(\"\\n\");\n const childrenIdx = updated.lastIndexOf(\"{children}\");\n if (childrenIdx === -1) {\n // Couldn't find {children} — write the import only and warn.\n writeFileSync(layoutPath, updated, \"utf8\");\n return {\n kind: \"skipped\",\n reason: \"added import but couldn't find {children} to render <GGPixelClient />\",\n };\n }\n const before = updated.slice(0, childrenIdx);\n const after = updated.slice(childrenIdx);\n const finalContent = before + \"<GGPixelClient />\\n \" + after;\n writeFileSync(layoutPath, finalContent, \"utf8\");\n return { kind: \"injected\", entryPath: layoutPath };\n}\n\nfunction patchNextConfig(projectRoot: string): void {\n // Required so Next's bundler doesn't statically follow better-sqlite3\n // (a native module) when @kenkaiiii/gg-pixel is imported server-side.\n const candidates = [\"next.config.ts\", \"next.config.mjs\", \"next.config.js\", \"next.config.cjs\"];\n let configPath: string | null = null;\n for (const c of candidates) {\n const p = join(projectRoot, c);\n if (existsSync(p)) {\n configPath = p;\n break;\n }\n }\n if (!configPath) {\n configPath = join(projectRoot, \"next.config.ts\");\n writeFileSync(\n configPath,\n `import type { NextConfig } from \"next\";\\n\\nconst nextConfig: NextConfig = {\\n // Keeps Next's bundler from trying to compile better-sqlite3 (native dep).\\n serverExternalPackages: [\"@kenkaiiii/gg-pixel\"],\\n};\\n\\nexport default nextConfig;\\n`,\n \"utf8\",\n );\n return;\n }\n const content = readFileSync(configPath, \"utf8\");\n if (content.includes(\"@kenkaiiii/gg-pixel\")) return;\n if (content.includes(\"serverExternalPackages\")) {\n const updated = content.replace(\n /serverExternalPackages\\s*:\\s*\\[([^\\]]*)\\]/,\n (_match: string, inside: string) => {\n const trimmed = inside.trim();\n const sep = trimmed.length > 0 ? \", \" : \"\";\n return `serverExternalPackages: [${trimmed}${sep}\"@kenkaiiii/gg-pixel\"]`;\n },\n );\n if (updated !== content) writeFileSync(configPath, updated, \"utf8\");\n return;\n }\n // Inject a fresh `serverExternalPackages` line into the config object.\n const objStart =\n /(const\\s+\\w+\\s*:\\s*NextConfig\\s*=\\s*\\{|module\\.exports\\s*=\\s*\\{|export\\s+default\\s*\\{)/;\n const m = objStart.exec(content);\n if (m) {\n const insertAt = m.index + m[0].length;\n const updated =\n content.slice(0, insertAt) +\n `\\n serverExternalPackages: [\"@kenkaiiii/gg-pixel\"],` +\n content.slice(insertAt);\n writeFileSync(configPath, updated, \"utf8\");\n }\n}\n\nfunction wireSveltekit({ projectRoot, projectKey, ingestUrl }: WiringInput): WiringResult {\n // SvelteKit auto-loads src/hooks.server.ts and src/hooks.client.ts.\n const serverPath = join(projectRoot, \"src/hooks.server.ts\");\n const clientPath = join(projectRoot, \"src/hooks.client.ts\");\n if (!existsSync(dirname(serverPath))) mkdirSync(dirname(serverPath), { recursive: true });\n appendOrCreate(\n serverPath,\n `import { initPixel } from \"@kenkaiiii/gg-pixel\";\\ninitPixel({\\n projectKey: process.env.GG_PIXEL_KEY ?? ${JSON.stringify(projectKey)},\\n sink: { kind: \"http\", ingestUrl: ${JSON.stringify(`${ingestUrl}/ingest`)} },\\n});\\n`,\n \"@kenkaiiii/gg-pixel\",\n );\n appendOrCreate(\n clientPath,\n `import { initPixel } from \"@kenkaiiii/gg-pixel/browser\";\\ninitPixel({\\n projectKey: ${JSON.stringify(projectKey)},\\n ingestUrl: ${JSON.stringify(ingestUrl)},\\n});\\n`,\n \"@kenkaiiii/gg-pixel/browser\",\n );\n return {\n primaryInitPath: clientPath,\n entryWiring: { kind: \"injected\", entryPath: clientPath },\n secondaryInit: {\n path: serverPath,\n description: \"SvelteKit server hooks (auto-loaded)\",\n },\n warnings: [],\n };\n}\n\nfunction wireNuxt({ projectRoot, projectKey, ingestUrl }: WiringInput): WiringResult {\n // Nuxt auto-loads plugins/*.client.ts and plugins/*.server.ts.\n const pluginsDir = join(projectRoot, \"plugins\");\n mkdirSync(pluginsDir, { recursive: true });\n const serverPath = join(pluginsDir, \"gg-pixel.server.ts\");\n const clientPath = join(pluginsDir, \"gg-pixel.client.ts\");\n writeFileSync(\n serverPath,\n `import { initPixel } from \"@kenkaiiii/gg-pixel\";\\nexport default defineNuxtPlugin(() => {\\n initPixel({\\n projectKey: process.env.GG_PIXEL_KEY ?? ${JSON.stringify(projectKey)},\\n sink: { kind: \"http\", ingestUrl: ${JSON.stringify(`${ingestUrl}/ingest`)} },\\n });\\n});\\n`,\n \"utf8\",\n );\n writeFileSync(\n clientPath,\n `import { initPixel } from \"@kenkaiiii/gg-pixel/browser\";\\nexport default defineNuxtPlugin(() => {\\n initPixel({\\n projectKey: ${JSON.stringify(projectKey)},\\n ingestUrl: ${JSON.stringify(ingestUrl)},\\n });\\n});\\n`,\n \"utf8\",\n );\n return {\n primaryInitPath: clientPath,\n entryWiring: { kind: \"injected\", entryPath: clientPath },\n secondaryInit: { path: serverPath, description: \"Nuxt server plugin (auto-loaded)\" },\n warnings: [],\n };\n}\n\nfunction wireRemix({ projectRoot, projectKey, ingestUrl }: WiringInput): WiringResult {\n // Remix uses app/entry.server.tsx and app/entry.client.tsx.\n const serverPath = pickPath(projectRoot, [\"app/entry.server.tsx\", \"app/entry.server.jsx\"]);\n const clientPath = pickPath(projectRoot, [\"app/entry.client.tsx\", \"app/entry.client.jsx\"]);\n const warnings: string[] = [];\n\n // Drop a small init module to import.\n const clientInitPath = join(projectRoot, \"gg-pixel.client.mjs\");\n writeFileSync(clientInitPath, renderBrowserInitFile(ingestUrl, projectKey), \"utf8\");\n\n if (clientPath) {\n injectImport(clientPath, clientInitPath);\n } else {\n warnings.push(\n \"No app/entry.client.tsx found. Run `npx remix reveal` then re-run pixel install.\",\n );\n }\n\n // Server-side: write a small init we import from entry.server.\n const serverInitPath = join(projectRoot, \"gg-pixel.server.mjs\");\n writeFileSync(serverInitPath, renderInitFile(ingestUrl), \"utf8\");\n let serverEntry: EntryWiringResult = { kind: \"no_entry_found\" };\n if (serverPath) {\n serverEntry = injectImport(serverPath, serverInitPath);\n } else {\n warnings.push(\n \"No app/entry.server.tsx found. Run `npx remix reveal` then re-run pixel install.\",\n );\n }\n void serverEntry;\n\n return {\n primaryInitPath: clientInitPath,\n entryWiring: clientPath\n ? { kind: \"injected\", entryPath: clientPath }\n : { kind: \"no_entry_found\" },\n secondaryInit: { path: serverInitPath, description: \"Remix server init\" },\n warnings,\n };\n}\n\nfunction wireElectron({ projectRoot, pkg, projectKey, ingestUrl }: WiringInput): WiringResult {\n const warnings: string[] = [];\n const isMainEsm = pkg.type === \"module\";\n const mainInitPath = isMainEsm\n ? join(projectRoot, \"gg-pixel.main.mjs\")\n : join(projectRoot, \"gg-pixel.main.cjs\");\n writeFileSync(\n mainInitPath,\n isMainEsm ? renderInitFile(ingestUrl, projectKey) : renderInitFileCjs(ingestUrl, projectKey),\n \"utf8\",\n );\n\n // ── Main entry resolution: pkg.main might point at compiled output\n // (e.g. dist/main/index.js for TS-compiled apps like pocket-agent).\n // We prefer the source file so the import survives `npm run build`.\n const mainEntry = resolveMainEntryFromPkg(projectRoot, pkg);\n let mainWiring: EntryWiringResult = { kind: \"no_entry_found\" };\n if (mainEntry && existsSync(mainEntry)) {\n mainWiring = injectImport(mainEntry, mainInitPath);\n }\n\n // ── Renderer: HTML-with-CSP apps use the IIFE bundle; module-system\n // apps use the .mjs init.\n const htmlFiles = findRendererHtmlFiles(projectRoot);\n let rendererInitPath: string;\n if (htmlFiles.length > 0) {\n const rendererDir = dirname(htmlFiles[0]!);\n rendererInitPath = join(rendererDir, \"gg-pixel.browser.iife.js\");\n if (!copyIifeBundle(projectRoot, rendererInitPath)) {\n warnings.push(\n \"Could not copy gg-pixel browser IIFE bundle — install @kenkaiiii/gg-pixel and re-run.\",\n );\n }\n let patchedAny = false;\n for (const html of htmlFiles) {\n if (patchRendererHtml(html, rendererInitPath, projectKey, ingestUrl) === \"patched\") {\n patchedAny = true;\n }\n }\n if (!patchedAny) {\n warnings.push(\n `Found HTML files in ${rendererDir} but couldn't patch any — they may have unusual CSP or no <head>.`,\n );\n }\n } else {\n rendererInitPath = join(projectRoot, \"gg-pixel.renderer.mjs\");\n writeFileSync(rendererInitPath, renderBrowserInitFile(ingestUrl, projectKey), \"utf8\");\n const rendererEntry = pickPath(projectRoot, [\n \"src/renderer/index.ts\",\n \"src/renderer/index.tsx\",\n \"src/renderer/index.js\",\n \"src/renderer/main.ts\",\n \"src/renderer/main.tsx\",\n \"src/renderer/main.js\",\n \"renderer/index.ts\",\n \"renderer/index.tsx\",\n \"renderer/index.js\",\n \"renderer.ts\",\n \"renderer.tsx\",\n \"renderer.js\",\n \"src/index.tsx\",\n \"src/index.jsx\",\n \"src/main.tsx\",\n \"src/main.jsx\",\n ]);\n if (rendererEntry) injectImport(rendererEntry, rendererInitPath);\n else\n warnings.push(\n 'Could not auto-detect the Electron renderer entry. Add `import \"./gg-pixel.renderer.mjs\";` to the top of your renderer entry file.',\n );\n }\n\n return {\n primaryInitPath: rendererInitPath,\n entryWiring: { kind: \"injected\", entryPath: rendererInitPath },\n secondaryInit: {\n path: mainInitPath,\n description:\n \"Electron main-process init\" +\n (mainWiring.kind === \"injected\" ? ` (wired into ${mainEntry})` : \"\"),\n },\n warnings,\n };\n}\n\nfunction resolveMainEntryFromPkg(projectRoot: string, pkg: PackageJson): string | null {\n if (pkg.main) {\n const sourceCandidates: string[] = [];\n const main = pkg.main;\n // dist/X.js → src/X.ts (most common TS-compiled layout)\n if (/^(dist|build|\\.next|out)\\//.test(main)) {\n const swap = main.replace(/^(dist|build|\\.next|out)\\//, \"src/\");\n if (swap.endsWith(\".js\")) {\n sourceCandidates.push(swap.replace(/\\.js$/, \".ts\"));\n sourceCandidates.push(swap.replace(/\\.js$/, \".tsx\"));\n }\n sourceCandidates.push(swap);\n }\n if (main.endsWith(\".js\")) {\n sourceCandidates.push(main.replace(/\\.js$/, \".ts\"));\n sourceCandidates.push(main.replace(/\\.js$/, \".tsx\"));\n }\n for (const c of sourceCandidates) {\n const p = join(projectRoot, c);\n if (existsSync(p)) return p;\n }\n const literal = join(projectRoot, main);\n if (existsSync(literal)) return literal;\n }\n return pickPath(projectRoot, [\n \"main.js\",\n \"main.ts\",\n \"src/main.js\",\n \"src/main.ts\",\n \"src/main/index.ts\",\n \"src/main/index.js\",\n \"electron/main.js\",\n \"electron/main.ts\",\n ]);\n}\n\nconst RENDERER_HTML_DIRS = [\"ui\", \"renderer\", \"src/renderer\", \"public\", \"static\"];\n\nfunction findRendererHtmlFiles(projectRoot: string): string[] {\n for (const dir of RENDERER_HTML_DIRS) {\n const root = join(projectRoot, dir);\n if (!existsSync(root)) continue;\n const html: string[] = [];\n let entries: string[];\n try {\n entries = readdirSync(root);\n } catch {\n continue;\n }\n for (const e of entries) {\n if (!e.endsWith(\".html\")) continue;\n const p = join(root, e);\n try {\n const c = readFileSync(p, \"utf8\");\n if (/<meta[^>]+content-security-policy/i.test(c) || /<script[\\s>]/i.test(c)) {\n html.push(p);\n }\n } catch {\n // ignore\n }\n }\n if (html.length > 0) return html;\n }\n return [];\n}\n\nfunction copyIifeBundle(projectRoot: string, dest: string): boolean {\n const candidates = [\n join(projectRoot, \"node_modules/@kenkaiiii/gg-pixel/dist/browser.iife.global.js\"),\n join(projectRoot, \"node_modules/@kenkaiiii/gg-pixel/dist/browser.iife.js\"),\n ];\n for (const c of candidates) {\n if (existsSync(c)) {\n try {\n writeFileSync(dest, readFileSync(c, \"utf8\"), \"utf8\");\n return true;\n } catch {\n // continue\n }\n }\n }\n return false;\n}\n\nfunction patchRendererHtml(\n htmlPath: string,\n iifePath: string,\n projectKey: string,\n ingestUrl: string,\n): \"patched\" | \"already\" | \"not-applicable\" {\n let content: string;\n try {\n content = readFileSync(htmlPath, \"utf8\");\n } catch {\n return \"not-applicable\";\n }\n if (content.includes(\"gg-pixel.browser.iife\")) return \"already\";\n\n const ingestOrigin = new URL(ingestUrl).origin;\n // Match content=\"...\" OR content='...'. Critical: don't use `[^\"']` for\n // the inner — CSPs legitimately contain `'self'` etc., which would halt\n // a `[^\"']+` match at the first single-quote and corrupt the directive.\n content = content.replace(\n /(<meta[^>]+http-equiv=[\"']?content-security-policy[\"']?[^>]*content=)(\"([^\"]+)\"|'([^']+)')/i,\n (\n _match: string,\n before: string,\n _all: string,\n dq: string | undefined,\n sq: string | undefined,\n ) => {\n const quote = dq !== undefined ? '\"' : \"'\";\n const csp = dq !== undefined ? dq : (sq as string);\n let updated = csp;\n if (/connect-src\\s/i.test(csp)) {\n if (!csp.includes(ingestOrigin)) {\n updated = csp.replace(/(connect-src[^;]*)/i, `$1 ${ingestOrigin}`);\n }\n } else {\n updated = csp.trim().replace(/;?$/, `; connect-src 'self' ${ingestOrigin};`);\n }\n return before + quote + updated + quote;\n },\n );\n\n const relScript = relative(dirname(htmlPath), iifePath).split(sep).join(\"/\");\n const inject = `\\n <!-- gg-pixel: auto-wired by ggcoder pixel install -->\\n <script src=\"${relScript}\"></script>\\n <script>\\n if (window.GGPixel) GGPixel.initPixel({ projectKey: ${JSON.stringify(projectKey)}, ingestUrl: ${JSON.stringify(ingestUrl)} });\\n </script>\\n`;\n if (/<head[^>]*>/i.test(content)) {\n content = content.replace(/(<head[^>]*>)/i, `$1${inject}`);\n } else if (/<html[^>]*>/i.test(content)) {\n content = content.replace(/(<html[^>]*>)/i, `$1<head>${inject}</head>`);\n } else {\n return \"not-applicable\";\n }\n writeFileSync(htmlPath, content, \"utf8\");\n return \"patched\";\n}\n\nfunction wireTauri({ projectRoot, pkg, projectKey, ingestUrl }: WiringInput): WiringResult {\n // Tauri frontend = web. Use Browser SDK on the JS side.\n // The Rust backend has no SDK yet — we say so honestly.\n const initPath = join(projectRoot, \"gg-pixel.init.mjs\");\n writeFileSync(initPath, renderBrowserInitFile(ingestUrl, projectKey), \"utf8\");\n const entryWiring = wireEntryFile(projectRoot, initPath, pkg);\n return {\n primaryInitPath: initPath,\n entryWiring,\n warnings: [\n \"Tauri Rust backend is not instrumented — no Rust SDK exists yet. Frontend errors are captured.\",\n ],\n };\n}\n\nfunction wireWorkers({ projectRoot, projectKey, ingestUrl }: WiringInput): WiringResult {\n // Cloudflare Workers / Vercel Edge / etc. The user's worker exports a default\n // object with fetch/scheduled/queue handlers. We can't safely refactor their\n // default export with regex, so we drop a snippet showing the wrap pattern\n // and warn the user.\n const initPath = join(projectRoot, \"gg-pixel.workers.snippet.ts\");\n writeFileSync(\n initPath,\n `// gg-pixel — Cloudflare Workers wiring snippet.\n// Auto-generated by ggcoder pixel install. Wrap your default export with\n// withPixel(...) so any throw in your handler is auto-reported. Example:\n//\n// import { withPixel } from \"@kenkaiiii/gg-pixel/workers\";\n//\n// export default withPixel(\n// { projectKey: ${JSON.stringify(projectKey)} },\n// {\n// async fetch(req, env, ctx) { /* your code */ },\n// async scheduled(evt, env, ctx) { /* your code */ },\n// },\n// );\n//\n// For manual reports inside a handler:\n//\n// import { reportPixel } from \"@kenkaiiii/gg-pixel/workers\";\n// reportPixel(ctx, { projectKey: ${JSON.stringify(projectKey)} }, {\n// message: \"user clicked the broken button\",\n// });\n//\n// Your project_key is publishable — safe to commit.\n\nimport { withPixel, reportPixel } from \"@kenkaiiii/gg-pixel/workers\";\nexport const PIXEL_KEY = ${JSON.stringify(projectKey)};\nexport const PIXEL_INGEST = ${JSON.stringify(ingestUrl)};\nexport { withPixel, reportPixel };\n`,\n \"utf8\",\n );\n return {\n primaryInitPath: initPath,\n entryWiring: { kind: \"no_entry_found\" },\n warnings: [\n `Cloudflare Workers default exports can't be auto-wrapped safely. Open ${initPath} for a 3-line snippet you can paste into your worker.`,\n ],\n };\n}\n\nfunction wireReactNative({ projectRoot }: WiringInput): WiringResult {\n // RN's JS engine is neither a real browser nor Node. Our current SDKs\n // don't reliably hook it. Be honest rather than ship something broken.\n return {\n primaryInitPath: join(projectRoot, \"(not-installed)\"),\n entryWiring: { kind: \"skipped\", reason: \"react-native SDK not built yet\" },\n warnings: [\n \"React Native is not yet supported — its JS runtime is neither browser nor Node.\",\n \"A dedicated React Native SDK will be a future slice.\",\n ],\n };\n}\n\n// ── small helpers used by the per-framework writers ────────────────\n\nfunction pickPath(root: string, candidates: string[]): string | null {\n for (const c of candidates) {\n const p = join(root, c);\n if (existsSync(p)) return p;\n }\n return null;\n}\n\nfunction appendOrCreate(filePath: string, snippet: string, marker: string): void {\n if (existsSync(filePath)) {\n const existing = readFileSync(filePath, \"utf8\");\n if (existing.includes(marker)) return;\n writeFileSync(filePath, existing + \"\\n\" + snippet, \"utf8\");\n return;\n }\n writeFileSync(filePath, snippet, \"utf8\");\n}\n\nfunction injectImport(entryPath: string, initFilePath: string): EntryWiringResult {\n let content: string;\n try {\n content = readFileSync(entryPath, \"utf8\");\n } catch (err) {\n return { kind: \"skipped\", reason: `unreadable: ${(err as Error).message}` };\n }\n const initBasename = initFilePath.split(sep).pop() ?? \"gg-pixel.init.mjs\";\n if (content.includes(initBasename) || content.includes(\"@kenkaiiii/gg-pixel\")) {\n return { kind: \"already_present\", entryPath };\n }\n const fromDir = dirname(entryPath);\n let spec = relative(fromDir, initFilePath).split(sep).join(\"/\");\n if (!spec.startsWith(\".\")) spec = \"./\" + spec;\n // Detect CJS by content: .cjs, or .js using `require(` and lacking ESM markers.\n // Electron's main.js is the canonical case here.\n const isCjs =\n entryPath.endsWith(\".cjs\") ||\n (entryPath.endsWith(\".js\") &&\n /\\brequire\\s*\\(/.test(content) &&\n !/\\bimport\\s+/.test(content) &&\n !/\\bexport\\s+/.test(content));\n const importLine = isCjs\n ? `require(${JSON.stringify(spec)});`\n : `import ${JSON.stringify(spec)};`;\n const lines = content.split(\"\\n\");\n let insertAt = 0;\n if (lines[0]?.startsWith(\"#!\")) insertAt = 1;\n while (\n insertAt < lines.length &&\n /^\\s*(?:[\"']use strict[\"']|\\/\\/|\\/\\*)/.test(lines[insertAt] ?? \"\")\n ) {\n insertAt++;\n }\n const updated = [...lines.slice(0, insertAt), importLine, ...lines.slice(insertAt)].join(\"\\n\");\n writeFileSync(entryPath, updated, \"utf8\");\n return { kind: \"injected\", entryPath };\n}\n\n// ── /Framework wiring ───────────────────────────────────────────────\n\nexport function isBrowserProject(pkg: PackageJson, projectRoot: string): boolean {\n const all = { ...(pkg.dependencies ?? {}), ...(pkg.devDependencies ?? {}) };\n const browserishDeps = [\n \"react\",\n \"react-dom\",\n \"vue\",\n \"@vue/runtime-core\",\n \"svelte\",\n \"next\",\n \"vite\",\n \"@vitejs/plugin-react\",\n \"@angular/core\",\n \"solid-js\",\n \"preact\",\n \"@remix-run/react\",\n \"astro\",\n \"qwik\",\n \"@sveltejs/kit\",\n \"expo\",\n ];\n if (browserishDeps.some((d) => d in all)) return true;\n if (pkg.browser !== undefined) return true;\n if (existsSync(join(projectRoot, \"index.html\"))) return true;\n if (existsSync(join(projectRoot, \"public\", \"index.html\"))) return true;\n return false;\n}\n\nexport function renderBrowserInitFile(ingestUrl: string, projectKey: string): string {\n return `// gg-pixel init — auto-generated by ggcoder pixel install.\n// The project_key is publishable (designed to live in browser bundles).\nimport { initPixel } from \"@kenkaiiii/gg-pixel/browser\";\n\ninitPixel({\n projectKey: ${JSON.stringify(projectKey)},\n ingestUrl: ${JSON.stringify(ingestUrl)},\n});\n`;\n}\n\n// ── Python ──────────────────────────────────────────────────────────\n\nconst PYTHON_MARKERS = [\"pyproject.toml\", \"setup.py\", \"requirements.txt\", \"Pipfile\"];\n\nexport function findPythonProjectRoot(start: string): string | null {\n let dir = start;\n for (let i = 0; i < 20; i++) {\n if (PYTHON_MARKERS.some((m) => existsSync(join(dir, m)))) return dir;\n const parent = dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n return null;\n}\n\nexport function detectPythonPackageManager(projectRoot: string): PythonPackageManager {\n if (existsSync(join(projectRoot, \"uv.lock\"))) return \"uv\";\n if (existsSync(join(projectRoot, \"poetry.lock\"))) return \"poetry\";\n if (existsSync(join(projectRoot, \"Pipfile.lock\"))) return \"pipenv\";\n return \"pip\";\n}\n\nfunction pickClosestRoot(roots: Array<string | null>): string | null {\n let best: string | null = null;\n for (const r of roots) {\n if (!r) continue;\n if (!best || r.length > best.length) best = r;\n }\n return best;\n}\n\nconst GO_MARKER = \"go.mod\";\nconst RUBY_MARKERS = [\"Gemfile\"];\n\nexport function findGoProjectRoot(start: string): string | null {\n let dir = start;\n for (let i = 0; i < 20; i++) {\n if (existsSync(join(dir, GO_MARKER))) return dir;\n const parent = dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n return null;\n}\n\nexport function findRubyProjectRoot(start: string): string | null {\n let dir = start;\n for (let i = 0; i < 20; i++) {\n for (const m of RUBY_MARKERS) {\n if (existsSync(join(dir, m))) return dir;\n }\n // Also catch *.gemspec files at this level.\n try {\n const entries = readdirSync(dir);\n if (entries.some((e) => e.endsWith(\".gemspec\"))) return dir;\n } catch {\n // ignore\n }\n const parent = dirname(dir);\n if (parent === dir) return null;\n dir = parent;\n }\n return null;\n}\n\ninterface NativeInstallContext {\n projectRoot: string;\n opts: InstallOptions;\n ingestUrl: string;\n fetchFn: typeof fetch;\n home: string;\n}\n\nasync function installGo(ctx: NativeInstallContext): Promise<InstallResult> {\n const { projectRoot, opts, ingestUrl, fetchFn, home } = ctx;\n const projectName =\n opts.projectName ?? readGoModuleName(projectRoot) ?? projectRoot.split(\"/\").pop() ?? \"unnamed\";\n const projectsJsonPath = join(home, \".gg\", \"projects.json\");\n const envFilePath = join(projectRoot, \".env\");\n\n const existing = findMappingByPath(projectsJsonPath, projectRoot);\n const existingKey = readEnvKey(envFilePath, \"GG_PIXEL_KEY\");\n let created: CreatedProject;\n let reused = false;\n if (existing && existing.secret && existingKey) {\n created = { id: existing.id, key: existingKey, secret: existing.secret };\n reused = true;\n } else {\n created = await createProject(fetchFn, ingestUrl, projectName);\n }\n\n const packageInstalled = opts.skipPackageInstall ? false : runGoGet(projectRoot);\n\n const initFilePath = join(projectRoot, \"gg_pixel_init.go\");\n writeFileSync(\n initFilePath,\n `// gg-pixel init — auto-generated by ggcoder pixel install.\npackage main\n\nimport (\n\t\"os\"\n\tgg \"github.com/kenkaiiii/gg-pixel-go\"\n)\n\nfunc init() {\n\tkey := os.Getenv(\"GG_PIXEL_KEY\")\n\tif key == \"\" {\n\t\tkey = ${JSON.stringify(created.key)}\n\t}\n\t_ = gg.Init(gg.Options{ProjectKey: key, IngestURL: ${JSON.stringify(`${ingestUrl}/ingest`)}})\n}\n`,\n \"utf8\",\n );\n\n writeEnvKey(envFilePath, \"GG_PIXEL_KEY\", created.key);\n writeProjectsMapping(projectsJsonPath, created.id, projectName, projectRoot, created.secret);\n\n return {\n projectId: created.id,\n projectKey: created.key,\n projectSecret: created.secret,\n projectName,\n projectKind: \"go\",\n initFilePath,\n envFilePath,\n projectsJsonPath,\n packageManager: \"pip\",\n packageInstalled,\n entryWiring: { kind: \"no_entry_found\" },\n reused,\n warnings: [\n \"Add `defer ggpixel.Recover()` near the top of your main() so panics are captured before the process exits.\",\n ],\n };\n}\n\nfunction readGoModuleName(projectRoot: string): string | null {\n try {\n const content = readFileSync(join(projectRoot, \"go.mod\"), \"utf8\");\n const match = /^\\s*module\\s+(\\S+)\\s*$/m.exec(content);\n if (!match) return null;\n return match[1]!.split(\"/\").pop() ?? null;\n } catch {\n return null;\n }\n}\n\nfunction runGoGet(projectRoot: string): boolean {\n const result = spawnSync(\"go\", [\"get\", \"github.com/kenkaiiii/gg-pixel-go@latest\"], {\n cwd: projectRoot,\n stdio: \"inherit\",\n });\n return result.status === 0;\n}\n\nasync function installRuby(ctx: NativeInstallContext): Promise<InstallResult> {\n const { projectRoot, opts, ingestUrl, fetchFn, home } = ctx;\n const projectName =\n opts.projectName ?? readRubyAppName(projectRoot) ?? projectRoot.split(\"/\").pop() ?? \"unnamed\";\n const projectsJsonPath = join(home, \".gg\", \"projects.json\");\n const envFilePath = join(projectRoot, \".env\");\n\n const existing = findMappingByPath(projectsJsonPath, projectRoot);\n const existingKey = readEnvKey(envFilePath, \"GG_PIXEL_KEY\");\n let created: CreatedProject;\n let reused = false;\n if (existing && existing.secret && existingKey) {\n created = { id: existing.id, key: existingKey, secret: existing.secret };\n reused = true;\n } else {\n created = await createProject(fetchFn, ingestUrl, projectName);\n }\n\n const packageInstalled = opts.skipPackageInstall ? false : runRubyInstall(projectRoot);\n\n const initFilePath = join(projectRoot, \"gg_pixel_init.rb\");\n writeFileSync(\n initFilePath,\n `# gg-pixel init — auto-generated by ggcoder pixel install.\nrequire \"gg_pixel\"\nGGPixel.init(\n project_key: ENV[\"GG_PIXEL_KEY\"] || ${JSON.stringify(created.key)},\n ingest_url: ${JSON.stringify(`${ingestUrl}/ingest`)},\n)\n`,\n \"utf8\",\n );\n\n writeEnvKey(envFilePath, \"GG_PIXEL_KEY\", created.key);\n writeProjectsMapping(projectsJsonPath, created.id, projectName, projectRoot, created.secret);\n\n return {\n projectId: created.id,\n projectKey: created.key,\n projectSecret: created.secret,\n projectName,\n projectKind: \"ruby\",\n initFilePath,\n envFilePath,\n projectsJsonPath,\n packageManager: \"pip\",\n packageInstalled,\n entryWiring: { kind: \"no_entry_found\" },\n reused,\n warnings: [\n `Add \\`require \"./gg_pixel_init\"\\` at the top of your entry script (often \\`config/application.rb\\` for Rails, \\`app.rb\\` for Sinatra, or your main file).`,\n ],\n };\n}\n\nfunction readRubyAppName(projectRoot: string): string | null {\n try {\n const entries = readdirSync(projectRoot);\n const gemspec = entries.find((e) => e.endsWith(\".gemspec\"));\n if (!gemspec) return null;\n return gemspec.replace(/\\.gemspec$/, \"\");\n } catch {\n return null;\n }\n}\n\nfunction runRubyInstall(projectRoot: string): boolean {\n // Prefer bundler if a Gemfile exists.\n if (existsSync(join(projectRoot, \"Gemfile\"))) {\n // Append to Gemfile if not present.\n try {\n const content = readFileSync(join(projectRoot, \"Gemfile\"), \"utf8\");\n if (!content.includes(\"gg_pixel\")) {\n writeFileSync(\n join(projectRoot, \"Gemfile\"),\n content + (content.endsWith(\"\\n\") ? \"\" : \"\\n\") + 'gem \"gg_pixel\"\\n',\n \"utf8\",\n );\n }\n } catch {\n // ignore\n }\n const r = spawnSync(\"bundle\", [\"install\"], { cwd: projectRoot, stdio: \"inherit\" });\n if (r.status === 0) return true;\n }\n const r2 = spawnSync(\"gem\", [\"install\", \"gg_pixel\"], { cwd: projectRoot, stdio: \"inherit\" });\n return r2.status === 0;\n}\n\ninterface PythonInstallContext {\n projectRoot: string;\n opts: InstallOptions;\n ingestUrl: string;\n fetchFn: typeof fetch;\n home: string;\n}\n\nasync function installPython(ctx: PythonInstallContext): Promise<InstallResult> {\n const { projectRoot, opts, ingestUrl, fetchFn, home } = ctx;\n const projectName =\n opts.projectName ?? readPyprojectName(projectRoot) ?? projectRoot.split(\"/\").pop() ?? \"unnamed\";\n\n const projectsJsonPath = join(home, \".gg\", \"projects.json\");\n const envFilePath = join(projectRoot, \".env\");\n\n const existing = findMappingByPath(projectsJsonPath, projectRoot);\n const existingKey = readEnvKey(envFilePath, \"GG_PIXEL_KEY\");\n let created: CreatedProject;\n let reused = false;\n if (existing && existing.secret && existingKey) {\n created = { id: existing.id, key: existingKey, secret: existing.secret };\n reused = true;\n } else {\n created = await createProject(fetchFn, ingestUrl, projectName);\n }\n\n const pm = detectPythonPackageManager(projectRoot);\n const packageInstalled = opts.skipPackageInstall ? false : runPythonInstall(projectRoot, pm);\n\n const initFilePath = join(projectRoot, \"gg_pixel_init.py\");\n writeFileSync(initFilePath, renderPythonInitFile(ingestUrl, created.key), \"utf8\");\n\n writeEnvKey(envFilePath, \"GG_PIXEL_KEY\", created.key);\n writeProjectsMapping(projectsJsonPath, created.id, projectName, projectRoot, created.secret);\n\n const entryWiring = wirePythonEntry(projectRoot, initFilePath);\n\n return {\n projectId: created.id,\n projectKey: created.key,\n projectSecret: created.secret,\n projectName,\n projectKind: \"python\",\n initFilePath,\n envFilePath,\n projectsJsonPath,\n packageManager: pm,\n packageInstalled,\n entryWiring,\n reused,\n warnings: [],\n };\n}\n\nfunction readPyprojectName(projectRoot: string): string | null {\n const path = join(projectRoot, \"pyproject.toml\");\n if (!existsSync(path)) return null;\n try {\n const content = readFileSync(path, \"utf8\");\n const match = /^\\s*name\\s*=\\s*[\"']([^\"']+)[\"']/m.exec(content);\n return match?.[1] ?? null;\n } catch {\n return null;\n }\n}\n\nfunction runPythonInstall(projectRoot: string, pm: PythonPackageManager): boolean {\n const cmd =\n pm === \"uv\"\n ? [\"uv\", [\"add\", \"gg-pixel\"]]\n : pm === \"poetry\"\n ? [\"poetry\", [\"add\", \"gg-pixel\"]]\n : pm === \"pipenv\"\n ? [\"pipenv\", [\"install\", \"gg-pixel\"]]\n : [\"pip\", [\"install\", \"gg-pixel\"]];\n const result = spawnSync(cmd[0] as string, cmd[1] as string[], {\n cwd: projectRoot,\n stdio: \"inherit\",\n });\n if (result.status === 0) return true;\n // Fallback: many systems only have `pip3` on PATH.\n if (pm === \"pip\") {\n const r2 = spawnSync(\"pip3\", [\"install\", \"gg-pixel\"], {\n cwd: projectRoot,\n stdio: \"inherit\",\n });\n if (r2.status === 0) return true;\n const r3 = spawnSync(\"python3\", [\"-m\", \"pip\", \"install\", \"gg-pixel\"], {\n cwd: projectRoot,\n stdio: \"inherit\",\n });\n return r3.status === 0;\n }\n return false;\n}\n\nexport function renderPythonInitFile(ingestUrl: string, projectKey: string): string {\n return `\"\"\"gg-pixel init — auto-generated by ggcoder pixel install.\n\nThis file initializes error tracking. Importing it (which the install step\nwires into your entry file) registers the global Python error handlers.\n\"\"\"\nimport os\n\nimport gg_pixel\n\ngg_pixel.init_pixel(\n project_key=os.environ.get(\"GG_PIXEL_KEY\") or ${JSON.stringify(projectKey)},\n ingest_url=${JSON.stringify(`${ingestUrl}/ingest`)},\n)\n`;\n}\n\nfunction wirePythonEntry(projectRoot: string, initFilePath: string): EntryWiringResult {\n const entryPath = findPythonEntryFile(projectRoot);\n if (!entryPath) return { kind: \"no_entry_found\" };\n\n let content: string;\n try {\n content = readFileSync(entryPath, \"utf8\");\n } catch (err) {\n return { kind: \"skipped\", reason: `unreadable: ${(err as Error).message}` };\n }\n\n if (content.includes(\"gg_pixel_init\")) {\n return { kind: \"already_present\", entryPath };\n }\n\n // Compute import name from the relative path. gg_pixel_init.py at root →\n // `gg_pixel_init`. For nested, the user can adjust manually.\n const fromDir = dirname(entryPath);\n const rel = relative(fromDir, initFilePath).split(sep).join(\"/\");\n let moduleSpec: string;\n if (rel === \"gg_pixel_init.py\") {\n moduleSpec = \"gg_pixel_init\";\n } else if (rel.startsWith(\"../\")) {\n // Init is above the entry — Python imports don't traverse via path,\n // so insert via sys.path manipulation as a fallback.\n moduleSpec = \"gg_pixel_init\";\n } else {\n // Same-or-deeper directory: use module path.\n moduleSpec = rel.replace(/\\.py$/, \"\").replace(/\\//g, \".\");\n }\n\n const importLine = `import ${moduleSpec} # noqa: F401, E402 -- gg-pixel`;\n\n const lines = content.split(\"\\n\");\n let insertAt = 0;\n if (lines[0]?.startsWith(\"#!\")) insertAt = 1;\n // Skip encoding declarations and module docstrings.\n while (insertAt < lines.length && /^\\s*(?:#.*coding[:=]|[\"']{3}|#)/.test(lines[insertAt] ?? \"\")) {\n insertAt++;\n }\n\n const updated = [...lines.slice(0, insertAt), importLine, ...lines.slice(insertAt)].join(\"\\n\");\n writeFileSync(entryPath, updated, \"utf8\");\n return { kind: \"injected\", entryPath };\n}\n\nfunction findPythonEntryFile(projectRoot: string): string | null {\n const tryPath = (rel: string): string | null => {\n const p = join(projectRoot, rel);\n return existsSync(p) ? p : null;\n };\n const candidates = [\n \"main.py\",\n \"app.py\",\n \"server.py\",\n \"manage.py\",\n \"wsgi.py\",\n \"asgi.py\",\n \"__main__.py\",\n \"src/main.py\",\n \"src/app.py\",\n \"src/server.py\",\n \"src/__main__.py\",\n ];\n for (const c of candidates) {\n const found = tryPath(c);\n if (found) return found;\n }\n return null;\n}\n\n// ── /Python ─────────────────────────────────────────────────────────\n\nexport function writeProjectsMapping(\n projectsJsonPath: string,\n projectId: string,\n name: string,\n path: string,\n secret?: string,\n): void {\n mkdirSync(dirname(projectsJsonPath), { recursive: true });\n let map: Record<string, { name: string; path: string; secret?: string }> = {};\n if (existsSync(projectsJsonPath)) {\n try {\n map = JSON.parse(readFileSync(projectsJsonPath, \"utf8\")) as typeof map;\n } catch {\n // start fresh on corrupt file\n }\n }\n const entry: { name: string; path: string; secret?: string } = { name, path };\n if (secret) entry.secret = secret;\n map[projectId] = entry;\n writeFileSync(projectsJsonPath, `${JSON.stringify(map, null, 2)}\\n`, \"utf8\");\n}\n","import { install, DEFAULT_INGEST_URL } from \"./install.js\";\n\ninterface ParsedArgs {\n command: string;\n ingestUrl?: string;\n name?: string;\n skipPackageInstall: boolean;\n help: boolean;\n}\n\nfunction parse(argv: string[]): ParsedArgs {\n const out: ParsedArgs = { command: argv[0] ?? \"\", skipPackageInstall: false, help: false };\n for (let i = 1; i < argv.length; i++) {\n const a = argv[i];\n if (a === \"--ingest-url\") out.ingestUrl = argv[++i];\n else if (a === \"--name\") out.name = argv[++i];\n else if (a === \"--skip-install\") out.skipPackageInstall = true;\n else if (a === \"--help\" || a === \"-h\") out.help = true;\n }\n return out;\n}\n\nfunction printUsage(): void {\n console.log(`gg-pixel install — drop the pixel into the current project\n\nUsage:\n gg-pixel install [--name <project-name>] [--ingest-url <url>] [--skip-install]\n\nOptions:\n --name Project name to register (defaults to package.json name)\n --ingest-url Backend URL (defaults to ${DEFAULT_INGEST_URL})\n --skip-install Skip the package-manager install step (useful for testing)\n`);\n}\n\nasync function main(argv: string[]): Promise<void> {\n const args = parse(argv);\n if (args.help || !args.command) {\n printUsage();\n return;\n }\n if (args.command !== \"install\") {\n console.error(`Unknown command: ${args.command}`);\n printUsage();\n process.exitCode = 1;\n return;\n }\n\n const result = await install({\n ingestUrl: args.ingestUrl,\n projectName: args.name,\n skipPackageInstall: args.skipPackageInstall,\n });\n\n console.log(\"\");\n console.log(result.reused ? \"Pixel re-wired (existing project).\" : \"Pixel installed.\");\n console.log(` Project: ${result.projectName} (${result.projectId})`);\n console.log(` Kind: ${result.projectKind}`);\n console.log(` Wrote: ${result.initFilePath}`);\n console.log(` Wrote env: ${result.envFilePath}`);\n console.log(` Mapping saved: ${result.projectsJsonPath}`);\n switch (result.entryWiring.kind) {\n case \"injected\":\n console.log(` Wired entry: ${result.entryWiring.entryPath}`);\n break;\n case \"already_present\":\n console.log(` Entry: ${result.entryWiring.entryPath} (already wired)`);\n break;\n case \"no_entry_found\":\n console.log(` ⚠ Could not auto-detect your entry file.`);\n console.log(` Add this line to the TOP of your entry file manually:`);\n console.log(` import \"./gg-pixel.init.mjs\";`);\n break;\n case \"skipped\":\n console.log(` ⚠ Entry wiring skipped: ${result.entryWiring.reason}`);\n break;\n }\n if (!result.packageInstalled && !args.skipPackageInstall) {\n console.log(` ⚠ Package install failed via ${result.packageManager}. Run it manually.`);\n }\n if (result.secondaryInit) {\n console.log(` Also wrote: ${result.secondaryInit.path}`);\n console.log(` ${result.secondaryInit.description}`);\n }\n for (const w of result.warnings) {\n console.log(` ⚠ ${w}`);\n }\n console.log(\"\");\n}\n\nmain(process.argv.slice(2)).catch((err: unknown) => {\n console.error(err instanceof Error ? err.message : String(err));\n process.exitCode = 1;\n});\n"],"mappings":";;;AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,eAAe;AACxB,SAAS,SAAS,MAAM,UAAU,SAAS,WAAW;AACtD,SAAS,iBAAiB;AAEnB,IAAM,qBAAqB;AAwElC,eAAsB,QAAQ,OAAuB,CAAC,GAA2B;AAC/E,QAAM,MAAM,QAAQ,KAAK,OAAO,QAAQ,IAAI,CAAC;AAC7C,QAAM,aAAa,KAAK,aAAa,oBAAoB,QAAQ,QAAQ,EAAE;AAC3E,QAAM,UAAU,KAAK,WAAW;AAChC,QAAM,OAAO,KAAK,WAAW,QAAQ;AAIrC,QAAM,WAAW,gBAAgB,GAAG;AACpC,QAAM,aAAa,sBAAsB,GAAG;AAC5C,QAAM,SAAS,kBAAkB,GAAG;AACpC,QAAM,WAAW,oBAAoB,GAAG;AAExC,MAAI,CAAC,YAAY,CAAC,cAAc,CAAC,UAAU,CAAC,UAAU;AACpD,UAAM,IAAI;AAAA,MACR,uBAAuB,GAAG;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,cAAc,gBAAgB,CAAC,UAAU,YAAY,QAAQ,QAAQ,CAAC;AAE5E,MAAI,gBAAgB,UAAU,QAAQ;AACpC,WAAO,UAAU,EAAE,aAAa,QAAQ,MAAM,WAAW,SAAS,KAAK,CAAC;AAAA,EAC1E;AACA,MAAI,gBAAgB,YAAY,UAAU;AACxC,WAAO,YAAY,EAAE,aAAa,UAAU,MAAM,WAAW,SAAS,KAAK,CAAC;AAAA,EAC9E;AACA,MAAI,gBAAgB,cAAc,YAAY;AAC5C,WAAO,cAAc,EAAE,aAAa,YAAY,MAAM,WAAW,SAAS,KAAK,CAAC;AAAA,EAClF;AAGA,MAAI,CAAC,UAAU;AACb,UAAM,IAAI,MAAM,qDAAqD;AAAA,EACvE;AACA,QAAM,UAAU,KAAK,UAAU,cAAc;AAC7C,QAAM,MAAM,KAAK,MAAM,aAAa,SAAS,MAAM,CAAC;AACpD,QAAM,cAAc,KAAK,eAAe,IAAI,QAAQ,SAAS,MAAM,GAAG,EAAE,IAAI,KAAK;AACjF,QAAM,OAAO,oBAAoB,KAAK,QAAQ;AAE9C,QAAM,mBAAmB,KAAK,MAAM,OAAO,eAAe;AAC1D,QAAM,cAAc,KAAK,UAAU,MAAM;AAEzC,QAAM,WAAW,kBAAkB,kBAAkB,QAAQ;AAC7D,QAAM,cAAc,WAAW,aAAa,cAAc;AAC1D,MAAI;AACJ,MAAI,SAAS;AAIb,MAAI,YAAY,SAAS,UAAU,aAAa;AAC9C,cAAU,EAAE,IAAI,SAAS,IAAI,KAAK,aAAa,QAAQ,SAAS,OAAO;AACvE,aAAS;AAAA,EACX,OAAO;AACL,cAAU,MAAM,cAAc,SAAS,WAAW,WAAW;AAAA,EAC/D;AAEA,QAAM,KAAK,qBAAqB,QAAQ;AACxC,QAAM,mBAAmB,KAAK,qBAC1B,QACA,WAAW,UAAU,IAAI,qBAAqB;AAGlD,QAAM,QAAQ,cAAc;AAAA,IAC1B;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA,YAAY,QAAQ;AAAA,IACpB;AAAA,EACF,CAAC;AAKD,MAAI,SAAS,aAAa,SAAS,SAAS;AAC1C,gBAAY,aAAa,gBAAgB,QAAQ,GAAG;AAAA,EACtD;AAEA,uBAAqB,kBAAkB,QAAQ,IAAI,aAAa,UAAU,QAAQ,MAAM;AAExF,SAAO;AAAA,IACL,WAAW,QAAQ;AAAA,IACnB,YAAY,QAAQ;AAAA,IACpB,eAAe,QAAQ;AAAA,IACvB;AAAA,IACA,aAAa;AAAA,IACb,cAAc,MAAM;AAAA,IACpB;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB;AAAA,IACA,aAAa,MAAM;AAAA,IACnB;AAAA,IACA,eAAe,MAAM;AAAA,IACrB,UAAU,MAAM;AAAA,EAClB;AACF;AAQA,SAAS,kBACP,kBACA,aACoE;AACpE,MAAI,CAAC,WAAW,gBAAgB,EAAG,QAAO;AAC1C,MAAI;AACJ,MAAI;AACF,UAAM,KAAK,MAAM,aAAa,kBAAkB,MAAM,CAAC;AAAA,EACzD,QAAQ;AACN,WAAO;AAAA,EACT;AACA,aAAW,CAAC,IAAI,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC7C,QAAI,MAAM,SAAS,YAAa,QAAO,EAAE,IAAI,GAAG,MAAM;AAAA,EACxD;AACA,SAAO;AACT;AAEA,SAAS,WAAW,SAAiB,KAA4B;AAC/D,MAAI,CAAC,WAAW,OAAO,EAAG,QAAO;AACjC,MAAI;AACF,UAAM,UAAU,aAAa,SAAS,MAAM;AAC5C,UAAM,QAAQ,IAAI,OAAO,IAAI,GAAG,UAAU,GAAG,EAAE,KAAK,OAAO;AAC3D,WAAO,QAAQ,CAAC,GAAG,KAAK,KAAK;AAAA,EAC/B,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,gBAAgB,OAA8B;AACrD,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,QAAI,WAAW,KAAK,KAAK,cAAc,CAAC,EAAG,QAAO;AAClD,UAAM,SAAS,QAAQ,GAAG;AAC1B,QAAI,WAAW,IAAK,QAAO;AAC3B,UAAM;AAAA,EACR;AACA,SAAO;AACT;AAEA,eAAe,cACb,SACA,WACA,MACyB;AACzB,QAAM,MAAM,MAAM,QAAQ,GAAG,SAAS,iBAAiB;AAAA,IACrD,QAAQ;AAAA,IACR,SAAS,EAAE,gBAAgB,mBAAmB;AAAA,IAC9C,MAAM,KAAK,UAAU,EAAE,KAAK,CAAC;AAAA,EAC/B,CAAC;AACD,MAAI,CAAC,IAAI,IAAI;AACX,UAAM,IAAI,MAAM,8BAA8B,IAAI,MAAM,IAAI,MAAM,SAAS,GAAG,CAAC,EAAE;AAAA,EACnF;AACA,QAAM,OAAQ,MAAM,IAAI,KAAK;AAC7B,MAAI,CAAC,KAAK,MAAM,CAAC,KAAK,OAAO,CAAC,KAAK,QAAQ;AACzC,UAAM,IAAI,MAAM,gCAAgC;AAAA,EAClD;AACA,SAAO,EAAE,IAAI,KAAK,IAAI,KAAK,KAAK,KAAK,QAAQ,KAAK,OAAO;AAC3D;AAEA,eAAe,SAAS,GAA8B;AACpD,MAAI;AACF,WAAO,MAAM,EAAE,KAAK;AAAA,EACtB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEO,SAAS,qBAAqB,aAAqC;AACxE,MAAI,WAAW,KAAK,aAAa,gBAAgB,CAAC,EAAG,QAAO;AAC5D,MAAI,WAAW,KAAK,aAAa,WAAW,CAAC,EAAG,QAAO;AACvD,MAAI,WAAW,KAAK,aAAa,WAAW,CAAC,EAAG,QAAO;AACvD,SAAO;AACT;AAEA,SAAS,WAAW,aAAqB,IAAoB,KAAsB;AACjF,QAAM,MAAM;AAIZ,QAAM,OAAO,OAAO,QAAQ,CAAC,WAAW,KAAK,cAAc,WAAW,IAAI,CAAC,OAAO,GAAG;AACrF,QAAM,SAAS,UAAU,KAAK,MAAM,EAAE,KAAK,aAAa,OAAO,UAAU,CAAC;AAC1E,SAAO,OAAO,WAAW;AAC3B;AAEO,SAAS,eAAe,WAAmB,YAA6B;AAC7E,QAAM,WAAW,aAAa,OAAO,KAAK,UAAU,UAAU,CAAC,KAAK;AACpE,SAAO;AAAA;AAAA,sCAE6B,QAAQ;AAAA;AAAA;AAAA;AAAA,uCAIP,KAAK,UAAU,GAAG,SAAS,SAAS,CAAC;AAAA;AAAA;AAAA;AAI5E;AAEO,SAAS,kBAAkB,WAAmB,YAA6B;AAChF,QAAM,WAAW,aAAa,OAAO,KAAK,UAAU,UAAU,CAAC,KAAK;AACpE,SAAO;AAAA;AAAA,sCAE6B,QAAQ;AAAA;AAAA;AAAA;AAAA,uCAIP,KAAK,UAAU,GAAG,SAAS,SAAS,CAAC;AAAA;AAAA;AAAA;AAI5E;AAEO,SAAS,YAAY,SAAiB,KAAa,OAAqB;AAC7E,MAAI,WAAW,OAAO,GAAG;AACvB,UAAM,UAAU,aAAa,SAAS,MAAM;AAC5C,UAAM,YAAY,IAAI,OAAO,IAAI,GAAG,QAAQ,GAAG;AAC/C,QAAI,UAAU,KAAK,OAAO,GAAG;AAC3B,oBAAc,SAAS,QAAQ,QAAQ,WAAW,GAAG,GAAG,IAAI,KAAK,EAAE,GAAG,MAAM;AAC5E;AAAA,IACF;AACA,UAAMA,OAAM,QAAQ,SAAS,IAAI,KAAK,QAAQ,WAAW,IAAI,KAAK;AAClE,mBAAe,SAAS,GAAGA,IAAG,GAAG,GAAG,IAAI,KAAK;AAAA,GAAM,MAAM;AACzD;AAAA,EACF;AACA,gBAAc,SAAS,GAAG,GAAG,IAAI,KAAK;AAAA,GAAM,MAAM;AACpD;AAEO,SAAS,cACd,aACA,cACA,KACmB;AACnB,QAAM,YAAY,cAAc,aAAa,GAAG;AAChD,MAAI,CAAC,UAAW,QAAO,EAAE,MAAM,iBAAiB;AAEhD,MAAI;AACJ,MAAI;AACF,cAAU,aAAa,WAAW,MAAM;AAAA,EAC1C,SAAS,KAAK;AACZ,WAAO,EAAE,MAAM,WAAW,QAAQ,eAAgB,IAAc,OAAO,GAAG;AAAA,EAC5E;AAEA,MAAI,QAAQ,SAAS,eAAe,GAAG;AACrC,WAAO,EAAE,MAAM,mBAAmB,UAAU;AAAA,EAC9C;AAGA,QAAM,UAAU,QAAQ,SAAS;AACjC,MAAI,OAAO,SAAS,SAAS,YAAY,EAAE,MAAM,GAAG,EAAE,KAAK,GAAG;AAC9D,MAAI,CAAC,KAAK,WAAW,GAAG,EAAG,QAAO,OAAO;AAEzC,QAAM,QAAQ,gBAAgB,WAAW,GAAG;AAC5C,QAAM,aAAa,QACf,WAAW,KAAK,UAAU,IAAI,CAAC,OAC/B,UAAU,KAAK,UAAU,IAAI,CAAC;AAIlC,QAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,MAAI,WAAW;AACf,MAAI,MAAM,CAAC,GAAG,WAAW,IAAI,EAAG,YAAW;AAC3C,SACE,WAAW,MAAM,UACjB,uCAAuC,KAAK,MAAM,QAAQ,KAAK,EAAE,GACjE;AACA;AAAA,EACF;AAEA,QAAM,UAAU,CAAC,GAAG,MAAM,MAAM,GAAG,QAAQ,GAAG,YAAY,GAAG,MAAM,MAAM,QAAQ,CAAC,EAAE,KAAK,IAAI;AAC7F,gBAAc,WAAW,SAAS,MAAM;AACxC,SAAO,EAAE,MAAM,YAAY,UAAU;AACvC;AAEA,SAAS,cAAc,aAAqB,KAAiC;AAC3E,QAAM,UAAU,CAAC,QAA+B;AAC9C,UAAM,IAAI,KAAK,aAAa,GAAG;AAC/B,QAAI,WAAW,CAAC,EAAG,QAAO;AAE1B,QAAI,IAAI,SAAS,KAAK,GAAG;AACvB,YAAM,KAAK,KAAK,aAAa,IAAI,QAAQ,SAAS,KAAK,CAAC;AACxD,UAAI,WAAW,EAAE,EAAG,QAAO;AAAA,IAC7B;AACA,WAAO;AAAA,EACT;AAEA,MAAI,OAAO,IAAI,QAAQ,UAAU;AAC/B,UAAM,QAAQ,QAAQ,IAAI,GAAG;AAC7B,QAAI,MAAO,QAAO;AAAA,EACpB;AACA,MAAI,IAAI,OAAO,OAAO,IAAI,QAAQ,UAAU;AAC1C,eAAW,SAAS,OAAO,OAAO,IAAI,GAAG,GAAG;AAC1C,UAAI,OAAO,UAAU,UAAU;AAC7B,cAAM,QAAQ,QAAQ,KAAK;AAC3B,YAAI,MAAO,QAAO;AAAA,MACpB;AAAA,IACF;AAAA,EACF;AACA,MAAI,IAAI,MAAM;AACZ,UAAM,QAAQ,QAAQ,IAAI,IAAI;AAC9B,QAAI,MAAO,QAAO;AAAA,EACpB;AACA,MAAI,IAAI,QAAQ;AACd,UAAM,QAAQ,QAAQ,IAAI,MAAM;AAChC,QAAI,MAAO,QAAO;AAAA,EACpB;AAGA,QAAM,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,aAAW,KAAK,YAAY;AAC1B,UAAM,QAAQ,QAAQ,CAAC;AACvB,QAAI,MAAO,QAAO;AAAA,EACpB;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,WAAmB,KAA2B;AACrE,MAAI,UAAU,SAAS,MAAM,EAAG,QAAO;AACvC,MAAI,UAAU,SAAS,MAAM,EAAG,QAAO;AACvC,MAAI,UAAU,SAAS,KAAK,KAAK,UAAU,SAAS,MAAM,EAAG,QAAO;AAEpE,SAAO,IAAI,SAAS;AACtB;AAIO,SAAS,oBAAoB,KAAkB,aAAkC;AACtF,QAAM,MAAM,EAAE,GAAI,IAAI,gBAAgB,CAAC,GAAI,GAAI,IAAI,mBAAmB,CAAC,EAAG;AAE1E,MACE,WAAW,KAAK,aAAa,eAAe,CAAC,KAC7C,WAAW,KAAK,aAAa,gBAAgB,CAAC,KAC9C,WAAW,KAAK,aAAa,eAAe,CAAC,GAC7C;AACA,WAAO;AAAA,EACT;AACA,MAAI,cAAc,IAAK,QAAO;AAC9B,MAAI,WAAW,KAAK,aAAa,WAAW,CAAC,KAAK,qBAAqB,IAAK,QAAO;AACnF,MAAI,kBAAkB,IAAK,QAAO;AAClC,MAAI,UAAU,IAAK,QAAO;AAC1B,MAAI,mBAAmB,IAAK,QAAO;AACnC,MAAI,UAAU,OAAO,WAAW,IAAK,QAAO;AAC5C,MAAI,sBAAsB,OAAO,qBAAqB,IAAK,QAAO;AAClE,MAAI,iBAAiB,KAAK,WAAW,EAAG,QAAO;AAC/C,SAAO;AACT;AAiBA,SAAS,cAAc,GAA8B;AACnD,UAAQ,EAAE,MAAM;AAAA,IACd,KAAK;AACH,aAAO,SAAS,CAAC;AAAA,IACnB,KAAK;AACH,aAAO,YAAY,CAAC;AAAA,IACtB,KAAK;AACH,aAAO,WAAW,CAAC;AAAA,IACrB,KAAK;AACH,aAAO,cAAc,CAAC;AAAA,IACxB,KAAK;AACH,aAAO,SAAS,CAAC;AAAA,IACnB,KAAK;AACH,aAAO,UAAU,CAAC;AAAA,IACpB,KAAK;AACH,aAAO,aAAa,CAAC;AAAA,IACvB,KAAK;AACH,aAAO,UAAU,CAAC;AAAA,IACpB,KAAK;AACH,aAAO,gBAAgB,CAAC;AAAA,IAC1B,KAAK;AACH,aAAO,YAAY,CAAC;AAAA,IACtB,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK;AACH,YAAM,IAAI,MAAM,aAAa,EAAE,IAAI,mCAAmC;AAAA,EAC1E;AACF;AAEA,SAAS,SAAS,EAAE,aAAa,KAAK,YAAY,UAAU,GAA8B;AACxF,QAAM,WAAW,KAAK,aAAa,mBAAmB;AACtD,gBAAc,UAAU,eAAe,WAAW,UAAU,GAAG,MAAM;AACrE,SAAO;AAAA,IACL,iBAAiB;AAAA,IACjB,aAAa,cAAc,aAAa,UAAU,GAAG;AAAA,IACrD,UAAU,CAAC;AAAA,EACb;AACF;AAEA,SAAS,YAAY,EAAE,aAAa,KAAK,YAAY,UAAU,GAA8B;AAC3F,QAAM,WAAW,KAAK,aAAa,mBAAmB;AACtD,gBAAc,UAAU,sBAAsB,WAAW,UAAU,GAAG,MAAM;AAC5E,SAAO;AAAA,IACL,iBAAiB;AAAA,IACjB,aAAa,cAAc,aAAa,UAAU,GAAG;AAAA,IACrD,UAAU,CAAC;AAAA,EACb;AACF;AAEA,SAAS,WAAW,EAAE,aAAa,YAAY,UAAU,GAA8B;AAGrF,QAAM,WAAqB,CAAC;AAG5B,QAAM,iBAAiB,SAAS,aAAa,CAAC,sBAAsB,oBAAoB,CAAC;AACzF,QAAM,kBAAkB,kBAAkB,KAAK,aAAa,oBAAoB;AAChF,2BAAyB,iBAAiB,WAAW,UAAU;AAK/D,kBAAgB,WAAW;AAM3B,QAAM,iBAAiB,KAAK,aAAa,qBAAqB;AAC9D,gBAAc,gBAAgB,0BAA0B,WAAW,UAAU,GAAG,MAAM;AAEtF,QAAM,aAAa,eAAe,WAAW;AAC7C,MAAI;AACJ,MAAI,CAAC,YAAY;AACf,aAAS;AAAA,MACP;AAAA,IACF;AACA,kBAAc,EAAE,MAAM,iBAAiB;AAAA,EACzC,OAAO;AACL,kBAAc,0BAA0B,YAAY,cAAc;AAAA,EACpE;AAEA,SAAO;AAAA,IACL,iBAAiB;AAAA,IACjB;AAAA,IACA,eAAe;AAAA,MACb,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,yBAAyB,MAAc,WAAmB,YAA2B;AAC5F,QAAM,WAAW,WAAW,IAAI,IAAI,aAAa,MAAM,MAAM,IAAI;AACjE,MAAI,SAAS,SAAS,qBAAqB,EAAG;AAE9C,QAAM,aAAa,WACf,WAAW,OAAO,0BAA0B,WAAW,UAAU,IACjE,8BAA8B,WAAW,UAAU;AACvD,gBAAc,MAAM,YAAY,MAAM;AACxC;AAEA,SAAS,8BAA8B,WAAmB,YAA6B;AACrF,QAAM,WAAW,aAAa,OAAO,KAAK,UAAU,UAAU,CAAC,KAAK;AACpE,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,4CAOmC,QAAQ;AAAA,yCACX,KAAK,UAAU,GAAG,SAAS,SAAS,CAAC;AAAA;AAAA;AAAA;AAAA;AAK9E;AAEA,SAAS,0BAA0B,WAAmB,YAA6B;AACjF,QAAM,WAAW,aAAa,OAAO,KAAK,UAAU,UAAU,CAAC,KAAK;AACpE,SAAO;AAAA;AAAA;AAAA;AAAA,0CAIiC,QAAQ;AAAA,uCACX,KAAK,UAAU,GAAG,SAAS,SAAS,CAAC;AAAA;AAAA;AAAA;AAI5E;AAEA,SAAS,eAAe,aAAoC;AAC1D,QAAM,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,aAAW,KAAK,YAAY;AAC1B,UAAM,IAAI,KAAK,aAAa,CAAC;AAC7B,QAAI,WAAW,CAAC,EAAG,QAAO;AAAA,EAC5B;AACA,SAAO;AACT;AAEA,SAAS,0BAA0B,WAAmB,YAA4B;AAChF,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAcW,KAAK,UAAU,UAAU,CAAC;AAAA,mBAC3B,KAAK,UAAU,SAAS,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAM5C;AAEA,SAAS,0BAA0B,YAAoB,gBAA2C;AAChG,MAAI;AACJ,MAAI;AACF,cAAU,aAAa,YAAY,MAAM;AAAA,EAC3C,SAAS,KAAK;AACZ,WAAO,EAAE,MAAM,WAAW,QAAQ,eAAgB,IAAc,OAAO,GAAG;AAAA,EAC5E;AACA,MAAI,QAAQ,SAAS,eAAe,KAAK,QAAQ,SAAS,qBAAqB,GAAG;AAChF,WAAO,EAAE,MAAM,mBAAmB,WAAW,WAAW;AAAA,EAC1D;AACA,QAAM,UAAU,QAAQ,UAAU;AAClC,MAAI,OAAO,SAAS,SAAS,cAAc,EAAE,MAAM,GAAG,EAAE,KAAK,GAAG;AAChE,MAAI,CAAC,KAAK,WAAW,GAAG,EAAG,QAAO,OAAO;AAEzC,SAAO,KAAK,QAAQ,UAAU,EAAE;AAGhC,QAAM,aAAa,6BAA6B,KAAK,UAAU,IAAI,CAAC;AACpE,QAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,MAAI,iBAAiB;AACrB,WAAS,IAAI,GAAG,IAAI,MAAM,QAAQ,KAAK;AACrC,QAAI,eAAe,KAAK,MAAM,CAAC,KAAK,EAAE,EAAG,kBAAiB,IAAI;AAAA,EAChE;AACA,QAAM,OAAO,gBAAgB,GAAG,UAAU;AAI1C,QAAM,UAAU,MAAM,KAAK,IAAI;AAC/B,QAAM,cAAc,QAAQ,YAAY,YAAY;AACpD,MAAI,gBAAgB,IAAI;AAEtB,kBAAc,YAAY,SAAS,MAAM;AACzC,WAAO;AAAA,MACL,MAAM;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,EACF;AACA,QAAM,SAAS,QAAQ,MAAM,GAAG,WAAW;AAC3C,QAAM,QAAQ,QAAQ,MAAM,WAAW;AACvC,QAAM,eAAe,SAAS,gCAAgC;AAC9D,gBAAc,YAAY,cAAc,MAAM;AAC9C,SAAO,EAAE,MAAM,YAAY,WAAW,WAAW;AACnD;AAEA,SAAS,gBAAgB,aAA2B;AAGlD,QAAM,aAAa,CAAC,kBAAkB,mBAAmB,kBAAkB,iBAAiB;AAC5F,MAAI,aAA4B;AAChC,aAAW,KAAK,YAAY;AAC1B,UAAM,IAAI,KAAK,aAAa,CAAC;AAC7B,QAAI,WAAW,CAAC,GAAG;AACjB,mBAAa;AACb;AAAA,IACF;AAAA,EACF;AACA,MAAI,CAAC,YAAY;AACf,iBAAa,KAAK,aAAa,gBAAgB;AAC/C;AAAA,MACE;AAAA,MACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MACA;AAAA,IACF;AACA;AAAA,EACF;AACA,QAAM,UAAU,aAAa,YAAY,MAAM;AAC/C,MAAI,QAAQ,SAAS,qBAAqB,EAAG;AAC7C,MAAI,QAAQ,SAAS,wBAAwB,GAAG;AAC9C,UAAM,UAAU,QAAQ;AAAA,MACtB;AAAA,MACA,CAAC,QAAgB,WAAmB;AAClC,cAAM,UAAU,OAAO,KAAK;AAC5B,cAAMA,OAAM,QAAQ,SAAS,IAAI,OAAO;AACxC,eAAO,4BAA4B,OAAO,GAAGA,IAAG;AAAA,MAClD;AAAA,IACF;AACA,QAAI,YAAY,QAAS,eAAc,YAAY,SAAS,MAAM;AAClE;AAAA,EACF;AAEA,QAAM,WACJ;AACF,QAAM,IAAI,SAAS,KAAK,OAAO;AAC/B,MAAI,GAAG;AACL,UAAM,WAAW,EAAE,QAAQ,EAAE,CAAC,EAAE;AAChC,UAAM,UACJ,QAAQ,MAAM,GAAG,QAAQ,IACzB;AAAA,sDACA,QAAQ,MAAM,QAAQ;AACxB,kBAAc,YAAY,SAAS,MAAM;AAAA,EAC3C;AACF;AAEA,SAAS,cAAc,EAAE,aAAa,YAAY,UAAU,GAA8B;AAExF,QAAM,aAAa,KAAK,aAAa,qBAAqB;AAC1D,QAAM,aAAa,KAAK,aAAa,qBAAqB;AAC1D,MAAI,CAAC,WAAW,QAAQ,UAAU,CAAC,EAAG,WAAU,QAAQ,UAAU,GAAG,EAAE,WAAW,KAAK,CAAC;AACxF;AAAA,IACE;AAAA,IACA;AAAA;AAAA,4CAA4G,KAAK,UAAU,UAAU,CAAC;AAAA,qCAAyC,KAAK,UAAU,GAAG,SAAS,SAAS,CAAC;AAAA;AAAA;AAAA,IACpN;AAAA,EACF;AACA;AAAA,IACE;AAAA,IACA;AAAA;AAAA,gBAAwF,KAAK,UAAU,UAAU,CAAC;AAAA,eAAmB,KAAK,UAAU,SAAS,CAAC;AAAA;AAAA;AAAA,IAC9J;AAAA,EACF;AACA,SAAO;AAAA,IACL,iBAAiB;AAAA,IACjB,aAAa,EAAE,MAAM,YAAY,WAAW,WAAW;AAAA,IACvD,eAAe;AAAA,MACb,MAAM;AAAA,MACN,aAAa;AAAA,IACf;AAAA,IACA,UAAU,CAAC;AAAA,EACb;AACF;AAEA,SAAS,SAAS,EAAE,aAAa,YAAY,UAAU,GAA8B;AAEnF,QAAM,aAAa,KAAK,aAAa,SAAS;AAC9C,YAAU,YAAY,EAAE,WAAW,KAAK,CAAC;AACzC,QAAM,aAAa,KAAK,YAAY,oBAAoB;AACxD,QAAM,aAAa,KAAK,YAAY,oBAAoB;AACxD;AAAA,IACE;AAAA,IACA;AAAA;AAAA;AAAA,8CAAyJ,KAAK,UAAU,UAAU,CAAC;AAAA,uCAA2C,KAAK,UAAU,GAAG,SAAS,SAAS,CAAC;AAAA;AAAA;AAAA;AAAA,IACnQ;AAAA,EACF;AACA;AAAA,IACE;AAAA,IACA;AAAA;AAAA;AAAA,kBAAqI,KAAK,UAAU,UAAU,CAAC;AAAA,iBAAqB,KAAK,UAAU,SAAS,CAAC;AAAA;AAAA;AAAA;AAAA,IAC7M;AAAA,EACF;AACA,SAAO;AAAA,IACL,iBAAiB;AAAA,IACjB,aAAa,EAAE,MAAM,YAAY,WAAW,WAAW;AAAA,IACvD,eAAe,EAAE,MAAM,YAAY,aAAa,mCAAmC;AAAA,IACnF,UAAU,CAAC;AAAA,EACb;AACF;AAEA,SAAS,UAAU,EAAE,aAAa,YAAY,UAAU,GAA8B;AAEpF,QAAM,aAAa,SAAS,aAAa,CAAC,wBAAwB,sBAAsB,CAAC;AACzF,QAAM,aAAa,SAAS,aAAa,CAAC,wBAAwB,sBAAsB,CAAC;AACzF,QAAM,WAAqB,CAAC;AAG5B,QAAM,iBAAiB,KAAK,aAAa,qBAAqB;AAC9D,gBAAc,gBAAgB,sBAAsB,WAAW,UAAU,GAAG,MAAM;AAElF,MAAI,YAAY;AACd,iBAAa,YAAY,cAAc;AAAA,EACzC,OAAO;AACL,aAAS;AAAA,MACP;AAAA,IACF;AAAA,EACF;AAGA,QAAM,iBAAiB,KAAK,aAAa,qBAAqB;AAC9D,gBAAc,gBAAgB,eAAe,SAAS,GAAG,MAAM;AAC/D,MAAI,cAAiC,EAAE,MAAM,iBAAiB;AAC9D,MAAI,YAAY;AACd,kBAAc,aAAa,YAAY,cAAc;AAAA,EACvD,OAAO;AACL,aAAS;AAAA,MACP;AAAA,IACF;AAAA,EACF;AACA,OAAK;AAEL,SAAO;AAAA,IACL,iBAAiB;AAAA,IACjB,aAAa,aACT,EAAE,MAAM,YAAY,WAAW,WAAW,IAC1C,EAAE,MAAM,iBAAiB;AAAA,IAC7B,eAAe,EAAE,MAAM,gBAAgB,aAAa,oBAAoB;AAAA,IACxE;AAAA,EACF;AACF;AAEA,SAAS,aAAa,EAAE,aAAa,KAAK,YAAY,UAAU,GAA8B;AAC5F,QAAM,WAAqB,CAAC;AAC5B,QAAM,YAAY,IAAI,SAAS;AAC/B,QAAM,eAAe,YACjB,KAAK,aAAa,mBAAmB,IACrC,KAAK,aAAa,mBAAmB;AACzC;AAAA,IACE;AAAA,IACA,YAAY,eAAe,WAAW,UAAU,IAAI,kBAAkB,WAAW,UAAU;AAAA,IAC3F;AAAA,EACF;AAKA,QAAM,YAAY,wBAAwB,aAAa,GAAG;AAC1D,MAAI,aAAgC,EAAE,MAAM,iBAAiB;AAC7D,MAAI,aAAa,WAAW,SAAS,GAAG;AACtC,iBAAa,aAAa,WAAW,YAAY;AAAA,EACnD;AAIA,QAAM,YAAY,sBAAsB,WAAW;AACnD,MAAI;AACJ,MAAI,UAAU,SAAS,GAAG;AACxB,UAAM,cAAc,QAAQ,UAAU,CAAC,CAAE;AACzC,uBAAmB,KAAK,aAAa,0BAA0B;AAC/D,QAAI,CAAC,eAAe,aAAa,gBAAgB,GAAG;AAClD,eAAS;AAAA,QACP;AAAA,MACF;AAAA,IACF;AACA,QAAI,aAAa;AACjB,eAAW,QAAQ,WAAW;AAC5B,UAAI,kBAAkB,MAAM,kBAAkB,YAAY,SAAS,MAAM,WAAW;AAClF,qBAAa;AAAA,MACf;AAAA,IACF;AACA,QAAI,CAAC,YAAY;AACf,eAAS;AAAA,QACP,uBAAuB,WAAW;AAAA,MACpC;AAAA,IACF;AAAA,EACF,OAAO;AACL,uBAAmB,KAAK,aAAa,uBAAuB;AAC5D,kBAAc,kBAAkB,sBAAsB,WAAW,UAAU,GAAG,MAAM;AACpF,UAAM,gBAAgB,SAAS,aAAa;AAAA,MAC1C;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AACD,QAAI,cAAe,cAAa,eAAe,gBAAgB;AAAA;AAE7D,eAAS;AAAA,QACP;AAAA,MACF;AAAA,EACJ;AAEA,SAAO;AAAA,IACL,iBAAiB;AAAA,IACjB,aAAa,EAAE,MAAM,YAAY,WAAW,iBAAiB;AAAA,IAC7D,eAAe;AAAA,MACb,MAAM;AAAA,MACN,aACE,gCACC,WAAW,SAAS,aAAa,gBAAgB,SAAS,MAAM;AAAA,IACrE;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,wBAAwB,aAAqB,KAAiC;AACrF,MAAI,IAAI,MAAM;AACZ,UAAM,mBAA6B,CAAC;AACpC,UAAMC,QAAO,IAAI;AAEjB,QAAI,6BAA6B,KAAKA,KAAI,GAAG;AAC3C,YAAM,OAAOA,MAAK,QAAQ,8BAA8B,MAAM;AAC9D,UAAI,KAAK,SAAS,KAAK,GAAG;AACxB,yBAAiB,KAAK,KAAK,QAAQ,SAAS,KAAK,CAAC;AAClD,yBAAiB,KAAK,KAAK,QAAQ,SAAS,MAAM,CAAC;AAAA,MACrD;AACA,uBAAiB,KAAK,IAAI;AAAA,IAC5B;AACA,QAAIA,MAAK,SAAS,KAAK,GAAG;AACxB,uBAAiB,KAAKA,MAAK,QAAQ,SAAS,KAAK,CAAC;AAClD,uBAAiB,KAAKA,MAAK,QAAQ,SAAS,MAAM,CAAC;AAAA,IACrD;AACA,eAAW,KAAK,kBAAkB;AAChC,YAAM,IAAI,KAAK,aAAa,CAAC;AAC7B,UAAI,WAAW,CAAC,EAAG,QAAO;AAAA,IAC5B;AACA,UAAM,UAAU,KAAK,aAAaA,KAAI;AACtC,QAAI,WAAW,OAAO,EAAG,QAAO;AAAA,EAClC;AACA,SAAO,SAAS,aAAa;AAAA,IAC3B;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,CAAC;AACH;AAEA,IAAM,qBAAqB,CAAC,MAAM,YAAY,gBAAgB,UAAU,QAAQ;AAEhF,SAAS,sBAAsB,aAA+B;AAC5D,aAAW,OAAO,oBAAoB;AACpC,UAAM,OAAO,KAAK,aAAa,GAAG;AAClC,QAAI,CAAC,WAAW,IAAI,EAAG;AACvB,UAAM,OAAiB,CAAC;AACxB,QAAI;AACJ,QAAI;AACF,gBAAU,YAAY,IAAI;AAAA,IAC5B,QAAQ;AACN;AAAA,IACF;AACA,eAAW,KAAK,SAAS;AACvB,UAAI,CAAC,EAAE,SAAS,OAAO,EAAG;AAC1B,YAAM,IAAI,KAAK,MAAM,CAAC;AACtB,UAAI;AACF,cAAM,IAAI,aAAa,GAAG,MAAM;AAChC,YAAI,qCAAqC,KAAK,CAAC,KAAK,gBAAgB,KAAK,CAAC,GAAG;AAC3E,eAAK,KAAK,CAAC;AAAA,QACb;AAAA,MACF,QAAQ;AAAA,MAER;AAAA,IACF;AACA,QAAI,KAAK,SAAS,EAAG,QAAO;AAAA,EAC9B;AACA,SAAO,CAAC;AACV;AAEA,SAAS,eAAe,aAAqB,MAAuB;AAClE,QAAM,aAAa;AAAA,IACjB,KAAK,aAAa,8DAA8D;AAAA,IAChF,KAAK,aAAa,uDAAuD;AAAA,EAC3E;AACA,aAAW,KAAK,YAAY;AAC1B,QAAI,WAAW,CAAC,GAAG;AACjB,UAAI;AACF,sBAAc,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM;AACnD,eAAO;AAAA,MACT,QAAQ;AAAA,MAER;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,kBACP,UACA,UACA,YACA,WAC0C;AAC1C,MAAI;AACJ,MAAI;AACF,cAAU,aAAa,UAAU,MAAM;AAAA,EACzC,QAAQ;AACN,WAAO;AAAA,EACT;AACA,MAAI,QAAQ,SAAS,uBAAuB,EAAG,QAAO;AAEtD,QAAM,eAAe,IAAI,IAAI,SAAS,EAAE;AAIxC,YAAU,QAAQ;AAAA,IAChB;AAAA,IACA,CACE,QACA,QACA,MACA,IACA,OACG;AACH,YAAM,QAAQ,OAAO,SAAY,MAAM;AACvC,YAAM,MAAM,OAAO,SAAY,KAAM;AACrC,UAAI,UAAU;AACd,UAAI,iBAAiB,KAAK,GAAG,GAAG;AAC9B,YAAI,CAAC,IAAI,SAAS,YAAY,GAAG;AAC/B,oBAAU,IAAI,QAAQ,uBAAuB,MAAM,YAAY,EAAE;AAAA,QACnE;AAAA,MACF,OAAO;AACL,kBAAU,IAAI,KAAK,EAAE,QAAQ,OAAO,wBAAwB,YAAY,GAAG;AAAA,MAC7E;AACA,aAAO,SAAS,QAAQ,UAAU;AAAA,IACpC;AAAA,EACF;AAEA,QAAM,YAAY,SAAS,QAAQ,QAAQ,GAAG,QAAQ,EAAE,MAAM,GAAG,EAAE,KAAK,GAAG;AAC3E,QAAM,SAAS;AAAA;AAAA,iBAA8E,SAAS;AAAA;AAAA,0DAAoF,KAAK,UAAU,UAAU,CAAC,gBAAgB,KAAK,UAAU,SAAS,CAAC;AAAA;AAAA;AAC7P,MAAI,eAAe,KAAK,OAAO,GAAG;AAChC,cAAU,QAAQ,QAAQ,kBAAkB,KAAK,MAAM,EAAE;AAAA,EAC3D,WAAW,eAAe,KAAK,OAAO,GAAG;AACvC,cAAU,QAAQ,QAAQ,kBAAkB,WAAW,MAAM,SAAS;AAAA,EACxE,OAAO;AACL,WAAO;AAAA,EACT;AACA,gBAAc,UAAU,SAAS,MAAM;AACvC,SAAO;AACT;AAEA,SAAS,UAAU,EAAE,aAAa,KAAK,YAAY,UAAU,GAA8B;AAGzF,QAAM,WAAW,KAAK,aAAa,mBAAmB;AACtD,gBAAc,UAAU,sBAAsB,WAAW,UAAU,GAAG,MAAM;AAC5E,QAAM,cAAc,cAAc,aAAa,UAAU,GAAG;AAC5D,SAAO;AAAA,IACL,iBAAiB;AAAA,IACjB;AAAA,IACA,UAAU;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,YAAY,EAAE,aAAa,YAAY,UAAU,GAA8B;AAKtF,QAAM,WAAW,KAAK,aAAa,6BAA6B;AAChE;AAAA,IACE;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAOmB,KAAK,UAAU,UAAU,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,sCAUX,KAAK,UAAU,UAAU,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,2BAOrC,KAAK,UAAU,UAAU,CAAC;AAAA,8BACvB,KAAK,UAAU,SAAS,CAAC;AAAA;AAAA;AAAA,IAGnD;AAAA,EACF;AACA,SAAO;AAAA,IACL,iBAAiB;AAAA,IACjB,aAAa,EAAE,MAAM,iBAAiB;AAAA,IACtC,UAAU;AAAA,MACR,yEAAyE,QAAQ;AAAA,IACnF;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,EAAE,YAAY,GAA8B;AAGnE,SAAO;AAAA,IACL,iBAAiB,KAAK,aAAa,iBAAiB;AAAA,IACpD,aAAa,EAAE,MAAM,WAAW,QAAQ,iCAAiC;AAAA,IACzE,UAAU;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAIA,SAAS,SAAS,MAAc,YAAqC;AACnE,aAAW,KAAK,YAAY;AAC1B,UAAM,IAAI,KAAK,MAAM,CAAC;AACtB,QAAI,WAAW,CAAC,EAAG,QAAO;AAAA,EAC5B;AACA,SAAO;AACT;AAEA,SAAS,eAAe,UAAkB,SAAiB,QAAsB;AAC/E,MAAI,WAAW,QAAQ,GAAG;AACxB,UAAM,WAAW,aAAa,UAAU,MAAM;AAC9C,QAAI,SAAS,SAAS,MAAM,EAAG;AAC/B,kBAAc,UAAU,WAAW,OAAO,SAAS,MAAM;AACzD;AAAA,EACF;AACA,gBAAc,UAAU,SAAS,MAAM;AACzC;AAEA,SAAS,aAAa,WAAmB,cAAyC;AAChF,MAAI;AACJ,MAAI;AACF,cAAU,aAAa,WAAW,MAAM;AAAA,EAC1C,SAAS,KAAK;AACZ,WAAO,EAAE,MAAM,WAAW,QAAQ,eAAgB,IAAc,OAAO,GAAG;AAAA,EAC5E;AACA,QAAM,eAAe,aAAa,MAAM,GAAG,EAAE,IAAI,KAAK;AACtD,MAAI,QAAQ,SAAS,YAAY,KAAK,QAAQ,SAAS,qBAAqB,GAAG;AAC7E,WAAO,EAAE,MAAM,mBAAmB,UAAU;AAAA,EAC9C;AACA,QAAM,UAAU,QAAQ,SAAS;AACjC,MAAI,OAAO,SAAS,SAAS,YAAY,EAAE,MAAM,GAAG,EAAE,KAAK,GAAG;AAC9D,MAAI,CAAC,KAAK,WAAW,GAAG,EAAG,QAAO,OAAO;AAGzC,QAAM,QACJ,UAAU,SAAS,MAAM,KACxB,UAAU,SAAS,KAAK,KACvB,iBAAiB,KAAK,OAAO,KAC7B,CAAC,cAAc,KAAK,OAAO,KAC3B,CAAC,cAAc,KAAK,OAAO;AAC/B,QAAM,aAAa,QACf,WAAW,KAAK,UAAU,IAAI,CAAC,OAC/B,UAAU,KAAK,UAAU,IAAI,CAAC;AAClC,QAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,MAAI,WAAW;AACf,MAAI,MAAM,CAAC,GAAG,WAAW,IAAI,EAAG,YAAW;AAC3C,SACE,WAAW,MAAM,UACjB,uCAAuC,KAAK,MAAM,QAAQ,KAAK,EAAE,GACjE;AACA;AAAA,EACF;AACA,QAAM,UAAU,CAAC,GAAG,MAAM,MAAM,GAAG,QAAQ,GAAG,YAAY,GAAG,MAAM,MAAM,QAAQ,CAAC,EAAE,KAAK,IAAI;AAC7F,gBAAc,WAAW,SAAS,MAAM;AACxC,SAAO,EAAE,MAAM,YAAY,UAAU;AACvC;AAIO,SAAS,iBAAiB,KAAkB,aAA8B;AAC/E,QAAM,MAAM,EAAE,GAAI,IAAI,gBAAgB,CAAC,GAAI,GAAI,IAAI,mBAAmB,CAAC,EAAG;AAC1E,QAAM,iBAAiB;AAAA,IACrB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,MAAI,eAAe,KAAK,CAAC,MAAM,KAAK,GAAG,EAAG,QAAO;AACjD,MAAI,IAAI,YAAY,OAAW,QAAO;AACtC,MAAI,WAAW,KAAK,aAAa,YAAY,CAAC,EAAG,QAAO;AACxD,MAAI,WAAW,KAAK,aAAa,UAAU,YAAY,CAAC,EAAG,QAAO;AAClE,SAAO;AACT;AAEO,SAAS,sBAAsB,WAAmB,YAA4B;AACnF,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA,gBAKO,KAAK,UAAU,UAAU,CAAC;AAAA,eAC3B,KAAK,UAAU,SAAS,CAAC;AAAA;AAAA;AAGxC;AAIA,IAAM,iBAAiB,CAAC,kBAAkB,YAAY,oBAAoB,SAAS;AAE5E,SAAS,sBAAsB,OAA8B;AAClE,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,QAAI,eAAe,KAAK,CAAC,MAAM,WAAW,KAAK,KAAK,CAAC,CAAC,CAAC,EAAG,QAAO;AACjE,UAAM,SAAS,QAAQ,GAAG;AAC1B,QAAI,WAAW,IAAK,QAAO;AAC3B,UAAM;AAAA,EACR;AACA,SAAO;AACT;AAEO,SAAS,2BAA2B,aAA2C;AACpF,MAAI,WAAW,KAAK,aAAa,SAAS,CAAC,EAAG,QAAO;AACrD,MAAI,WAAW,KAAK,aAAa,aAAa,CAAC,EAAG,QAAO;AACzD,MAAI,WAAW,KAAK,aAAa,cAAc,CAAC,EAAG,QAAO;AAC1D,SAAO;AACT;AAEA,SAAS,gBAAgB,OAA4C;AACnE,MAAI,OAAsB;AAC1B,aAAW,KAAK,OAAO;AACrB,QAAI,CAAC,EAAG;AACR,QAAI,CAAC,QAAQ,EAAE,SAAS,KAAK,OAAQ,QAAO;AAAA,EAC9C;AACA,SAAO;AACT;AAEA,IAAM,YAAY;AAClB,IAAM,eAAe,CAAC,SAAS;AAExB,SAAS,kBAAkB,OAA8B;AAC9D,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,QAAI,WAAW,KAAK,KAAK,SAAS,CAAC,EAAG,QAAO;AAC7C,UAAM,SAAS,QAAQ,GAAG;AAC1B,QAAI,WAAW,IAAK,QAAO;AAC3B,UAAM;AAAA,EACR;AACA,SAAO;AACT;AAEO,SAAS,oBAAoB,OAA8B;AAChE,MAAI,MAAM;AACV,WAAS,IAAI,GAAG,IAAI,IAAI,KAAK;AAC3B,eAAW,KAAK,cAAc;AAC5B,UAAI,WAAW,KAAK,KAAK,CAAC,CAAC,EAAG,QAAO;AAAA,IACvC;AAEA,QAAI;AACF,YAAM,UAAU,YAAY,GAAG;AAC/B,UAAI,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,UAAU,CAAC,EAAG,QAAO;AAAA,IAC1D,QAAQ;AAAA,IAER;AACA,UAAM,SAAS,QAAQ,GAAG;AAC1B,QAAI,WAAW,IAAK,QAAO;AAC3B,UAAM;AAAA,EACR;AACA,SAAO;AACT;AAUA,eAAe,UAAU,KAAmD;AAC1E,QAAM,EAAE,aAAa,MAAM,WAAW,SAAS,KAAK,IAAI;AACxD,QAAM,cACJ,KAAK,eAAe,iBAAiB,WAAW,KAAK,YAAY,MAAM,GAAG,EAAE,IAAI,KAAK;AACvF,QAAM,mBAAmB,KAAK,MAAM,OAAO,eAAe;AAC1D,QAAM,cAAc,KAAK,aAAa,MAAM;AAE5C,QAAM,WAAW,kBAAkB,kBAAkB,WAAW;AAChE,QAAM,cAAc,WAAW,aAAa,cAAc;AAC1D,MAAI;AACJ,MAAI,SAAS;AACb,MAAI,YAAY,SAAS,UAAU,aAAa;AAC9C,cAAU,EAAE,IAAI,SAAS,IAAI,KAAK,aAAa,QAAQ,SAAS,OAAO;AACvE,aAAS;AAAA,EACX,OAAO;AACL,cAAU,MAAM,cAAc,SAAS,WAAW,WAAW;AAAA,EAC/D;AAEA,QAAM,mBAAmB,KAAK,qBAAqB,QAAQ,SAAS,WAAW;AAE/E,QAAM,eAAe,KAAK,aAAa,kBAAkB;AACzD;AAAA,IACE;AAAA,IACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,UAWM,KAAK,UAAU,QAAQ,GAAG,CAAC;AAAA;AAAA,sDAEiB,KAAK,UAAU,GAAG,SAAS,SAAS,CAAC;AAAA;AAAA;AAAA,IAGvF;AAAA,EACF;AAEA,cAAY,aAAa,gBAAgB,QAAQ,GAAG;AACpD,uBAAqB,kBAAkB,QAAQ,IAAI,aAAa,aAAa,QAAQ,MAAM;AAE3F,SAAO;AAAA,IACL,WAAW,QAAQ;AAAA,IACnB,YAAY,QAAQ;AAAA,IACpB,eAAe,QAAQ;AAAA,IACvB;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB;AAAA,IACA,aAAa,EAAE,MAAM,iBAAiB;AAAA,IACtC;AAAA,IACA,UAAU;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,aAAoC;AAC5D,MAAI;AACF,UAAM,UAAU,aAAa,KAAK,aAAa,QAAQ,GAAG,MAAM;AAChE,UAAM,QAAQ,0BAA0B,KAAK,OAAO;AACpD,QAAI,CAAC,MAAO,QAAO;AACnB,WAAO,MAAM,CAAC,EAAG,MAAM,GAAG,EAAE,IAAI,KAAK;AAAA,EACvC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,SAAS,aAA8B;AAC9C,QAAM,SAAS,UAAU,MAAM,CAAC,OAAO,yCAAyC,GAAG;AAAA,IACjF,KAAK;AAAA,IACL,OAAO;AAAA,EACT,CAAC;AACD,SAAO,OAAO,WAAW;AAC3B;AAEA,eAAe,YAAY,KAAmD;AAC5E,QAAM,EAAE,aAAa,MAAM,WAAW,SAAS,KAAK,IAAI;AACxD,QAAM,cACJ,KAAK,eAAe,gBAAgB,WAAW,KAAK,YAAY,MAAM,GAAG,EAAE,IAAI,KAAK;AACtF,QAAM,mBAAmB,KAAK,MAAM,OAAO,eAAe;AAC1D,QAAM,cAAc,KAAK,aAAa,MAAM;AAE5C,QAAM,WAAW,kBAAkB,kBAAkB,WAAW;AAChE,QAAM,cAAc,WAAW,aAAa,cAAc;AAC1D,MAAI;AACJ,MAAI,SAAS;AACb,MAAI,YAAY,SAAS,UAAU,aAAa;AAC9C,cAAU,EAAE,IAAI,SAAS,IAAI,KAAK,aAAa,QAAQ,SAAS,OAAO;AACvE,aAAS;AAAA,EACX,OAAO;AACL,cAAU,MAAM,cAAc,SAAS,WAAW,WAAW;AAAA,EAC/D;AAEA,QAAM,mBAAmB,KAAK,qBAAqB,QAAQ,eAAe,WAAW;AAErF,QAAM,eAAe,KAAK,aAAa,kBAAkB;AACzD;AAAA,IACE;AAAA,IACA;AAAA;AAAA;AAAA,wCAGoC,KAAK,UAAU,QAAQ,GAAG,CAAC;AAAA,gBACnD,KAAK,UAAU,GAAG,SAAS,SAAS,CAAC;AAAA;AAAA;AAAA,IAGjD;AAAA,EACF;AAEA,cAAY,aAAa,gBAAgB,QAAQ,GAAG;AACpD,uBAAqB,kBAAkB,QAAQ,IAAI,aAAa,aAAa,QAAQ,MAAM;AAE3F,SAAO;AAAA,IACL,WAAW,QAAQ;AAAA,IACnB,YAAY,QAAQ;AAAA,IACpB,eAAe,QAAQ;AAAA,IACvB;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB;AAAA,IACA,aAAa,EAAE,MAAM,iBAAiB;AAAA,IACtC;AAAA,IACA,UAAU;AAAA,MACR;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,gBAAgB,aAAoC;AAC3D,MAAI;AACF,UAAM,UAAU,YAAY,WAAW;AACvC,UAAM,UAAU,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,UAAU,CAAC;AAC1D,QAAI,CAAC,QAAS,QAAO;AACrB,WAAO,QAAQ,QAAQ,cAAc,EAAE;AAAA,EACzC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,eAAe,aAA8B;AAEpD,MAAI,WAAW,KAAK,aAAa,SAAS,CAAC,GAAG;AAE5C,QAAI;AACF,YAAM,UAAU,aAAa,KAAK,aAAa,SAAS,GAAG,MAAM;AACjE,UAAI,CAAC,QAAQ,SAAS,UAAU,GAAG;AACjC;AAAA,UACE,KAAK,aAAa,SAAS;AAAA,UAC3B,WAAW,QAAQ,SAAS,IAAI,IAAI,KAAK,QAAQ;AAAA,UACjD;AAAA,QACF;AAAA,MACF;AAAA,IACF,QAAQ;AAAA,IAER;AACA,UAAM,IAAI,UAAU,UAAU,CAAC,SAAS,GAAG,EAAE,KAAK,aAAa,OAAO,UAAU,CAAC;AACjF,QAAI,EAAE,WAAW,EAAG,QAAO;AAAA,EAC7B;AACA,QAAM,KAAK,UAAU,OAAO,CAAC,WAAW,UAAU,GAAG,EAAE,KAAK,aAAa,OAAO,UAAU,CAAC;AAC3F,SAAO,GAAG,WAAW;AACvB;AAUA,eAAe,cAAc,KAAmD;AAC9E,QAAM,EAAE,aAAa,MAAM,WAAW,SAAS,KAAK,IAAI;AACxD,QAAM,cACJ,KAAK,eAAe,kBAAkB,WAAW,KAAK,YAAY,MAAM,GAAG,EAAE,IAAI,KAAK;AAExF,QAAM,mBAAmB,KAAK,MAAM,OAAO,eAAe;AAC1D,QAAM,cAAc,KAAK,aAAa,MAAM;AAE5C,QAAM,WAAW,kBAAkB,kBAAkB,WAAW;AAChE,QAAM,cAAc,WAAW,aAAa,cAAc;AAC1D,MAAI;AACJ,MAAI,SAAS;AACb,MAAI,YAAY,SAAS,UAAU,aAAa;AAC9C,cAAU,EAAE,IAAI,SAAS,IAAI,KAAK,aAAa,QAAQ,SAAS,OAAO;AACvE,aAAS;AAAA,EACX,OAAO;AACL,cAAU,MAAM,cAAc,SAAS,WAAW,WAAW;AAAA,EAC/D;AAEA,QAAM,KAAK,2BAA2B,WAAW;AACjD,QAAM,mBAAmB,KAAK,qBAAqB,QAAQ,iBAAiB,aAAa,EAAE;AAE3F,QAAM,eAAe,KAAK,aAAa,kBAAkB;AACzD,gBAAc,cAAc,qBAAqB,WAAW,QAAQ,GAAG,GAAG,MAAM;AAEhF,cAAY,aAAa,gBAAgB,QAAQ,GAAG;AACpD,uBAAqB,kBAAkB,QAAQ,IAAI,aAAa,aAAa,QAAQ,MAAM;AAE3F,QAAM,cAAc,gBAAgB,aAAa,YAAY;AAE7D,SAAO;AAAA,IACL,WAAW,QAAQ;AAAA,IACnB,YAAY,QAAQ;AAAA,IACpB,eAAe,QAAQ;AAAA,IACvB;AAAA,IACA,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA;AAAA,IACA,gBAAgB;AAAA,IAChB;AAAA,IACA;AAAA,IACA;AAAA,IACA,UAAU,CAAC;AAAA,EACb;AACF;AAEA,SAAS,kBAAkB,aAAoC;AAC7D,QAAM,OAAO,KAAK,aAAa,gBAAgB;AAC/C,MAAI,CAAC,WAAW,IAAI,EAAG,QAAO;AAC9B,MAAI;AACF,UAAM,UAAU,aAAa,MAAM,MAAM;AACzC,UAAM,QAAQ,mCAAmC,KAAK,OAAO;AAC7D,WAAO,QAAQ,CAAC,KAAK;AAAA,EACvB,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAEA,SAAS,iBAAiB,aAAqB,IAAmC;AAChF,QAAM,MACJ,OAAO,OACH,CAAC,MAAM,CAAC,OAAO,UAAU,CAAC,IAC1B,OAAO,WACL,CAAC,UAAU,CAAC,OAAO,UAAU,CAAC,IAC9B,OAAO,WACL,CAAC,UAAU,CAAC,WAAW,UAAU,CAAC,IAClC,CAAC,OAAO,CAAC,WAAW,UAAU,CAAC;AACzC,QAAM,SAAS,UAAU,IAAI,CAAC,GAAa,IAAI,CAAC,GAAe;AAAA,IAC7D,KAAK;AAAA,IACL,OAAO;AAAA,EACT,CAAC;AACD,MAAI,OAAO,WAAW,EAAG,QAAO;AAEhC,MAAI,OAAO,OAAO;AAChB,UAAM,KAAK,UAAU,QAAQ,CAAC,WAAW,UAAU,GAAG;AAAA,MACpD,KAAK;AAAA,MACL,OAAO;AAAA,IACT,CAAC;AACD,QAAI,GAAG,WAAW,EAAG,QAAO;AAC5B,UAAM,KAAK,UAAU,WAAW,CAAC,MAAM,OAAO,WAAW,UAAU,GAAG;AAAA,MACpE,KAAK;AAAA,MACL,OAAO;AAAA,IACT,CAAC;AACD,WAAO,GAAG,WAAW;AAAA,EACvB;AACA,SAAO;AACT;AAEO,SAAS,qBAAqB,WAAmB,YAA4B;AAClF,SAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oDAU2C,KAAK,UAAU,UAAU,CAAC;AAAA,iBAC7D,KAAK,UAAU,GAAG,SAAS,SAAS,CAAC;AAAA;AAAA;AAGtD;AAEA,SAAS,gBAAgB,aAAqB,cAAyC;AACrF,QAAM,YAAY,oBAAoB,WAAW;AACjD,MAAI,CAAC,UAAW,QAAO,EAAE,MAAM,iBAAiB;AAEhD,MAAI;AACJ,MAAI;AACF,cAAU,aAAa,WAAW,MAAM;AAAA,EAC1C,SAAS,KAAK;AACZ,WAAO,EAAE,MAAM,WAAW,QAAQ,eAAgB,IAAc,OAAO,GAAG;AAAA,EAC5E;AAEA,MAAI,QAAQ,SAAS,eAAe,GAAG;AACrC,WAAO,EAAE,MAAM,mBAAmB,UAAU;AAAA,EAC9C;AAIA,QAAM,UAAU,QAAQ,SAAS;AACjC,QAAM,MAAM,SAAS,SAAS,YAAY,EAAE,MAAM,GAAG,EAAE,KAAK,GAAG;AAC/D,MAAI;AACJ,MAAI,QAAQ,oBAAoB;AAC9B,iBAAa;AAAA,EACf,WAAW,IAAI,WAAW,KAAK,GAAG;AAGhC,iBAAa;AAAA,EACf,OAAO;AAEL,iBAAa,IAAI,QAAQ,SAAS,EAAE,EAAE,QAAQ,OAAO,GAAG;AAAA,EAC1D;AAEA,QAAM,aAAa,UAAU,UAAU;AAEvC,QAAM,QAAQ,QAAQ,MAAM,IAAI;AAChC,MAAI,WAAW;AACf,MAAI,MAAM,CAAC,GAAG,WAAW,IAAI,EAAG,YAAW;AAE3C,SAAO,WAAW,MAAM,UAAU,kCAAkC,KAAK,MAAM,QAAQ,KAAK,EAAE,GAAG;AAC/F;AAAA,EACF;AAEA,QAAM,UAAU,CAAC,GAAG,MAAM,MAAM,GAAG,QAAQ,GAAG,YAAY,GAAG,MAAM,MAAM,QAAQ,CAAC,EAAE,KAAK,IAAI;AAC7F,gBAAc,WAAW,SAAS,MAAM;AACxC,SAAO,EAAE,MAAM,YAAY,UAAU;AACvC;AAEA,SAAS,oBAAoB,aAAoC;AAC/D,QAAM,UAAU,CAAC,QAA+B;AAC9C,UAAM,IAAI,KAAK,aAAa,GAAG;AAC/B,WAAO,WAAW,CAAC,IAAI,IAAI;AAAA,EAC7B;AACA,QAAM,aAAa;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACA,aAAW,KAAK,YAAY;AAC1B,UAAM,QAAQ,QAAQ,CAAC;AACvB,QAAI,MAAO,QAAO;AAAA,EACpB;AACA,SAAO;AACT;AAIO,SAAS,qBACd,kBACA,WACA,MACA,MACA,QACM;AACN,YAAU,QAAQ,gBAAgB,GAAG,EAAE,WAAW,KAAK,CAAC;AACxD,MAAI,MAAuE,CAAC;AAC5E,MAAI,WAAW,gBAAgB,GAAG;AAChC,QAAI;AACF,YAAM,KAAK,MAAM,aAAa,kBAAkB,MAAM,CAAC;AAAA,IACzD,QAAQ;AAAA,IAER;AAAA,EACF;AACA,QAAM,QAAyD,EAAE,MAAM,KAAK;AAC5E,MAAI,OAAQ,OAAM,SAAS;AAC3B,MAAI,SAAS,IAAI;AACjB,gBAAc,kBAAkB,GAAG,KAAK,UAAU,KAAK,MAAM,CAAC,CAAC;AAAA,GAAM,MAAM;AAC7E;;;ACzoDA,SAAS,MAAM,MAA4B;AACzC,QAAM,MAAkB,EAAE,SAAS,KAAK,CAAC,KAAK,IAAI,oBAAoB,OAAO,MAAM,MAAM;AACzF,WAAS,IAAI,GAAG,IAAI,KAAK,QAAQ,KAAK;AACpC,UAAM,IAAI,KAAK,CAAC;AAChB,QAAI,MAAM,eAAgB,KAAI,YAAY,KAAK,EAAE,CAAC;AAAA,aACzC,MAAM,SAAU,KAAI,OAAO,KAAK,EAAE,CAAC;AAAA,aACnC,MAAM,iBAAkB,KAAI,qBAAqB;AAAA,aACjD,MAAM,YAAY,MAAM,KAAM,KAAI,OAAO;AAAA,EACpD;AACA,SAAO;AACT;AAEA,SAAS,aAAmB;AAC1B,UAAQ,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8CAOgC,kBAAkB;AAAA;AAAA,CAE/D;AACD;AAEA,eAAe,KAAK,MAA+B;AACjD,QAAM,OAAO,MAAM,IAAI;AACvB,MAAI,KAAK,QAAQ,CAAC,KAAK,SAAS;AAC9B,eAAW;AACX;AAAA,EACF;AACA,MAAI,KAAK,YAAY,WAAW;AAC9B,YAAQ,MAAM,oBAAoB,KAAK,OAAO,EAAE;AAChD,eAAW;AACX,YAAQ,WAAW;AACnB;AAAA,EACF;AAEA,QAAM,SAAS,MAAM,QAAQ;AAAA,IAC3B,WAAW,KAAK;AAAA,IAChB,aAAa,KAAK;AAAA,IAClB,oBAAoB,KAAK;AAAA,EAC3B,CAAC;AAED,UAAQ,IAAI,EAAE;AACd,UAAQ,IAAI,OAAO,SAAS,uCAAuC,kBAAkB;AACrF,UAAQ,IAAI,oBAAoB,OAAO,WAAW,KAAK,OAAO,SAAS,GAAG;AAC1E,UAAQ,IAAI,oBAAoB,OAAO,WAAW,EAAE;AACpD,UAAQ,IAAI,oBAAoB,OAAO,YAAY,EAAE;AACrD,UAAQ,IAAI,oBAAoB,OAAO,WAAW,EAAE;AACpD,UAAQ,IAAI,oBAAoB,OAAO,gBAAgB,EAAE;AACzD,UAAQ,OAAO,YAAY,MAAM;AAAA,IAC/B,KAAK;AACH,cAAQ,IAAI,oBAAoB,OAAO,YAAY,SAAS,EAAE;AAC9D;AAAA,IACF,KAAK;AACH,cAAQ,IAAI,oBAAoB,OAAO,YAAY,SAAS,kBAAkB;AAC9E;AAAA,IACF,KAAK;AACH,cAAQ,IAAI,kDAA6C;AACzD,cAAQ,IAAI,4DAA4D;AACxE,cAAQ,IAAI,sCAAsC;AAClD;AAAA,IACF,KAAK;AACH,cAAQ,IAAI,mCAA8B,OAAO,YAAY,MAAM,EAAE;AACrE;AAAA,EACJ;AACA,MAAI,CAAC,OAAO,oBAAoB,CAAC,KAAK,oBAAoB;AACxD,YAAQ,IAAI,wCAAmC,OAAO,cAAc,oBAAoB;AAAA,EAC1F;AACA,MAAI,OAAO,eAAe;AACxB,YAAQ,IAAI,oBAAoB,OAAO,cAAc,IAAI,EAAE;AAC3D,YAAQ,IAAI,oBAAoB,OAAO,cAAc,WAAW,EAAE;AAAA,EACpE;AACA,aAAW,KAAK,OAAO,UAAU;AAC/B,YAAQ,IAAI,aAAQ,CAAC,EAAE;AAAA,EACzB;AACA,UAAQ,IAAI,EAAE;AAChB;AAEA,KAAK,QAAQ,KAAK,MAAM,CAAC,CAAC,EAAE,MAAM,CAAC,QAAiB;AAClD,UAAQ,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,CAAC;AAC9D,UAAQ,WAAW;AACrB,CAAC;","names":["sep","main"]}
|